define("views/admin/layouts/base", ["exports", "view"], function (_exports, _view) { "use strict"; Object.defineProperty(_exports, "__esModule", { value: true }); _exports.default = void 0; _view = _interopRequireDefault(_view); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /************************************************************************ * This file is part of EspoCRM. * * EspoCRM – Open Source CRM application. * Copyright (C) 2014-2025 EspoCRM, Inc. * Website: https://www.espocrm.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ /** @module module:views/admin/layouts/base */ class LayoutBaseView extends _view.default { /** * @type {string} */ scope; /** * @type {string} */ type; events = { /** @this LayoutBaseView */ 'click button[data-action="save"]': function () { this.actionSave(); }, /** @this LayoutBaseView */ 'click button[data-action="cancel"]': function () { this.cancel(); }, /** @this LayoutBaseView */ 'click button[data-action="resetToDefault"]': function () { this.confirm(this.translate('confirmation', 'messages'), () => { this.resetToDefault(); }); }, /** @this LayoutBaseView */ 'click button[data-action="remove"]': function () { this.actionDelete(); } }; buttonList = [{ name: 'save', label: 'Save', style: 'primary' }, { name: 'cancel', label: 'Cancel' }]; // noinspection JSUnusedGlobalSymbols dataAttributes = null; dataAttributesDefs = null; dataAttributesDynamicLogicDefs = null; setup() { this.buttonList = _.clone(this.buttonList); this.events = _.clone(this.events); this.scope = this.options.scope; this.type = this.options.type; this.realType = this.options.realType; this.setId = this.options.setId; this.em = this.options.em; const defs = /** @type {Record} */this.getMetadata().get(['clientDefs', this.scope, 'additionalLayouts', this.type]) ?? {}; this.typeDefs = defs; this.dataAttributeList = Espo.Utils.clone(defs.dataAttributeList || this.dataAttributeList); this.isCustom = !!defs.isCustom; if (this.isCustom && this.em) { this.buttonList.push({ name: 'remove', label: 'Remove' }); } if (!this.isCustom) { this.buttonList.push({ name: 'resetToDefault', label: 'Reset to Default' }); } } actionSave() { this.disableButtons(); Espo.Ui.notify(this.translate('saving', 'messages')); this.save(this.enableButtons.bind(this)); } disableButtons() { this.$el.find('.button-container button').attr('disabled', 'disabled'); } enableButtons() { this.$el.find('.button-container button').removeAttr('disabled'); } setConfirmLeaveOut(value) { this.getRouter().confirmLeaveOut = value; } setIsChanged() { this.isChanged = true; this.setConfirmLeaveOut(true); } setIsNotChanged() { this.isChanged = false; this.setConfirmLeaveOut(false); } save(callback) { const layout = this.fetch(); if (!this.validate(layout)) { this.enableButtons(); return false; } this.getHelper().layoutManager.set(this.scope, this.type, layout, () => { Espo.Ui.success(this.translate('Saved')); this.setIsNotChanged(); if (typeof callback === 'function') { callback(); } this.getHelper().broadcastChannel.postMessage('update:layout'); }, this.setId).catch(() => this.enableButtons()); } resetToDefault() { this.getHelper().layoutManager.resetToDefault(this.scope, this.type, () => { this.loadLayout(() => { this.setIsNotChanged(); this.prepareLayout().then(() => this.reRender()); }); }, this.options.setId); } prepareLayout() { return Promise.resolve(); } reset() { this.render(); } fetch() {} unescape(string) { if (string === null) { return ''; } const map = { '&': '&', '<': '<', '>': '>', '"': '"', ''': "'" }; const reg = new RegExp('(' + _.keys(map).join('|') + ')', 'g'); return ('' + string).replace(reg, match => { return map[match]; }); } getEditAttributesModalViewOptions(attributes) { return { name: attributes.name, scope: this.scope, attributeList: this.dataAttributeList, attributeDefs: this.dataAttributesDefs, dynamicLogicDefs: this.dataAttributesDynamicLogicDefs, attributes: attributes, languageCategory: this.languageCategory, headerText: ' ' }; } openEditDialog(attributes) { const name = attributes.name; const viewOptions = this.getEditAttributesModalViewOptions(attributes); this.createView('editModal', 'views/admin/layouts/modals/edit-attributes', viewOptions, view => { view.render(); this.listenToOnce(view, 'after:save', attributes => { this.trigger('update-item', name, attributes); const $li = $("#layout ul > li[data-name='" + name + "']"); for (const key in attributes) { $li.attr('data-' + key, attributes[key]); $li.data(key, attributes[key]); $li.find('.' + key + '-value').text(attributes[key]); } view.close(); this.setIsChanged(); }); }); } cancel() { this.loadLayout(() => { this.setIsNotChanged(); if (this.em) { this.trigger('cancel'); return; } this.prepareLayout().then(() => this.reRender()); }); } /** * @abstract * @protected * @param {function} callback */ loadLayout(callback) {} // noinspection JSUnusedLocalSymbols validate(layout) { return true; } actionDelete() { this.confirm(this.translate('confirmation', 'messages')).then(() => { this.disableButtons(); Espo.Ui.notifyWait(); Espo.Ajax.postRequest('Layout/action/delete', { scope: this.scope, name: this.type }).then(() => { Espo.Ui.success(this.translate('Removed'), { suppress: true }); this.trigger('after-delete'); }).catch(() => { this.enableButtons(); }); }); } } var _default = _exports.default = LayoutBaseView; }); define("views/admin/layouts/rows", ["exports", "views/admin/layouts/base"], function (_exports, _base) { "use strict"; Object.defineProperty(_exports, "__esModule", { value: true }); _exports.default = void 0; _base = _interopRequireDefault(_base); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /************************************************************************ * This file is part of EspoCRM. * * EspoCRM – Open Source CRM application. * Copyright (C) 2014-2025 EspoCRM, Inc. * Website: https://www.espocrm.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ /** * @abstract */ class LayoutRowsView extends _base.default { template = 'admin/layouts/rows'; dataAttributeList = null; dataAttributesDefs = {}; editable = false; data() { return { scope: this.scope, type: this.type, buttonList: this.buttonList, enabledFields: this.enabledFields, disabledFields: this.disabledFields, layout: this.rowLayout, dataAttributeList: this.dataAttributeList, dataAttributesDefs: this.dataAttributesDefs, editable: this.editable }; } setup() { this.itemsData = {}; super.setup(); this.events['click a[data-action="editItem"]'] = e => { const name = $(e.target).closest('li').data('name'); this.editRow(name); }; this.on('update-item', (name, attributes) => { this.itemsData[name] = Espo.Utils.cloneDeep(attributes); }); Espo.loader.require('res!client/css/misc/layout-manager-rows.css', styleCss => { this.$style = $('