set field read only race condition fix

This commit is contained in:
Yuri Kuznetsov
2023-10-10 15:06:12 +03:00
parent 6de8c3d1ca
commit b0b4fe5570
2 changed files with 51 additions and 16 deletions
+2
View File
@@ -103,6 +103,8 @@ class ViewRecordHelper {
this.fieldStateMap[field] = this.fieldStateMap[field] || {};
this.fieldStateMap[field][name] = value;
this.trigger('field-change');
}
/**
+49 -16
View File
@@ -224,7 +224,7 @@ class BaseRecordView extends View {
* @param {boolean } [locked] To lock. Won't be able to un-set.
*/
setFieldReadOnly(name, locked) {
let previousValue = this.recordHelper.getFieldStateParam(name, 'readOnly');
const previousValue = this.recordHelper.getFieldStateParam(name, 'readOnly');
this.recordHelper.setFieldStateParam(name, 'readOnly', true);
@@ -232,7 +232,7 @@ class BaseRecordView extends View {
this.recordHelper.setFieldStateParam(name, 'readOnlyLocked', true);
}
let view = this.getFieldView(name);
const view = this.getFieldView(name);
if (view) {
view.setReadOnly(locked);
@@ -241,6 +241,27 @@ class BaseRecordView extends View {
if (!previousValue) {
this.trigger('set-field-read-only', name);
}
/**
* @todo
* Move to fields/base. Listen to recordHelper 'field-change' (if recordHelper is available).
* Same for set state methods.
* Issue is that sometimes state is changed in between view initialization (for bottom views with fields).
*/
if (!view && !this.isReady) {
this.once('ready', () => {
const view = this.getFieldView(name);
if (
view &&
!view.readOnly &&
this.recordHelper.getFieldStateParam(name, 'readOnly')
) {
view.setReadOnly(locked);
}
})
}
}
/**
@@ -249,21 +270,19 @@ class BaseRecordView extends View {
* @param {string} name A field name.
*/
setFieldNotReadOnly(name) {
let previousValue = this.recordHelper.getFieldStateParam(name, 'readOnly');
const previousValue = this.recordHelper.getFieldStateParam(name, 'readOnly');
this.recordHelper.setFieldStateParam(name, 'readOnly', false);
let view = this.getFieldView(name);
const view = this.getFieldView(name);
if (view) {
if (view.readOnly) {
view.setNotReadOnly();
if (view && view.readOnly) {
view.setNotReadOnly();
if (this.mode === this.MODE_EDIT) {
if (!view.readOnlyLocked && view.isDetailMode()) {
view.setEditMode()
.then(() => view.reRender());
}
if (this.mode === this.MODE_EDIT) {
if (!view.readOnlyLocked && view.isDetailMode()) {
view.setEditMode()
.then(() => view.reRender());
}
}
}
@@ -271,6 +290,20 @@ class BaseRecordView extends View {
if (previousValue) {
this.trigger('set-field-not-read-only', name);
}
if (!view && !this.isReady) {
this.once('ready', () => {
const view = this.getFieldView(name);
if (
view &&
view.readOnly &&
!this.recordHelper.getFieldStateParam(name, 'readOnly')
) {
view.setNotReadOnly();
}
})
}
}
/**
@@ -279,11 +312,11 @@ class BaseRecordView extends View {
* @param {string} name A field name.
*/
setFieldRequired(name) {
let previousValue = this.recordHelper.getFieldStateParam(name, 'required');
const previousValue = this.recordHelper.getFieldStateParam(name, 'required');
this.recordHelper.setFieldStateParam(name, 'required', true);
let view = this.getFieldView(name);
const view = this.getFieldView(name);
if (view) {
view.setRequired();
@@ -300,11 +333,11 @@ class BaseRecordView extends View {
* @param {string} name A field name.
*/
setFieldNotRequired(name) {
let previousValue = this.recordHelper.getFieldStateParam(name, 'required');
const previousValue = this.recordHelper.getFieldStateParam(name, 'required');
this.recordHelper.setFieldStateParam(name, 'required', false);
let view = this.getFieldView(name);
const view = this.getFieldView(name);
if (view) {
view.setNotRequired();