diff --git a/README.md b/README.md index 4e386357..c366325c 100644 --- a/README.md +++ b/README.md @@ -575,6 +575,27 @@ $menu = (new CliMenuBuilder) ->build(); ``` +You can add multiple checkbox items at once like so: + +```php +addCheckboxItems([ + ['Item 1', $callable], + ['Item 2', $callable], + ['Item 3', $callable], + ]) + ->build(); +``` + When selecting an item, it will be toggled. Notice at first each item is unchecked. After selecting one it will become checked. @@ -597,6 +618,27 @@ $menu = (new CliMenuBuilder) ->build(); ``` +You can add multiple radio items at once like so: + +```php +addRadioItems([ + ['Item 1', $callable], + ['Item 2', $callable], + ['Item 3', $callable], + ]) + ->build(); +``` + When selecting an item, it will be toggled. Notice at first each item is unchecked. After selecting one it will become checked and all other `RadioItem` within the same level will be unchecked. diff --git a/examples/checkbox-item.php b/examples/checkbox-item.php index d64cba76..74d94985 100644 --- a/examples/checkbox-item.php +++ b/examples/checkbox-item.php @@ -15,10 +15,12 @@ ->addSubMenu('Compiled', function (CliMenuBuilder $b) use ($itemCallable) { $b->setTitle('Compiled Languages') ->addCheckboxItem('Rust', $itemCallable) - ->addCheckboxItem('C++', $itemCallable) ->addCheckboxItem('Go', $itemCallable) ->addCheckboxItem('Java', $itemCallable) - ->addCheckboxItem('C', $itemCallable) + ->addCheckboxItems([ + ['C++', $itemCallable], + ['C', $itemCallable] + ]); ; }) ->addSubMenu('Interpreted', function (CliMenuBuilder $b) use ($itemCallable) { diff --git a/examples/radio-item.php b/examples/radio-item.php index 90077a63..355db3d0 100644 --- a/examples/radio-item.php +++ b/examples/radio-item.php @@ -15,10 +15,12 @@ ->addSubMenu('Compiled', function (CliMenuBuilder $b) use ($itemCallable) { $b->setTitle('Compiled Languages') ->addRadioItem('Rust', $itemCallable) - ->addRadioItem('C++', $itemCallable) ->addRadioItem('Go', $itemCallable) ->addRadioItem('Java', $itemCallable) - ->addRadioItem('C', $itemCallable) + ->addRadioItems([ + ['C++', $itemCallable], + ['C', $itemCallable] + ]) ; }) ->addSubMenu('Interpreted', function (CliMenuBuilder $b) use ($itemCallable) { diff --git a/src/Builder/CliMenuBuilder.php b/src/Builder/CliMenuBuilder.php index 142cba13..f28501f5 100644 --- a/src/Builder/CliMenuBuilder.php +++ b/src/Builder/CliMenuBuilder.php @@ -154,6 +154,15 @@ public function addCheckboxItem( return $this; } + public function addCheckboxItems(array $items): self + { + foreach ($items as $item) { + $this->addCheckboxItem(...$item); + } + + return $this; + } + public function addRadioItem( string $text, callable $itemCallable, @@ -165,6 +174,15 @@ public function addRadioItem( return $this; } + public function addRadioItems(array $items): self + { + foreach ($items as $item) { + $this->addRadioItem(...$item); + } + + return $this; + } + public function addStaticItem(string $text) : self { $this->addMenuItem(new StaticItem($text)); diff --git a/test/Builder/CliMenuBuilderTest.php b/test/Builder/CliMenuBuilderTest.php index c3e0eb3d..fecd418b 100644 --- a/test/Builder/CliMenuBuilderTest.php +++ b/test/Builder/CliMenuBuilderTest.php @@ -375,6 +375,33 @@ public function testAddMultipleItems() : void $this->checkMenuItems($menu, $expected); } + public function testAddMultipleCheckboxItems() : void + { + $callable = function () { + }; + + $builder = new CliMenuBuilder; + $builder->disableDefaultItems(); + $builder->addCheckboxItems([ + ['Item 1', $callable], + ['Item 2', $callable] + ]); + $menu = $builder->build(); + + $expected = [ + [ + 'class' => CheckboxItem::class, + 'text' => 'Item 1', + ], + [ + 'class' => CheckboxItem::class, + 'text' => 'Item 2', + ], + ]; + + $this->checkMenuItems($menu, $expected); + } + public function testAddCheckboxItem() : void { $callable = function () { @@ -425,6 +452,33 @@ public function testAddRadioItem() : void $this->checkMenuItems($menu, $expected); } + public function testAddMultipleRadioItems() : void + { + $callable = function () { + }; + + $builder = new CliMenuBuilder; + $builder->disableDefaultItems(); + $builder->addRadioItems([ + ['Item 1', $callable], + ['Item 2', $callable], + ]); + $menu = $builder->build(); + + $expected = [ + [ + 'class' => RadioItem::class, + 'text' => 'Item 1', + ], + [ + 'class' => RadioItem::class, + 'text' => 'Item 2', + ], + ]; + + $this->checkMenuItems($menu, $expected); + } + public function testAddStaticItem() : void {