diff --git a/modules/backend/lang/en/lang.php b/modules/backend/lang/en/lang.php index bf250a7d4..92567e3f3 100644 --- a/modules/backend/lang/en/lang.php +++ b/modules/backend/lang/en/lang.php @@ -440,7 +440,8 @@ return [ 'filter' => [ 'all' => 'all', 'options_method_not_exists' => "The model class :model must define a method :method() returning options for the ':filter' filter.", - 'date_all' => 'all period' + 'date_all' => 'all periods', + 'number_all' => 'all numbers', ], 'import_export' => [ 'upload_csv_file' => '1. Upload a CSV file', diff --git a/modules/backend/widgets/Filter.php b/modules/backend/widgets/Filter.php index 21b3f457d..038104032 100644 --- a/modules/backend/widgets/Filter.php +++ b/modules/backend/widgets/Filter.php @@ -135,6 +135,12 @@ class Filter extends WidgetBase } } + break; + case 'number': + if (is_numeric($scope->value)) { + $params['number'] = $scope->value; + } + break; case 'numberrange': if ($scope->value && is_array($scope->value) && count($scope->value) === 2 && @@ -144,25 +150,14 @@ class Filter extends WidgetBase $min = $scope->value[0]; $max = $scope->value[1]; - if($min) { - $params['minStr'] = $min; - $params['min'] = $min; - } - else { - $params['minStr'] = ''; - $params['min'] = null; - } + $params['minStr'] = $min ? $min : ''; + $params['min'] = $min ? $min : null; - if($max) { - $params['maxStr'] = $max; - $params['max'] = $max; - } - else { - $params['maxStr'] = '∞'; - $params['max'] = null; - } + $params['maxStr'] = $max ? $max : '∞'; + $params['max'] = $max ? $max : null; } - break + + break; } return $this->makePartial('scope_'.$scope->type, $params); @@ -230,8 +225,22 @@ class Filter extends WidgetBase $this->setScopeValue($scope, $dates); break; + case 'number': + $numbers = $this->numbersFromAjax(post('options.numbers')); + + if (!empty($numbers)) { + list($number) = $numbers; + } + else { + $number = null; + } + + $this->setScopeValue($scope, $number); + break; + case 'numberrange': $numbers = $this->numbersFromAjax(post('options.numbers')); + if (!empty($numbers)) { list($min, $max) = $numbers; @@ -242,7 +251,7 @@ class Filter extends WidgetBase } $this->setScopeValue($scope, $numbers); - break; + break; } /* @@ -527,14 +536,6 @@ class Filter extends WidgetBase $scopeObj->{$property} = $value; } - /* - * Ensure number options are set - */ - if (!isset($config['minNumber'])) { - $scopeObj->minNumber = '0'; - $scopeObj->maxNumber = '999999999'; - } - $this->allScopes[$name] = $scopeObj; } } @@ -658,6 +659,24 @@ class Filter extends WidgetBase break; + case 'number': + if (is_numeric($scope->value)) { + /* + * Condition + */ + if ($scopeConditions = $scope->conditions) { + $query->whereRaw(DbDongle::parse(strtr($scopeConditions, [ + ':filtered' => $scope->value, + ]))); + } + /* + * Scope + */ + elseif ($scopeMethod = $scope->scope) { + $query->$scopeMethod($scope->value); + } + } + case 'numberrange': if (is_array($scope->value) && count($scope->value) > 1) { list($min, $max) = array_values($scope->value); @@ -846,7 +865,6 @@ class Filter extends WidgetBase /** * Convert an array from the posted dates * - * @param mixed $scope * @param array $dates * * @return array @@ -881,6 +899,36 @@ class Filter extends WidgetBase return $dates; } + /** + * Convert an array from the posted numbers + * + * @param array $dates + * + * @return array + */ + protected function numbersFromAjax($ajaxNumbers) + { + $numbers = []; + $numberRegex = '/\d/'; + + if (!empty($ajaxNumbers)) { + if (!is_array($ajaxNumbers) && preg_match($numberRegex, $ajaxNumbers)) { + $numbers = [$ajaxNumbers]; + } else { + foreach ($ajaxNumbers as $i => $number) { + if (preg_match($numberRegex, $number)) { + $numbers[] = $number; + } else { + $numbers = []; + break; + } + } + } + } + + return $numbers; + } + /** * @param mixed $scope * diff --git a/modules/backend/widgets/filter/partials/_scope_date.htm b/modules/backend/widgets/filter/partials/_scope_date.htm index bbdf056f2..36f2f30f7 100644 --- a/modules/backend/widgets/filter/partials/_scope_date.htm +++ b/modules/backend/widgets/filter/partials/_scope_date.htm @@ -1,6 +1,6 @@ " + class="filter-scope-date filter-has-popover range = isset($after) || isset($before) ? 'active' : '' ?>" href="javascript:;" data-scope-name="= $scope->scopeName ?>" data-scope-data="= e(json_encode([ diff --git a/modules/backend/widgets/filter/partials/_scope_number.htm b/modules/backend/widgets/filter/partials/_scope_number.htm new file mode 100644 index 000000000..be83619f5 --- /dev/null +++ b/modules/backend/widgets/filter/partials/_scope_number.htm @@ -0,0 +1,12 @@ + + + = e(trans($scope->label)) ?>: + = isset($number) ? $number : e(trans('backend::lang.filter.number_all')) ?> + diff --git a/modules/backend/widgets/filter/partials/_scope_numberrange.htm b/modules/backend/widgets/filter/partials/_scope_numberrange.htm new file mode 100644 index 000000000..d6747b86a --- /dev/null +++ b/modules/backend/widgets/filter/partials/_scope_numberrange.htm @@ -0,0 +1,12 @@ + + + = e(trans($scope->label)) ?>: + = isset($minStr) && isset($maxStr) ? ($minStr . ' → ' . $maxStr) : e(trans('backend::lang.filter.number_all')) ?> + diff --git a/modules/system/assets/ui/js/filter.dates.js b/modules/system/assets/ui/js/filter.dates.js index 72b6bfe76..be0c7568d 100644 --- a/modules/system/assets/ui/js/filter.dates.js +++ b/modules/system/assets/ui/js/filter.dates.js @@ -106,7 +106,7 @@ return ' \