fix: Group field validator changes with field value changes. (#8589)

This commit is contained in:
John Nesky
2024-09-24 16:09:41 -07:00
committed by GitHub
parent bc2b142f62
commit 8d44a4d93a
2 changed files with 59 additions and 48 deletions

View File

@@ -1086,57 +1086,68 @@ export abstract class Field<T = any>
return; return;
} }
const classValidation = this.doClassValidation_(newValue); // Field validators are allowed to make changes to the workspace, which
const classValue = this.processValidation_( // should get grouped with the field value change event.
newValue, const existingGroup = eventUtils.getGroup();
classValidation, if (!existingGroup) {
fireChangeEvent, eventUtils.setGroup(true);
);
if (classValue instanceof Error) {
if (doLogging) console.log('invalid class validation, return');
return;
} }
const localValidation = this.getValidator()?.call(this, classValue); try {
const localValue = this.processValidation_( const classValidation = this.doClassValidation_(newValue);
classValue, const classValue = this.processValidation_(
localValidation, newValue,
fireChangeEvent, classValidation,
); fireChangeEvent,
if (localValue instanceof Error) {
if (doLogging) console.log('invalid local validation, return');
return;
}
const source = this.sourceBlock_;
if (source && source.disposed) {
if (doLogging) console.log('source disposed, return');
return;
}
const oldValue = this.getValue();
if (oldValue === localValue) {
if (doLogging) console.log('same, doValueUpdate_, return');
this.doValueUpdate_(localValue);
return;
}
this.doValueUpdate_(localValue);
if (fireChangeEvent && source && eventUtils.isEnabled()) {
eventUtils.fire(
new (eventUtils.get(EventType.BLOCK_CHANGE))(
source,
'field',
this.name || null,
oldValue,
localValue,
),
); );
if (classValue instanceof Error) {
if (doLogging) console.log('invalid class validation, return');
return;
}
const localValidation = this.getValidator()?.call(this, classValue);
const localValue = this.processValidation_(
classValue,
localValidation,
fireChangeEvent,
);
if (localValue instanceof Error) {
if (doLogging) console.log('invalid local validation, return');
return;
}
const source = this.sourceBlock_;
if (source && source.disposed) {
if (doLogging) console.log('source disposed, return');
return;
}
const oldValue = this.getValue();
if (oldValue === localValue) {
if (doLogging) console.log('same, doValueUpdate_, return');
this.doValueUpdate_(localValue);
return;
}
this.doValueUpdate_(localValue);
if (fireChangeEvent && source && eventUtils.isEnabled()) {
eventUtils.fire(
new (eventUtils.get(EventType.BLOCK_CHANGE))(
source,
'field',
this.name || null,
oldValue,
localValue,
),
);
}
if (this.isDirty_) {
this.forceRerender();
}
if (doLogging) console.log(this.value_);
} finally {
eventUtils.setGroup(existingGroup);
} }
if (this.isDirty_) {
this.forceRerender();
}
if (doLogging) console.log(this.value_);
} }
/** /**

View File

@@ -533,7 +533,7 @@ suite('JSO Serialization', function () {
}, },
'block': { 'block': {
'type': 'text', 'type': 'text',
'id': 'id3', 'id': 'id4',
'fields': { 'fields': {
'TEXT': '', 'TEXT': '',
}, },