<?php 
 
use gdgrid\gd\GridForm; 
use gdgrid\gd\Grid; 
 
/* @var \gdgrid\gd\plugin\GridPlugin $this */ 
 
$this->setConfig('filter', [ 
    'provider'  => $this->gridObject()->getProvider(), 
    'formatter' => $this->gridObject()->formatter(), 
    'buttons'   => [ 
        'submit'   => ['url' => null, 'id' => null, 'attr' => null, 'onclick' => null, 'text' => 'Apply Filter'], 
        'reset'    => ['url' => null, 'id' => null, 'attr' => null, 'onclick' => null, 'text' => 'Reset Filter'], 
        'template' => null, // '{submit} {reset}' 
        'insert_before' => '<{tag}', 
        'insert_after' => null, 
    ], 
    'insert_before' => null, 
    'insert_after' => '{columns}', 
]); 
 
$this->fetchComponent('filter', function(GridForm $plugin, Grid $grid) 
{ 
    /* @var \gdgrid\gd\plugin\GridPlugin $this */ 
 
    if (empty($plugin->getInput())) 
 
        $plugin->loadInputs(); 
 
    $id = $plugin->getTagAttributes()['id'] ?? 'grid-table-filter-' . substr(md5(microtime(true)), 0, 10); 
 
    if (empty($plugin->getSortOrder())) 
 
        $plugin->setSortOrder($grid->fetchSortOrder()); 
 
    $templateSet = null !== $plugin->getTemplate(); 
 
    if ($grid->getTag() === 'table' && ! $templateSet) 
    { 
        $plugin->setTag('tr')->setTagAttributes([])->setTemplate('<td {attr}>{input}</td>'); 
 
        if (false == isset($plugin->getRowAttributes()['class'])) 
 
            $plugin->setRowAttributes(['class' => []]); 
    } 
 
    $plugin->setTagAttributes(['id' => $id]); 
 
    foreach ($plugin->fetchSortOrder() as $item) 
    { 
        if (false == $grid->checkRow($item)) 
        { 
            $plugin->unsetInput($item); 
 
            continue; 
        } 
 
        if (false == $plugin->checkInput($item) && $grid->checkRow($item)) 
        { 
            $plugin->setRow($item, ''); 
 
            continue; 
        } 
 
        if (null === $plugin->getRowTemplate($item)) 
        { 
            $type = $plugin->getInputType($item); 
 
            if ($plugin->isOptionalInput($item)) 
            { 
                if ($type !== 'select') 
 
                    $plugin->setSelect($item); 
 
                if ($plugin->getPrompt($item) === null) 
 
                    $plugin->setPrompt($item, ['' => '']); 
            } 
            elseif ($type === 'date' && isset($plugin->getInput($item)['time'])) 
 
                $plugin->setInputType($item, $plugin::DEFAULT_INPUT_TYPE)->setInputAttribute($item, ['data-type' => 'datetime']); 
 
            elseif ($type !== 'number') 
 
                $plugin->setInput($item, null, $plugin::DEFAULT_INPUT_TYPE); 
        } 
    } 
 
    if ($this->checkConfig('filter', 'buttons') && $buttons = $this->getConfig('filter', 'buttons')) 
    { 
        $btn = [ 
            'submit' => [ 
                'id'      => $buttons['submit']['id'] ?? 'grid-table-filter-submit-' . substr(md5(microtime(true)), 0, 10), 
                'text'    => $buttons['submit']['text'] ?? 'Apply Filter', 
                'attr'    => $buttons['submit']['attr'] ?? 'class="btn btn-info btn-sm"', 
                'onclick' => $buttons['submit']['onclick'] 
                    ?? sprintf('gdFilterSubmit(\'%s\', \'%s\')', $id, $buttons['submit']['url'] ?? getenv('REQUEST_URI')), 
            ], 
            'reset'  => [ 
                'id'      => $buttons['submit']['id'] ?? 'grid-table-filter-reset-' . substr(md5(microtime(true)), 0, 10), 
                'text'    => $buttons['reset']['text'] ?? 'Reset Filter', 
                'attr'    => $buttons['reset']['attr'] ?? 'class="btn btn-default btn-sm"', 
                'onclick' => $buttons['reset']['onclick'] 
                    ?? sprintf('window.location.href = %s', $buttons['reset']['url'] ?? 'window.location.pathname'), 
            ] 
        ]; 
 
        $template = $buttons['template'] ?? '<div class="grid-table-filter-submit-buttons">{submit} {reset}</div>'; 
 
        $template = strtr($template, [ 
 
            '{submit}' => sprintf('<button %s id="%s" onclick="%s">%s</button>', 
 
                $btn['submit']['attr'], $btn['submit']['id'], $btn['submit']['onclick'], $btn['submit']['text']), 
 
            '{reset}' => sprintf('<button %s id="%s" onclick="%s">%s</button>', 
 
                $btn['reset']['attr'], $btn['reset']['id'], $btn['reset']['onclick'], $btn['reset']['text']) 
        ]); 
 
        if (false == isset($plugin->getTagAttributes()['onkeydown']) && ! $templateSet) 
 
            $plugin->setTagAttributes([ 
                'onkeydown' => sprintf('if (event.keyCode === 13) $(\'#%s\').trigger(\'click\')', $btn['submit']['id']) 
            ]); 
 
        $grid->bindLayout('{filter_btn}', [$template, $buttons['insert_before'], $buttons['insert_after']]); 
    } 
 
    $grid->bindLayout('{filter}', [ 
        $plugin->render(), 
        $this->getConfig('filter', 'insert_before'), 
        $this->getConfig('filter', 'insert_after') 
    ]); 
 
}); 
 
 |