web-dev-qa-db-ja.com

ExtJs-列ヘッダーの検索フィールドでグリッドをフィルタリングします

ExtJsには、グリッドをフィルターする多くのオプションがあります。 この質問 で参照されているように、ドキュメントには2つの素晴らしい例があります。

  1. リモートフィルタリング
  2. ローカルフィルタリング

ただし、デフォルトのドロップダウンメニューの Ext.ux.grid.FiltersFeature は私にとって本当に扱いにくいように見えます。人間工学に基づいた適切な選択は、@ Ctacusが 彼の質問 に示すように、列ヘッダーに検索フィールドを作成することです。

これはどのように達成できますか?

8
Lorenz Meyer

疎なドキュメントによるかなりの調査の結果、SOでのすばらしい質問と回答のおかげで、この機能を追加し、構成を可能にする単純なクラスを思いつきました。

次のようになります。

Search filter fields in column header

このフィールドをグリッドに次のように追加します。

Ext.define('Sandbox.view.OwnersGrid', {
    extend: 'Ext.grid.Panel',
    requires: ['Sandbox.view.SearchTrigger'],
    alias: 'widget.ownersGrid',
    store: 'Owners',
    columns: [{
        dataIndex: 'id',
        width: 50,
        text: 'ID'
    }, {
        dataIndex: 'name',
        text: 'Name',
    items:[{
        xtype: 'searchtrigger',
        autoSearch: true
    }]
},

次のconfigsが可能であり、 Ext.util.Filter

  • anyMatch
  • caseSensitive
  • exactMatch
  • operator
  • さらに、autoSearchを使用できます。 trueの場合、入力時にフィルターが検索されます。falseの場合、または設定されていない場合は、検索アイコンをクリックしてフィルターを適用する必要があります。

ExtJs 5/6出典:

Ext.define('Sandbox.view.SearchTrigger', {
    extend: 'Ext.form.field.Text',
    alias: 'widget.searchtrigger',
    triggers:{
        search: {
            cls: 'x-form-search-trigger',
            handler: function() {
                this.setFilter(this.up().dataIndex, this.getValue())
            }
        },
        clear: {
            cls: 'x-form-clear-trigger',
            handler: function() {
                this.setValue('')
                if(!this.autoSearch) this.setFilter(this.up().dataIndex, '')
            }
        }
    },
    setFilter: function(filterId, value){
        var store = this.up('grid').getStore();
        if(value){
            store.removeFilter(filterId, false)
            var filter = {id: filterId, property: filterId, value: value};
            if(this.anyMatch) filter.anyMatch = this.anyMatch
            if(this.caseSensitive) filter.caseSensitive = this.caseSensitive
            if(this.exactMatch) filter.exactMatch = this.exactMatch
            if(this.operator) filter.operator = this.operator
            console.log(this.anyMatch, filter)
            store.addFilter(filter)
        } else {
            store.filters.removeAtKey(filterId)
            store.reload()
        }
    },
    listeners: {
        render: function(){
            var me = this;
            me.ownerCt.on('resize', function(){
                me.setWidth(this.getEl().getWidth())
            })
        },
        change: function() {
            if(this.autoSearch) this.setFilter(this.up().dataIndex, this.getValue())
        }
    }
})

ExtJs 6.2.0の場合、 以下のバグとその回避策 がこれに関連します。そうでない場合、列をflexedにすることはできません。

ExtJs 4出典:

Ext.define('Sandbox.view.SearchTrigger', {
    extend: 'Ext.form.field.Trigger',
    alias: 'widget.searchtrigger',
    triggerCls: 'x-form-clear-trigger',
    trigger2Cls: 'x-form-search-trigger',
    onTriggerClick: function() {
        this.setValue('')
        this.setFilter(this.up().dataIndex, '')
    },
    onTrigger2Click: function() {
        this.setFilter(this.up().dataIndex, this.getValue())
    },
    setFilter: function(filterId, value){
        var store = this.up('grid').getStore();
        if(value){
            store.removeFilter(filterId, false)
            var filter = {id: filterId, property: filterId, value: value};
            if(this.anyMatch) filter.anyMatch = this.anyMatch
            if(this.caseSensitive) filter.caseSensitive = this.caseSensitive
            if(this.exactMatch) filter.exactMatch = this.exactMatch
            if(this.operator) filter.operator = this.operator
            console.log(this.anyMatch, filter)
            store.addFilter(filter)
        } else {
            store.filters.removeAtKey(filterId)
            store.reload()
        }
    },
    listeners: {
        render: function(){
            var me = this;
            me.ownerCt.on('resize', function(){
                me.setWidth(this.getEl().getWidth())
            })
        },
        change: function() {
            if(this.autoSearch) this.setFilter(this.up().dataIndex, this.getValue())
        }
    }
})
23
Lorenz Meyer