Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -791,6 +791,32 @@ $menu = (new CliMenuBuilder)
->build();
```

If no items have display extra set to true, then the item extra will not be displayed. If you toggle the item to show
it's item extra in a callback or at runtime it will render incorrectly.

In order to fix that you need to tell the menu to display item extra explicitly. You can do this when constructing the
menu like so:

```php
<?php

use PhpSchool\CliMenu\Builder\CliMenuBuilder;
use PhpSchool\CliMenu\CliMenu;

$menu = (new CliMenuBuilder)
->setItemExtra('✔')
->addItem('Exercise 1', function (CliMenu $menu) {
$selectedItem = $menu->getSelectedItem();
if ($selectedItem->showsItemExtra()) {
$selectedItem->hideItemExtra();
} else {
$selectedItem->showItemExtra();
}
})
->displayExtra()
->build();
```

## Menu Methods

The next set of documentation applies to methods available directly on the `\PhpSchool\CliMenu\CliMenu` instance. Typically
Expand Down
28 changes: 28 additions & 0 deletions examples/item-extra-toggling.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

use PhpSchool\CliMenu\CliMenu;
use PhpSchool\CliMenu\Builder\CliMenuBuilder;

require_once(__DIR__ . '/../vendor/autoload.php');

$itemCallable = function (CliMenu $menu) {
if ($menu->getSelectedItem()->showsItemExtra()) {
$menu->getSelectedItem()->hideItemExtra();
} else {
$menu->getSelectedItem()->showItemExtra();
}
$menu->redraw();
echo $menu->getSelectedItem()->getText();
};

$menu = (new CliMenuBuilder)
->setTitle('Basic CLI Menu Custom Item Extra')
->addItem('First Item', $itemCallable)
->addItem('Second Item', $itemCallable)
->addItem('Third Item', $itemCallable)
->setItemExtra('[COMPLETE!]')
->displayExtra()
->addLineBreak('-')
->build();

$menu->open();
14 changes: 13 additions & 1 deletion src/Builder/CliMenuBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,9 @@ public function setItemExtra(string $extra) : self
{
$this->style->setItemExtra($extra);

//if we customise item extra, it means we most likely want to display it
$this->displayExtra();

return $this;
}

Expand Down Expand Up @@ -505,6 +508,13 @@ public function disableDefaultItems() : self
return $this;
}

public function displayExtra() : self
{
$this->style->setDisplaysExtra(true);

return $this;
}

private function itemsHaveExtra(array $items) : bool
{
return !empty(array_filter($items, function (MenuItemInterface $item) {
Expand All @@ -518,7 +528,9 @@ public function build() : CliMenu
$this->menu->addItems($this->getDefaultItems());
}

$this->style->setDisplaysExtra($this->itemsHaveExtra($this->menu->getItems()));
if (!$this->style->getDisplaysExtra()) {
$this->style->setDisplaysExtra($this->itemsHaveExtra($this->menu->getItems()));
}

return $this->menu;
}
Expand Down
29 changes: 29 additions & 0 deletions test/Builder/CliMenuBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -820,6 +820,35 @@ public function testAddSplitItemWithClosureBinding() : void
$this->checkItems($menu->getItems()[0]->getItems(), $expected);
}

public function testDisplayExtraForcesExtraToBeDisplayedWhenNoItemsDisplayExtra() : void
{
$cb = function () {
};
$builder = new CliMenuBuilder;
$builder->addItem('Item 1', $cb);
$builder->addItem('Item 2', $cb);
$builder->displayExtra();

$menu = $builder->build();

self::assertTrue($menu->getStyle()->getDisplaysExtra());
}

public function testModifyingItemExtraForcesExtraToBeDisplayedWhenNoItemsDisplayExtra() : void
{
$cb = function () {
};
$builder = new CliMenuBuilder;
$builder->addItem('Item 1', $cb);
$builder->addItem('Item 2', $cb);
$builder->setItemExtra('DONE');

$menu = $builder->build();

self::assertTrue($menu->getStyle()->getDisplaysExtra());
}


private function checkMenuItems(CliMenu $menu, array $expected) : void
{
$this->checkItems($menu->getItems(), $expected);
Expand Down