From 8064ca32f384cdd1dab5c5002a52ea524fcb2a65 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Mon, 25 Sep 2023 17:47:43 +0530 Subject: [PATCH] Make order status filter multi-select --- .../themes/default/sass/partials/_chosen.sass | 1 + .../orders/helpers/list/list_header.tpl | 30 +++++++++++++++++-- classes/controller/AdminController.php | 9 ++++-- classes/helper/HelperList.php | 5 ++++ controllers/admin/AdminOrdersController.php | 3 +- 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/admin/themes/default/sass/partials/_chosen.sass b/admin/themes/default/sass/partials/_chosen.sass index 4fdf178f6..21eb71ce6 100644 --- a/admin/themes/default/sass/partials/_chosen.sass +++ b/admin/themes/default/sass/partials/_chosen.sass @@ -229,6 +229,7 @@ $chosen-sprite-path: '../img/chosen-sprite.png' border: 0 !important color: $gray height: $chosen-multi-height - 8px + width: 100% !important margin: 0 padding: 4px outline: 0 diff --git a/admin/themes/default/template/controllers/orders/helpers/list/list_header.tpl b/admin/themes/default/template/controllers/orders/helpers/list/list_header.tpl index 4e1263421..3d85e7128 100644 --- a/admin/themes/default/template/controllers/orders/helpers/list/list_header.tpl +++ b/admin/themes/default/template/controllers/orders/helpers/list/list_header.tpl @@ -141,6 +141,16 @@ {$params['title']|escape:'html':'UTF-8'}: {$params['list'][$params['value']]|escape:'html':'UTF-8'} + {else if $params.type == 'select_multiple_or'} + + {$params['title']|escape:'html':'UTF-8'}: + + {foreach from=$params.value item=option name=foreachInfo} + {$params.list[$option]}{if !$smarty.foreach.foreachInfo.last} | {/if} + {/foreach} + + + {else} {$params['title']|escape:'html':'UTF-8'}: {$params['value']|escape:'html':'UTF-8'} @@ -255,6 +265,14 @@ {/if} {/if} + {elseif $params.type == 'select_multiple_or'} + {else} {/if} @@ -296,11 +314,19 @@ $('#list_filters_panel').find('[name*="'+$(this).parent().data('filter_key')+'"]').val(''); } else if (type == 'range') { $('#list_filters_panel').find('[name*="orderFilter_'+$(this).parent().data('filter_key')+'"]').val(''); - } else if (type == 'select') { - $('#list_filters_panel').find('select[name="orderFilter_'+$(this).parent().data('filter_key')+'"] option:selected').prop("selected", false); + } else if (type == 'select' || type == 'select_multiple_or') { + $('#list_filters_panel').find('select[name*="orderFilter_'+$(this).parent().data('filter_key')+'"] option:selected').prop('selected', false); } else { $('#list_filters_panel').find('input[name="orderFilter_'+$(this).parent().data('filter_key')+'"]').val(''); } + + // set post data for empty multi-select filters + $(form).find('select[multiple]').each(function (i, selectElement) { + if ($(selectElement).find('option:selected').length == 0) { + $(form).append(''); + } + }); + form.submit(); }); }); diff --git a/classes/controller/AdminController.php b/classes/controller/AdminController.php index ea3a469f7..8f5e90583 100644 --- a/classes/controller/AdminController.php +++ b/classes/controller/AdminController.php @@ -875,7 +875,7 @@ class AdminControllerCore extends Controller if ($field = $this->filterToField($key, $filter)) { $type = (array_key_exists('filter_type', $field) ? $field['filter_type'] : (array_key_exists('type', $field) ? $field['type'] : false)); - if (($type == 'date' || $type == 'datetime' || $type == 'range') && is_string($value)) { + if ((in_array($type, array('date', 'datetime', 'range', 'select_multiple_and', 'select_multiple_or'))) && is_string($value)) { $value = json_decode($value, true); } $key = isset($tmp_tab[1]) ? $tmp_tab[0].'.`'.$tmp_tab[1].'`' : '`'.$tmp_tab[0].'`'; @@ -895,7 +895,12 @@ class AdminControllerCore extends Controller } /* Only for date filtering (from, to) */ if (is_array($value)) { - if ($type == 'range') { + if ($type == 'select_multiple_and') { + $sql_filter .= ' AND '.pSQL($key).' IN ('.pSQL(implode(',', $value)).')'; + $this->_filterHaving .= ' AND COUNT(DISTINCT '.pSQL($key).') = '.(int) count($value); + } elseif ($type == 'select_multiple_or') { + $sql_filter .= ' AND '.pSQL($key).' IN ('.pSQL(implode(',', $value)).')'; + } elseif ($type == 'range') { if (isset($value[0]) && !empty($value[0])) { if (!Validate::isUnsignedInt($value[0])) { $this->errors[] = Tools::displayError('The \'From\' value is invalid'); diff --git a/classes/helper/HelperList.php b/classes/helper/HelperList.php index e807008dc..c1f944ff3 100644 --- a/classes/helper/HelperList.php +++ b/classes/helper/HelperList.php @@ -681,6 +681,11 @@ class HelperListCore extends Helper } break; + case 'select_multiple_and': + case 'select_multiple_or': + $value = json_decode($value, true); + break; + case 'text': if (!Validate::isCleanHtml($value)) { $value = ''; diff --git a/controllers/admin/AdminOrdersController.php b/controllers/admin/AdminOrdersController.php index 017808c60..9d4f3327c 100644 --- a/controllers/admin/AdminOrdersController.php +++ b/controllers/admin/AdminOrdersController.php @@ -246,11 +246,10 @@ class AdminOrdersControllerCore extends AdminController ), 'osname' => array( 'title' => $this->l('Status'), - 'type' => 'select', + 'type' => 'select_multiple_or', 'color' => 'color', 'list' => $this->statuses_array, 'filter_key' => 'os!id_order_state', - 'filter_type' => 'int', 'order_key' => 'osname', 'optional' => true, 'visible_default' => true