/**
@module ember-flexberry
*/
import Mixin from '@ember/object/mixin';
import { predicateForFilter } from 'ember-flexberry/utils/filter';
import Condition from 'ember-flexberry-data/query/condition';
import { ComplexPredicate } from 'ember-flexberry-data/query/predicate';
/**
Mixin for route, that restrictions on the list form.
@example
```javascript
// app/controllers/employees.js
import Controller from '@ember/controller';
import LimitedController from 'ember-flexberry/mixins/limited-controller'
export default Controller.extend(LimitedController, {
...
});
```
```javascript
// app/routes/employees.js
import Route from '@ember/routing/route';
import LimitedRoute from 'ember-flexberry/mixins/limited-route'
export default Route.extend(LimitedRoute, {
...
});
```
```handlebars
<!-- app/templates/employees.hbs -->
...
{{flexberry-objectlistview
...
enableFilters=enableFilters
filters=filters
applyFilters=(action "applyFilters")
resetFilters=(action "resetFilters")
...
filterButton=true
filterText=filter
filterByAnyMatch=(action 'filterByAnyMatch')
...
}}
...
```
@class LimitedRouteMixin
@uses <a href="https://www.emberjs.com/api/ember/release/classes/Mixin">Mixin</a>
*/
export default Mixin.create({
/**
Configuration hash for this route's queryParams. [More info](https://www.emberjs.com/api/ember/release/classes/Route/properties/queryParams?anchor=queryParams).
@property queryParams
@type Object
*/
queryParams: {
filter: { refreshModel: true },
filterCondition: { refreshModel: true }
},
/**
String with search query.
@property filter
@type String
@default null
*/
filter: null,
/**
Result predicate with all restrictions for olv.
@property resultPredicate
@type BasePredicate
@default null
*/
resultPredicate: null,
/**
Result predicate with filters restrictions for olv.
@property filterPredicate
@type BasePredicate
@default null
*/
filterPredicate: null,
/**
Builds predicate for filter.
@example
```javascript
// app/routes/example.js
...
predicateForFilter(filter) {
if (filter.type === 'string' && filter.condition === 'like') {
return new StringPredicate(filter.name).contains(filter.pattern);
}
return this._super(...arguments);
},
...
```
@method predicateForFilter
@param {Object} filter Object (`{ name, condition, pattern }`) with parameters for filter.
@return {BasePredicate|null} Predicate to filter through.
*/
predicateForFilter: predicateForFilter,
/**
Return predicate for `QueryBuilder` or `undefined`.
@method _filtersPredicate
@return {BasePredicate|undefined} Predicate for `QueryBuilder` or `undefined`.
@private
*/
_filtersPredicate() {
let filters = this.controllerFor(this.routeName).get('filters');
if (filters) {
let predicates = [];
for (let filter in filters) {
if (filters.hasOwnProperty(filter)) {
let predicate = this.predicateForFilter(filters[filter]);
if (predicate) {
predicates.push(predicate);
}
}
}
return predicates.length ? predicates.length > 1 ? new ComplexPredicate(Condition.And, ...predicates) : predicates[0] : undefined;
}
return undefined;
}
});