Сетка свойств с выпадающим списком - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть какой-то магазин, в котором формируются данные.На панели выглядит, как «fieldName» и текстовое поле (в зависимости от вызванной формы).

Например, на одной форме отображается «имя документа» и поле, на другой: дата продажи и поле даты,Данные формируются динамически.

Вот хранилище:

tableTempStore = new Ext.data.JsonStore({
    url: objectUrlAddress,
    baseParams: {
        'objectID': objectID
    },
    root: 'Fields',
    fields: [{
        name: 'Hint'
    }, {
        name: 'Type',
        type: 'int'
    }, {
        name: 'Value'
    }, {
        name: 'Index',
        type: 'int'
    }, {
        name: 'IsRequired',
        type: 'bool'
    }, {
        name: 'Identifier'
    }, {
        name: 'EnumList'
    }, {
        name: 'Directory'
    }, {
        name: 'Data'
    }],
    listeners: {
        load: function (obj, records) {
            Ext.each(records, function (rec) {
                var item = null;
                switch (rec.get('Type')) {
                case 0: // целое
                    item = new Ext.form.NumberField();
                    item.id = rec.get('Identifier');
                    item.fieldLabel = rec.get('Hint');
                    var isRequired = rec.get('IsRequired');
                    item.anchor = '100%';
                    item.allowBlank = !isRequired;
                    item.disabled = editDisabled;
                    item.value = rec.get('Data');
                    break;
                case 1: // вещественное
                    item = new Ext.form.NumberField();
                    item.id = rec.get('Identifier');
                    item.fieldLabel = rec.get('Hint');
                    var isRequired = rec.get('IsRequired');
                    item.anchor = '100%';
                    item.allowBlank = !isRequired;
                    item.allowDecimals = true;
                    item.disabled = editDisabled;
                    item.value = rec.get('Data');
                    break;
                case 5: // SQL-справочник
                    var dataValues = Ext.util.JSON.decode(rec.get('EnumList'));
                    var dataArray = Object.keys(dataValues).map(function (k) {
                        return [k, dataValues[k]]
                    });
                    item = new Ext.form.ComboBox({
                        typeAhead: true,
                        width: '100%',
                        triggerAction: 'all',
                        forceSelection: true,
                        editable: false,
                        hiddenName: rec.get('Identifier'),
                        mode: 'local',
                        store: new Ext.data.ArrayStore({
                            fields: [{
                                name: 'myId',
                                type: 'string'
                            }, {
                                name: 'displayText'
                            }],
                            data: dataArray
                        }),
                        valueField: 'myId',
                        displayField: 'displayText',
                        disabled: editDisabled
                    });
                    item.id = '_' + rec.get('Identifier');
                    item.anchor = '100%';
                    item.fieldLabel = rec.get('Hint');
                    var isRequired = rec.get('IsRequired');
                    item.allowBlank = !isRequired;
                    item.value = rec.get('Data');
                    break;
                }
                if (item != null) {
                    templateGrids.add(item);
                    columnsTable = item.__proto__.constructor.xtype;
                    var s = null;
                    else if (rec.get('Type') == 4) {
                        var dataValues = Ext.util.JSON.decode(rec.get('EnumList'));
                        var dataArray = Object.keys(dataValues).map(function (k) {
                            return [k, dataValues[k]]
                        });
                        combo = new Ext.grid.GridEditor(new Ext.form.ComboBox({
                            id: item.id,
                            allowBlank: item.allowBlank,
                            typeAhead: true,
                            lazyRender: true,
                            triggerAction: 'all',
                            forceSelection: true,
                            queryMode: 'local',
                            editable: false,
                            value: item.value,
                            hiddenName: rec.get('Identifier'),
                            mode: 'local',
                            store: new Ext.data.ArrayStore({
                                fields: [{
                                    name: 'myId',
                                    type: 'string'
                                }, {
                                    name: 'displayText',
                                    type: 'string'
                                }],
                                data: dataArray
                            }),
                            valueField: "myId",
                            displayField: "displayText",
                            disabled: editDisabled
                        }));
                    }
                    source[item.fieldLabel] = '';
                    grid.customEditors['Сохранить в'] = combo;

                    grid.getColumnModel().setConfig([{
                        header: "Поле"
                    }, {
                        header: "Значение",
                        dataIndex: '',
                        renderer: Ext.util.Format.comboRenderer(combo)
                    }]);
                    grid.setSource(source);
                };
            });
        }
    }
});

Вот моя сетка свойств:

grid = new Ext.grid.PropertyGrid({
    url: objectUrlAddress,
    id: 'propGrid',
    autoFill: true,
    autoHeight: true,
    width: 200,
    store: tableTempStore,
    width: 600,
    style: 'margin:0 auto;margin-top:10px;'
});

Проблема со списком.В ячейке отображается itemValue вместо fieldValue, и я не знаю, как решить эту проблему.Как я могу сделать?Заранее спасибо.

Для рендеринга я использовал функцию:

Ext.util.Format.comboRenderer = function (combo) {
    return function (value) {
        var record = combo.findRecord(combo.valueField, value);
        return record ? record.get(combo.displayField) : combo.valueNotFoundText;
    }
};

Но это не сработало.

...