ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
124 lines • 7.6 kB
JavaScript
import * as React from 'react';
import { useCallback, useState } from 'react';
import { useTranslate } from "../i18n/useTranslate.js";
import { Translate } from "../i18n/Translate.js";
import { useFieldValue } from "../util/useFieldValue.js";
import { useWrappedSource } from "../core/useWrappedSource.js";
import { useArrayInput } from "../controller/input/useArrayInput.js";
import { useSimpleFormIterator } from "../controller/input/useSimpleFormIterator.js";
import { useSimpleFormIteratorItem } from "../controller/input/useSimpleFormIteratorItem.js";
import { SimpleFormIteratorBase } from "../controller/input/SimpleFormIteratorBase.js";
import { SimpleFormIteratorItemBase } from "../controller/input/SimpleFormIteratorItemBase.js";
import { Confirm } from "./Confirm.js";
import { useGetArrayInputNewItemDefaults } from "../controller/index.js";
import { useEvent } from "../util/index.js";
const DefaultAddItemButton = (props) => {
const { add, source } = useSimpleFormIterator();
const { className, ...rest } = props;
return (React.createElement("button", { type: "button", onClick: () => add(), className: [`button-add button-add-${source}`, className].join(' '), ...rest },
React.createElement(Translate, { i18nKey: "ra.action.add" }, "Add")));
};
const DefaultRemoveItemButton = (props) => {
const { remove, index } = useSimpleFormIteratorItem();
const { source } = useSimpleFormIterator();
const { className, ...rest } = props;
return (React.createElement("button", { type: "button", onClick: () => remove(), className: [
`button-remove button-remove-${source}-${index}`,
className,
].join(' '), ...rest },
React.createElement(Translate, { i18nKey: "ra.action.remove" }, "Remove")));
};
const DefaultReOrderButtons = ({ className }) => {
const { index, total, reOrder } = useSimpleFormIteratorItem();
const { source } = useSimpleFormIterator();
return (React.createElement("span", { className: [
`button-reorder button-reorder-${source}-${index}`,
className,
].join(' ') },
React.createElement("button", { type: "button", onClick: () => reOrder(index - 1), disabled: index <= 0 },
React.createElement(Translate, { i18nKey: "ra.action.move_up" }, "Move Up")),
React.createElement("button", { type: "button", onClick: () => reOrder(index + 1), disabled: total == null || index >= total - 1 },
React.createElement(Translate, { i18nKey: "ra.action.move_down" }, "Move Down"))));
};
export const SimpleFormIteratorItem = React.forwardRef(function SimpleFormIteratorItem(props, ref) {
const { children, disabled, disableReordering, disableRemove, getItemLabel, index, inline, record, removeButton = React.createElement(DefaultRemoveItemButton, null), reOrderButtons = React.createElement(DefaultReOrderButtons, null), } = props;
// Returns a boolean to indicate whether to disable the remove button for certain fields.
// If disableRemove is a function, then call the function with the current record to
// determining if the button should be disabled. Otherwise, use a boolean property that
// enables or disables the button for all of the fields.
const disableRemoveField = (record) => {
if (typeof disableRemove === 'boolean') {
return disableRemove;
}
return disableRemove && disableRemove(record);
};
const label = typeof getItemLabel === 'function' ? getItemLabel(index) : getItemLabel;
return (React.createElement(SimpleFormIteratorItemBase, { ...props },
React.createElement("li", { ref: ref },
React.createElement("div", { style: {
display: 'flex',
gap: '1rem',
alignItems: 'center',
} },
label != null && label !== false && React.createElement("span", null, label),
React.createElement("div", { style: {
display: 'flex',
flexDirection: inline ? 'row' : 'column',
gap: '1rem',
} }, children),
!disabled && (React.createElement("span", null,
!disableReordering && reOrderButtons,
!disableRemoveField(record) && removeButton))),
React.createElement("hr", null))));
});
export const SimpleFormIterator = (props) => {
const { addButton = React.createElement(DefaultAddItemButton, null), removeButton, reOrderButtons, children, className, resource, disabled, disableAdd = false, disableClear, disableRemove = false, disableReordering, inline, getItemLabel = false, fullWidth, } = props;
const finalSource = useWrappedSource('');
if (!finalSource) {
throw new Error('SimpleFormIterator can only be called within an iterator input like ArrayInput');
}
const [confirmIsOpen, setConfirmIsOpen] = useState(false);
const { fields, remove } = useArrayInput(props);
const translate = useTranslate();
const handleArrayClear = useCallback(() => {
remove();
setConfirmIsOpen(false);
}, [remove]);
const records = useFieldValue({ source: finalSource });
const getArrayInputNewItemDefaults = useGetArrayInputNewItemDefaults(fields);
const getItemDefaults = useEvent((item = undefined) => {
if (item != null)
return item;
return getArrayInputNewItemDefaults(children);
});
return fields ? (React.createElement(SimpleFormIteratorBase, { getItemDefaults: getItemDefaults, ...props },
React.createElement("div", { className: [
className,
fullWidth ? 'fullwidth' : '',
disabled ? 'disabled' : '',
].join(' ') },
React.createElement("ul", { style: {
listStyle: 'none',
margin: 0,
padding: 0,
display: 'flex',
flexDirection: 'column',
gap: '1rem',
marginBottom: '1rem',
} }, fields.map((member, index) => (React.createElement(React.Fragment, { key: member.id },
React.createElement(SimpleFormIteratorItem, { disabled: disabled, disableRemove: disableRemove, disableReordering: disableReordering, fields: fields, getItemLabel: getItemLabel, index: index, record: (records && records[index]) || {}, removeButton: removeButton, reOrderButtons: reOrderButtons, resource: resource, inline: inline }, children))))),
!disabled &&
!(disableAdd && (disableClear || disableRemove)) && (React.createElement("div", { style: {
display: 'flex',
gap: '1rem',
marginBottom: '1rem',
} },
!disableAdd && React.createElement("div", null, addButton),
fields.length > 0 &&
!disableClear &&
!disableRemove && (React.createElement("div", null,
React.createElement(Confirm, { isOpen: confirmIsOpen, title: translate('ra.action.clear_array_input'), content: translate('ra.message.clear_array_input'), onConfirm: handleArrayClear, onClose: () => setConfirmIsOpen(false) }),
React.createElement("button", { type: "button", onClick: () => setConfirmIsOpen(true) },
React.createElement(Translate, { i18nKey: "ra.action.clear_array_input" }, "Clear"))))))))) : null;
};
//# sourceMappingURL=SimpleFormIterator.js.map