@roqueform/reset-plugin
Version:
Manages Roqueform field initial value and dirty status.
66 lines (63 loc) • 2.42 kB
JavaScript
import isDeepEqual from 'fast-deep-equal';
import { isEqual, dispatchEvents } from 'roqueform';
/**
* Enhances fields with methods that manage the initial value.
*
* @param equalityChecker The callback that compares initial value and the current value of the field. By default, the
* deep comparison is used.
*/
function resetPlugin(equalityChecker) {
if (equalityChecker === void 0) { equalityChecker = isDeepEqual; }
return function (field) {
Object.defineProperty(field, 'isDirty', {
configurable: true,
get: function () { return !equalityChecker(field.initialValue, field.value); },
});
field.setInitialValue = function (value) {
setInitialValue(field, value);
};
field.reset = function () {
field.setValue(field.initialValue);
};
field.getDirtyFields = function () { return getDirtyFields(field, []); };
};
}
function setInitialValue(field, initialValue) {
if (isEqual(field.initialValue, initialValue)) {
return;
}
var root = field;
while (root.parentField !== null) {
initialValue = field.valueAccessor.set(root.parentField.value, root.key, initialValue);
root = root.parentField;
}
dispatchEvents(propagateInitialValue(field, root, initialValue, []));
}
function propagateInitialValue(originField, targetField, initialValue, events) {
events.push({ type: 'change:initialValue', targetField: targetField, originField: originField, data: targetField.initialValue });
targetField.initialValue = initialValue;
if (targetField.children !== null) {
for (var _i = 0, _a = targetField.children; _i < _a.length; _i++) {
var child = _a[_i];
var childInitialValue = targetField.valueAccessor.get(initialValue, child.key);
if (child !== originField && isEqual(child.initialValue, childInitialValue)) {
continue;
}
propagateInitialValue(originField, child, childInitialValue, events);
}
}
return events;
}
function getDirtyFields(field, batch) {
if (field.isDirty) {
batch.push(field);
}
if (field.children !== null) {
for (var _i = 0, _a = field.children; _i < _a.length; _i++) {
var child = _a[_i];
getDirtyFields(child, batch);
}
}
return batch;
}
export { resetPlugin };