diff --git a/dist/amd/behaviors/filterable-store.js b/dist/amd/behaviors/filterable-store.js index d5c4aba..0dd9177 100644 --- a/dist/amd/behaviors/filterable-store.js +++ b/dist/amd/behaviors/filterable-store.js @@ -34,6 +34,7 @@ define(['exports', 'angular', './behavior', '../store', './transformable', '../u _get(Object.getPrototypeOf(FilterableStoreBehavior.prototype), 'constructor', this).apply(this, arguments); + this.searchText = null; this.collection = collection || 'items'; this.transformerWeight = transformerWeight || 25; this.filters = new Map(); @@ -57,12 +58,16 @@ define(['exports', 'angular', './behavior', '../store', './transformable', '../u } }, { key: 'onChangeSearch', - value: function onChangeSearch(expression) { - this.onChangeFilter('__search', expression); + value: function onChangeSearch(searchText) { + if (_angular2['default'].isString(searchText) && searchText.trim().length > 0) { + this.searchText = searchText; + this.onChangeFilter('__search', searchText); + } } }, { key: 'onClearSearch', value: function onClearSearch() { + this.searchText = null; this.onClearFilter('__search'); } }, { diff --git a/dist/amd/behaviors/filterable-store.js.map b/dist/amd/behaviors/filterable-store.js.map index 1f808da..5414948 100644 --- a/dist/amd/behaviors/filterable-store.js.map +++ b/dist/amd/behaviors/filterable-store.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/behaviors/filterable-store.js"],"names":[],"mappings":"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","file":"filterable-store.js","sourcesContent":["import angular from 'angular';\nimport {Behavior} from './behavior';\nimport {Handler as handlerDecorator} from '../store';\n\nimport {\n Transformer,\n Transformable as transformableDecorator\n} from './transformable';\n\nimport {\n addBehavior,\n camelcase,\n Inject as injectDecorator\n} from '../utils';\n\nexport class FilterableStoreBehavior extends Behavior {\n constructor(instance, {collection, transformerWeight} = {}) {\n super(...arguments);\n\n this.collection = collection || 'items';\n this.transformerWeight = transformerWeight || 25;\n this.filters = new Map();\n }\n\n get $filter() {\n return this.instance.$filter;\n }\n\n get transformableCollection() {\n return this.instance.transformables[this.collection];\n }\n\n get transformer() {\n if (!this._transformer) {\n this._transformer = new Transformer('filterableStore', items => items, this.transformerWeight);\n }\n return this._transformer;\n }\n\n onChangeFilter(filterName, expression, comparator) {\n this.filters.set(filterName, items => {\n return this.$filter('filter')(items, expression, comparator);\n });\n this.doFilter();\n }\n\n onClearFilter(filterName) {\n this.filters.delete(filterName);\n this.doFilter();\n }\n\n onChangeSearch(expression) {\n this.onChangeFilter('__search', expression);\n }\n\n onClearSearch() {\n this.onClearFilter('__search');\n }\n\n doFilter() {\n const collection = this.transformableCollection;\n const transformer = this.transformer;\n\n transformer.fn = items => {\n let filtered = items.slice();\n\n for (const filterFn of this.filters.values()) {\n filtered = filterFn(filtered);\n }\n\n return filtered;\n };\n\n if (collection.transformers.indexOf(transformer) >= 0) {\n collection.refresh();\n } else {\n collection.addTransformer(transformer);\n }\n }\n}\n\nexport function FilterableStore(config) {\n return cls => {\n let preparedConfig = config;\n if (angular.isString(config)) {\n preparedConfig = {entity: config};\n }\n\n preparedConfig = Object.assign({\n collection: 'items',\n entity: cls.name.replace(/store$/i, '')\n }, preparedConfig);\n preparedConfig.entity = camelcase(preparedConfig.entity);\n\n injectDecorator()(cls.prototype, '$filter');\n transformableDecorator()(cls.prototype, preparedConfig.collection);\n\n const changeFilterHandlerName = `on${preparedConfig.entity}ChangeFilter`;\n const clearFilterHandlerName = `on${preparedConfig.entity}ClearFilter`;\n handlerDecorator(null, false)(cls.prototype, changeFilterHandlerName);\n handlerDecorator(null, false)(cls.prototype, clearFilterHandlerName);\n\n const changeSearchHandlerName = `on${preparedConfig.entity}ChangeSearch`;\n const clearSearchHandlerName = `on${preparedConfig.entity}ClearSearch`;\n handlerDecorator(null, false)(cls.prototype, changeSearchHandlerName);\n handlerDecorator(null, false)(cls.prototype, clearSearchHandlerName);\n\n addBehavior(cls, FilterableStoreBehavior, {\n property: 'filterableStore',\n config: preparedConfig,\n proxy: [\n `${changeFilterHandlerName}:onChangeFilter`,\n `${clearFilterHandlerName}:onClearFilter`,\n `${changeSearchHandlerName}:onChangeSearch`,\n `${clearSearchHandlerName}:onClearSearch`\n ]\n });\n };\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/behaviors/filterable-store.js"],"names":[],"mappings":"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","file":"filterable-store.js","sourcesContent":["import angular from 'angular';\nimport {Behavior} from './behavior';\nimport {Handler as handlerDecorator} from '../store';\n\nimport {\n Transformer,\n Transformable as transformableDecorator\n} from './transformable';\n\nimport {\n addBehavior,\n camelcase,\n Inject as injectDecorator\n} from '../utils';\n\nexport class FilterableStoreBehavior extends Behavior {\n constructor(instance, {collection, transformerWeight} = {}) {\n super(...arguments);\n\n this.searchText = null;\n this.collection = collection || 'items';\n this.transformerWeight = transformerWeight || 25;\n this.filters = new Map();\n }\n\n get $filter() {\n return this.instance.$filter;\n }\n\n get transformableCollection() {\n return this.instance.transformables[this.collection];\n }\n\n get transformer() {\n if (!this._transformer) {\n this._transformer = new Transformer('filterableStore', items => items, this.transformerWeight);\n }\n return this._transformer;\n }\n\n onChangeFilter(filterName, expression, comparator) {\n this.filters.set(filterName, items => {\n return this.$filter('filter')(items, expression, comparator);\n });\n this.doFilter();\n }\n\n onClearFilter(filterName) {\n this.filters.delete(filterName);\n this.doFilter();\n }\n\n onChangeSearch(searchText) {\n if (angular.isString(searchText) && searchText.trim().length > 0) {\n this.searchText = searchText;\n this.onChangeFilter('__search', searchText);\n }\n }\n\n onClearSearch() {\n this.searchText = null;\n this.onClearFilter('__search');\n }\n\n doFilter() {\n const collection = this.transformableCollection;\n const transformer = this.transformer;\n\n transformer.fn = items => {\n let filtered = items.slice();\n\n for (const filterFn of this.filters.values()) {\n filtered = filterFn(filtered);\n }\n\n return filtered;\n };\n\n if (collection.transformers.indexOf(transformer) >= 0) {\n collection.refresh();\n } else {\n collection.addTransformer(transformer);\n }\n }\n}\n\nexport function FilterableStore(config) {\n return cls => {\n let preparedConfig = config;\n if (angular.isString(config)) {\n preparedConfig = {entity: config};\n }\n\n preparedConfig = Object.assign({\n collection: 'items',\n entity: cls.name.replace(/store$/i, '')\n }, preparedConfig);\n preparedConfig.entity = camelcase(preparedConfig.entity);\n\n injectDecorator()(cls.prototype, '$filter');\n transformableDecorator()(cls.prototype, preparedConfig.collection);\n\n const changeFilterHandlerName = `on${preparedConfig.entity}ChangeFilter`;\n const clearFilterHandlerName = `on${preparedConfig.entity}ClearFilter`;\n handlerDecorator(null, false)(cls.prototype, changeFilterHandlerName);\n handlerDecorator(null, false)(cls.prototype, clearFilterHandlerName);\n\n const changeSearchHandlerName = `on${preparedConfig.entity}ChangeSearch`;\n const clearSearchHandlerName = `on${preparedConfig.entity}ClearSearch`;\n handlerDecorator(null, false)(cls.prototype, changeSearchHandlerName);\n handlerDecorator(null, false)(cls.prototype, clearSearchHandlerName);\n\n addBehavior(cls, FilterableStoreBehavior, {\n property: 'filterableStore',\n config: preparedConfig,\n proxy: [\n `${changeFilterHandlerName}:onChangeFilter`,\n `${clearFilterHandlerName}:onClearFilter`,\n `${changeSearchHandlerName}:onChangeSearch`,\n `${clearSearchHandlerName}:onClearSearch`\n ]\n });\n };\n}\n"]} \ No newline at end of file diff --git a/src/behaviors/filterable-store.js b/src/behaviors/filterable-store.js index c062985..dfaea39 100644 --- a/src/behaviors/filterable-store.js +++ b/src/behaviors/filterable-store.js @@ -17,6 +17,7 @@ export class FilterableStoreBehavior extends Behavior { constructor(instance, {collection, transformerWeight} = {}) { super(...arguments); + this.searchText = null; this.collection = collection || 'items'; this.transformerWeight = transformerWeight || 25; this.filters = new Map(); @@ -49,11 +50,15 @@ export class FilterableStoreBehavior extends Behavior { this.doFilter(); } - onChangeSearch(expression) { - this.onChangeFilter('__search', expression); + onChangeSearch(searchText) { + if (angular.isString(searchText) && searchText.trim().length > 0) { + this.searchText = searchText; + this.onChangeFilter('__search', searchText); + } } onClearSearch() { + this.searchText = null; this.onClearFilter('__search'); }