UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

224 lines (223 loc) 11.6 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; require("core-js/modules/web.dom-collections.iterator.js"); var _react = _interopRequireWildcard(require("react")); var _Isolation = _interopRequireDefault(require("../../Form/Isolation")); var _PushContainerContext = _interopRequireDefault(require("./PushContainerContext")); var _IterateItemContext = _interopRequireDefault(require("../IterateItemContext")); var _Context = _interopRequireDefault(require("../../DataContext/Context")); var _VisibilityContext = _interopRequireDefault(require("../../Form/Visibility/VisibilityContext")); var _useDataValue = _interopRequireDefault(require("../../hooks/useDataValue")); var _EditContainer = _interopRequireWildcard(require("../EditContainer")); var _Array = _interopRequireDefault(require("../Array")); var _OpenButton = _interopRequireDefault(require("./OpenButton")); var _components = require("../../../../components"); var _hooks = require("../hooks"); var _Toolbar = _interopRequireDefault(require("../Toolbar")); var _hooks2 = require("../../hooks"); var _Provider = require("../../DataContext/Provider"); var _structuredClone = _interopRequireDefault(require("@ungap/structured-clone")); 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 _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } 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; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } function PushContainer(props) { const [, forceUpdate] = (0, _react.useReducer)(() => ({}), {}); const { data: outerData, required: requiredInherited } = (0, _react.useContext)(_Context.default) || {}; const { data: dataProp, defaultData: defaultDataProp, isolatedData, bubbleValidation, path, itemPath, insertAt, title, required = requiredInherited, children, openButton, showOpenButtonWhen, onCommit } = props, rest = _objectWithoutProperties(props, _excluded); const { absolutePath } = (0, _hooks.useItemPath)(itemPath); const commitHandleRef = (0, _react.useRef)(); const switchContainerModeRef = (0, _react.useRef)(); const containerModeRef = (0, _react.useRef)(); const { value: entries = [], moveValueToPath, getValueByPath } = (0, _useDataValue.default)(path || itemPath); const { setNextContainerMode } = (0, _hooks.useSwitchContainerMode)(path || absolutePath); const { hasReachedLimit, setShowStatus } = (0, _hooks.useArrayLimit)(path || absolutePath); const cancelHandler = (0, _react.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 = (0, _react.useMemo)(() => { if (defaultDataProp) { return; } return _objectSpread(_objectSpread({}, isolatedData), {}, { pushContainerItems: [dataProp !== null && dataProp !== void 0 ? dataProp : _Provider.clearedData] }); }, [dataProp, defaultDataProp, isolatedData]); if (outerData) { Object.assign(data, outerData); } const defaultData = (0, _react.useMemo)(() => { return _objectSpread(_objectSpread({}, !dataProp ? isolatedData : null), {}, { pushContainerItems: [defaultDataProp !== null && defaultDataProp !== void 0 ? defaultDataProp : _Provider.clearedData] }); }, [dataProp, defaultDataProp, isolatedData]); const emptyData = (0, _react.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.default.createElement(_Isolation.default, { 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 ? (0, _structuredClone.default)(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.default.createElement(_PushContainerContext.default.Provider, { value: newItemContextProps }, _react.default.createElement(_Array.default, { path: "/pushContainerItems", containerMode: showOpenButton ? 'view' : 'edit', withoutFlex: true }, _react.default.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 } = (0, _react.useContext)(_IterateItemContext.default) || {}; containerModeRef.current = containerMode; (0, _react.useEffect)(() => { rerenderPushContainer(); }, [containerMode, rerenderPushContainer]); switchContainerModeRef.current = switchContainerMode; const isVisible = Boolean(!showOpenButton || containerMode === 'edit'); const { createButton } = (0, _hooks2.useTranslation)().IteratePushContainer; const { clearData } = (0, _react.useContext)(_Context.default) || {}; const restoreOriginalValue = (0, _react.useCallback)(() => { clearData === null || clearData === void 0 ? void 0 : clearData(); }, [clearData]); const toolbar = _react.default.createElement(_Toolbar.default, null, _react.default.createElement(_IterateItemContext.default.Consumer, null, context => { const newItemContextProps = _objectSpread(_objectSpread({}, context), {}, { restoreOriginalValue }); return _react.default.createElement(_IterateItemContext.default.Provider, { value: newItemContextProps }, _react.default.createElement(_components.Flex.Horizontal, { gap: "large" }, _DoneButton || (_DoneButton = _react.default.createElement(_EditContainer.DoneButton, { text: createButton })), showOpenButton && (_CancelButton || (_CancelButton = _react.default.createElement(_EditContainer.CancelButton, { onClick: cancelHandler }))))); })); return _react.default.createElement(_VisibilityContext.default.Provider, { value: { isVisible, keepInDOM: false } }, _react.default.createElement(_EditContainer.default, _extends({ open: isVisible, title: title, toolbar: toolbar }, rest), children), openButton && typeof showOpenButton === 'boolean' && _react.default.createElement(_components.HeightAnimation, { open: showOpenButton && containerMode === 'view' }, openButton)); } PushContainer.OpenButton = _OpenButton.default; PushContainer._supportsSpacingProps = true; var _default = exports.default = PushContainer; //# sourceMappingURL=PushContainer.js.map