Skip to content

Active Selections ​

luya\admin\ngrest\base\ActiveSelection are analog to Active Buttons. When luya\admin\ngrest\base\NgRestModel -> ngRestActiveSelections() are defined, checkboxes will appear in the CRUD list (overview of all records) and a the active selection buttons are visible in the bottom. A click on the button interacts with the selected items/rows.

There are built in Active Selections you can use and configure or you can create your own Active Selections and attach them to an NgRestModel

Inline ​

Compare to Active Buttons or Active Windows, the Active Selections can be defined inline as anonymus function inside the NgRestModel luya\admin\ngrest\base\NgRestModel -> ngRestActiveSelections() method.

Basic Usage ​

As first parameter the callable will receive an array with all selected models.

php
public function ngRestActiveSelections()
{
    return [
        [
            'label' => 'Click Me',
            'action' => function(array $items) {
                /** @var \luya\admin\ngrest\base\NgRestModel $item */
                foreach ($items as $item) {
                    // ... do something with the selected item object
                }

                return true;
            }
        ]
    ]
}

Advanced Response ​

Its possible to send a reload event, as well as customized success or error messages, therefore a second parameter of the callable is required which takes the luya\admin\ngrest\base\ActiveSelection context object.

php
public function ngRestActiveSelections()
{
    return [
        [
            'label' => 'Click Me',
            'action' => function(array $items, \luya\admin\ngrest\base\ActiveSelection $context) {
                /** @var \luya\admin\ngrest\base\NgRestModel $item */
                foreach ($items as $item) {
                    // ... do something with the selected item object
                }

                // sends a reload event, so the ngrest list will be reloaded afterwards. 
                $context->sendReloadEvent();

                return $context->sendSuccess('We did, what you teached.');
            }
        ]
    ]
}

Standalone ​

In order to make a configurable and shareable Active Select extends from luya\admin\ngrest\base\ActiveSelection and override the luya\admin\ngrest\base\ActiveSelection -> handle() method, see luya\admin\selections\DeleteActiveSelection as example.

php
class DeleteActiveSelection extends ActiveSelection
{
    /**
     * {@inheritDoc}
     */
    public $label = 'Delete';

    /**
    * {@inheritDoc}
     */
    public $icon = 'delete';

    /**
     * @var string The success message to display.
     */
    public $message = '%s items has been deleted';

    /**
     * {@inheritDoc}
     */
    public function handle(array $items)
    {
        $count = 0;
        foreach ($items as $item) {
            if ($item->delete()) {
                $count++;
            }
        }

        $this->sendReloadEvent();

        return $this->sendSuccess(sprintf($this->message, $count));
    }
}

Attaching ​

Use the luya\admin\ngrest\base\NgRestModel -> ngRestActiveSelections() method inside the desired NgRestModel:

php
public function ngRestActiveSelections()
{
    return [
        [
            'label' => 'Archive Rows',
            'action' => function(array $items, \luya\admin\ngrest\base\ActiveSelection $context) {
                foreach ($items as $item) {
                    // do something with item. Each item is an ActiveRecord of the method implementation itself.
                }
  
                // if the selection interacts with the items, it might be necessary to reload the CRUD.
                $context->sendReloadEvent();

                return $context->sendSuccess('Done!');
            }
        ],
        [
            'class' => luya\admin\selections\DeleteActiveSelection::class,
            'message' => 'I have just deleted some items',
        ]
    ];
}