InsertToTTCatlog.js 16.7 KB
Ext.define('amdaPlotComp.intervalSelection.InsertToTTCatlog', {
    extend: 'Ext.form.FieldSet',

    collapsible: true,
    layout: LAYOUT_STYLE,
    title: 'Add in Time Table or Catalog',
    name: 'tt-insertion-fieldset',

    fieldTypeTTCat: 'ttcat-type',
    fieldTypeName: 'ttcat-name',
    ttModuleId: 'timetab-win',
    catModuleId: 'catalog-win',
    linkedTTCatNode: null,

    parent: null,

    initComponent: function () {
        const self = this;

        const insertTypeStore = Ext.create('Ext.data.Store', {
            fields: ['key', 'name'],
            data: [
                { "key": "timeTable", "name": "TimeTable" },
                { "key": "catalog", "name": "Catalog" }
            ]
        });

        Ext.apply(self, {
            
            items: [{
                xtype: 'combo',
                fieldLabel: 'Insert In',
                store: insertTypeStore,
                queryMode: 'local',
                displayField: 'name',
                valueField: 'key',
                editable: false,
                value: 'timeTable',
                name: self.fieldTypeTTCat,
                itemId: self.fieldTypeTTCat,
            },

            {
                xtype: 'combo',
                fieldLabel: 'Name',
                editable: true,
                hideTrigger: true,
                store: Ext.create('Ext.data.Store', {
                    fields: ['text']
                }),
                name: self.fieldTypeName,
                itemId: self.fieldTypeName,
                queryMode: 'local',
                displayField: 'text',
                valueField: 'text',
                listeners: {
                    render: function (o, op) {
                        var field = this;
                        var el = this.el;
                        Ext.create('Ext.dd.DropTarget', el, {
                            ddGroup: 'explorerTree',
                            notifyOver: function (ddSource, e, data) {
                                var TTCatType = self._getFieldTypeTTCat().getValue();
                                if (data.records[0].data.leaf && (data.records[0].data.nodeType == TTCatType)) {
                                    this.valid = true;
                                    return this.dropAllowed;
                                }
                                this.valid = false;
                                return this.dropNotAllowed;
                            },
                            notifyDrop: function (ddSource, e, data) {
                                if (!this.valid)
                                    return false;
                                field.setValue(data.records[0].get('text'));
                                var store = field.getStore();
                                store.loadData([{ text: data.records[0].get('text') }], false);
                                field.setValue(data.records[0].get('text'));
                                field.fireEvent('select', field, [field.getStore().findRecord('text', data.records[0].get('text'))]);
                                return true;
                            }
                        });
                    },
                    change: function (field, newValue) {
                        // change event to handle the case when the user types a name
                        var explorerTree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID);
                        var ttCatRootNode = explorerTree.getRootNode().findChild('id', 'catalog-treeRootNode', true);

                        var matchingNodes = [];
                        var store = field.getStore();

                        amdaModel.InteractiveNode.preloadNodes(ttCatRootNode, function () {
                            matchingNodes = []; // Clear previous matches
                            ttCatRootNode.eachChild(function (node) {
                                if (newValue && node.get('text').toLowerCase().includes(newValue.toLowerCase())) {
                                    matchingNodes.push({ text: node.get('text') });
                                }
                            });
                            
                            if ((self._getFieldTypeTTCat().getValue() == 'catalog') && (matchingNodes.length > 0)) {
                                store.removeAll();
                                store.loadData(matchingNodes);
                                field.expand();
                            } else {
                                store.removeAll();
                                if (newValue) {
                                    store.add({ text: newValue });
                                    field.setValue(newValue);
                                    field.fireEvent('select', field, [store.findRecord('text', newValue)]);
                                    field.expand();
                                } else {
                                    store.removeAll();
                                    var parametersGrid = self.down('#parametersGrid');
                                    parametersGrid.getStore().removeAll();
                                    field.collapse();
                                }
                            }

                            self._getFieldTypeTTCat().on('change', function () {
                                field.setValue('');
                                store.removeAll();
                                var parametersGrid = self.down('#parametersGrid');
                                parametersGrid.getStore().removeAll();
                            });
                            
                            field.focus(false, 100);
                        });
                    },
                    select: function (combo) {
                        // select event to handle the case when the user selects a name from the dropdown
                        if(self._getFieldTypeTTCat().getValue() == 'catalog'){
                            var selectedName = combo.getRawValue();
                            var panel = combo.up('fieldset').down('panel');
                            var store = panel.down('#parametersGrid').getStore();

                            var explorerTree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID);
                            var ttCatRootNode = explorerTree.getRootNode().findChild('id', 'catalog-treeRootNode', true);
                            var nodeWithSameName = ttCatRootNode.findChild('text', selectedName, true);
                            
                            if (nodeWithSameName) {

                                var opt = {
                                    'typeTT': 'catalog',
                                    'id': nodeWithSameName.data.id,
                                    'name': selectedName
                                };

                                // Get parameters for the selected catalog
                                AmdaAction.readIntervalsForChart(opt, function (result, e) {
                                    if (result && result.success) {
                                        store.removeAll();
                                        Ext.Array.each(result.parameters, function (param) {
                                            if (param.size > 1 || param.id.includes('COMPONENT')) 
                                                return; // Skip parameters with size > 1
                                            store.add({
                                                name: param.name,
                                                id : param.id,
                                                value: ''
                                            });
                                        });
                                    }
                                });
                            } else {
                                store.removeAll();
                            }
                        }
                        self.selectUsed = true; // flag to indicate that the select event was triggered by the user
                    },
                    blur: function (field) {
                        // blur event to handle the case when the user types a name and then clicks outside the field
                        if (!self.selectUsed) {
                            var value = field.getRawValue();
                            field.fireEvent('select', field);
                        }
                        self.selectUsed = false;
                        
                    }
                }
            },
            {
                // Panel for parameters
                xtype: 'panel',
                layout: 'fit',
                title: 'Parameters',
                collapsible: true,
                hidden: true,
                // tbar: [
                //     {
                //         xtype: 'tbtext',
                //         text: 'Parameters'
                //     },
                //     '->',
                //     {
                //         iconCls: 'icon-add',
                //         text: 'Add Parameter',
                //         handler: function () {
                //             var grid = this.up('panel').down('#parametersGrid');
                //             var store = grid.getStore();
                //             store.add({ name: '', value: '' });
                //         }
                //     }
                // ],
                items: [
                    {
                        xtype: 'grid',
                        store: Ext.create('Ext.data.Store', {
                            fields: ['name', 'value']
                        }),
                        columns: [
                            { text: 'Name', dataIndex: 'name', editor: 'textfield', flex: 1 },
                            { text: 'Value', dataIndex: 'value', editor: 'textfield', flex: 1 }
                        ],
                        selType: 'cellmodel',
                        plugins: {
                            ptype: 'cellediting',
                            clicksToEdit: 1
                        },
                        height: 200,
                        width: 400,
                        itemId: 'parametersGrid',
                    }
                ],
                listeners: {
                    beforerender: function () {
                        var TTCatType = self._getFieldTypeTTCat().getValue();
                        this.setVisible(TTCatType == 'catalog');
                    },
                    render: function (o, op) {
                        self._getFieldTypeTTCat().on('change', function (field, newValue) {
                            this.setVisible(newValue == 'catalog');
                        }, this);
                    }
                }
            },

            {
                xtype: 'button',
                width: width,
                text: 'Insert Interval',
                scope: this,
                handler: function () {
                    var me = this;

                    var TTCatType = self._getFieldTypeTTCat().getValue();
                    var TTCatName = self._getFieldNameTTCat().getValue();
                    var isCatalog = (TTCatType == 'catalog');
                    myDesktopApp.getLoadedModule(isCatalog ? this.catModuleId : this.ttModuleId, true, function (module) {
                        var targetModuleUI = module.getUiContent();
                        if (me.linkedTTCatNode && (me.linkedTTCatNode.get('text') == TTCatName) && (me.linkedTTCatNode.get('nodeType') == TTCatType)) {
                            if (targetModuleUI)
                                me.insertInterval();
                            
                            else {
                                me.linkedTTCatNode.editLeaf(function () {
                                    me.insertInterval();
                                });
                            }
                        }
                        else {
                            var explorerTree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID);
                            var ttCatRootNode = explorerTree.getRootNode().findChild('id', isCatalog ? 'catalog-treeRootNode' : 'timeTable-treeRootNode', true);

                            amdaModel.InteractiveNode.preloadNodes(ttCatRootNode, function () {
                                var nodeWithSameName = null;

                                if (TTCatName != ''){
                                    nodeWithSameName = ttCatRootNode.findChild('text', TTCatName, true);
                                }

                                if (nodeWithSameName !== null){
                                    me.linkedTTCatNode = nodeWithSameName;}
                                else {
                                    module.createLinkedNode();
                                    module.getLinkedNode().set('text', TTCatName);
                                    me.linkedTTCatNode = module.getLinkedNode();
                                    var obj = {
                                        name: TTCatName,
                                        fromPlugin: true
                                    };
                                    
                                    if (isCatalog) {
                                        Ext.Msg.prompt('Define Parameters', 'Please enter parameters number for the new catalog:', function (btn, text) {
                                            if (btn == 'ok') {
                                                obj.nbParameters = parseInt(text, 10);
                                                if (isNaN(obj.nbParameters)) {
                                                    obj.nbParameters = 1;
                                                }
                                                module.name = 'color';
                                                
                                                module.createObject(obj);
                                                me.linkedTTCatNode.editLeaf(function () {
                                                    me.insertInterval();
                                                });
                                            }
                                        });
                                        return;
                                    }
                                    else {
                                        module.createObject(obj);
                                    }
                                }

                                me.linkedTTCatNode.editLeaf(function () {
                                    me.insertInterval();
                                });
                            });
                        }
                    });
                }
            }
            ]
        });

        self.callParent(arguments);
    },


    _getFieldTypeTTCat: function () {
        return this.down('#' + this.fieldTypeTTCat);
    },

    _getFieldNameTTCat: function () {
        return this.down('#' + this.fieldTypeName);
    },

    /**
     * add Interval to Time table or Catalog
     */
    insertInterval: function () {
        const self = this;
        const start = self.parent.getField1Value();
        const stop = self.parent.getField2Value();

        const TTCatType = self._getFieldTypeTTCat().getValue();
        const isCatalog = (TTCatType == 'catalog');

        myDesktopApp.getLoadedModule(isCatalog ? self.catModuleId : self.ttModuleId, true, function (module) {
            var targetModuleUI = module.getUiContent();
            var parametersGrid = self.down('#parametersGrid');
            var parametersStore = parametersGrid.getStore();
            var parametersData = {};
            var index = targetModuleUI.object.data.nbIntervals;

            // Add parameters and values to the interval
            parametersStore.each(function(record) {
                parametersData[record.get('id')] = record.get('value');
            });
            if (targetModuleUI)
               targetModuleUI.addInterval(start, stop, index, parametersData);
        });
    },
    // getCatalogParameters: function(catalogId) {
    //     const self = this;
        
    //     AmdaAction.readIntervalsForChart({
    //         'typeTT': 'catalog',
    //         'id': catalogId,
    //         'name': this.linkedTTCatNode.get('name')
    //     }, function(result, e) {
    //         if (result && result.success) {
    //             const parametersGrid = self.down('#parametersGrid');
    //             const store = parametersGrid.getStore();
    //             store.removeAll();
                
    //             Ext.Array.each(result.parameters, function(param) {
    //                 store.add({
    //                     name: param.id,
    //                     value: ''
    //                 });
    //             });
    //         }
    //     });
    // }
});