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; + } +}