$fieldName, ]; }, $filters); $formTypeMap = $this->Form->getConfig('typeMap'); $filteringForm = $this->Bootstrap->table( [ 'small' => true, 'striped' => false, 'hover' => false, 'tableClass' => ['indexFilteringTable'], ], [ 'fields' => [ [ 'path' => 'fieldname', 'label' => __('Field'), 'formatter' => function ($field, $row) { return sprintf('%s', h($field), h($field)); } ], [ 'path' => 'operator', 'label' => __('Operator'), 'formatter' => function ($field, $row) use ($typeMap) { $fieldName = $row['fieldname']; $type = $typeMap[$fieldName] ?? 'text'; $options = [ sprintf('', '=', '='), sprintf('', '!=', '!='), ]; if ($type === 'datetime') { $options = [ sprintf('', '>=', '>='), sprintf('', '<=', '<='), ]; } return sprintf('', implode('', $options)); } ], [ 'path' => 'value', 'labelHtml' => sprintf( '%s %s', __('Value'), sprintf('', __('Supports strict matches and LIKE matches with the `%` character. Example: `%.com`')) ), 'formatter' => function ($field, $row) use ($typeMap, $formTypeMap, $filtersConfig) { $fieldName = $row['fieldname']; $formType = $formTypeMap[$typeMap[$fieldName]] ?? 'text'; $fieldData = [ 'field' => $fieldName, 'type' => $formType, 'label' => '', 'class' => 'fieldValue form-control-sm' ]; if (!empty($filtersConfig[$fieldName])) { if (!empty($filtersConfig[$fieldName]['options'])) { $fieldData['options'] = $filtersConfig[$fieldName]['options']; } if (!empty($filtersConfig[$fieldName]['select2'])) { $fieldData['type'] = 'dropdown'; $fieldData['select2'] = true; } if (!empty($filtersConfig[$fieldName]['multiple'])) { $fieldData['type'] = 'dropdown'; $fieldData['multiple'] = true; $fieldData['select2'] = [ 'tags' => true, 'tokenSeparators' => [',', ' '], ]; } } $this->Form->setTemplates([ 'formGroup' => '
{{input}}
', ]); return $this->element('genericElements/Form/fieldScaffold', [ 'fieldData' => $fieldData, 'params' => [] ]); } ], ], 'items' => $tableItems ] ); $filteringMetafields = ''; if ($metaFieldsEnabled) { $helpText = $this->Bootstrap->node('sup', [ 'class' => ['ms-1 fa fa-info'], 'title' => __('Include help'), 'data-bs-toggle' => 'tooltip', ]); $filteringMetafields = $this->Bootstrap->node('h5', [], __('Meta Fields') . $helpText); $filteringMetafields .= $this->element('genericElements/IndexTable/metafield_filtering', $metaTemplates); } $filteringTags = ''; if ($taggingEnabled) { $helpText = $this->Bootstrap->node('sup', [ 'class' => ['ms-1 fa fa-info'], 'title' => __('Supports negation matches (with the `!` character) and LIKE matches (with the `%` character). Example: `!exportable`, `%able`'), 'data-bs-toggle' => 'tooltip', ]); $filteringTags = $this->Bootstrap->node('h5', [ 'class' => 'mt-2' ], __('Tags') . $helpText); $filteringTags .= $this->Tag->tags([], [ 'allTags' => $allTags, 'picker' => true, 'editable' => false, ]); } $modalBody = implode('', [$filteringForm, $filteringMetafields, $filteringTags]); echo $this->Bootstrap->modal([ 'title' => __('Filtering options for {0}', Inflector::singularize($this->request->getParam('controller'))), 'size' => !empty($metaFieldsEnabled) ? 'xl' : 'lg', 'type' => 'confirm', 'bodyHtml' => $modalBody, 'confirmButton' => [ 'text' => __('Filter'), ], 'confirmFunction' => 'filterIndex' ]); ?>