UNPKG

ra-core

Version:

Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React

55 lines 2.8 kB
import * as React from 'react'; import { useMemo } from 'react'; import { SourceContextProvider, useResourceContext, useSourceContext, } from "../../core/index.js"; import { useSimpleFormIterator } from "./useSimpleFormIterator.js"; import { SimpleFormIteratorItemContext, } from "./SimpleFormIteratorItemContext.js"; export const SimpleFormIteratorItemBase = (props) => { const { children, index } = props; const resource = useResourceContext(props); if (!resource) { throw new Error('SimpleFormIteratorItem must be used in a ResourceContextProvider or be passed a resource prop.'); } const { total, reOrder, remove } = useSimpleFormIterator(); const context = useMemo(() => ({ index, total, reOrder: newIndex => reOrder(index, newIndex), remove: () => remove(index), }), [index, total, reOrder, remove]); const parentSourceContext = useSourceContext(); const sourceContext = useMemo(() => ({ getSource: (source) => { if (!source) { // source can be empty for scalar values, e.g. // <ArrayInput source="tags" /> => SourceContext is "tags" // <SimpleFormIterator> => SourceContext is "tags.0" // <TextInput /> => use its parent's getSource so finalSource = "tags.0" // </SimpleFormIterator> // </ArrayInput> return parentSourceContext.getSource(`${index}`); } else { // Normal input with source, e.g. // <ArrayInput source="orders" /> => SourceContext is "orders" // <SimpleFormIterator> => SourceContext is "orders.0" // <DateInput source="date" /> => use its parent's getSource so finalSource = "orders.0.date" // </SimpleFormIterator> // </ArrayInput> return parentSourceContext.getSource(`${index}.${source}`); } }, getLabel: (source) => { // <ArrayInput source="orders" /> => LabelContext is "orders" // <SimpleFormIterator> => LabelContext is ALSO "orders" // <DateInput source="date" /> => use its parent's getLabel so finalLabel = "orders.date" // </SimpleFormIterator> // </ArrayInput> // // we don't prefix with the index to avoid that translation keys contain it return parentSourceContext.getLabel(source); }, }), [index, parentSourceContext]); return (React.createElement(SimpleFormIteratorItemContext.Provider, { value: context }, React.createElement(SourceContextProvider, { value: sourceContext }, children))); }; //# sourceMappingURL=SimpleFormIteratorItemBase.js.map