diff --git a/client/src/views/record/base.js b/client/src/views/record/base.js index dcb53e4c9b..1d13166673 100644 --- a/client/src/views/record/base.js +++ b/client/src/views/record/base.js @@ -336,6 +336,15 @@ Espo.define('views/record/base', ['view', 'view-record-helper', 'dynamic-logic'] this.model.set(this.attributes); }, + setModelAttributes: function (setAttributes, options) { + for (var item in this.model.attributes) { + if (!(item in setAttributes)) { + this.model.unset(item); + } + } + this.model.set(setAttributes, options || {}); + }, + initDynamicLogic: function () { this.dynamicLogicDefs = Espo.Utils.clone(this.dynamicLogicDefs || {}); this.dynamicLogicDefs.fields = Espo.Utils.clone(this.dynamicLogicDefs.fields); @@ -427,7 +436,7 @@ Espo.define('views/record/base', ['view', 'view-record-helper', 'dynamic-logic'] this.notify('Not valid', 'error'); }, - save: function (callback, skipExit) { + save: function (callback, skipExit, errorCallback) { this.beforeBeforeSave(); var data = this.fetch(); @@ -441,25 +450,25 @@ Espo.define('views/record/base', ['view', 'view-record-helper', 'dynamic-logic'] data = _.extend(Espo.Utils.cloneDeep(beforeSaveAttributes), data); - var attrs = false; + var setAttributes = false; if (model.isNew()) { - attrs = data; + setAttributes = data; } else { for (var name in data) { if (_.isEqual(initialAttributes[name], data[name])) { continue; } - (attrs || (attrs = {}))[name] = data[name]; + (setAttributes || (setAttributes = {}))[name] = data[name]; } } - if (!attrs) { + if (!setAttributes) { this.trigger('cancel:save'); this.afterNotModified(); return true; } - model.set(attrs, {silent: true}); + model.set(setAttributes, {silent: true}); if (this.validate()) { model.attributes = beforeSaveAttributes; @@ -473,7 +482,7 @@ Espo.define('views/record/base', ['view', 'view-record-helper', 'dynamic-logic'] this.trigger('before:save'); model.trigger('before:save'); - model.save(attrs, { + model.save(setAttributes, { success: function () { this.afterSave(); var isNew = self.isNew; @@ -510,12 +519,6 @@ Espo.define('views/record/base', ['view', 'view-record-helper', 'dynamic-logic'] } } - if (xhr.status == 400) { - if (!this.isNew) { - this.resetModelChanges(); - } - } - if (response && response.reason) { var methodName = 'errorHandler' + Espo.Utils.upperCaseFirst(response.reason.toString()); if (methodName in this) { @@ -526,9 +529,13 @@ Espo.define('views/record/base', ['view', 'view-record-helper', 'dynamic-logic'] this.afterSaveError(); - model.attributes = beforeSaveAttributes; + this.setModelAttributes(beforeSaveAttributes); + self.trigger('cancel:save'); + if (errorCallback) { + errorCallback.call(this, xhr); + } }.bind(this), patch: !model.isNew() }); diff --git a/client/src/views/record/detail.js b/client/src/views/record/detail.js index d8c0c89fd1..0966792767 100644 --- a/client/src/views/record/detail.js +++ b/client/src/views/record/detail.js @@ -147,7 +147,13 @@ Espo.define('views/record/detail', ['views/record/base', 'view-record-helper'], }, actionSave: function () { - if (this.save(null, true)) { + var modeBeforeSave = this.mode; + var errorCallback = function () { + if (modeBeforeSave == 'edit') { + this.setEditMode(); + } + }.bind(this); + if (this.save(null, true, errorCallback)) { this.setDetailMode(); $(window).scrollTop(0) }