Skip to content

Commit 92dd003

Browse files
committed
Adds the ability to add multiple checkbox and radio items
1 parent d25ae86 commit 92dd003

File tree

5 files changed

+122
-4
lines changed

5 files changed

+122
-4
lines changed

README.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,27 @@ $menu = (new CliMenuBuilder)
575575
->build();
576576
```
577577

578+
You can add multiple checkbox items at once like so:
579+
580+
```php
581+
<?php
582+
583+
use PhpSchool\CliMenu\Builder\CliMenuBuilder;
584+
use PhpSchool\CliMenu\CliMenu;
585+
586+
$callable = function (CliMenu $menu) {
587+
echo 'I am alive!';
588+
};
589+
590+
$menu = (new CliMenuBuilder)
591+
->addCheckboxItems([
592+
['Item 1', $callable],
593+
['Item 2', $callable],
594+
['Item 3', $callable],
595+
])
596+
->build();
597+
```
598+
578599
When selecting an item, it will be toggled. Notice at first each item is unchecked. After selecting one it will become
579600
checked.
580601

@@ -597,6 +618,27 @@ $menu = (new CliMenuBuilder)
597618
->build();
598619
```
599620

621+
You can add multiple radio items at once like so:
622+
623+
```php
624+
<?php
625+
626+
use PhpSchool\CliMenu\Builder\CliMenuBuilder;
627+
use PhpSchool\CliMenu\CliMenu;
628+
629+
$callable = function (CliMenu $menu) {
630+
echo 'I am alive!';
631+
};
632+
633+
$menu = (new CliMenuBuilder)
634+
->addRadioItems([
635+
['Item 1', $callable],
636+
['Item 2', $callable],
637+
['Item 3', $callable],
638+
])
639+
->build();
640+
```
641+
600642
When selecting an item, it will be toggled. Notice at first each item is unchecked. After selecting one it will become
601643
checked and all other `RadioItem` within the same level will be unchecked.
602644

examples/checkbox-item.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
->addSubMenu('Compiled', function (CliMenuBuilder $b) use ($itemCallable) {
1616
$b->setTitle('Compiled Languages')
1717
->addCheckboxItem('Rust', $itemCallable)
18-
->addCheckboxItem('C++', $itemCallable)
1918
->addCheckboxItem('Go', $itemCallable)
2019
->addCheckboxItem('Java', $itemCallable)
21-
->addCheckboxItem('C', $itemCallable)
20+
->addCheckboxItems([
21+
['C++', $itemCallable],
22+
['C', $itemCallable]
23+
]);
2224
;
2325
})
2426
->addSubMenu('Interpreted', function (CliMenuBuilder $b) use ($itemCallable) {

examples/radio-item.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
->addSubMenu('Compiled', function (CliMenuBuilder $b) use ($itemCallable) {
1616
$b->setTitle('Compiled Languages')
1717
->addRadioItem('Rust', $itemCallable)
18-
->addRadioItem('C++', $itemCallable)
1918
->addRadioItem('Go', $itemCallable)
2019
->addRadioItem('Java', $itemCallable)
21-
->addRadioItem('C', $itemCallable)
20+
->addRadioItems([
21+
['C++', $itemCallable],
22+
['C', $itemCallable]
23+
])
2224
;
2325
})
2426
->addSubMenu('Interpreted', function (CliMenuBuilder $b) use ($itemCallable) {

src/Builder/CliMenuBuilder.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,15 @@ public function addCheckboxItem(
154154
return $this;
155155
}
156156

157+
public function addCheckboxItems(array $items): self
158+
{
159+
foreach ($items as $item) {
160+
$this->addCheckboxItem(...$item);
161+
}
162+
163+
return $this;
164+
}
165+
157166
public function addRadioItem(
158167
string $text,
159168
callable $itemCallable,
@@ -165,6 +174,15 @@ public function addRadioItem(
165174
return $this;
166175
}
167176

177+
public function addRadioItems(array $items): self
178+
{
179+
foreach ($items as $item) {
180+
$this->addRadioItem(...$item);
181+
}
182+
183+
return $this;
184+
}
185+
168186
public function addStaticItem(string $text) : self
169187
{
170188
$this->addMenuItem(new StaticItem($text));

test/Builder/CliMenuBuilderTest.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,33 @@ public function testAddMultipleItems() : void
375375
$this->checkMenuItems($menu, $expected);
376376
}
377377

378+
public function testAddMultipleCheckboxItems() : void
379+
{
380+
$callable = function () {
381+
};
382+
383+
$builder = new CliMenuBuilder;
384+
$builder->disableDefaultItems();
385+
$builder->addCheckboxItems([
386+
['Item 1', $callable],
387+
['Item 2', $callable]
388+
]);
389+
$menu = $builder->build();
390+
391+
$expected = [
392+
[
393+
'class' => CheckboxItem::class,
394+
'text' => 'Item 1',
395+
],
396+
[
397+
'class' => CheckboxItem::class,
398+
'text' => 'Item 2',
399+
],
400+
];
401+
402+
$this->checkMenuItems($menu, $expected);
403+
}
404+
378405
public function testAddCheckboxItem() : void
379406
{
380407
$callable = function () {
@@ -425,6 +452,33 @@ public function testAddRadioItem() : void
425452
$this->checkMenuItems($menu, $expected);
426453
}
427454

455+
public function testAddMultipleRadioItems() : void
456+
{
457+
$callable = function () {
458+
};
459+
460+
$builder = new CliMenuBuilder;
461+
$builder->disableDefaultItems();
462+
$builder->addRadioItems([
463+
['Item 1', $callable],
464+
['Item 2', $callable],
465+
]);
466+
$menu = $builder->build();
467+
468+
$expected = [
469+
[
470+
'class' => RadioItem::class,
471+
'text' => 'Item 1',
472+
],
473+
[
474+
'class' => RadioItem::class,
475+
'text' => 'Item 2',
476+
],
477+
];
478+
479+
$this->checkMenuItems($menu, $expected);
480+
}
481+
428482
public function testAddStaticItem() : void
429483
{
430484

0 commit comments

Comments
 (0)