diff --git a/client/src/dynamic-handler.js b/client/src/dynamic-handler.js new file mode 100644 index 0000000000..ea1ea52b43 --- /dev/null +++ b/client/src/dynamic-handler.js @@ -0,0 +1,44 @@ +/************************************************************************ + * This file is part of EspoCRM. + * + * EspoCRM - Open Source CRM application. + * Copyright (C) 2014-2018 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko + * Website: http://www.espocrm.com + * + * EspoCRM is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * EspoCRM 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with EspoCRM. If not, see http://www.gnu.org/licenses/. + * + * 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 General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +define('dynamic-handler', [], function () { + + var DynamicHandler = function (recordView) { + this.recordView = recordView; + this.model = recordView.model; + } + + _.extend(DynamicHandler.prototype, { + + init: function () {}, + + onChange: function (model, o) {} + }); + + return DynamicHandler; +}); diff --git a/client/src/views/record/detail.js b/client/src/views/record/detail.js index cc9a2249d8..b53a4e3cd7 100644 --- a/client/src/views/record/detail.js +++ b/client/src/views/record/detail.js @@ -753,6 +753,37 @@ Espo.define('views/record/detail', ['views/record/base', 'view-record-helper'], this.initDynamicLogic(); this.setupFieldLevelSecurity(); + + this.initDynamicHandler(); + }, + + initDynamicHandler: function () { + var dynamicHandlerClassName = this.dynamicHandlerClassName || this.getMetadata().get(['clientDefs', this.model.name, 'dynamicHandler']); + if (dynamicHandlerClassName) { + this.addReadyCondition(function () { + return !!this.dynamicHandler; + }.bind(this)); + + require(dynamicHandlerClassName, function (DynamicHandler) { + this.dynamicHandler = new DynamicHandler(this); + + this.listenTo(this.model, 'change', function (model, o) { + this.dynamicHandler.onChange(model, o); + + var changedAttributes = model.changedAttributes(); + for (var attribute in changedAttributes) { + var methodName = 'onChange' + Espo.Utils.upperCaseFirst(attribute); + if (methodName in this.dynamicHandler) { + this.dynamicHandler[methodName](model, changedAttributes[attribute], o); + } + } + }, this); + + this.dynamicHandler.init(); + + this.tryReady(); + }.bind(this)); + } }, setupFinal: function () {