Início
NexoPOS

Ação Personalizada

Uma ação ajuda a executar uma solicitação em uma entrada CRUD. Por padrão, o NexoPOS vem com ações “editar” e “excluir” que operam diretamente na linha selecionada. Isto mostrará como criar uma ação personalizada em uma entrada CRUD.

Registrar Filtro Personalizado

<?php
namespace Modules\YourModule\Providers;

use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;

class ServiceProvider 
{
    public function register()
    {
        Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
    }
}

Vamos explicar o que está acontecendo acima. Em primeiro lugar, vamos registrar nosso filtro com o provedor de serviços do nosso módulo. Importamos 3 classes (Hook, CrudEntry e OrderCrud).

Neste exemplo, estamos tentando adicionar uma nova ação a uma entrada CRUD na tabela de pedidos. Em seguida, adicionamos um filtro usando o método “addFilter”, que irá colocar o callback no método “setActions” da classe OrderCrud.

Assim, toda vez que o método "setActions" é chamado, a callback "customAction" é acionada com, como parâmetro único, uma instância de "CrudEntry".

Adicionar ação à instância do CrudEntry

Agora, vamos nos concentrar no método de callback, pois é nele que vamos inserir nossa ação. Observe que podemos inserir mais de uma ação de uma só vez. Aqui está como definir uma ação:

<?php
namespace Modules\YourModule\Providers;

use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;

class ServiceProvider 
{
    public function regiser()
    {
        Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
    }
    
    public function customAction( CrudEntry $crudEntry )
    {
        $crudEntry->action( 
            label: 'Email to Customer',
            identifier: 'email',
            type: 'GET',
            url: url( '/api/your/slug/' . $crudEntry->id )
        );
        
        return $entry;
    }
}

Observe que aqui, nossa ação terá como identificador “email” e como rótulo “Email para o Cliente” (visível para o usuário). Quando for clicada, uma requisição GET (assíncrona) será executada para a URL fornecida no parâmetro “url”.

Se você quiser que o usuário confirme a ação, você pode adicionar uma nova entrada a esse array chamada "confirm", assim:

<?php
namespace Modules\YourModule\Providers;

use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;

class ServiceProvider 
{
    public function regiser()
    {
        Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
    }
    
    public function customAction( CrudEntry $crudEntry )
    {
        $crudEntry->action(
            label: 'Email to Customer',
            type: 'GET',
            url: url( '/api/your/slug/' . $crudEntry->id ),
            confirm: [
                'message'   =>  'Would you like to send this as an email?'
            ]
        );
        
        return $entry;
    }
}

Para solicitações assíncronas, apenas "GET" e "DELETE" são suportados. Se você quiser que o usuário seja direcionado para uma página diferente após clicar na ação, use o tipo "GOTO" em vez de "GET", assim:

<?php
namespace Modules\YourModule\Providers;

use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;

class ServiceProvider 
{
    public function regiser()
    {
        Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
    }
    
    public function customAction( CrudEntry $crudEntry )
    {
        $crudEntry->action(
            lable: 'Email to customer',
            type: 'GOTO',
            url: url( '/api/your/slug/' . $crudEntry->id ),
            confirm: [
                'message'   =>  'Would you like to send this as an email?'
            ]
        );
        
        return $entry;
    }
}

Ao clicar em uma ação, o usuário será redirecionado para a página na chave "url".

Executando solicitações assíncronas

Por padrão, as requisições GET e DELETE executarão uma requisição assíncrona. No entanto, um dos requisitos é adicionar uma mensagem de confirmação. Isso deve impedir que o usuário final acione uma ação acidentalmente.

<?php
namespace Modules\YourModule\Providers;

use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;

class ServiceProvider 
{
    public function regiser()
    {
        Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
    }
    
    public function customAction( CrudEntry $crudEntry )
    {
        $crudEntry->action(
            label: 'Refresh Product',
            type: 'GET',
            url: url( '/api/your/slug/' . $crudEntry->id ),
            confirm: [
                'message'   =>  'Would you like to refresh the products ?'
            ]
        );
        
        return $entry;
    }
}