UNPKG

@roqueform/reset-plugin

Version:
68 lines (64 loc) 2.46 kB
'use strict'; var isDeepEqual = require('fast-deep-equal'); var roqueform = require('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 (roqueform.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; } roqueform.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 && roqueform.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; } exports.resetPlugin = resetPlugin;