diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5c0bcc99d..1573d854b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
* Important vendor updates to provide PHP 7.1 beta support!
* Added a `Util::arrayFlatten()` static function
* Added support for 'external_url' page header to enable easier external URL based menu items
+ * Improved the UI for CLI GPM Index view to use a table
1. [](#bugfix)
* Fix for lightbox media function throwing error [#981](https://github.com/getgrav/grav/issues/981)
diff --git a/system/src/Grav/Console/Gpm/IndexCommand.php b/system/src/Grav/Console/Gpm/IndexCommand.php
index 2e3edb229..9426aeaac 100644
--- a/system/src/Grav/Console/Gpm/IndexCommand.php
+++ b/system/src/Grav/Console/Gpm/IndexCommand.php
@@ -9,7 +9,9 @@
namespace Grav\Console\Gpm;
use Grav\Common\GPM\GPM;
+use Grav\Common\Utils;
use Grav\Console\ConsoleCommand;
+use League\CLImate\CLImate;
use Symfony\Component\Console\Input\InputOption;
class IndexCommand extends ConsoleCommand
@@ -100,33 +102,34 @@ class IndexCommand extends ConsoleCommand
protected function serve()
{
$this->options = $this->input->getOptions();
-
$this->gpm = new GPM($this->options['force']);
-
$this->displayGPMRelease();
-
$this->data = $this->gpm->getRepository();
$data = $this->filter($this->data);
- foreach ($data as $type => $packages) {
- $this->output->writeln("" . ucfirst($type) . " [ " . count($packages) . " ]");
+ $climate = new CLImate;
+ $climate->extend('Grav\Console\TerminalObjects\Table');
+ foreach ($data as $type => $packages) {
+ $this->output->writeln("" . strtoupper($type) . " [ " . count($packages) . " ]");
+
+ $table = [];
$index = 0;
$packages = $this->sort($packages);
+
foreach ($packages as $slug => $package) {
- $this->output->writeln(
- // index
- str_pad($index++ + 1, 2, '0', STR_PAD_LEFT) . ". " .
- // package name
- "" . str_pad($package->name, 20) . " " .
- // slug
- "[" . str_pad($slug, 20, ' ', STR_PAD_BOTH) . "] " .
- // version details
- $this->versionDetails($package)
- );
+ $row = [
+ 'Count' => $index++ + 1,
+ 'Name' => "" . Utils::truncate($package->name, 20, false, ' ', '...') . " ",
+ 'Slug' => $slug,
+ 'Version'=> $this->version($package),
+ 'Installed' => $this->installed($package)
+ ];
+ $table[] = $row;
}
+ $climate->table($table);
$this->output->writeln('');
}
@@ -143,7 +146,7 @@ class IndexCommand extends ConsoleCommand
*
* @return string
*/
- private function versionDetails($package)
+ private function version($package)
{
$list = $this->gpm->{'getUpdatable' . ucfirst($package->package_type)}();
$package = isset($list[$package->slug]) ? $list[$package->slug] : $package;
@@ -154,21 +157,31 @@ class IndexCommand extends ConsoleCommand
if (!$installed || !$updatable) {
$version = $installed ? $local->version : $package->version;
- $installed = !$installed ? ' (not installed)' : ' (installed)';
-
- return str_pad(" [v" . $version . "]", 35) . $installed;
+ return "v" . $version . "";
}
if ($updatable) {
- $installed = !$installed ? ' (not installed)' : ' (installed)';
-
- return str_pad(" [v" . $package->version . " ➜ v" . $package->available . "]",
- 61) . $installed;
+ return "v" . $package->version . " -> v" . $package->available . "";
}
return '';
}
+ /**
+ * @param $package
+ *
+ * @return string
+ */
+ private function installed($package)
+ {
+ $package = isset($list[$package->slug]) ? $list[$package->slug] : $package;
+ $type = ucfirst(preg_replace("/s$/", '', $package->package_type));
+ $updatable = $this->gpm->{'is' . $type . 'Updatable'}($package->slug);
+ $installed = $this->gpm->{'is' . $type . 'Installed'}($package->slug);
+
+ return !$installed ? 'not installed' : 'installed';
+ }
+
/**
* @param $data
*
diff --git a/system/src/Grav/Console/TerminalObjects/Table.php b/system/src/Grav/Console/TerminalObjects/Table.php
new file mode 100644
index 000000000..7c5dc328b
--- /dev/null
+++ b/system/src/Grav/Console/TerminalObjects/Table.php
@@ -0,0 +1,29 @@
+column_widths = $this->getColumnWidths();
+ $this->table_width = $this->getWidth();
+ $this->border = $this->getBorder();
+
+ $this->buildHeaderRow();
+
+ foreach ($this->data as $key => $columns) {
+ $this->rows[] = $this->buildRow($columns);
+ }
+
+ $this->rows[] = $this->border;
+
+ return $this->rows;
+ }
+}