Skip to content

Commit

Permalink
addRemoveButton returns builder
Browse files Browse the repository at this point in the history
  • Loading branch information
MartkCz committed Jun 20, 2018
1 parent 32bd064 commit 9e5d3f1
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 21 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ $multiplier = $form->addMultiplier('multiplier', function (Nette\Forms\Container

$multiplier->addCreateButton('Add')
->addClass('btn btn-primary');
$multiplier->addRemoveButton('Remove');
$multiplier->addRemoveButton('Remove')
->addClass('btn btn-danger');
```

## Adding multiple containers
Expand Down
70 changes: 70 additions & 0 deletions src/Buttons/RemoveButton.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

namespace WebChemistry\Forms\Controls\Buttons;

use Nette\Forms\Container;
use Nette\Forms\Controls\SubmitButton;
use Nette\SmartObject;
use WebChemistry\Forms\Controls\Multiplier;

class RemoveButton {

use SmartObject;

/** @var null|string */
private $caption;

/** @var array */
public $onCreate = [];

/** @var array */
private $classes = [];

/**
* @param $caption string|null
*/
public function __construct($caption) {
$this->caption = $caption;
}

/**
* @param callable $onCreate
* @return static
*/
public function addOnCreateCallback(callable $onCreate) {
$this->onCreate[] = $onCreate;

return $this;
}

/**
* @param string $class
* @return static
*/
public function addClass($class) {
$this->classes[] = $class;

return $this;
}

/**
* @param Multiplier $multiplier
* @return SubmitButton
*/
public function create(Multiplier $multiplier) {
$button = new SubmitButton($this->caption);

$button->setHtmlAttribute('class', implode(' ', $this->classes));
$button->setValidationScope([])
->setOmitted();

$button->onClick[] = $button->onInvalidClick[] = [$multiplier, 'resetFormEvents'];

foreach ($this->onCreate as $callback) {
$callback($button);
}

return $button;
}

}
29 changes: 12 additions & 17 deletions src/Multiplier.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Nette\Utils\ArrayHash;
use Nette\Utils\Arrays;
use WebChemistry\Forms\Controls\Buttons\CreateButton;
use WebChemistry\Forms\Controls\Buttons\RemoveButton;

class Multiplier extends Container {

Expand Down Expand Up @@ -43,8 +44,8 @@ class Multiplier extends Container {
/** @var CreateButton[] */
protected $createButtons = [];

/** @var array */
protected $removeButton = [];
/** @var RemoveButton|null */
protected $removeButton;

/** @var array */
protected $httpData = [];
Expand Down Expand Up @@ -180,14 +181,17 @@ public function getCopyNumber() {
/************************* Buttons **************************/

/**
* @param string|bool $caption False = not showed
* @param callable|null $onCreate
* @return Multiplier
* @param string
* @param callable|null $onCreate deprecated, use ->addOnCreateCallback
* @return RemoveButton
*/
public function addRemoveButton($caption = null, callable $onCreate = null) {
$this->removeButton = [$caption, $onCreate];
$btn = $this->removeButton = new RemoveButton($caption);
if ($onCreate) {
$btn->addOnCreateCallback($onCreate);
}

return $this;
return $btn;
}

/**
Expand Down Expand Up @@ -374,16 +378,7 @@ private function attachRemoveButton(Container $container) {
return;
}

list($caption, $onCreate) = $this->removeButton;
$submit = $container->addSubmit(self::SUBMIT_REMOVE_NAME, $caption)
->setValidationScope(false)
->setOmitted();

$submit->onClick[] = $submit->onInvalidClick[] = [$this, 'resetFormEvents'];

if ($onCreate) {
$onCreate($submit);
}
$container->addComponent($this->removeButton->create($this), self::SUBMIT_REMOVE_NAME);
}

/************************* Http data **************************/
Expand Down
27 changes: 24 additions & 3 deletions tests/unit/RemoveButtonTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ private function createMultiplier(callable $factory, $copyNumber = 1, $maxCopies
protected function _before() {
$form = $this->services->form;

$form->addForm('buttons', function ($copyNumber = 2, $maxCopies = NULL) {
$form->addForm('buttons', function ($copyNumber = 2, $maxCopies = NULL, $removeCallback = null) {
$form = $this->createMultiplier(function (Container $container) {
$container->addText('bar');
}, $copyNumber, $maxCopies);
Expand All @@ -31,9 +31,13 @@ protected function _before() {
$multiplier = $form['m'];

$multiplier->setMinCopies(1);
$multiplier->addRemoveButton();
$btn = $multiplier->addRemoveButton();
$multiplier->addCreateButton();

if (is_callable($removeCallback)) {
$removeCallback($btn);
}

return $form;
});

Expand All @@ -53,7 +57,8 @@ protected function _before() {
$multiplier->addRemoveButton();
$multiplier->addCreateButton();

$form['m2']->addRemoveButton()->addCreateButton();
$form['m2']->addRemoveButton();
$form['m2']->addCreateButton();

return $form;
});
Expand Down Expand Up @@ -121,4 +126,20 @@ public function testFormEvents() {
$this->assertDomNotHas($dom, 'input[name="m[1][bar]"]');
}

public function testAddClass() {
$response = $this->services->form->createRequest('buttons', 2, null, function (\WebChemistry\Forms\Controls\Buttons\RemoveButton $btn) {
$btn->addClass('btn btn-remove');
})->setPost([
'm' => [
['bar' => ''],
['bar' => ''],
]
])->send();

$dom = $response->toDomQuery();

$this->assertDomHas($dom, 'input[name="m[0][bar]"]');
$this->assertDomHas($dom, 'input.btn.btn-remove');
}

}

0 comments on commit 9e5d3f1

Please sign in to comment.