Uses code from ExtJS 6.0.1 ComboBox.js to overwrite 'doLocalQuery',
adding a new property 'searchFields' which allows to specify fields from
the bound store which will all be searched (OR filter, i.e. the searched
value can appear in any column specified).

Signed-off-by: Stefan Reiter <s.rei...@proxmox.com>
---
 form/ComboGrid.js | 82 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 82 insertions(+)

diff --git a/form/ComboGrid.js b/form/ComboGrid.js
index c3e7782..d470a98 100644
--- a/form/ComboGrid.js
+++ b/form/ComboGrid.js
@@ -310,6 +310,88 @@ Ext.define('Proxmox.form.ComboGrid', {
         return picker;
     },
 
+    createStoreFilter: function(property, queryString, suffix) {
+       var me = this;
+
+       return new Ext.util.Filter({
+           id: me.id + '-filter-' + suffix,
+           anyMatch: me.anyMatch,
+           caseSensitive: me.caseSensitive,
+           root: 'data',
+           property: property,
+           value: me.enableRegEx ? new RegExp(queryString) : queryString
+       });
+    },
+
+    doLocalQuery: function(queryPlan) {
+       var me = this,
+           queryString = queryPlan.query,
+           store = me.getStore(),
+           filter = me.queryFilter,
+           multiFilters;
+
+       me.queryFilter = null;
+       // Must set changingFilters flag for this.checkValueOnChange.
+       // the suppressEvents flag does not affect the filterchange event
+       me.changingFilters = true;
+       if (filter) {
+           store.removeFilter(filter, true);
+       }
+
+       // Querying by a string...
+       if (queryString) {
+           // proxmox overrides: allow filtering multiple fields
+           if (Ext.isArray(me.searchFields)) {
+               // Since me.queryFilter is used elsewhere as a single filter, we
+               // cannot assign an array. Instead, we create a function
+               // manually applying the different filters OR'd together and set
+               // that as the filterFn of a single, combined filter.
+               multiFilters = [];
+               Ext.Array.each(me.searchFields, function (v) {
+                   multiFilters.push(me.createStoreFilter(
+                       v,
+                       queryString,
+                       'multi-' + v
+                   ));
+               });
+
+               filter = me.queryFilter = new Ext.util.Filter({
+                   id: me.id + '-filter-multi',
+                   root: 'data',
+                   filterFn: function (item) {
+                       for (var i = 0; i < multiFilters.length; i++) {
+                           if (multiFilters[i].getFilterFn()(item)) {
+                               return true;
+                           }
+                       }
+                       return false;
+                   }
+               })
+           } else {
+               filter = me.queryFilter = me.createStoreFilter(
+                   me.displayField,
+                   queryString,
+                   'single'
+               );
+           }
+
+           store.addFilter(filter, true);
+       }
+       me.changingFilters = false;
+
+       // Expand after adjusting the filter if there are records or if 
emptyText is configured.
+       if (me.store.getCount() || me.getPicker().emptyText) {
+           // The filter changing was done with events suppressed, so
+           // refresh the picker DOM while hidden and it will layout on show.
+           me.getPicker().refresh();
+           me.expand();
+       } else {
+           me.collapse();
+       }
+
+       me.afterQuery(queryPlan);
+    },
+
     isValueInStore: function(value) {
        var me = this;
        var store = me.store;
-- 
2.20.1


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to