From 5b87d12449cf87da3f36b5d0aeb9591f5dba91ef Mon Sep 17 00:00:00 2001 From: Yurii Date: Thu, 20 Nov 2025 17:30:14 +0200 Subject: [PATCH] frontend populate defaults before view --- client/src/controllers/record.js | 3 +++ client/src/helpers/model/defaults-populator.js | 4 ++-- client/src/views/modals/edit.js | 5 ++++- client/src/views/record/base.js | 14 +++++--------- client/src/views/record/edit.js | 2 +- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/client/src/controllers/record.js b/client/src/controllers/record.js index 8a5ec84044..da6e4fd68c 100644 --- a/client/src/controllers/record.js +++ b/client/src/controllers/record.js @@ -29,6 +29,7 @@ /** @module controllers/record */ import Controller from 'controller'; +import DefaultsPopulator from 'helpers/model/defaults-populator'; /** * A record controller. @@ -329,6 +330,8 @@ class RecordController extends Controller { o[k] = optionsOptions[k]; } + await new DefaultsPopulator().populate(model); + if (options.attributes) { model.set(options.attributes); } diff --git a/client/src/helpers/model/defaults-populator.js b/client/src/helpers/model/defaults-populator.js index e4d598626a..d7ecd26b26 100644 --- a/client/src/helpers/model/defaults-populator.js +++ b/client/src/helpers/model/defaults-populator.js @@ -85,7 +85,7 @@ class DefaultsPopulator { * Populate default values. * * @param {module:model} model A model. - * @return {Promise|undefined} + * @return {Promise} */ populate(model) { model.populateDefaults(); @@ -113,7 +113,7 @@ class DefaultsPopulator { const preparatorClass = this.metadata.get(`clientDefs.${model.entityType}.modelDefaultsPreparator`); if (!preparatorClass) { - return undefined; + return Promise.resolve(); } return Espo.loader.requirePromise(preparatorClass) diff --git a/client/src/views/modals/edit.js b/client/src/views/modals/edit.js index b48251bbc0..5254caecbe 100644 --- a/client/src/views/modals/edit.js +++ b/client/src/views/modals/edit.js @@ -30,6 +30,7 @@ import ModalView from 'views/modal'; import Backbone from 'backbone'; +import DefaultsPopulator from 'helpers/model/defaults-populator'; /** * A quick edit modal. @@ -212,7 +213,7 @@ class EditModalView extends ModalView { this.waitForView('edit'); - this.getModelFactory().create(this.entityType, model => { + this.getModelFactory().create(this.entityType, async model => { if (this.id) { if (this.sourceModel) { model = this.model = this.sourceModel.clone(); @@ -234,6 +235,8 @@ class EditModalView extends ModalView { return; } + await new DefaultsPopulator().populate(model); + this.model = model; if (this.options.relate) { diff --git a/client/src/views/record/base.js b/client/src/views/record/base.js index c4ca66cd18..3eedcba70e 100644 --- a/client/src/views/record/base.js +++ b/client/src/views/record/base.js @@ -33,7 +33,6 @@ import ViewRecordHelper from 'view-record-helper'; import DynamicLogic from 'dynamic-logic'; import _ from 'underscore'; import $ from 'jquery'; -import DefaultsPopulator from 'helpers/model/defaults-populator'; /** * A base record view. To be extended. @@ -686,7 +685,7 @@ class BaseRecordView extends View { } this.listenTo(this.model, 'sync', () => { - this.attributes = this.model.getClonedAttributes(); + this.attributes = this.model.getClonedAttributes(); }); this.initDependency(); @@ -1303,15 +1302,12 @@ class BaseRecordView extends View { } /** - * Populate defaults. - * * @return {Promise|undefined} + * + * @deprecated As of v9.3.0. + * @todo Remove in v10.0. */ - populateDefaults() { - const populator = new DefaultsPopulator(); - - return populator.populate(this.model); - } + populateDefaults() {} // noinspection JSUnusedGlobalSymbols /** diff --git a/client/src/views/record/edit.js b/client/src/views/record/edit.js index 6497d588f6..69b7de1989 100644 --- a/client/src/views/record/edit.js +++ b/client/src/views/record/edit.js @@ -144,10 +144,10 @@ class EditRecordView extends DetailRecordView { super.setupBeforeFinal(); } + // @todo To be removed. if (promise) { this.wait(promise); - // @todo Revise. Possible race condition issues. promise.then(() => { super.setupBeforeFinal();