fred.panel.Element = function (config) { config = config || {}; config.id = config.id || 'fred-panel-element'; Ext.applyIf(config, { border: false, cls: 'container', url: fred.config.connectorUrl, baseParams: { action: 'mgr/elements/update' }, useLoadingMask: true, items: this.getItems(config), listeners: { 'setup': { fn: this.setup, scope: this }, 'success': { fn: this.success, scope: this } } }); this.theme_folder = ''; fred.panel.Element.superclass.constructor.call(this, config); }; Ext.extend(fred.panel.Element, MODx.FormPanel, { setup: function () { if (this.config.isUpdate) { MODx.Ajax.request({ url: this.config.url, params: { action: 'mgr/elements/get', id: MODx.request.id }, listeners: { 'success': { fn: function (r) { if (Array.isArray(r.object.options_override) && r.object.options_override.length === 0) { r.object.options_override = ''; } else { if (typeof r.object.options_override === 'object') { r.object.options_override = JSON.stringify(r.object.options_override, null, 2); } } if (r.object.option_set === 0) { Ext.getCmp('fred-element-panel-preview-option-set').disable(); } this.getForm().setValues(r.object); var category = this.find('name', 'category'); if (category[0]) { category = category[0]; category.baseParams.theme = r.object.theme; } var optionSet = this.find('name', 'option_set'); if (optionSet[0]) { optionSet = optionSet[0]; optionSet.baseParams.theme = r.object.theme; } if (r.object.image) { this.theme_folder = r.object.theme_folder; r.object.image = fred.prependBaseUrl(r.object.image, r.object.theme_folder); } else { r.object.image = "https://via.placeholder.com/300x150?text=No+image"; } Ext.getCmp('image_preview').el.dom.querySelector('img').src = r.object.image; this.fireEvent('ready', r.object); MODx.fireEvent('ready'); }, scope: this } } }); } else { Ext.getCmp('fred-element-panel-preview-option-set').disable(); var theme = MODx.request.theme; if (theme) { var categoryField = this.find('name', 'category'); if (!categoryField[0]) return; var optionSetField = this.find('name', 'option_set'); if (!optionSetField[0]) return; var category = MODx.request.category; this.getForm().setValues({theme: theme, category: category}); optionSetField = optionSetField[0]; optionSetField.enable(); optionSetField.baseParams.theme = theme; } this.fireEvent('ready'); MODx.fireEvent('ready'); } }, success: function (o, r) { if (this.config.isUpdate == false) { fred.loadPage('element/update', {id: o.result.object.id}); } }, getItems: function (config) { return [ { html: '

' + ((config.isUpdate == true) ? _('fred.elements.update') : _('fred.elements.create')) + '

', border: false, cls: 'modx-page-header' }, { name: 'id', xtype: 'hidden' }, this.getGeneralFields(config), { html: '
', bodyCssClass: 'transparent-background' }, this.getColumnsGrid(config) ]; }, getGeneralFields: function (config) { return [ { deferredRender: false, border: true, defaults: { autoHeight: true, layout: 'form', labelWidth: 150, bodyCssClass: 'main-wrapper', layoutOnTabChange: true }, items: [ { defaults: { msgTarget: 'side', autoHeight: true }, cls: 'form-with-labels', border: false, items: [ { layout: 'column', border: false, height: 100, defaults: { layout: 'form', labelAlign: 'top', labelSeparator: '', anchor: '100%', border: false }, items: [ { columnWidth: 0.7, border: false, defaults: { msgTarget: 'under' }, items: [ { xtype: 'textfield', fieldLabel: _('fred.elements.name'), name: 'name', anchor: '100%', allowBlank: false }, { xtype: 'textarea', fieldLabel: _('fred.elements.description'), name: 'description', anchor: '100%', height: 100 } ] }, { columnWidth: 0.3, border: false, defaults: { msgTarget: 'under' }, items: [ { xtype: 'fred-combo-themes', fieldLabel: _('fred.elements.theme'), name: 'theme', hiddenName: 'theme', anchor: '100%', listeners: { select: function(combo, record) { var category = this.find('name', 'category'); if (!category[0]) return; this.theme_folder = record.data.theme_folder; category = category[0]; category.setValue(); category.enable(); category.baseParams.theme = record.id; category.store.load(); var optionSet = this.find('name', 'option_set'); if (!optionSet[0]) return; optionSet = optionSet[0]; optionSet.setValue(0); optionSet.enable(); optionSet.baseParams.theme = record.id; optionSet.store.load(); var previewButton = Ext.getCmp('fred-element-panel-preview-option-set'); if (previewButton) previewButton.disable(); var image = Ext.getCmp('fred-element-image-field'); if (image) { image.updatePreview(this.theme_folder); } }, scope: this }, allowBlank: false, isUpdate: config.isUpdate }, { xtype: 'fred-combo-element-categories', fieldLabel: _('fred.elements.category'), name: 'category', hiddenName: 'category', anchor: '100%', disabled: !config.isUpdate, allowBlank: false }, { xtype: 'numberfield', allowDecimals: false, allowNegative: false, fieldLabel: _('fred.elements.rank'), name: 'rank', anchor: '100%', allowBlank: true } ] } ] }, { layout: 'column', border: false, anchor: '100%', defaults: { layout: 'form', labelAlign: 'top', labelSeparator: '', anchor: '100%', border: false }, items: [ { columnWidth: 1, border: false, defaults: { msgTarget: 'under', anchor: '100%' }, items: [ { id: 'fred-element-image-field', xtype: 'modx-combo-browser', fieldLabel: _('fred.elements.image'), triggerClass: 'x-form-image-trigger', name: 'image', anchor: '100%', allowBlank: true, updatePreview: function (theme_folder = '') { var value = this.getValue(); if (value) { value = fred.prependBaseUrl(value, theme_folder); } else { value = "https://via.placeholder.com/300x150?text=No+image"; } Ext.getCmp('image_preview').el.dom.querySelector('img').src = value; }, listeners: { 'select': { fn: function (data) { this.setValue(data.fullRelativeUrl); this.updatePreview(''); } }, 'change': { fn: function (cb, nv) { cb.updatePreview(this.theme_folder); }, scope: this } } }, { id: 'image_preview', html: '', listeners: { render: function () { this.el.dom.style.textAlign = 'center'; } } } ] } ] } ] } ] } ]; }, getColumnsGrid: function (config) { var items = [ { xtype: 'modx-tabs', forceLayout: true, deferredRender: false, collapsible: false, defaults: { layout: 'form', labelAlign: 'top', labelSeparator: '', anchor: '100%', border: false }, items: [ { title: _('fred.elements.markup'), layout: 'form', bodyCssClass: 'tab-panel-wrapper main-wrapper', autoHeight: true, defaults: { border: false, msgTarget: 'under', width: 400 }, items: [ { xtype: Ext.ComponentMgr.isRegistered('modx-texteditor') ? 'modx-texteditor' : 'textarea', mimeType: 'text/html', name: 'content', id: 'fred-element-content', hideLabel: true, anchor: '100%', height: 400, grow: false, value: '', listeners: { render: function () { if ((this.xtype === 'modx-texteditor') && this.editor) this.editor.getSession().setMode('ace/mode/twig') } } } ] }, { title: _('fred.elements.options'), layout: 'form', bodyCssClass: 'tab-panel-wrapper main-wrapper', autoHeight: true, defaults: { layout: 'form', labelAlign: 'top', labelSeparator: '', anchor: '100%', border: false, msgTarget: 'under', width: 400 }, items: [ { layout: 'column', border: false, anchor: '100%', defaults: { layout: 'form', labelAlign: 'top', labelSeparator: '', anchor: '100%', border: false }, items: [ { columnWidth: .8, border: false, defaults: { msgTarget: 'under', anchor: '100%' }, items: [ { xtype: 'fred-combo-element-option-sets', name: 'option_set', hiddenName: 'option_set', baseParams: { action: 'mgr/element_option_sets/getlist', addEmpty: 1, complete: 1 }, fieldLabel: _('fred.elements.option_set'), listeners: { select: { fn: function(combo) { var previewButton = Ext.getCmp('fred-element-panel-preview-option-set'); if (combo.getValue() === 0) { previewButton.disable(); } else { previewButton.enable(); } }, scope: this } } } ] }, { columnWidth: .2, border: false, defaults: { msgTarget: 'under', anchor: '100%' }, items: [ { xtype: 'button', id: 'fred-element-panel-preview-option-set', text: _('fred.element_option_sets.preview'), fieldLabel: ' ', handler: this.previewOptionSet, scope: this } ] } ] }, { xtype: Ext.ComponentMgr.isRegistered('modx-texteditor') ? 'modx-texteditor' : 'textarea', fieldLabel: _('fred.elements.options_override'), mimeType: 'application/json', name: 'options_override', id: 'fred-element-options-override', anchor: '100%', height: 400, grow: false, } ] } ] } ]; return items; }, previewOptionSet: function(btn, e) { var optionSetId = this.getField('option_set').getValue(); if (optionSetId === 0) return; MODx.Ajax.request({ url: this.config.url, params: { action: 'mgr/element_option_sets/get', id: optionSetId }, listeners: { 'success': { fn: function (r) { var record = {data: ''}; if (Array.isArray(r.object.data) && r.object.data.length === 0) { record.data = ''; } else { if (typeof r.object.data === 'object') { record.data = JSON.stringify(r.object.data, null, 2); } } var updateElementOptionSet = MODx.load({ xtype: 'fred-window-element-option-set-preview', record: record, listeners: { success: { fn: function () { this.refresh(); }, scope: this } } }); updateElementOptionSet.fp.getForm().reset(); updateElementOptionSet.fp.getForm().setValues(record); updateElementOptionSet.show(e.target); }, scope: this } } }); } }); Ext.reg('fred-panel-element', fred.panel.Element);