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