Add filter of type text in backend list (#3094)

Fixes #3048, credit to @ChVuagniaux
This commit is contained in:
Christophe Vuagniaux 2017-11-06 19:07:53 +01:00 committed by Luke Towers
parent 712dcf9412
commit cbcdd76ff2
4 changed files with 85 additions and 1 deletions

View File

@ -142,6 +142,7 @@ class Filter extends WidgetBase
}
break;
case 'numberrange':
if ($scope->value && is_array($scope->value) && count($scope->value) === 2 &&
$scope->value[0] &&
@ -157,6 +158,12 @@ class Filter extends WidgetBase
$params['max'] = $max ? $max : null;
}
break;
case 'text':
$params['value'] = $scope->value;
$params['size'] = array_get($scope->config, 'size', 10);
break;
}
@ -238,7 +245,7 @@ class Filter extends WidgetBase
$this->setScopeValue($scope, $number);
break;
case 'numberrange':
case 'numberrange':
$numbers = $this->numbersFromAjax(post('options.numbers'));
if (!empty($numbers)) {
@ -252,6 +259,19 @@ class Filter extends WidgetBase
$this->setScopeValue($scope, $numbers);
break;
case 'text':
$values = post('options.value');
if (!is_null($values) && $values !== '') {
list($value) = $values;
}
else {
$value = null;
}
$this->setScopeValue($scope, $value);
break;
}
/*
@ -705,6 +725,25 @@ class Filter extends WidgetBase
break;
case 'text':
/*
* Condition
*/
if ($scopeConditions = $scope->conditions) {
$query->whereRaw(DbDongle::parse(strtr($scopeConditions, [
':value' => Db::getPdo()->quote($scope->value),
])));
}
/*
* Scope
*/
elseif ($scopeMethod = $scope->scope) {
$query->$scopeMethod($scope->value);
}
break;
default:
$value = is_array($scope->value) ? array_keys($scope->value) : $scope->value;

View File

@ -0,0 +1,15 @@
<div class="filter-scope text loading-indicator-container size-input-text">
<label class="filter-label">
<?= e(trans($scope->label)) ?>:
<input type="text"
name="options[value][]"
data-request="listFilter::onFilterUpdate"
data-request-data="'scopeName':'<?= $scope->scopeName ?>'"
data-track-input
data-load-indicator
data-load-indicator-opaque
size="<?= $size ?>"
value="<?= isset($value) ? $value:''; ?>"
class="form-control"/>
</label>
</div>

View File

@ -86,6 +86,31 @@
}
}
&.text {
padding: 0 10px;
&, label {
margin: 0;
}
.form-control {
display: inline;
width: auto;
height: 30px;
margin-left: 10px;
}
&:after {
content: '';
}
.loading-indicator {
top: -2px;
right: 7px;
left: auto;
}
}
&:hover, &.active {
&, &.custom-checkbox label {
color: @color-filter-text-active;

View File

@ -2881,6 +2881,11 @@ ul.autocomplete.dropdown-menu.inspector-autocomplete li a{padding:5px 12px;white
.control-filter > .filter-scope.checkbox,.control-filter > .filter-scope.checkbox label{margin-bottom:0}
.control-filter > .filter-scope.checkbox label{padding-left:25px}
.control-filter > .filter-scope.checkbox:after{content:''}
.control-filter > .filter-scope.text{padding:0 10px}
.control-filter > .filter-scope.text,.control-filter > .filter-scope.text label{margin:0}
.control-filter > .filter-scope.text .form-control{display:inline;width:auto;height:30px;margin-left:10px}
.control-filter > .filter-scope.text:after{content:''}
.control-filter > .filter-scope.text .loading-indicator{top:-2px;right:7px;left:auto}
.control-filter > .filter-scope:hover,.control-filter > .filter-scope.active,.control-filter > .filter-scope:hover.custom-checkbox label,.control-filter > .filter-scope.active.custom-checkbox label{color:#000000}
.control-filter > .filter-scope:hover .filter-label,.control-filter > .filter-scope.active .filter-label{color:#000000}
.control-filter > .filter-scope:hover.active .filter-setting,.control-filter > .filter-scope.active.active .filter-setting{background-color:#5f9a4c}