ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
57 lines • 2.37 kB
JavaScript
import * as React from 'react';
import { useMemo } from 'react';
import { useFormContext } from 'react-hook-form';
import { useWrappedSource } from "../../core/useWrappedSource.js";
import { useEvent } from "../../util/index.js";
import { useArrayInput } from "./useArrayInput.js";
import { SimpleFormIteratorContext } from "./SimpleFormIteratorContext.js";
var DefaultGetItemDefaults = function (item) { return item; };
export var SimpleFormIteratorBase = function (props) {
var children = props.children, _a = props.getItemDefaults, getItemDefaultsProp = _a === void 0 ? DefaultGetItemDefaults : _a;
var getItemDefaults = useEvent(getItemDefaultsProp);
var finalSource = useWrappedSource('');
if (!finalSource) {
throw new Error('SimpleFormIterator can only be called within an iterator input like ArrayInput');
}
var _b = useArrayInput(props), append = _b.append, fields = _b.fields, move = _b.move, remove = _b.remove;
var _c = useFormContext(), trigger = _c.trigger, getValues = _c.getValues;
var removeField = useEvent(function (index) {
remove(index);
var isScalarArray = getValues(finalSource).every(function (value) { return typeof value !== 'object'; });
if (isScalarArray) {
// Trigger validation on the Array to avoid ghost errors.
// Otherwise, validation errors on removed fields might still be displayed
trigger(finalSource);
}
});
var addField = useEvent(function (item) {
if (item === void 0) { item = undefined; }
append(getItemDefaults(item));
});
var handleReorder = useEvent(function (origin, destination) {
move(origin, destination);
});
var handleArrayClear = useEvent(function () {
remove();
});
var context = useMemo(function () { return ({
total: fields.length,
add: addField,
clear: handleArrayClear,
remove: removeField,
reOrder: handleReorder,
source: finalSource,
}); }, [
addField,
fields.length,
handleArrayClear,
handleReorder,
removeField,
finalSource,
]);
if (!fields) {
return null;
}
return (React.createElement(SimpleFormIteratorContext.Provider, { value: context }, children));
};
//# sourceMappingURL=SimpleFormIteratorBase.js.map