UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

213 lines (212 loc) 8.73 kB
"use client"; import _extends from "@babel/runtime/helpers/esm/extends"; import _defineProperty from "@babel/runtime/helpers/esm/defineProperty"; import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties"; const _excluded = ["data", "defaultData", "isolatedData", "bubbleValidation", "path", "itemPath", "insertAt", "title", "required", "children", "openButton", "showOpenButtonWhen", "onCommit"], _excluded2 = ["title", "openButton", "showOpenButton", "switchContainerModeRef", "cancelHandler", "containerModeRef", "rerenderPushContainer", "children"]; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } import "core-js/modules/web.dom-collections.iterator.js"; import React, { useCallback, useContext, useEffect, useMemo, useReducer, useRef } from 'react'; import Isolation from '../../Form/Isolation'; import PushContainerContext from './PushContainerContext'; import IterateItemContext from '../IterateItemContext'; import DataContext from '../../DataContext/Context'; import VisibilityContext from '../../Form/Visibility/VisibilityContext'; import useDataValue from '../../hooks/useDataValue'; import EditContainer, { CancelButton, DoneButton } from '../EditContainer'; import IterateArray from '../Array'; import OpenButton from './OpenButton'; import { Flex, HeightAnimation } from '../../../../components'; import { useArrayLimit, useItemPath, useSwitchContainerMode } from '../hooks'; import Toolbar from '../Toolbar'; import { useTranslation } from '../../hooks'; import { clearedData } from '../../DataContext/Provider'; import structuredClone from '@ungap/structured-clone'; function PushContainer(props) { const [, forceUpdate] = useReducer(() => ({}), {}); const { data: outerData, required: requiredInherited } = useContext(DataContext) || {}; const { data: dataProp, defaultData: defaultDataProp, isolatedData, bubbleValidation, path, itemPath, insertAt, title, required = requiredInherited, children, openButton, showOpenButtonWhen, onCommit } = props, rest = _objectWithoutProperties(props, _excluded); const { absolutePath } = useItemPath(itemPath); const commitHandleRef = useRef(); const switchContainerModeRef = useRef(); const containerModeRef = useRef(); const { value: entries = [], moveValueToPath, getValueByPath } = useDataValue(path || itemPath); const { setNextContainerMode } = useSwitchContainerMode(path || absolutePath); const { hasReachedLimit, setShowStatus } = useArrayLimit(path || absolutePath); const cancelHandler = useCallback(() => { if (hasReachedLimit) { setShowStatus(false); } }, [hasReachedLimit, setShowStatus]); const showOpenButton = showOpenButtonWhen === null || showOpenButtonWhen === void 0 ? void 0 : showOpenButtonWhen(entries); const newItemContextProps = { path, itemPath, entries, commitHandleRef, switchContainerMode: switchContainerModeRef.current }; const data = useMemo(() => { if (defaultDataProp) { return; } return _objectSpread(_objectSpread({}, isolatedData), {}, { pushContainerItems: [dataProp !== null && dataProp !== void 0 ? dataProp : clearedData] }); }, [dataProp, defaultDataProp, isolatedData]); if (outerData) { Object.assign(data, outerData); } const defaultData = useMemo(() => { return _objectSpread(_objectSpread({}, !dataProp ? isolatedData : null), {}, { pushContainerItems: [defaultDataProp !== null && defaultDataProp !== void 0 ? defaultDataProp : clearedData] }); }, [dataProp, defaultDataProp, isolatedData]); const emptyData = useCallback(data => { var _data$pushContainerIt; const firstItem = (_data$pushContainerIt = data.pushContainerItems) === null || _data$pushContainerIt === void 0 ? void 0 : _data$pushContainerIt[0]; if (firstItem === null || typeof firstItem !== 'object') { return _objectSpread(_objectSpread({}, isolatedData), {}, { pushContainerItems: [null] }); } return defaultData; }, [defaultData, isolatedData]); return React.createElement(Isolation, { data: data, defaultData: defaultData, required: required, emptyData: emptyData, bubbleValidation: containerModeRef.current === 'view' ? false : bubbleValidation, commitHandleRef: commitHandleRef, transformOnCommit: _ref => { let { pushContainerItems } = _ref; return moveValueToPath(path || absolutePath, typeof insertAt === 'number' ? [...entries.slice(0, insertAt), ...pushContainerItems, ...entries.slice(insertAt)] : [...entries, ...pushContainerItems], absolutePath ? structuredClone(getValueByPath('/')) : {}); }, onCommit: (data, options) => { const { clearData, preventCommit } = options; if (hasReachedLimit) { preventCommit(); setShowStatus(true); } else { var _switchContainerModeR; setNextContainerMode('view'); (_switchContainerModeR = switchContainerModeRef.current) === null || _switchContainerModeR === void 0 ? void 0 : _switchContainerModeR.call(switchContainerModeRef, 'view'); clearData(); } onCommit === null || onCommit === void 0 ? void 0 : onCommit(data, options); } }, React.createElement(PushContainerContext.Provider, { value: newItemContextProps }, React.createElement(IterateArray, { path: "/pushContainerItems", containerMode: showOpenButton ? 'view' : 'edit', withoutFlex: true }, React.createElement(NewContainer, _extends({ title: title, openButton: openButton, switchContainerModeRef: switchContainerModeRef, showOpenButton: showOpenButton, cancelHandler: cancelHandler, containerModeRef: containerModeRef, rerenderPushContainer: forceUpdate }, rest), children)))); } function NewContainer(_ref2) { var _DoneButton, _CancelButton; let { title, openButton, showOpenButton, switchContainerModeRef, cancelHandler, containerModeRef, rerenderPushContainer, children } = _ref2, rest = _objectWithoutProperties(_ref2, _excluded2); const { containerMode, switchContainerMode } = useContext(IterateItemContext) || {}; containerModeRef.current = containerMode; useEffect(() => { rerenderPushContainer(); }, [containerMode, rerenderPushContainer]); switchContainerModeRef.current = switchContainerMode; const isVisible = Boolean(!showOpenButton || containerMode === 'edit'); const { createButton } = useTranslation().IteratePushContainer; const { clearData } = useContext(DataContext) || {}; const restoreOriginalValue = useCallback(() => { clearData === null || clearData === void 0 ? void 0 : clearData(); }, [clearData]); const toolbar = React.createElement(Toolbar, null, React.createElement(IterateItemContext.Consumer, null, context => { const newItemContextProps = _objectSpread(_objectSpread({}, context), {}, { restoreOriginalValue }); return React.createElement(IterateItemContext.Provider, { value: newItemContextProps }, React.createElement(Flex.Horizontal, { gap: "large" }, _DoneButton || (_DoneButton = React.createElement(DoneButton, { text: createButton })), showOpenButton && (_CancelButton || (_CancelButton = React.createElement(CancelButton, { onClick: cancelHandler }))))); })); return React.createElement(VisibilityContext.Provider, { value: { isVisible, keepInDOM: false } }, React.createElement(EditContainer, _extends({ open: isVisible, title: title, toolbar: toolbar }, rest), children), openButton && typeof showOpenButton === 'boolean' && React.createElement(HeightAnimation, { open: showOpenButton && containerMode === 'view' }, openButton)); } PushContainer.OpenButton = OpenButton; PushContainer._supportsSpacingProps = true; export default PushContainer; //# sourceMappingURL=PushContainer.js.map