Сетка контрольных столбцов ExtJS - отметьте столбцы слева, снимите отметки справа

Я работаю над сеткой ExtJS, состоящей из текстового столбца, детализирующего элементы в сетке, и нескольких checkColumns, которые показывают, прошел ли элемент через определенную точку в процессе:

Ext.Loader.setConfig({
    enabled: true
});
Ext.Loader.setPath('Ext.ux', '../ux');

Ext.require([
    'Ext.ux.CheckColumn'
]);

Ext.onReady(function(){
    Ext.define('ProcessModel', {
        extend: 'Ext.data.Model',
        fields: [
            'Item',
            'Phase1',
            'Phase2',
            'Phase3',
            'Phase4',
            'Phase5',
            'Phase6',
            'Phase7',
            'Phase8',
            'Phase9',
            'Phase10'
        ]
    });

    // create the Data Store
    var processStore = Ext.create('Ext.data.Store', {
        model: 'processModel',
        autoLoad: true,
        proxy: {
            // load using HTTP
            type: 'ajax',
            url: '<?= $site_url ?>/Production/Processes/<?= $itemId ?>',
            reader: {
                type: 'json',
                model: 'ProcessModel',
                root: data
            }
        }
    });

    Ext.create('Ext.grid.Panel', {
        width: 800,
        store: processStore,
        title: 'Processes',
        tbar: [
            {
                xtype: 'button',
                text: 'Update',
                handler: function(){
                    //TODO: update by POST function
                }
            }
        ],
        columns: [
            {
                text: 'Item',
                dataIndex: 'Item'
            },{
                xtype: 'checkcolumn',
                text: 'Phase 1',
                dataIndex:'Phase1'
            },{
                xtype: 'checkcolumn',
                text: 'Phase 2',
                dataIndex:'Phase2'
            },{
                xtype: 'checkcolumn',
                text: 'Phase 3',
                dataIndex:'Phase3'
            },{
                xtype: 'checkcolumn',
                text: 'Phase 4',
                dataIndex:'Phase4'
            },{
                xtype: 'checkcolumn',
                text: 'Phase 5',
                dataIndex:'Phase5'
            },{
                xtype: 'checkcolumn',
                text: 'Phase 6',
                dataIndex:'Phase6'
            },{
                xtype: 'checkcolumn',
                text: 'Phase 7',
                dataIndex:'Phase7'
            },{
                xtype: 'checkcolumn',
                text: 'Phase 8',
                dataIndex:'Phase8'
            },{
                xtype: 'checkcolumn',
                text: 'Phase 9',
                dataIndex:'Phase9'
            },{
                xtype: 'checkcolumn',
                text: 'Phase 10',
                dataIndex:'Phase10'
            }
        ],
        renderTo: Ext.get('sencha_processes')
    });
});

Я не уверен, как реализовать функциональность, при которой, когда флажок установлен для данной строки, он проверяет все, что находится слева от этого флажка, то есть отметьте «Фаза 5» для «Элемент 3» и фазы 1-4 для «Элемент». 3 'также проверяются. Я предполагаю, что аналогичный код можно было бы использовать для снятия флажков справа, если бы он не был отмечен, т.е. снимите флажок «Фаза 5» для «элемента 7», а фазы 6-10 для «элемента 7» не отмечены.

Я думаю, он будет использовать событие checkChange, где функция будет проверять, было ли изменение на 'checked' / true, переместиться вверх по DOM, каким-то образом определить, какой столбец был слева от данного столбца, и установить флажок для данного rowIndex to checked, что, в свою очередь, может (?) запустить свое событие checkChange и проходить его каскадно, пока не достигнет первого столбца и не остановится; может быть более эффективный способ сделать это, но я не знаю наверняка.

Это также может обрабатывать uncheck-to-right, проверяя изменение было на 'unchecked' / false, переходя вправо и снимая отметку с каждого столбца, пока последний столбец не будет достигнут и не будет снят.

Некоторый псевдокод, который, надеюсь, поможет:

listeners: {
    checkChange: {
        function (this, rowIndex, checked, eOpts) {
            if(checked) {
                column = this.up('column').getNameOrId -1;
                boxToLeft = column.down('row').rowIndex.getCheckBox;
                boxToLeft.check;
            };
            if(!checked) {
                column = this.up('column').getNameOrId +1;
                boxToRight = column.down('row').rowIndex.getCheckBox;
                boxToLeft.uncheck;
            }
        }
    }

Как бы это было закодировано? Нужно ли мне применять идентификаторы к моим столбцам, чтобы разрешить итерацию через универсальную функцию? Является ли решение несколькими функциями для каждого столбца? Какие свойства / методы / события мне использовать?

Кроме того, я также буду реализовывать «выбрать / отменить выбор всего в столбце», но здесь уже есть достаточно ответов, и, возможно, вызовет «выделить все влево / отменить выбор все вправо» как отдельный событие, поэтому я упоминаю его только в том случае, если он имеет отношение к этому вопросу.


person David Smithson    schedule 23.01.2014    source источник
comment
Вы работаете с «видом» сетки. вы должны делать это с записями, модель.   -  person Mohammadreza    schedule 03.09.2014


Ответы (1)


Не пытайтесь установить флажок в столбцах, просто получите запись, привязанную к строке, в которой пользователь установил флажок.

Затем вы можете изменить значения записи phase1 - phase10 в зависимости от того, в каком столбце пользователь установил флажок.

Ваш checkChange обработчик событий должен выглядеть так:

function onCheckChange (column, rowIndex, checked, eOpts) {
    // get record which is bind to row on which user click on checbox
    var record = processStore.getAt(rowIndex); 

    // get index of column   
    var columnIndex = column.getIndex();

    // change record values
    for (var i = 1; i <= 10; i++) {
        if (i <= columnIndex) {
            record.set('Phase'+i, true);
        } 
        else 
        {
            record.set('Phase'+i, false);
        }
    }
} 

Поиграйте с примером: https://fiddle.sencha.com/#fiddle/2t4

person Akatum    schedule 23.01.2014
comment
Мне придется отредактировать часть моего кода, чтобы он лучше соответствовал этому, но ваш ответ делает то, что мне нужно, спасибо. - person David Smithson; 23.01.2014