Created
December 17, 2017 10:36
-
-
Save vgrish/9433f56803379bcb4462723fcecca47a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Ext.override(Ext.Component, { | |
| findParentByType: function(type){ | |
| if (Ext.isFunction(type)){ | |
| return this.findParentBy(function(p){ | |
| return p instanceof type; | |
| }); | |
| } else { | |
| return (Ext.isFunction(Ext.ComponentMgr.types[type]))? | |
| this.findParentByType(Ext.ComponentMgr.types[type]): | |
| null; | |
| } | |
| } | |
| }); | |
| modclassvar.panel.Variable = function (config) { | |
| config = config || {}; | |
| this.exp = new Ext.grid.RowExpander({ | |
| expandOnDblClick: false, | |
| enableCaching: false, | |
| tpl: new Ext.XTemplate( | |
| '<tpl for=".">', | |
| '<table class="modclassvar-expander"><tbody>', | |
| '<tpl if="description">', | |
| '<tr>', | |
| '<td><b>' + _('modclassvar_description') + ': </b>{description}</td>', | |
| '</tr>', | |
| '</tpl>', | |
| '<tpl if="values">', | |
| '{values:this.renderValues}', | |
| '</tpl>', | |
| ' </tbody></table>', | |
| '</tpl>', | |
| { | |
| compiled: true, | |
| renderValues: function (value, record) { | |
| var values = []; | |
| var tmp = []; | |
| var pf = MODx.config['modclassvar_field_prefix'] || 'modclassvar.'; | |
| var rx = new RegExp(pf.replace(".", "")); | |
| for (var i in record) { | |
| if (!record.hasOwnProperty(i)) { | |
| continue; | |
| } | |
| if (!rx.test(i)) { | |
| continue; | |
| } | |
| var name = i.split('.'); | |
| name = name[1]; | |
| switch (true) { | |
| case i == pf + name + '.name': | |
| tmp.push({name: name, title: record[i]}); | |
| break; | |
| case i == pf + name && !!record[i] && typeof record[i] === 'object': | |
| tmp.push({name: name, value: record[i].join(', ')}); | |
| break; | |
| case i == pf + name + '.value' && tmp.length == 1: | |
| tmp.push({name: name, value: record[i]}); | |
| break; | |
| } | |
| if (tmp.length == 2 && tmp[0]['name'] == tmp[1]['name']) { | |
| if (tmp[0]['value'] && !!tmp[0]['value']) { | |
| values.push(String.format('<tr><td><b>{0}: </b>{1}</td></tr>',tmp[1]['title'],tmp[0]['value'])); | |
| } | |
| else if (!!tmp[1]['value']) { | |
| values.push(String.format('<tr><td><b>{0}: </b>{1}</td></tr>',tmp[0]['title'],tmp[1]['value'])); | |
| } | |
| tmp = []; | |
| } | |
| } | |
| return values.join(''); | |
| } | |
| } | |
| ) | |
| }); | |
| this.exp.on('beforeexpand', function (rowexpander, record, body, rowIndex) { | |
| record['data']['json'] = record['json']; | |
| record['data'] = Ext.applyIf(record['data'], record['json']); | |
| return true; | |
| }); | |
| this.sm = new Ext.grid.CheckboxSelectionModel({ | |
| singleSelect: true, | |
| listeners: { | |
| rowselect: function(sm, rowIndex, record) { | |
| Ext.each(sm.grid.findParentByType('modx-tabs').findByType('modx-tabs'),function(t) | |
| { | |
| t.fireEvent('modClassVarFormReload', sm, t, rowIndex, record); | |
| }); | |
| }, | |
| selectionchange: function(sm) { | |
| Ext.each(sm.grid.findParentByType('modx-tabs').findByType('modx-tabs'),function(t) | |
| { | |
| t.fireEvent('modClassVarFormReload', sm, t, null, null); | |
| }); | |
| } | |
| } | |
| }); | |
| this.grid = new MODx.grid.Grid({ | |
| url: modclassvar.config.connector_url, | |
| baseParams: { | |
| action: 'mgr/variable/getlist', | |
| class: config.class || 'modResource', | |
| cid: config.record.id || 0, | |
| sort: 'rank', | |
| dir: 'asc' | |
| }, | |
| paging: true, | |
| pageSize: 10, | |
| remoteSort: true, | |
| viewConfig: { | |
| forceFit: true, | |
| enableRowBody: true, | |
| autoFill: true, | |
| showPreview: true, | |
| scrollOffset: 0 | |
| }, | |
| autoHeight: true, | |
| sm: this.sm, | |
| plugins: [this.exp], | |
| fields: this.getGridFields(config), | |
| columns: this.getColumns(config), | |
| tbar: this.getTopBar(config), | |
| listeners: { | |
| viewready: function (grid) { | |
| grid.getSelectionModel().selectRow(0); | |
| } | |
| }, | |
| cls: 'modclassvar-grid', | |
| bodyCssClass: 'grid-with-buttons', | |
| getMenu:this.getMenu, | |
| onClick:this.onClick, | |
| remove:this.remove, | |
| setAction:this.setAction, | |
| _getSelectedIds: this._getSelectedIds, | |
| }); | |
| this.tab = new MODx.Tabs({ | |
| autoHeight: true, | |
| deferredRender: false, | |
| forceLayout: true, | |
| style: { | |
| 'margin-top': '-28px' | |
| }, | |
| cls: 'modclassvar-variable-field-tab', | |
| defaults: { | |
| autoHeight: true, | |
| layout: 'form', | |
| defaults: {anchor: '100%'}, | |
| deferredRender: false, | |
| forceLayout: true, | |
| labelAlign: 'top' | |
| }, | |
| items: [], | |
| listeners: { | |
| modClassVarFormReload: function (sm, t, rowIndex, record) { | |
| if (!sm) { | |
| t.removeAll(); | |
| t.setActiveTab(0); | |
| } | |
| else if (t && sm.last === false) { | |
| t.removeAll(); | |
| t.add({ | |
| title: '', | |
| items: this.getFormField(this.config, record) | |
| }); | |
| t.setActiveTab(0); | |
| } | |
| else if (t && record) { | |
| t.removeAll(); | |
| t.add({ | |
| title: '', | |
| items: this.getFormField(this.config, record) | |
| }); | |
| t.setActiveTab(0); | |
| } | |
| if (t && record) { | |
| MODx.Ajax.request({ | |
| url: modclassvar.config.connector_url, | |
| params: { | |
| action: 'mgr/variable/get', | |
| class: this.config.class || 'modResource', | |
| cid: record.json['cid'] || 0, | |
| key: record.json['key'] || 0, | |
| }, | |
| listeners: { | |
| success: { | |
| fn: function (r) { | |
| var f = this.findParentByType('form'); | |
| if (f && r.object) { | |
| var field = f.getForm().findField('modclassvar'); | |
| if (field) { | |
| field.setValue(r.object.modclassvar); | |
| field.fireEvent('modClassVarFieldSet', r); | |
| } | |
| } | |
| }, | |
| scope: this | |
| } | |
| } | |
| }); | |
| } | |
| }, | |
| scope: this | |
| } | |
| }); | |
| Ext.apply(config, { | |
| border: false, | |
| layout: 'column', | |
| cls: 'modclassvar-panel-variable', | |
| defaults: {msgTarget: 'under', border: false}, | |
| items: this.getMainItems(config), | |
| }); | |
| modclassvar.panel.Variable.superclass.constructor.call(this, config); | |
| this.addEvents('modClassVarFormReload'); | |
| }; | |
| Ext.extend(modclassvar.panel.Variable, MODx.Panel, { | |
| getFormField: function (config, record) { | |
| record = record || {json: {msg: null,cid: null}}; | |
| record.json['actions'] = ''; | |
| var field = []; | |
| var add = { | |
| msg: { | |
| html: '<p>' + _('modclassvar_combo_select') + '</p>', | |
| style: { | |
| 'margin-top': '15px' | |
| } | |
| }, | |
| cid: { | |
| xtype: 'numberfield', | |
| hidden: true | |
| }, | |
| key: { | |
| xtype: 'textfield', | |
| hidden: true | |
| }, | |
| type: { | |
| xtype: 'textfield', | |
| disabled: true | |
| } | |
| }; | |
| field.push({ | |
| xtype: 'toolbar', | |
| cls:'modclassvar-field-form-toolbar', | |
| items: [{ | |
| cls: 'modclassvar-button-form-reset', | |
| text: _('reset'), | |
| handler: this.resetField, | |
| scope: this | |
| },'->', { | |
| cls: 'modclassvar-button-form-save', | |
| text: _('save'), | |
| handler: this.saveField, | |
| scope: this | |
| }, { | |
| xtype: 'spacer', | |
| style: 'width:1px;' | |
| }] | |
| }); | |
| for (var item in record.json) { | |
| if (!record.json.hasOwnProperty(item)) { | |
| continue; | |
| } | |
| if (add[item]) { | |
| Ext.applyIf(add[item], { | |
| name: item, | |
| value: record.json[item], | |
| }); | |
| field.push(add[item]); | |
| } | |
| } | |
| if (!record.json['type']) { | |
| return field; | |
| } | |
| var cnf = Ext.util.JSON.decode(record.json['config'] || '{}'); | |
| /** */ | |
| Ext.applyIf(cnf, { | |
| xtype: record.json['type'], | |
| class: this.config.class || 'modResource', | |
| cid: record.json['cid'] || 0, | |
| key: record.json['key'] || 0, | |
| name: 'modclassvar', | |
| hiddenName: 'modclassvar', | |
| listeners: { | |
| modClassVarFieldSet: function () { | |
| if (typeof TinyMCERTE != 'undefined') { | |
| TinyMCERTE.loadForTVs(); | |
| } | |
| }, | |
| } | |
| }); | |
| field.push(cnf); | |
| return field; | |
| }, | |
| resetField:function (config) { | |
| var f = this.findParentByType('form').getForm(); | |
| var record = f.getFieldValues(); | |
| MODx.Ajax.request({ | |
| url: modclassvar.config.connector_url, | |
| params: { | |
| action: 'mgr/variable/save', | |
| class: this.config.class || 'modResource', | |
| cid: record['cid'] || 0, | |
| key: record['key'] || 0, | |
| modclassvar: '' | |
| }, | |
| listeners: { | |
| success: { | |
| fn: function (response) { | |
| f.setValues({modclassvar: ''}); | |
| }, | |
| scope: this | |
| }, | |
| failure: { | |
| fn: function (response) { | |
| MODx.msg.alert(_('error'), response.message); | |
| }, | |
| scope: this | |
| } | |
| } | |
| }); | |
| }, | |
| saveField: function (config) { | |
| var f = this.findParentByType('form').getForm(); | |
| var record = f.getFieldValues(); | |
| MODx.Ajax.request({ | |
| url: modclassvar.config.connector_url, | |
| params: { | |
| action: 'mgr/variable/save', | |
| class: this.config.class || 'modResource', | |
| cid: record['cid'] || 0, | |
| key: record['key'] || 0, | |
| modclassvar: record['modclassvar'] | |
| }, | |
| listeners: { | |
| success: { | |
| fn: function (response) { | |
| }, | |
| scope: this | |
| }, | |
| failure: { | |
| fn: function (response) { | |
| MODx.msg.alert(_('error'), response.message); | |
| }, | |
| scope: this | |
| } | |
| } | |
| }); | |
| }, | |
| getMainItems: function (config) { | |
| return [{ | |
| columnWidth: 0.60, | |
| layout: 'fit', | |
| items: this.grid | |
| },{ | |
| columnWidth: 0.4, | |
| layout: 'fit', | |
| items: this.tab | |
| }, { | |
| columnWidth: 1, | |
| layout: 'fit', | |
| html:"<div class='modclassvar-html-mg15'>" | |
| }]; | |
| }, | |
| getGridFields: function (config) { | |
| var fields = [ | |
| 'id', 'class', 'cid', 'key', 'name', 'value', 'actions' | |
| ]; | |
| return fields; | |
| }, | |
| getColumns: function (config) { | |
| var columns = [this.exp, this.sm]; | |
| var add = { | |
| class: { | |
| width: 15, | |
| hidden: true, | |
| sortable: true, | |
| }, | |
| cid: { | |
| width: 10, | |
| hidden: true, | |
| sortable: true, | |
| }, | |
| key: { | |
| width: 10, | |
| sortable: true, | |
| }, | |
| name: { | |
| width: 15, | |
| sortable: true, | |
| }, | |
| value: { | |
| width: 15, | |
| sortable: true, | |
| hidden: true, | |
| }, | |
| actions: { | |
| width: 5, | |
| sortable: false, | |
| renderer: modclassvar.tools.renderActions, | |
| id: 'actions' | |
| } | |
| }; | |
| var fields = this.getGridFields(); | |
| for (var i = 0; i < fields.length; i++) { | |
| var field = fields[i]; | |
| if (add[field]) { | |
| Ext.applyIf(add[field], { | |
| header: _('modclassvar_header_' + field), | |
| tooltip: _('modclassvar_tooltip_' + field), | |
| dataIndex: field | |
| }); | |
| columns.push(add[field]); | |
| } | |
| } | |
| return columns; | |
| }, | |
| getTopBar: function (config) { | |
| var tbar1 = []; | |
| var tbar2 = []; | |
| var component1 = ['toggle', 'field', 'left', 'type', 'section', 'spacer']; | |
| var component2 = ['tabfield']; | |
| var add = { | |
| toggle: { | |
| text: '<i class="icon icon-cog"></i>', | |
| handler: this._toggleExtra, | |
| scope: this | |
| }, | |
| field: { | |
| xtype: 'panel', | |
| width: 200, | |
| layout: 'fit', | |
| cls: 'modclassvar-padding-fix', | |
| items: [{ | |
| xtype: 'modclassvar-combo-field', | |
| id: 'modclassvar_option', | |
| name: 'option', | |
| emptyText: _('modclassvar_var'), | |
| width: 200, | |
| custm: true, | |
| clear: true, | |
| active: true, | |
| class: config.class || 'modResource', | |
| cid: config.record.id || 0, | |
| listeners: { | |
| select: { | |
| fn: this._addVariable, | |
| scope: this | |
| } | |
| } | |
| }] | |
| }, | |
| /*type: { | |
| xtype: 'panel', | |
| width: 200, | |
| layout: 'fit', | |
| cls: 'modclassvar-padding-fix', | |
| items: [{ | |
| xtype: 'modclassvar-combo-field-type', | |
| name: 'type', | |
| emptyText: _('modclassvar_type'), | |
| width: 200, | |
| custm: true, | |
| clear: true, | |
| addall: true, | |
| value: '', | |
| listeners: { | |
| select: { | |
| fn: this._filterByCombo, | |
| scope: this | |
| }, | |
| afterrender: { | |
| fn: this._filterByCombo, | |
| scope: this | |
| } | |
| } | |
| }] | |
| },*/ | |
| section: { | |
| xtype: 'panel', | |
| width: 200, | |
| layout: 'fit', | |
| cls: 'modclassvar-padding-fix', | |
| items: [{ | |
| xtype: 'modclassvar-combo-section', | |
| name: 'section', | |
| emptyText: _('modclassvar_section'), | |
| width: 200, | |
| custm: true, | |
| clear: true, | |
| addall: true, | |
| value: '', | |
| listeners: { | |
| select: { | |
| fn: this._filterByCombo, | |
| scope: this | |
| }, | |
| afterrender: { | |
| fn: this._filterByCombo, | |
| scope: this | |
| } | |
| } | |
| }] | |
| }, | |
| tabfield:{ | |
| xtype: 'modx-tabs', | |
| collapsible: true, | |
| collapsed: false, | |
| titleCollapse:true, | |
| defaults: { | |
| autoHeight: true, | |
| layout: 'fit', | |
| defaults: {anchor: '100%'}, | |
| deferredRender: false, | |
| forceLayout: true, | |
| }, | |
| cls: 'modclassvar-tab-field', | |
| items: [{ | |
| title: _('modclassvar_field'), | |
| xtype: 'modclassvar-grid-field', | |
| listeners: { | |
| afterrender:{ | |
| fn: function (field) { | |
| this._toggleExtra(); | |
| }, | |
| scope: this | |
| }, | |
| }, | |
| }] | |
| }, | |
| left: '->', | |
| spacer: { | |
| xtype: 'spacer', | |
| width: '1px' | |
| } | |
| }; | |
| component1.filter(function(item) { | |
| if (add[item]) { | |
| tbar1.push(add[item]); | |
| } | |
| }); | |
| component2.filter(function(item) { | |
| if (add[item]) { | |
| tbar2.push(add[item]); | |
| } | |
| }); | |
| var items = []; | |
| if (tbar1.length > 0) { | |
| items.push(new Ext.Toolbar(tbar1)); | |
| } | |
| if (tbar2.length > 0) { | |
| items.push(new Ext.Panel({items:tbar2})); | |
| } | |
| return new Ext.Panel({items:items}); | |
| }, | |
| _toggleExtra: function () { | |
| Ext.each(Ext.query('.modclassvar-tab-field .x-tool-toggle', this.getEl().dom),function(t) | |
| { | |
| var o = Ext.get(t.id); | |
| if (o) o.dom.click(); | |
| }); | |
| }, | |
| _addVariable: function(combo, row) { | |
| if (!row) { | |
| return false; | |
| } | |
| combo.reset(); | |
| MODx.Ajax.request({ | |
| url: modclassvar.config.connector_url, | |
| params: { | |
| action: 'mgr/variable/create', | |
| class: this.config.class || 'modResource', | |
| cid: this.config.record.id || 0, | |
| key: row.json['key'] || 0, | |
| }, | |
| listeners: { | |
| success: { | |
| fn: function(r) { | |
| combo.getStore().reload(); | |
| this.grid.refresh(); | |
| }, | |
| scope: this | |
| } | |
| } | |
| }); | |
| }, | |
| getMenu: function (grid, rowIndex) { | |
| var ids = this._getSelectedIds(); | |
| var row = grid.getStore().getAt(rowIndex); | |
| var menu = modclassvar.tools.getMenu(row.data['actions'], this, ids); | |
| this.addContextMenuItem(menu); | |
| }, | |
| onClick: function(e) { | |
| var elem = e.getTarget(); | |
| if (elem.nodeName == 'BUTTON') { | |
| var row = this.getSelectionModel().getSelected(); | |
| if (typeof(row) != 'undefined') { | |
| var action = elem.getAttribute('action'); | |
| if (action == 'showMenu') { | |
| var ri = this.getStore().find('id', row.id); | |
| return this._showMenu(this, ri, e); | |
| } else if (typeof this[action] === 'function') { | |
| this.menu.record = row.data; | |
| return this[action](this, e); | |
| } | |
| } | |
| } | |
| return this.processEvent('click', e); | |
| }, | |
| setAction: function (method, field, value) { | |
| var ids = this._getSelectedIds(); | |
| if (!ids.length && (field !== 'false')) { | |
| return false; | |
| } | |
| MODx.Ajax.request({ | |
| url: modclassvar.config.connector_url, | |
| params: { | |
| action: 'mgr/variable/multiple', | |
| method: method, | |
| field_name: field, | |
| field_value: value, | |
| ids: Ext.util.JSON.encode(ids) | |
| }, | |
| listeners: { | |
| success: { | |
| fn: function () { | |
| this.refresh(); | |
| }, | |
| scope: this | |
| }, | |
| failure: { | |
| fn: function (response) { | |
| MODx.msg.alert(_('error'), response.message); | |
| }, | |
| scope: this | |
| } | |
| } | |
| }) | |
| }, | |
| remove: function () { | |
| Ext.MessageBox.confirm( | |
| _('modclassvar_action_remove'), | |
| _('modclassvar_confirm_remove'), | |
| function (val) { | |
| if (val == 'yes') { | |
| this.setAction('remove'); | |
| } | |
| }, | |
| this | |
| ); | |
| }, | |
| _filterByCombo: function (cb) { | |
| if (cb.name == 'section') { | |
| var comboOption = Ext.getCmp('modclassvar_option'); | |
| if (comboOption) { | |
| comboOption.baseParams.section = cb.getValue(); | |
| if (!!comboOption.pageTb) { | |
| comboOption.pageTb.show(); | |
| } | |
| comboOption.store.load(); | |
| } | |
| } | |
| this.grid.getStore().baseParams[cb.name] = cb.value; | |
| this.grid.getBottomToolbar().changePage(1); | |
| }, | |
| _doSearch: function (tf) { | |
| this.grid.getStore().baseParams.query = tf.getValue(); | |
| this.grid.getBottomToolbar().changePage(1); | |
| }, | |
| _clearSearch: function () { | |
| this.grid.getStore().baseParams.query = ''; | |
| this.grid.getBottomToolbar().changePage(1); | |
| }, | |
| _getSelectedIds: function () { | |
| var ids = []; | |
| var selected = this.getSelectionModel().getSelections(); | |
| for (var i in selected) { | |
| if (!selected.hasOwnProperty(i)) { | |
| continue; | |
| } | |
| ids.push([selected[i]['json']['class'],selected[i]['json']['cid'],selected[i]['json']['key']]); | |
| } | |
| return ids; | |
| } | |
| }); | |
| Ext.reg('modclassvar-panel-variable', modclassvar.panel.Variable); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment