chg: [indexTable:context_filters] Support of default context filter

This filter is used by default if none is provided
pull/89/head
Sami Mokaddem 2022-03-09 08:55:59 +01:00
parent 39d89efb53
commit 61736531b1
No known key found for this signature in database
GPG Key ID: 164C473F627A06FA
3 changed files with 29 additions and 3 deletions

View File

@ -50,6 +50,7 @@ class CRUDComponent extends Component
$optionFilters[] = "{$filter} !=";
}
$params = $this->Controller->ParamHandler->harvestParams($optionFilters);
$params = $this->fakeContextFilter($options, $params);
$query = $this->Table->find();
if (!empty($options['filterFunction'])) {
$query = $options['filterFunction']($query);
@ -1271,6 +1272,28 @@ class CRUDComponent extends Component
$this->Controller->set('filteringContexts', $filteringContexts);
}
/**
* Create a fake filtering label set to the filter to be used by default if the request does not supply one
* This fake filtering label will then be used to set approriate filters on the query
*
* @param array $options CRUD options
* @param array $params Collected params from the request
* @return array
*/
protected function fakeContextFilter($options, $params): array
{
if (empty($params['filteringLabel']) && !empty($options['contextFilters']['custom'])) {
foreach ($options['contextFilters']['custom'] as $contextFilter) {
if (!empty($contextFilter['default'])) {
$params['filteringLabel'] = $contextFilter['label'];
$this->Controller->set('fakeFilteringLabel', $contextFilter['label']);
break;
}
}
}
return $params;
}
public function setParentConditionsForMetaFields($query, array $metaConditions)
{
$metaTemplates = $this->MetaFields->MetaTemplates->find('list', [

View File

@ -254,7 +254,7 @@ class MetaTemplatesController extends AppController
'custom' => [
[
'default' => true,
'label' => __('Newest Templates'),
'label' => __('Latest Templates'),
'filterConditionFunction' => function ($query) {
return $query->where([
'id IN' => $this->MetaTemplates->genQueryForAllNewestVersionIDs()

View File

@ -9,6 +9,7 @@
];
$currentQuery = $this->request->getQuery();
$filteringLabel = !empty($currentQuery['filteringLabel']) ? $currentQuery['filteringLabel'] : '';
$fakeFilteringLabel = !empty($fakeFilteringLabel) ? $fakeFilteringLabel : false;
unset($currentQuery['page'], $currentQuery['limit'], $currentQuery['sort'], $currentQuery['filteringLabel']);
if (!empty($filteringContext['filterCondition'])) { // PHP replaces `.` by `_` when fetching the request parameter
$currentFilteringContext = [];
@ -25,9 +26,11 @@
(
$currentQuery == $currentFilteringContext && // query conditions match
!isset($filteringContext['filterConditionFunction']) && // not a custom filtering
empty($filteringLabel) // do not check `All` by default
empty($filteringLabel) && // do not check `All` by default
empty($fakeFilteringLabel) // no custom filter is a default filter
) ||
$filteringContext['label'] == $filteringLabel // labels should not be duplicated
$filteringContext['label'] == $filteringLabel || // labels should not be duplicated
$filteringContext['label'] == $fakeFilteringLabel // use the default filter
),
'isFilter' => true,
'onClick' => 'changeIndexContext',