On 9/10/19 7:11 PM, Stefan Reiter wrote:
> 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(+)
> 

some style comments inline, did not tested it at all and would like
to get also a ack from Dominik for this feature.

> 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
> +                 ))

Do not like the split over many newlines syntax to much, doesn't really fits
Proxmox's or ExtJS unwritten syntax style.. Nice and OK for configuration
objects, but not so much for a simple function parameter list.

Either:
let filter = me.createStoreFilter(v, queryString, 'multi-' + v);
multiFilters.push(filter);

or just use a map, below an (untested) example which uses map +
arrow function replacing 8 lines with 1:

multiFilter = Ext.Array.map(me.searchFields, (v) => me.createStoreFilter(v, 
queryString, 'multi-' + v));

or
multiFilter = Ext.Array.map(me.searchFields, (v) => {
    return 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'
> +             );

see above

> +         }
> +
> +         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;
> 


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

Reply via email to