@mittwald/flow-react-components 0.2.0-alpha.987 → 0.2.0-alpha.988
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/assets/doc-properties.json +22620 -22572
- package/dist/js/packages/components/src/components/Modal/Modal.mjs +7 -3
- package/dist/js/packages/components/src/components/Modal/Modal.mjs.map +1 -1
- package/dist/js/packages/components/src/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal.mjs +5 -3
- package/dist/js/packages/components/src/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal.mjs.map +1 -1
- package/dist/js/packages/components/src/components/Overlay/Overlay.mjs.map +1 -1
- package/dist/js/packages/components/src/integrations/react-hook-form/components/Form/Form.mjs +25 -26
- package/dist/js/packages/components/src/integrations/react-hook-form/components/Form/Form.mjs.map +1 -1
- package/dist/js/packages/components/src/lib/controller/overlay/OverlayController.mjs +47 -12
- package/dist/js/packages/components/src/lib/controller/overlay/OverlayController.mjs.map +1 -1
- package/dist/types/components/Modal/Modal.d.ts +5 -0
- package/dist/types/components/Modal/Modal.d.ts.map +1 -1
- package/dist/types/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal.d.ts +4 -0
- package/dist/types/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal.d.ts.map +1 -1
- package/dist/types/components/Modal/stories/Default.stories.d.ts +1 -0
- package/dist/types/components/Modal/stories/Default.stories.d.ts.map +1 -1
- package/dist/types/components/Overlay/Overlay.d.ts +2 -0
- package/dist/types/components/Overlay/Overlay.d.ts.map +1 -1
- package/dist/types/integrations/react-hook-form/components/Form/Form.d.ts.map +1 -1
- package/dist/types/lib/controller/overlay/OverlayController.d.ts +23 -1
- package/dist/types/lib/controller/overlay/OverlayController.d.ts.map +1 -1
- package/package.json +6 -6
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
-
import {
|
|
3
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
import { useId, Suspense } from 'react';
|
|
5
5
|
import styles from './Modal.module.scss.mjs';
|
|
6
6
|
import clsx from 'clsx';
|
|
@@ -24,6 +24,7 @@ import '../../views/IconView.mjs';
|
|
|
24
24
|
import { IconClose } from '../Icon/components/icons/IconClose.mjs';
|
|
25
25
|
import ButtonView from '../../views/ButtonView.mjs';
|
|
26
26
|
import { OffCanvasSuspenseFallback } from './components/OffCanvasSuspenseFallback/OffCanvasSuspenseFallback.mjs';
|
|
27
|
+
import { ConfirmUnsavedChangesModal } from './components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal.mjs';
|
|
27
28
|
import { Wrap } from '../Wrap/Wrap.mjs';
|
|
28
29
|
import { ClearPropsContext } from '../../lib/propsContext/components/ClearPropsContext.mjs';
|
|
29
30
|
import '../TranslationProvider/TranslationProvider.mjs';
|
|
@@ -131,7 +132,7 @@ const Modal = flowComponent("Modal", (props) => {
|
|
|
131
132
|
}
|
|
132
133
|
}
|
|
133
134
|
};
|
|
134
|
-
return /* @__PURE__ */
|
|
135
|
+
return /* @__PURE__ */ jsxs(
|
|
135
136
|
Overlay,
|
|
136
137
|
{
|
|
137
138
|
className: rootClassName,
|
|
@@ -139,7 +140,10 @@ const Modal = flowComponent("Modal", (props) => {
|
|
|
139
140
|
ref,
|
|
140
141
|
"aria-labelledby": generatedId,
|
|
141
142
|
...overlayProps,
|
|
142
|
-
children:
|
|
143
|
+
children: [
|
|
144
|
+
/* @__PURE__ */ jsx(PropsContextProvider, { props: propsContext, children: /* @__PURE__ */ jsx(Wrap, { if: offCanvas, children: /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(OffCanvasSuspenseFallback, {}), children }) }) }),
|
|
145
|
+
/* @__PURE__ */ jsx(ConfirmUnsavedChangesModal, {})
|
|
146
|
+
]
|
|
143
147
|
}
|
|
144
148
|
);
|
|
145
149
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.mjs","sources":["../../../../../../../src/components/Modal/Modal.tsx"],"sourcesContent":["import { type PropsWithChildren, type ReactNode, Suspense, useId } from \"react\";\nimport styles from \"./Modal.module.scss\";\nimport clsx from \"clsx\";\nimport {\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport { OverlayController } from \"@/lib/controller/overlay\";\nimport type { FlowComponentProps } from \"@/lib/componentFactory/flowComponent\";\nimport { flowComponent } from \"@/lib/componentFactory/flowComponent\";\nimport { Overlay, type OverlayProps } from \"@/components/Overlay/Overlay\";\nimport { Action } from \"@/components/Action\";\nimport { IconClose } from \"@/components/Icon/components/icons\";\nimport type { PropsWithClassName } from \"@/lib/types/props\";\nimport ButtonView from \"@/views/ButtonView\";\nimport { OffCanvasSuspenseFallback } from \"@/components/Modal/components/OffCanvasSuspenseFallback\";\nimport Wrap from \"@/components/Wrap\";\nimport { ClearPropsContext } from \"@/components/ClearPropsContext/ClearPropsContext\";\nimport { useLocalizedStringFormatter } from \"@/components/TranslationProvider\";\nimport { useVirtualKeyboardVisible } from \"@/lib/hooks/dom/useVirtualKeyboardVisible\";\nimport locales from \"./locales/*.locale.json\";\n\ntype SupportedOverlayProps = Pick<\n OverlayProps,\n \"isOpen\" | \"isDefaultOpen\" | \"onOpen\" | \"onClose\" | \"onOpenChange\"\n>;\n\nexport interface ModalProps\n extends\n PropsWithChildren,\n FlowComponentProps,\n PropsWithClassName,\n SupportedOverlayProps {\n /** The size of the modal. @default \"s\" */\n size?: \"s\" | \"m\" | \"l\";\n /** Whether the modal should be displayed as an off canvas. */\n offCanvas?: boolean;\n /**\n * Whether the off canvas should be displayed on the right or left side of the\n * screen. @default \"right\"\n */\n offCanvasOrientation?: \"left\" | \"right\";\n /** An overlay controller to control the modal state. */\n controller?: OverlayController;\n /**\n * Accepts \"actionConfirm\" to use the modal as a confirmation modal for an\n * action.\n */\n slot?: string;\n /** Whether the modal can be closed by clicking outside of it. */\n isDismissable?: boolean;\n /** Whether the close button should be visible */\n showCloseButton?: boolean;\n}\n\nexport const Modal = flowComponent(\"Modal\", (props) => {\n const {\n size = \"s\",\n offCanvas,\n controller,\n children,\n ref,\n className,\n offCanvasOrientation = \"right\",\n showCloseButton,\n ...overlayProps\n } = props;\n\n const stringFormatter = useLocalizedStringFormatter(locales, \"Modal\");\n\n // On mobile the header/footer are docked (sticky) while at rest, but flow\n // normally while the on-screen keyboard is open so the content gets the full\n // available space (see Modal.module.scss). #2423\n const keyboardVisible = useVirtualKeyboardVisible();\n\n const rootClassName = clsx(\n offCanvas ? styles.offCanvas : styles.modal,\n styles[`size-${size}`],\n offCanvasOrientation === \"left\" && styles[\"left\"],\n keyboardVisible && styles.keyboardVisible,\n className,\n );\n\n const generatedId = useId();\n\n const header = (children: ReactNode) => (\n <>\n {children}\n <Action closeModal={{ bypassConfirmation: true }}>\n <ButtonView\n variant=\"plain\"\n color=\"secondary\"\n aria-label={stringFormatter.format(\"close\")}\n className={clsx(\n styles.closeButton,\n showCloseButton === true\n ? styles.alwaysVisible\n : showCloseButton === false\n ? styles.alwaysHidden\n : undefined,\n )}\n >\n <IconClose />\n </ButtonView>\n </Action>\n </>\n );\n\n const nestedHeadingLevel = 3;\n\n const nestedHeadingProps: PropsContext = {\n Heading: { level: nestedHeadingLevel },\n Section: {\n Header: { Heading: { level: nestedHeadingLevel } },\n Heading: { level: nestedHeadingLevel },\n hideSeparator: true,\n },\n Header: { Heading: { level: nestedHeadingLevel } },\n };\n\n const propsContext: PropsContext = {\n Content: {\n ...nestedHeadingProps,\n className: styles.content,\n },\n ColumnLayout: {\n ...nestedHeadingProps,\n l: [2, 1],\n m: [1],\n className: styles.columnLayout,\n AccentBox: { className: styles.accentBox, backgroundColor: \"neutral\" },\n wrapWith: <ClearPropsContext />,\n },\n Heading: {\n className: styles.header,\n level: 2,\n children: dynamic((props) => header(props.children)),\n id: generatedId,\n },\n ActionGroup: {\n className: styles.actionGroup,\n spacing: \"m\",\n Action: {\n closeModal: dynamic((props) => {\n if (props.closeModal === undefined) {\n return;\n }\n if (props.closeModal === true) {\n return { bypassConfirmation: true };\n }\n return {\n bypassConfirmation: true,\n ...props.closeModal,\n };\n }),\n closeOverlay: dynamic((props) => {\n if (props.closeOverlay === undefined) {\n return;\n }\n if (\n props.closeOverlay instanceof OverlayController ||\n typeof props.closeOverlay === \"string\"\n ) {\n return {\n bypassConfirmation: true,\n overlay: props.closeOverlay,\n };\n }\n return {\n bypassConfirmation: true,\n ...props.closeOverlay,\n };\n }),\n },\n },\n };\n\n return (\n <Overlay\n className={rootClassName}\n controller={controller}\n ref={ref}\n aria-labelledby={generatedId}\n {...overlayProps}\n >\n <PropsContextProvider props={propsContext}>\n <Wrap if={offCanvas}>\n <Suspense fallback={<OffCanvasSuspenseFallback />}>\n {children}\n </Suspense>\n </Wrap>\n </PropsContextProvider>\n </Overlay>\n );\n});\n\nexport default Modal;\n"],"names":["children","props"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Modal.mjs","sources":["../../../../../../../src/components/Modal/Modal.tsx"],"sourcesContent":["import { type PropsWithChildren, type ReactNode, Suspense, useId } from \"react\";\nimport styles from \"./Modal.module.scss\";\nimport clsx from \"clsx\";\nimport {\n dynamic,\n type PropsContext,\n PropsContextProvider,\n} from \"@/lib/propsContext\";\nimport { OverlayController } from \"@/lib/controller/overlay\";\nimport type { FlowComponentProps } from \"@/lib/componentFactory/flowComponent\";\nimport { flowComponent } from \"@/lib/componentFactory/flowComponent\";\nimport { Overlay, type OverlayProps } from \"@/components/Overlay/Overlay\";\nimport { Action } from \"@/components/Action\";\nimport { IconClose } from \"@/components/Icon/components/icons\";\nimport type { PropsWithClassName } from \"@/lib/types/props\";\nimport ButtonView from \"@/views/ButtonView\";\nimport { OffCanvasSuspenseFallback } from \"@/components/Modal/components/OffCanvasSuspenseFallback\";\nimport { ConfirmUnsavedChangesModal } from \"@/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal\";\nimport Wrap from \"@/components/Wrap\";\nimport { ClearPropsContext } from \"@/components/ClearPropsContext/ClearPropsContext\";\nimport { useLocalizedStringFormatter } from \"@/components/TranslationProvider\";\nimport { useVirtualKeyboardVisible } from \"@/lib/hooks/dom/useVirtualKeyboardVisible\";\nimport locales from \"./locales/*.locale.json\";\n\ntype SupportedOverlayProps = Pick<\n OverlayProps,\n \"isOpen\" | \"isDefaultOpen\" | \"onOpen\" | \"onClose\" | \"onOpenChange\"\n>;\n\nexport interface ModalProps\n extends\n PropsWithChildren,\n FlowComponentProps,\n PropsWithClassName,\n SupportedOverlayProps {\n /** The size of the modal. @default \"s\" */\n size?: \"s\" | \"m\" | \"l\";\n /** Whether the modal should be displayed as an off canvas. */\n offCanvas?: boolean;\n /**\n * Whether the off canvas should be displayed on the right or left side of the\n * screen. @default \"right\"\n */\n offCanvasOrientation?: \"left\" | \"right\";\n /** An overlay controller to control the modal state. */\n controller?: OverlayController;\n /**\n * Accepts \"actionConfirm\" to use the modal as a confirmation modal for an\n * action.\n */\n slot?: string;\n /** Whether the modal can be closed by clicking outside of it. */\n isDismissable?: boolean;\n /** Whether the close button should be visible */\n showCloseButton?: boolean;\n /**\n * Whether closing the modal must be confirmed – use it to protect unsaved\n * changes.\n */\n confirmOnClose?: boolean;\n}\n\nexport const Modal = flowComponent(\"Modal\", (props) => {\n const {\n size = \"s\",\n offCanvas,\n controller,\n children,\n ref,\n className,\n offCanvasOrientation = \"right\",\n showCloseButton,\n ...overlayProps\n } = props;\n\n const stringFormatter = useLocalizedStringFormatter(locales, \"Modal\");\n\n // On mobile the header/footer are docked (sticky) while at rest, but flow\n // normally while the on-screen keyboard is open so the content gets the full\n // available space (see Modal.module.scss). #2423\n const keyboardVisible = useVirtualKeyboardVisible();\n\n const rootClassName = clsx(\n offCanvas ? styles.offCanvas : styles.modal,\n styles[`size-${size}`],\n offCanvasOrientation === \"left\" && styles[\"left\"],\n keyboardVisible && styles.keyboardVisible,\n className,\n );\n\n const generatedId = useId();\n\n const header = (children: ReactNode) => (\n <>\n {children}\n <Action closeModal={{ bypassConfirmation: true }}>\n <ButtonView\n variant=\"plain\"\n color=\"secondary\"\n aria-label={stringFormatter.format(\"close\")}\n className={clsx(\n styles.closeButton,\n showCloseButton === true\n ? styles.alwaysVisible\n : showCloseButton === false\n ? styles.alwaysHidden\n : undefined,\n )}\n >\n <IconClose />\n </ButtonView>\n </Action>\n </>\n );\n\n const nestedHeadingLevel = 3;\n\n const nestedHeadingProps: PropsContext = {\n Heading: { level: nestedHeadingLevel },\n Section: {\n Header: { Heading: { level: nestedHeadingLevel } },\n Heading: { level: nestedHeadingLevel },\n hideSeparator: true,\n },\n Header: { Heading: { level: nestedHeadingLevel } },\n };\n\n const propsContext: PropsContext = {\n Content: {\n ...nestedHeadingProps,\n className: styles.content,\n },\n ColumnLayout: {\n ...nestedHeadingProps,\n l: [2, 1],\n m: [1],\n className: styles.columnLayout,\n AccentBox: { className: styles.accentBox, backgroundColor: \"neutral\" },\n wrapWith: <ClearPropsContext />,\n },\n Heading: {\n className: styles.header,\n level: 2,\n children: dynamic((props) => header(props.children)),\n id: generatedId,\n },\n ActionGroup: {\n className: styles.actionGroup,\n spacing: \"m\",\n Action: {\n closeModal: dynamic((props) => {\n if (props.closeModal === undefined) {\n return;\n }\n if (props.closeModal === true) {\n return { bypassConfirmation: true };\n }\n return {\n bypassConfirmation: true,\n ...props.closeModal,\n };\n }),\n closeOverlay: dynamic((props) => {\n if (props.closeOverlay === undefined) {\n return;\n }\n if (\n props.closeOverlay instanceof OverlayController ||\n typeof props.closeOverlay === \"string\"\n ) {\n return {\n bypassConfirmation: true,\n overlay: props.closeOverlay,\n };\n }\n return {\n bypassConfirmation: true,\n ...props.closeOverlay,\n };\n }),\n },\n },\n };\n\n return (\n <Overlay\n className={rootClassName}\n controller={controller}\n ref={ref}\n aria-labelledby={generatedId}\n {...overlayProps}\n >\n <PropsContextProvider props={propsContext}>\n <Wrap if={offCanvas}>\n <Suspense fallback={<OffCanvasSuspenseFallback />}>\n {children}\n </Suspense>\n </Wrap>\n </PropsContextProvider>\n <ConfirmUnsavedChangesModal />\n </Overlay>\n );\n});\n\nexport default Modal;\n"],"names":["children","props"],"mappings":"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"}
|
|
@@ -18,8 +18,10 @@ import '../../../../lib/controller/overlay/context.mjs';
|
|
|
18
18
|
|
|
19
19
|
const ConfirmUnsavedChangesModal = () => {
|
|
20
20
|
const stringFormatter = useLocalizedStringFormatter(locales, "Modal");
|
|
21
|
-
const
|
|
22
|
-
|
|
21
|
+
const modalController = useModalController();
|
|
22
|
+
const confirmOnCloseEnabled = modalController.useConfirmOnCloseEnabled();
|
|
23
|
+
const closeConfirmationController = modalController.useConfirmationController();
|
|
24
|
+
if (confirmOnCloseEnabled && closeConfirmationController) {
|
|
23
25
|
const { controller, confirm, cancel } = closeConfirmationController;
|
|
24
26
|
return /* @__PURE__ */ jsxs(Modal, { controller, children: [
|
|
25
27
|
/* @__PURE__ */ jsx(HeadingView, { children: stringFormatter.format("unsavedChangesConfirmationModal.heading") }),
|
|
@@ -36,5 +38,5 @@ const ConfirmUnsavedChangesModal = () => {
|
|
|
36
38
|
}
|
|
37
39
|
};
|
|
38
40
|
|
|
39
|
-
export { ConfirmUnsavedChangesModal
|
|
41
|
+
export { ConfirmUnsavedChangesModal };
|
|
40
42
|
//# sourceMappingURL=ConfirmUnsavedChangesModal.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmUnsavedChangesModal.mjs","sources":["../../../../../../../../../src/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal.tsx"],"sourcesContent":["import ContentView from \"@/views/ContentView\";\nimport HeadingView from \"@/views/HeadingView\";\nimport type { FC } from \"react\";\nimport { useLocalizedStringFormatter } from \"@/components/TranslationProvider/useLocalizedStringFormatter\";\nimport locales from \"../../locales/*.locale.json\";\nimport Modal from \"@/components/Modal/Modal\";\nimport TextView from \"@/views/TextView\";\nimport ActionGroupView from \"@/views/ActionGroupView\";\nimport Action from \"@/components/Action\";\nimport ButtonView from \"@/views/ButtonView\";\nimport { useModalController } from \"@/lib/controller\";\n\nexport const ConfirmUnsavedChangesModal: FC = () => {\n const stringFormatter = useLocalizedStringFormatter(locales, \"Modal\");\n const closeConfirmationController =\n
|
|
1
|
+
{"version":3,"file":"ConfirmUnsavedChangesModal.mjs","sources":["../../../../../../../../../src/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal.tsx"],"sourcesContent":["import ContentView from \"@/views/ContentView\";\nimport HeadingView from \"@/views/HeadingView\";\nimport type { FC } from \"react\";\nimport { useLocalizedStringFormatter } from \"@/components/TranslationProvider/useLocalizedStringFormatter\";\nimport locales from \"../../locales/*.locale.json\";\nimport Modal from \"@/components/Modal/Modal\";\nimport TextView from \"@/views/TextView\";\nimport ActionGroupView from \"@/views/ActionGroupView\";\nimport Action from \"@/components/Action\";\nimport ButtonView from \"@/views/ButtonView\";\nimport { useModalController } from \"@/lib/controller\";\n\n/**\n * Rendered by every `Modal` and only becomes active once something requires the\n * close to be confirmed – the `confirmOnClose` prop or a dirty `Form`.\n */\nexport const ConfirmUnsavedChangesModal: FC = () => {\n const stringFormatter = useLocalizedStringFormatter(locales, \"Modal\");\n const modalController = useModalController();\n const confirmOnCloseEnabled = modalController.useConfirmOnCloseEnabled();\n const closeConfirmationController =\n modalController.useConfirmationController();\n\n if (confirmOnCloseEnabled && closeConfirmationController) {\n const { controller, confirm, cancel } = closeConfirmationController;\n\n return (\n <Modal controller={controller}>\n <HeadingView>\n {stringFormatter.format(\"unsavedChangesConfirmationModal.heading\")}\n </HeadingView>\n <ContentView>\n <TextView>\n {stringFormatter.format(\"unsavedChangesConfirmationModal.text\")}\n </TextView>\n </ContentView>\n <ActionGroupView>\n <Action closeModal>\n <Action onAction={confirm}>\n <ButtonView color=\"danger\">\n {stringFormatter.format(\n \"unsavedChangesConfirmationModal.close\",\n )}\n </ButtonView>\n </Action>\n <Action onAction={cancel}>\n <ButtonView color=\"secondary\" variant=\"soft\">\n {stringFormatter.format(\n \"unsavedChangesConfirmationModal.keepOpen\",\n )}\n </ButtonView>\n </Action>\n </Action>\n </ActionGroupView>\n </Modal>\n );\n }\n};\n\nexport default ConfirmUnsavedChangesModal;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAgBO,MAAM,6BAAiC,MAAM;AAClD,EAAA,MAAM,eAAA,GAAkB,2BAAA,CAA4B,OAAA,EAAS,OAAO,CAAA;AACpE,EAAA,MAAM,kBAAkB,kBAAA,EAAmB;AAC3C,EAAA,MAAM,qBAAA,GAAwB,gBAAgB,wBAAA,EAAyB;AACvE,EAAA,MAAM,2BAAA,GACJ,gBAAgB,yBAAA,EAA0B;AAE5C,EAAA,IAAI,yBAAyB,2BAAA,EAA6B;AACxD,IAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,MAAA,EAAO,GAAI,2BAAA;AAExC,IAAA,uBACE,IAAA,CAAC,SAAM,UAAA,EACL,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,WAAA,EAAA,EACE,QAAA,EAAA,eAAA,CAAgB,MAAA,CAAO,yCAAyC,CAAA,EACnE,CAAA;AAAA,sBACA,GAAA,CAAC,eACC,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EACE,0BAAgB,MAAA,CAAO,sCAAsC,GAChE,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,eAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAO,YAAU,IAAA,EAChB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAO,QAAA,EAAU,OAAA,EAChB,8BAAC,UAAA,EAAA,EAAW,KAAA,EAAM,UACf,QAAA,EAAA,eAAA,CAAgB,MAAA;AAAA,UACf;AAAA,WAEJ,CAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,MAAA,EAAA,EAAO,QAAA,EAAU,MAAA,EAChB,QAAA,kBAAA,GAAA,CAAC,cAAW,KAAA,EAAM,WAAA,EAAY,OAAA,EAAQ,MAAA,EACnC,QAAA,EAAA,eAAA,CAAgB,MAAA;AAAA,UACf;AAAA,WAEJ,CAAA,EACF;AAAA,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Overlay.mjs","sources":["../../../../../../../src/components/Overlay/Overlay.tsx"],"sourcesContent":["import type { FC, PropsWithChildren, Ref } from \"react\";\nimport styles from \"./Overlay.module.scss\";\nimport clsx from \"clsx\";\nimport type { OverlayController } from \"@/lib/controller\";\nimport { useOverlayController } from \"@/lib/controller\";\nimport OverlayContextProvider from \"@/lib/controller/overlay/OverlayContextProvider\";\nimport type { PropsWithClassName } from \"@/lib/types/props\";\nimport OverlayContentView from \"@/views/OverlayContentView\";\nimport type {\n OverlayCloseHandler,\n OverlayOpenHandler,\n OverlayOpenStateHandler,\n} from \"@/lib/controller/overlay/OverlayController\";\nimport type * as Aria from \"react-aria-components\";\n\nexport interface OverlayProps\n extends\n PropsWithChildren,\n PropsWithClassName,\n Pick<Aria.DialogProps, \"aria-labelledby\"> {\n ref?: Ref<HTMLDivElement>;\n /** The controller to control the overlay state. */\n controller?: OverlayController;\n /** Whether the overlay can be closed by clicking outside of it. */\n isDismissable?: boolean;\n /** Whether the overlay is a modal or a light box. */\n overlayType?: \"Modal\" | \"LightBox\";\n isOpen?: boolean;\n isDefaultOpen?: boolean;\n onOpen?: OverlayOpenHandler;\n onClose?: OverlayCloseHandler;\n onOpenChange?: OverlayOpenStateHandler;\n}\n\nexport const Overlay: FC<OverlayProps> = (props) => {\n const {\n controller: controllerFromProps,\n children,\n isDismissable = true,\n className,\n overlayType = \"Modal\",\n isDefaultOpen,\n isOpen: isOpenFromProps,\n ref,\n \"aria-labelledby\": ariaLabelledBy,\n ...controllerOptions\n } = props;\n\n const controllerFromContext = useOverlayController(overlayType, {\n reuseControllerFromContext: true,\n isDefaultOpen,\n });\n\n const controller = controllerFromProps ?? controllerFromContext;\n controller.useUpdateOptions(controllerOptions);\n\n const isOpen = isOpenFromProps ?? controller.useIsOpen();\n\n const rootClassName = clsx(styles.overlay, className);\n\n return (\n <OverlayContentView\n onOpenChange={controller.setOpen}\n isOpen={isOpen}\n ref={ref}\n isDismissable={isDismissable}\n className={rootClassName}\n aria-labelledby={ariaLabelledBy}\n >\n <OverlayContextProvider type=\"Modal\" controller={controller}>\n {children}\n </OverlayContextProvider>\n </OverlayContentView>\n );\n};\n\nexport default Overlay;\n"],"names":[],"mappings":";;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Overlay.mjs","sources":["../../../../../../../src/components/Overlay/Overlay.tsx"],"sourcesContent":["import type { FC, PropsWithChildren, Ref } from \"react\";\nimport styles from \"./Overlay.module.scss\";\nimport clsx from \"clsx\";\nimport type { OverlayController } from \"@/lib/controller\";\nimport { useOverlayController } from \"@/lib/controller\";\nimport OverlayContextProvider from \"@/lib/controller/overlay/OverlayContextProvider\";\nimport type { PropsWithClassName } from \"@/lib/types/props\";\nimport OverlayContentView from \"@/views/OverlayContentView\";\nimport type {\n OverlayCloseHandler,\n OverlayOpenHandler,\n OverlayOpenStateHandler,\n} from \"@/lib/controller/overlay/OverlayController\";\nimport type * as Aria from \"react-aria-components\";\n\nexport interface OverlayProps\n extends\n PropsWithChildren,\n PropsWithClassName,\n Pick<Aria.DialogProps, \"aria-labelledby\"> {\n ref?: Ref<HTMLDivElement>;\n /** The controller to control the overlay state. */\n controller?: OverlayController;\n /** Whether the overlay can be closed by clicking outside of it. */\n isDismissable?: boolean;\n /** Whether the overlay is a modal or a light box. */\n overlayType?: \"Modal\" | \"LightBox\";\n isOpen?: boolean;\n isDefaultOpen?: boolean;\n onOpen?: OverlayOpenHandler;\n onClose?: OverlayCloseHandler;\n onOpenChange?: OverlayOpenStateHandler;\n /** Whether closing the overlay must be confirmed. */\n confirmOnClose?: boolean;\n}\n\nexport const Overlay: FC<OverlayProps> = (props) => {\n const {\n controller: controllerFromProps,\n children,\n isDismissable = true,\n className,\n overlayType = \"Modal\",\n isDefaultOpen,\n isOpen: isOpenFromProps,\n ref,\n \"aria-labelledby\": ariaLabelledBy,\n ...controllerOptions\n } = props;\n\n const controllerFromContext = useOverlayController(overlayType, {\n reuseControllerFromContext: true,\n isDefaultOpen,\n });\n\n const controller = controllerFromProps ?? controllerFromContext;\n controller.useUpdateOptions(controllerOptions);\n\n const isOpen = isOpenFromProps ?? controller.useIsOpen();\n\n const rootClassName = clsx(styles.overlay, className);\n\n return (\n <OverlayContentView\n onOpenChange={controller.setOpen}\n isOpen={isOpen}\n ref={ref}\n isDismissable={isDismissable}\n className={rootClassName}\n aria-labelledby={ariaLabelledBy}\n >\n <OverlayContextProvider type=\"Modal\" controller={controller}>\n {children}\n </OverlayContextProvider>\n </OverlayContentView>\n );\n};\n\nexport default Overlay;\n"],"names":[],"mappings":";;;;;;;;;;;;;AAoCO,MAAM,OAAA,GAA4B,CAAC,KAAA,KAAU;AAClD,EAAA,MAAM;AAAA,IACJ,UAAA,EAAY,mBAAA;AAAA,IACZ,QAAA;AAAA,IACA,aAAA,GAAgB,IAAA;AAAA,IAChB,SAAA;AAAA,IACA,WAAA,GAAc,OAAA;AAAA,IACd,aAAA;AAAA,IACA,MAAA,EAAQ,eAAA;AAAA,IACR,GAAA;AAAA,IACA,iBAAA,EAAmB,cAAA;AAAA,IACnB,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,qBAAA,GAAwB,qBAAqB,WAAA,EAAa;AAAA,IAC9D,0BAAA,EAA4B,IAAA;AAAA,IAC5B;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAa,mBAAA,IAAuB,qBAAA;AAC1C,EAAA,UAAA,CAAW,iBAAiB,iBAAiB,CAAA;AAE7C,EAAA,MAAM,MAAA,GAAS,eAAA,IAAmB,UAAA,CAAW,SAAA,EAAU;AAEvD,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,SAAS,CAAA;AAEpD,EAAA,uBACE,GAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,cAAc,UAAA,CAAW,OAAA;AAAA,MACzB,MAAA;AAAA,MACA,GAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA,EAAW,aAAA;AAAA,MACX,iBAAA,EAAiB,cAAA;AAAA,MAEjB,QAAA,kBAAA,GAAA,CAAC,sBAAA,EAAA,EAAuB,IAAA,EAAK,OAAA,EAAQ,YAClC,QAAA,EACH;AAAA;AAAA,GACF;AAEJ;;;;"}
|
package/dist/js/packages/components/src/integrations/react-hook-form/components/Form/Form.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
-
import {
|
|
4
|
-
import { ConfirmUnsavedChangesModal } from '../../../../components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal.mjs';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
4
|
import { FormContextProvider } from '../FormContextProvider/FormContextProvider.mjs';
|
|
6
5
|
import { flags } from '../../../../flags.mjs';
|
|
7
6
|
import 'mobx';
|
|
@@ -40,7 +39,10 @@ function Form(props) {
|
|
|
40
39
|
const autoResetOptions = typeof autoReset === "boolean" ? { onAfterModalClose: autoReset } : autoReset;
|
|
41
40
|
const modalController = useModalController();
|
|
42
41
|
modalController.useUpdateOptions({
|
|
43
|
-
|
|
42
|
+
// Only contribute to the surrounding Modal's close confirmation while the
|
|
43
|
+
// flag is enabled – otherwise a `<Modal confirmOnClose>` around this Form
|
|
44
|
+
// would be overruled. The Modal renders the confirmation dialog itself.
|
|
45
|
+
confirmOnClose: flags.requireCloseModalConfirmationOnUnsavedChanges ? isDirty : void 0
|
|
44
46
|
});
|
|
45
47
|
modalController.useOnClosed(() => {
|
|
46
48
|
if (autoResetOptions?.onAfterModalClose) {
|
|
@@ -78,29 +80,26 @@ function Form(props) {
|
|
|
78
80
|
ref,
|
|
79
81
|
submitController
|
|
80
82
|
});
|
|
81
|
-
return /* @__PURE__ */
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
),
|
|
102
|
-
/* @__PURE__ */ jsx(ConfirmUnsavedChangesModal, {})
|
|
103
|
-
] });
|
|
83
|
+
return /* @__PURE__ */ jsx(FormProvider, { ...form, children: /* @__PURE__ */ jsx(
|
|
84
|
+
FormContextProvider,
|
|
85
|
+
{
|
|
86
|
+
form,
|
|
87
|
+
isReadOnly,
|
|
88
|
+
id: formId,
|
|
89
|
+
onAfterSuccessFeedback,
|
|
90
|
+
rootErrorController,
|
|
91
|
+
children: /* @__PURE__ */ jsx(
|
|
92
|
+
FormComponent,
|
|
93
|
+
{
|
|
94
|
+
...formProps,
|
|
95
|
+
ref: refWithHotkeySubmit,
|
|
96
|
+
id: formId,
|
|
97
|
+
onSubmit: handleSubmit,
|
|
98
|
+
children
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
) });
|
|
104
103
|
}
|
|
105
104
|
|
|
106
105
|
export { Form };
|
package/dist/js/packages/components/src/integrations/react-hook-form/components/Form/Form.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.mjs","sources":["../../../../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"Form.mjs","sources":["../../../../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"sourcesContent":["import { FormContextProvider } from \"@/integrations/react-hook-form/components/FormContextProvider/FormContextProvider\";\nimport { flags } from \"@/flags\";\nimport { useModalController } from \"@/lib/controller\";\nimport {\n type BaseSyntheticEvent,\n type ComponentProps,\n type FC,\n type PropsWithChildren,\n type Ref,\n type SubmitEventHandler,\n useId,\n useMemo,\n useRef,\n} from \"react\";\nimport type {\n FieldValues,\n Path,\n SubmitHandler,\n UseFormReturn,\n} from \"react-hook-form\";\nimport { FormProvider as RhfFormContextProvider } from \"react-hook-form\";\nimport { useFormRootErrorController } from \"../FormRootError/useFormRootErrorController\";\nimport { FormRootError } from \"../../lib/FormRootError\";\nimport { useFormSettings } from \"../FormSettingsProvider/FormSettingsProvider\";\nimport {\n useFormSubmitController,\n type WithFormSubmitControllerProps,\n} from \"@/integrations/react-hook-form/components/Form/hooks/useFormSubmitController\";\nimport { useHotkeySubmit } from \"@/integrations/react-hook-form/components/Form/hooks/useHotkeySubmit\";\n\nexport type FormOnSubmitHandler<F extends FieldValues> = SubmitHandler<F>;\n\nexport type AfterFormSubmitCallback = (...unknownArgs: unknown[]) => unknown;\n\nexport interface FormAutoResetOptions {\n onAfterModalClose?: boolean;\n}\n\ntype FormComponentType = FC<\n PropsWithChildren<{\n id: string;\n onSubmit?: SubmitEventHandler | FormOnSubmitHandler<never>;\n ref?: Ref<HTMLFormElement>;\n }>\n>;\n\nexport interface FormProps<F extends FieldValues>\n extends\n Omit<ComponentProps<\"form\">, \"onSubmit\">,\n PropsWithChildren,\n WithFormSubmitControllerProps {\n form: UseFormReturn<F>;\n onSubmit: FormOnSubmitHandler<F>;\n formComponent?: FC<Omit<FormComponentType, \"ref\">>;\n isReadOnly?: boolean;\n autoReset?: FormAutoResetOptions | boolean;\n}\n\nconst DefaultFormComponent: FormComponentType = (p) => <form {...p} />;\n\nexport function Form<F extends FieldValues>(props: FormProps<F>) {\n const {\n form,\n children,\n onSubmit: onSubmitProp,\n formComponent = DefaultFormComponent,\n isReadOnly,\n ref,\n id: idProp,\n autoReset = true,\n submitController: submitControllerFromProps,\n ...formProps\n } = props;\n\n const newFormId = useId();\n const formId = idProp ?? newFormId;\n const FormComponent = useMemo(() => formComponent, [formId]);\n const afterSubmitCallback = useRef<AfterFormSubmitCallback>(undefined);\n const { isDirty } = form.formState;\n const rootErrorController = useFormRootErrorController();\n\n const defaultSubmitController = useFormSubmitController();\n const submitController = submitControllerFromProps\n ? submitControllerFromProps.submit.extend(defaultSubmitController)\n : defaultSubmitController;\n\n const autoResetOptions =\n typeof autoReset === \"boolean\"\n ? { onAfterModalClose: autoReset }\n : autoReset;\n\n const modalController = useModalController();\n modalController.useUpdateOptions({\n // Only contribute to the surrounding Modal's close confirmation while the\n // flag is enabled – otherwise a `<Modal confirmOnClose>` around this Form\n // would be overruled. The Modal renders the confirmation dialog itself.\n confirmOnClose: flags.requireCloseModalConfirmationOnUnsavedChanges\n ? isDirty\n : undefined,\n });\n modalController.useOnClosed(() => {\n if (autoResetOptions?.onAfterModalClose) {\n form.reset();\n }\n });\n\n const { submitInterceptor } = useFormSettings();\n const onSubmit = submitInterceptor\n ? (values: F) => submitInterceptor<F>(onSubmitProp, values, { form })\n : onSubmitProp;\n\n const handleSubmitResult = (result: unknown) => {\n if (typeof result === \"function\") {\n afterSubmitCallback.current = result as AfterFormSubmitCallback;\n }\n const rootError = form.getFieldState(\"root\" as Path<F>)?.error;\n if (rootError && !rootErrorController.errorComponentMounted) {\n throw new FormRootError(rootError);\n }\n };\n\n const handleSubmit = (e?: BaseSyntheticEvent | F) => {\n const formEvent =\n e && \"nativeEvent\" in e ? (e as BaseSyntheticEvent) : undefined;\n formEvent?.stopPropagation();\n\n return form.handleSubmit((values, event) => {\n modalController.confirmClose();\n\n const submitResult = onSubmit(values, event);\n if (submitResult instanceof Promise) {\n return submitResult.then(handleSubmitResult);\n }\n handleSubmitResult(submitResult);\n })(formEvent);\n };\n submitController.submit.set(handleSubmit);\n\n const onAfterSuccessFeedback = () => {\n afterSubmitCallback.current?.();\n };\n\n const refWithHotkeySubmit = useHotkeySubmit({\n ref,\n submitController,\n });\n\n return (\n <RhfFormContextProvider {...form}>\n <FormContextProvider\n form={form as UseFormReturn}\n isReadOnly={isReadOnly}\n id={formId}\n onAfterSuccessFeedback={onAfterSuccessFeedback}\n rootErrorController={rootErrorController}\n >\n <FormComponent\n {...formProps}\n ref={refWithHotkeySubmit}\n id={formId}\n onSubmit={handleSubmit}\n >\n {children}\n </FormComponent>\n </FormContextProvider>\n </RhfFormContextProvider>\n );\n}\n\nexport default Form;\n"],"names":["RhfFormContextProvider"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
-
import { makeObservable, action,
|
|
3
|
+
import { observable, makeObservable, action, computed, runInAction } from 'mobx';
|
|
4
4
|
import useSelector from '../../mobx/useSelector.mjs';
|
|
5
5
|
import { useStatic } from '../../hooks/useStatic.mjs';
|
|
6
|
-
import {
|
|
6
|
+
import { useEffect, useRef } from 'react';
|
|
7
7
|
import { useCloseOverlayConfirmationController } from './useCloseOverlayConfirmationController.mjs';
|
|
8
8
|
|
|
9
9
|
class OverlayController {
|
|
@@ -14,30 +14,41 @@ class OverlayController {
|
|
|
14
14
|
onOpenChangeHandlers = /* @__PURE__ */ new Set();
|
|
15
15
|
showConfirmationModal = false;
|
|
16
16
|
closeIsConfirmed = false;
|
|
17
|
-
|
|
17
|
+
confirmOnCloseFromOptions;
|
|
18
|
+
/**
|
|
19
|
+
* Every mounted component that has an opinion on close confirmation
|
|
20
|
+
* contributes one entry here – e.g. a `Modal` with a `confirmOnClose` prop
|
|
21
|
+
* and a `Form` tracking its dirty state. Combining them instead of assigning
|
|
22
|
+
* a single flag keeps them from overwriting each other.
|
|
23
|
+
*/
|
|
24
|
+
confirmOnCloseSources = observable.map();
|
|
18
25
|
constructor(options = {}) {
|
|
19
26
|
makeObservable(this, {
|
|
20
27
|
isOpen: observable,
|
|
21
28
|
isContentSuspended: observable,
|
|
22
29
|
showConfirmationModal: observable,
|
|
30
|
+
confirmOnCloseEnabled: computed,
|
|
23
31
|
open: action.bound,
|
|
24
32
|
close: action.bound,
|
|
25
33
|
toggle: action.bound,
|
|
26
34
|
setOpen: action.bound,
|
|
27
35
|
setIsContentSuspended: action.bound,
|
|
28
|
-
confirmClose: action.bound
|
|
36
|
+
confirmClose: action.bound,
|
|
37
|
+
cancelConfirmation: action.bound
|
|
29
38
|
});
|
|
30
39
|
const { isDefaultOpen = false, confirmOnClose = false } = options;
|
|
31
40
|
this.isOpen = isDefaultOpen;
|
|
32
|
-
this.
|
|
41
|
+
this.confirmOnCloseFromOptions = confirmOnClose;
|
|
42
|
+
}
|
|
43
|
+
/** Whether closing this overlay currently requires a confirmation. */
|
|
44
|
+
get confirmOnCloseEnabled() {
|
|
45
|
+
if (this.confirmOnCloseSources.size === 0) {
|
|
46
|
+
return this.confirmOnCloseFromOptions;
|
|
47
|
+
}
|
|
48
|
+
return Array.from(this.confirmOnCloseSources.values()).some(Boolean);
|
|
33
49
|
}
|
|
34
50
|
useUpdateOptions(options = {}) {
|
|
35
|
-
const {
|
|
36
|
-
onOpen,
|
|
37
|
-
onClose,
|
|
38
|
-
onOpenChange,
|
|
39
|
-
confirmOnClose = this.confirmOnCloseEnabled
|
|
40
|
-
} = options;
|
|
51
|
+
const { onOpen, onClose, onOpenChange, confirmOnClose } = options;
|
|
41
52
|
this.useOnHandler(
|
|
42
53
|
onOpen,
|
|
43
54
|
(h) => this.addOpenStateHandler(h, this.onOpenHandlers)
|
|
@@ -50,7 +61,28 @@ class OverlayController {
|
|
|
50
61
|
onOpenChange,
|
|
51
62
|
(h) => this.addOpenStateHandler(h, this.onOpenChangeHandlers)
|
|
52
63
|
);
|
|
53
|
-
this.
|
|
64
|
+
this.useConfirmOnCloseSource(confirmOnClose);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Registers the calling component as a close confirmation source for as long
|
|
68
|
+
* as it is mounted. `undefined` contributes nothing at all.
|
|
69
|
+
*/
|
|
70
|
+
useConfirmOnCloseSource(confirmOnClose) {
|
|
71
|
+
const source = useStatic(() => ({}));
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (confirmOnClose === void 0) {
|
|
74
|
+
this.removeConfirmOnCloseSource(source);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
this.setConfirmOnCloseSource(source, confirmOnClose);
|
|
78
|
+
return () => this.removeConfirmOnCloseSource(source);
|
|
79
|
+
}, [this, source, confirmOnClose]);
|
|
80
|
+
}
|
|
81
|
+
setConfirmOnCloseSource(source, confirmOnClose) {
|
|
82
|
+
runInAction(() => this.confirmOnCloseSources.set(source, confirmOnClose));
|
|
83
|
+
}
|
|
84
|
+
removeConfirmOnCloseSource(source) {
|
|
85
|
+
runInAction(() => this.confirmOnCloseSources.delete(source));
|
|
54
86
|
}
|
|
55
87
|
/**
|
|
56
88
|
* Can be used to execute a callback when the Overlay has unmounted – means
|
|
@@ -161,6 +193,9 @@ class OverlayController {
|
|
|
161
193
|
useShowConfirmationModal() {
|
|
162
194
|
return useSelector(() => this.showConfirmationModal);
|
|
163
195
|
}
|
|
196
|
+
useConfirmOnCloseEnabled() {
|
|
197
|
+
return useSelector(() => this.confirmOnCloseEnabled);
|
|
198
|
+
}
|
|
164
199
|
useConfirmationController() {
|
|
165
200
|
return useCloseOverlayConfirmationController(this);
|
|
166
201
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OverlayController.mjs","sources":["../../../../../../../../src/lib/controller/overlay/OverlayController.ts"],"sourcesContent":["import { action, makeObservable, observable } from \"mobx\";\nimport useSelector from \"@/lib/mobx/useSelector\";\nimport { useStatic } from \"@/lib/hooks/useStatic\";\nimport { useEffect, useRef, type DependencyList } from \"react\";\nimport { useCloseOverlayConfirmationController } from \"@/lib/controller/overlay/useCloseOverlayConfirmationController\";\nimport type { FlowComponentName } from \"@/components/propTypes\";\n\nexport type OverlayOpenHandler = () => unknown;\nexport type OverlayCloseHandler = () => unknown;\nexport type OverlayOpenStateHandler = (isOpen: boolean) => unknown;\ntype AnyOverlayOpenStateHandler =\n | OverlayOpenHandler\n | OverlayCloseHandler\n | OverlayOpenStateHandler;\n\ntype DisposerFn = () => void;\n\nexport interface CloseOverlayOptions {\n overlay: FlowComponentName | OverlayController;\n bypassConfirmation?: boolean;\n}\n\nexport interface OnOverlayClosedOptions {\n dependencies?: DependencyList;\n}\n\nexport type CloseModalOptions = Omit<CloseOverlayOptions, \"overlay\">;\n\ntype CloseOptions = CloseOverlayOptions | CloseModalOptions;\n\nexport interface OverlayControllerOptions {\n isDefaultOpen?: boolean;\n onOpen?: OverlayOpenHandler;\n onClose?: OverlayCloseHandler;\n onOpenChange?: OverlayOpenStateHandler;\n confirmOnClose?: boolean;\n}\n\ntype ConstructorOptions = Pick<\n OverlayControllerOptions,\n \"isDefaultOpen\" | \"confirmOnClose\"\n>;\n\nexport class OverlayController {\n public isOpen = false;\n public isContentSuspended = false;\n private onOpenHandlers = new Set<OverlayOpenHandler>();\n private onCloseHandlers = new Set<OverlayCloseHandler>();\n private onOpenChangeHandlers = new Set<OverlayOpenStateHandler>();\n\n public showConfirmationModal = false;\n public closeIsConfirmed = false;\n public confirmOnCloseEnabled: boolean;\n\n public constructor(options: ConstructorOptions = {}) {\n makeObservable(this, {\n isOpen: observable,\n isContentSuspended: observable,\n showConfirmationModal: observable,\n open: action.bound,\n close: action.bound,\n toggle: action.bound,\n setOpen: action.bound,\n setIsContentSuspended: action.bound,\n confirmClose: action.bound,\n });\n const { isDefaultOpen = false, confirmOnClose = false } = options;\n this.isOpen = isDefaultOpen;\n this.confirmOnCloseEnabled = confirmOnClose;\n }\n\n public useUpdateOptions(options: OverlayControllerOptions = {}): void {\n const {\n onOpen,\n onClose,\n onOpenChange,\n confirmOnClose = this.confirmOnCloseEnabled,\n } = options;\n\n this.useOnHandler(onOpen, (h) =>\n this.addOpenStateHandler(h, this.onOpenHandlers),\n );\n this.useOnHandler(onClose, (h) =>\n this.addOpenStateHandler(h, this.onCloseHandlers),\n );\n this.useOnHandler(onOpenChange, (h) =>\n this.addOpenStateHandler(h, this.onOpenChangeHandlers),\n );\n\n this.confirmOnCloseEnabled = confirmOnClose;\n }\n\n /**\n * Can be used to execute a callback when the Overlay has unmounted – means\n * after any closing animation.\n *\n * NOTICE: This hook only works inside the corresponding Overlay!\n */\n public useOnClosed(\n callback: () => unknown,\n options: OnOverlayClosedOptions = {},\n ) {\n const { dependencies = [] } = options;\n const isOpen = this.useIsOpen();\n const wasOpen = useRef(this.isOpen);\n\n this.useUpdateOptions({\n onOpen: () => {\n wasOpen.current = true;\n },\n });\n\n useEffect(() => {\n return () => {\n if (!isOpen && wasOpen.current) {\n wasOpen.current = false;\n callback();\n }\n };\n }, [isOpen, ...dependencies]);\n }\n\n public static useNew(\n options: OverlayControllerOptions = {},\n ): OverlayController {\n const controller = useStatic(() => new OverlayController(options));\n controller.useUpdateOptions(options);\n return controller;\n }\n\n private addOpenStateHandler<T extends AnyOverlayOpenStateHandler>(\n handler: T,\n handlersSet: Set<T>,\n ): DisposerFn {\n handlersSet.add(handler);\n return () => {\n handlersSet.delete(handler);\n };\n }\n\n private useOnHandler<T extends AnyOverlayOpenStateHandler>(\n handler: T | undefined,\n addHandlerFn: (handler: T) => DisposerFn,\n ) {\n useEffect(\n () => (handler ? addHandlerFn(handler) : undefined),\n [handler, this],\n );\n }\n\n private executeHandlers(\n isOpen: boolean,\n handlers: Set<\n OverlayOpenHandler | OverlayCloseHandler | OverlayOpenStateHandler\n >,\n ): boolean {\n const handlerResult = Array.from(handlers).map((handler) =>\n handler(isOpen),\n );\n return handlerResult.some((result) => result === false);\n }\n\n private executeOnClose(): boolean {\n return this.executeHandlers(false, this.onCloseHandlers);\n }\n\n private executeOnOpen(): boolean {\n return this.executeHandlers(true, this.onOpenHandlers);\n }\n\n private executeOnOpenChange(isOpen: boolean): boolean {\n return this.executeHandlers(isOpen, this.onOpenChangeHandlers);\n }\n\n public addOnClose(handler: OverlayCloseHandler) {\n return this.addOpenStateHandler(handler, this.onCloseHandlers);\n }\n\n public addOnOpen(handler: OverlayOpenHandler) {\n return this.addOpenStateHandler(handler, this.onOpenHandlers);\n }\n\n public addOnOpenChange(handler: OverlayOpenStateHandler) {\n return this.addOpenStateHandler(handler, this.onOpenChangeHandlers);\n }\n\n public open(): void {\n this.setOpen(true);\n }\n\n public close(options?: CloseOptions): void {\n this.setOpen(false, options);\n }\n\n public toggle(): void {\n this.setOpen(!this.isOpen);\n }\n\n public setOpen(toOpen: boolean, options: CloseOptions = {}): void {\n if (this.isOpen === toOpen) {\n return;\n }\n\n const { bypassConfirmation = false } = options;\n\n if (\n toOpen === false &&\n this.confirmOnCloseEnabled &&\n !this.closeIsConfirmed &&\n !bypassConfirmation\n ) {\n this.showConfirmationModal = true;\n return;\n }\n\n let aborted: boolean;\n if (toOpen) {\n aborted = this.executeOnOpen();\n } else {\n aborted = this.executeOnClose();\n }\n if (!aborted) {\n aborted = this.executeOnOpenChange(toOpen);\n }\n\n if (!aborted) {\n this.isOpen = toOpen;\n this.closeIsConfirmed = false;\n }\n }\n\n public setIsContentSuspended(to: boolean): void {\n this.isContentSuspended = to;\n }\n\n public useIsOpen() {\n return useSelector(() => this.isOpen);\n }\n\n public useIsContentSuspended() {\n return useSelector(() => this.isContentSuspended);\n }\n\n public useShowConfirmationModal() {\n return useSelector(() => this.showConfirmationModal);\n }\n\n public useConfirmationController() {\n return useCloseOverlayConfirmationController(this);\n }\n\n public confirmClose(): void {\n this.closeIsConfirmed = true;\n this.showConfirmationModal = false;\n }\n\n public cancelConfirmation(): void {\n this.showConfirmationModal = false;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OverlayController.mjs","sources":["../../../../../../../../src/lib/controller/overlay/OverlayController.ts"],"sourcesContent":["import {\n action,\n computed,\n makeObservable,\n observable,\n runInAction,\n} from \"mobx\";\nimport useSelector from \"@/lib/mobx/useSelector\";\nimport { useStatic } from \"@/lib/hooks/useStatic\";\nimport { useEffect, useRef, type DependencyList } from \"react\";\nimport { useCloseOverlayConfirmationController } from \"@/lib/controller/overlay/useCloseOverlayConfirmationController\";\nimport type { FlowComponentName } from \"@/components/propTypes\";\n\nexport type OverlayOpenHandler = () => unknown;\nexport type OverlayCloseHandler = () => unknown;\nexport type OverlayOpenStateHandler = (isOpen: boolean) => unknown;\ntype AnyOverlayOpenStateHandler =\n | OverlayOpenHandler\n | OverlayCloseHandler\n | OverlayOpenStateHandler;\n\ntype DisposerFn = () => void;\n\nexport interface CloseOverlayOptions {\n overlay: FlowComponentName | OverlayController;\n bypassConfirmation?: boolean;\n}\n\nexport interface OnOverlayClosedOptions {\n dependencies?: DependencyList;\n}\n\nexport type CloseModalOptions = Omit<CloseOverlayOptions, \"overlay\">;\n\ntype CloseOptions = CloseOverlayOptions | CloseModalOptions;\n\nexport interface OverlayControllerOptions {\n isDefaultOpen?: boolean;\n onOpen?: OverlayOpenHandler;\n onClose?: OverlayCloseHandler;\n onOpenChange?: OverlayOpenStateHandler;\n /**\n * Whether closing the overlay must be confirmed. `undefined` means \"no\n * opinion\": the value is not contributed at all, so other sources (e.g. a\n * `Modal`'s `confirmOnClose` prop or a dirty `Form`) still decide.\n */\n confirmOnClose?: boolean;\n}\n\ntype ConstructorOptions = Pick<\n OverlayControllerOptions,\n \"isDefaultOpen\" | \"confirmOnClose\"\n>;\n\nexport class OverlayController {\n public isOpen = false;\n public isContentSuspended = false;\n private onOpenHandlers = new Set<OverlayOpenHandler>();\n private onCloseHandlers = new Set<OverlayCloseHandler>();\n private onOpenChangeHandlers = new Set<OverlayOpenStateHandler>();\n\n public showConfirmationModal = false;\n public closeIsConfirmed = false;\n private readonly confirmOnCloseFromOptions: boolean;\n /**\n * Every mounted component that has an opinion on close confirmation\n * contributes one entry here – e.g. a `Modal` with a `confirmOnClose` prop\n * and a `Form` tracking its dirty state. Combining them instead of assigning\n * a single flag keeps them from overwriting each other.\n */\n private confirmOnCloseSources = observable.map<object, boolean>();\n\n public constructor(options: ConstructorOptions = {}) {\n makeObservable(this, {\n isOpen: observable,\n isContentSuspended: observable,\n showConfirmationModal: observable,\n confirmOnCloseEnabled: computed,\n open: action.bound,\n close: action.bound,\n toggle: action.bound,\n setOpen: action.bound,\n setIsContentSuspended: action.bound,\n confirmClose: action.bound,\n cancelConfirmation: action.bound,\n });\n const { isDefaultOpen = false, confirmOnClose = false } = options;\n this.isOpen = isDefaultOpen;\n this.confirmOnCloseFromOptions = confirmOnClose;\n }\n\n /** Whether closing this overlay currently requires a confirmation. */\n public get confirmOnCloseEnabled(): boolean {\n if (this.confirmOnCloseSources.size === 0) {\n return this.confirmOnCloseFromOptions;\n }\n return Array.from(this.confirmOnCloseSources.values()).some(Boolean);\n }\n\n public useUpdateOptions(options: OverlayControllerOptions = {}): void {\n const { onOpen, onClose, onOpenChange, confirmOnClose } = options;\n\n this.useOnHandler(onOpen, (h) =>\n this.addOpenStateHandler(h, this.onOpenHandlers),\n );\n this.useOnHandler(onClose, (h) =>\n this.addOpenStateHandler(h, this.onCloseHandlers),\n );\n this.useOnHandler(onOpenChange, (h) =>\n this.addOpenStateHandler(h, this.onOpenChangeHandlers),\n );\n\n this.useConfirmOnCloseSource(confirmOnClose);\n }\n\n /**\n * Registers the calling component as a close confirmation source for as long\n * as it is mounted. `undefined` contributes nothing at all.\n */\n private useConfirmOnCloseSource(confirmOnClose: boolean | undefined): void {\n const source = useStatic((): object => ({}));\n\n useEffect(() => {\n if (confirmOnClose === undefined) {\n this.removeConfirmOnCloseSource(source);\n return;\n }\n this.setConfirmOnCloseSource(source, confirmOnClose);\n return () => this.removeConfirmOnCloseSource(source);\n }, [this, source, confirmOnClose]);\n }\n\n private setConfirmOnCloseSource(source: object, confirmOnClose: boolean) {\n runInAction(() => this.confirmOnCloseSources.set(source, confirmOnClose));\n }\n\n private removeConfirmOnCloseSource(source: object) {\n runInAction(() => this.confirmOnCloseSources.delete(source));\n }\n\n /**\n * Can be used to execute a callback when the Overlay has unmounted – means\n * after any closing animation.\n *\n * NOTICE: This hook only works inside the corresponding Overlay!\n */\n public useOnClosed(\n callback: () => unknown,\n options: OnOverlayClosedOptions = {},\n ) {\n const { dependencies = [] } = options;\n const isOpen = this.useIsOpen();\n const wasOpen = useRef(this.isOpen);\n\n this.useUpdateOptions({\n onOpen: () => {\n wasOpen.current = true;\n },\n });\n\n useEffect(() => {\n return () => {\n if (!isOpen && wasOpen.current) {\n wasOpen.current = false;\n callback();\n }\n };\n }, [isOpen, ...dependencies]);\n }\n\n public static useNew(\n options: OverlayControllerOptions = {},\n ): OverlayController {\n const controller = useStatic(() => new OverlayController(options));\n controller.useUpdateOptions(options);\n return controller;\n }\n\n private addOpenStateHandler<T extends AnyOverlayOpenStateHandler>(\n handler: T,\n handlersSet: Set<T>,\n ): DisposerFn {\n handlersSet.add(handler);\n return () => {\n handlersSet.delete(handler);\n };\n }\n\n private useOnHandler<T extends AnyOverlayOpenStateHandler>(\n handler: T | undefined,\n addHandlerFn: (handler: T) => DisposerFn,\n ) {\n useEffect(\n () => (handler ? addHandlerFn(handler) : undefined),\n [handler, this],\n );\n }\n\n private executeHandlers(\n isOpen: boolean,\n handlers: Set<\n OverlayOpenHandler | OverlayCloseHandler | OverlayOpenStateHandler\n >,\n ): boolean {\n const handlerResult = Array.from(handlers).map((handler) =>\n handler(isOpen),\n );\n return handlerResult.some((result) => result === false);\n }\n\n private executeOnClose(): boolean {\n return this.executeHandlers(false, this.onCloseHandlers);\n }\n\n private executeOnOpen(): boolean {\n return this.executeHandlers(true, this.onOpenHandlers);\n }\n\n private executeOnOpenChange(isOpen: boolean): boolean {\n return this.executeHandlers(isOpen, this.onOpenChangeHandlers);\n }\n\n public addOnClose(handler: OverlayCloseHandler) {\n return this.addOpenStateHandler(handler, this.onCloseHandlers);\n }\n\n public addOnOpen(handler: OverlayOpenHandler) {\n return this.addOpenStateHandler(handler, this.onOpenHandlers);\n }\n\n public addOnOpenChange(handler: OverlayOpenStateHandler) {\n return this.addOpenStateHandler(handler, this.onOpenChangeHandlers);\n }\n\n public open(): void {\n this.setOpen(true);\n }\n\n public close(options?: CloseOptions): void {\n this.setOpen(false, options);\n }\n\n public toggle(): void {\n this.setOpen(!this.isOpen);\n }\n\n public setOpen(toOpen: boolean, options: CloseOptions = {}): void {\n if (this.isOpen === toOpen) {\n return;\n }\n\n const { bypassConfirmation = false } = options;\n\n if (\n toOpen === false &&\n this.confirmOnCloseEnabled &&\n !this.closeIsConfirmed &&\n !bypassConfirmation\n ) {\n this.showConfirmationModal = true;\n return;\n }\n\n let aborted: boolean;\n if (toOpen) {\n aborted = this.executeOnOpen();\n } else {\n aborted = this.executeOnClose();\n }\n if (!aborted) {\n aborted = this.executeOnOpenChange(toOpen);\n }\n\n if (!aborted) {\n this.isOpen = toOpen;\n this.closeIsConfirmed = false;\n }\n }\n\n public setIsContentSuspended(to: boolean): void {\n this.isContentSuspended = to;\n }\n\n public useIsOpen() {\n return useSelector(() => this.isOpen);\n }\n\n public useIsContentSuspended() {\n return useSelector(() => this.isContentSuspended);\n }\n\n public useShowConfirmationModal() {\n return useSelector(() => this.showConfirmationModal);\n }\n\n public useConfirmOnCloseEnabled() {\n return useSelector(() => this.confirmOnCloseEnabled);\n }\n\n public useConfirmationController() {\n return useCloseOverlayConfirmationController(this);\n }\n\n public confirmClose(): void {\n this.closeIsConfirmed = true;\n this.showConfirmationModal = false;\n }\n\n public cancelConfirmation(): void {\n this.showConfirmationModal = false;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,11 @@ export interface ModalProps extends PropsWithChildren, FlowComponentProps, Props
|
|
|
25
25
|
isDismissable?: boolean;
|
|
26
26
|
/** Whether the close button should be visible */
|
|
27
27
|
showCloseButton?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Whether closing the modal must be confirmed – use it to protect unsaved
|
|
30
|
+
* changes.
|
|
31
|
+
*/
|
|
32
|
+
confirmOnClose?: boolean;
|
|
28
33
|
}
|
|
29
34
|
export declare const Modal: import('react').FunctionComponent<ModalProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
30
35
|
export default Modal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../../src/components/Modal/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAmC,MAAM,OAAO,CAAC;AAQhF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../../src/components/Modal/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAmC,MAAM,OAAO,CAAC;AAQhF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAU5D,KAAK,qBAAqB,GAAG,IAAI,CAC/B,YAAY,EACZ,QAAQ,GAAG,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CACnE,CAAC;AAEF,MAAM,WAAW,UACf,SACE,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB;IACvB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,wDAAwD;IACxD,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,KAAK,+FA4IhB,CAAC;AAEH,eAAe,KAAK,CAAC"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Rendered by every `Modal` and only becomes active once something requires the
|
|
4
|
+
* close to be confirmed – the `confirmOnClose` prop or a dirty `Form`.
|
|
5
|
+
*/
|
|
2
6
|
export declare const ConfirmUnsavedChangesModal: FC;
|
|
3
7
|
export default ConfirmUnsavedChangesModal;
|
|
4
8
|
//# sourceMappingURL=ConfirmUnsavedChangesModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmUnsavedChangesModal.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAUhC,eAAO,MAAM,0BAA0B,EAAE,
|
|
1
|
+
{"version":3,"file":"ConfirmUnsavedChangesModal.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Modal/components/ConfirmUnsavedChangesModal/ConfirmUnsavedChangesModal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAUhC;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,EAyCxC,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
|
|
@@ -7,6 +7,7 @@ export declare const Default: Story;
|
|
|
7
7
|
export declare const WithController: Story;
|
|
8
8
|
export declare const WithTrigger: Story;
|
|
9
9
|
export declare const WithForm: Story;
|
|
10
|
+
export declare const WithConfirmOnClose: Story;
|
|
10
11
|
export declare const WithColumnLayout: Story;
|
|
11
12
|
export declare const WithSuspense: Story;
|
|
12
13
|
export declare const LongContent: Story;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Default.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Modal/stories/Default.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,KAAuB,MAAM,oBAAoB,CAAC;AAmBzD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,KAAK,CAgD5B,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAC;AAEpC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,cAAc,EAAE,KA0B5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAmBzB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KA0CtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAqC9B,CAAC;AAUF,eAAO,MAAM,YAAY,EAAE,KAiB1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAkEzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"Default.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Modal/stories/Default.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,KAAuB,MAAM,oBAAoB,CAAC;AAmBzD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,KAAK,CAgD5B,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAC;AAEpC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,cAAc,EAAE,KA0B5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAmBzB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KA0CtB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAsChC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAqC9B,CAAC;AAUF,eAAO,MAAM,YAAY,EAAE,KAiB1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAkEzB,CAAC"}
|
|
@@ -16,6 +16,8 @@ export interface OverlayProps extends PropsWithChildren, PropsWithClassName, Pic
|
|
|
16
16
|
onOpen?: OverlayOpenHandler;
|
|
17
17
|
onClose?: OverlayCloseHandler;
|
|
18
18
|
onOpenChange?: OverlayOpenStateHandler;
|
|
19
|
+
/** Whether closing the overlay must be confirmed. */
|
|
20
|
+
confirmOnClose?: boolean;
|
|
19
21
|
}
|
|
20
22
|
export declare const Overlay: FC<OverlayProps>;
|
|
21
23
|
export default Overlay;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Overlay.d.ts","sourceRoot":"","sources":["../../../../src/components/Overlay/Overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,4CAA4C,CAAC;AACpD,OAAO,KAAK,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAEnD,MAAM,WAAW,YACf,SACE,iBAAiB,EACjB,kBAAkB,EAClB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC;IAC3C,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,mDAAmD;IACnD,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,mEAAmE;IACnE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,YAAY,CAAC,EAAE,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"Overlay.d.ts","sourceRoot":"","sources":["../../../../src/components/Overlay/Overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,4CAA4C,CAAC;AACpD,OAAO,KAAK,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAEnD,MAAM,WAAW,YACf,SACE,iBAAiB,EACjB,kBAAkB,EAClB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC;IAC3C,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,mDAAmD;IACnD,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,mEAAmE;IACnE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,YAAY,CAAC,EAAE,uBAAuB,CAAC;IACvC,qDAAqD;IACrD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CAwCpC,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../../../../src/integrations/react-hook-form/components/Form/Form.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,EAAE,EACP,KAAK,iBAAiB,EACtB,KAAK,GAAG,EACR,KAAK,kBAAkB,EAIxB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EAEX,aAAa,EACb,aAAa,EACd,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,8EAA8E,CAAC;AAGtF,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,WAAW,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;AAE1E,MAAM,MAAM,uBAAuB,GAAG,CAAC,GAAG,WAAW,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAE7E,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,KAAK,iBAAiB,GAAG,EAAE,CACzB,iBAAiB,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,kBAAkB,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3D,GAAG,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;CAC5B,CAAC,CACH,CAAC;AAEF,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,WAAW,CAC9C,SACE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EACxC,iBAAiB,EACjB,6BAA6B;IAC/B,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC;CAC5C;AAID,wBAAgB,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,+BA2G9D;AAED,eAAe,IAAI,CAAC"}
|
|
@@ -18,6 +18,11 @@ export interface OverlayControllerOptions {
|
|
|
18
18
|
onOpen?: OverlayOpenHandler;
|
|
19
19
|
onClose?: OverlayCloseHandler;
|
|
20
20
|
onOpenChange?: OverlayOpenStateHandler;
|
|
21
|
+
/**
|
|
22
|
+
* Whether closing the overlay must be confirmed. `undefined` means "no
|
|
23
|
+
* opinion": the value is not contributed at all, so other sources (e.g. a
|
|
24
|
+
* `Modal`'s `confirmOnClose` prop or a dirty `Form`) still decide.
|
|
25
|
+
*/
|
|
21
26
|
confirmOnClose?: boolean;
|
|
22
27
|
}
|
|
23
28
|
type ConstructorOptions = Pick<OverlayControllerOptions, "isDefaultOpen" | "confirmOnClose">;
|
|
@@ -29,9 +34,25 @@ export declare class OverlayController {
|
|
|
29
34
|
private onOpenChangeHandlers;
|
|
30
35
|
showConfirmationModal: boolean;
|
|
31
36
|
closeIsConfirmed: boolean;
|
|
32
|
-
|
|
37
|
+
private readonly confirmOnCloseFromOptions;
|
|
38
|
+
/**
|
|
39
|
+
* Every mounted component that has an opinion on close confirmation
|
|
40
|
+
* contributes one entry here – e.g. a `Modal` with a `confirmOnClose` prop
|
|
41
|
+
* and a `Form` tracking its dirty state. Combining them instead of assigning
|
|
42
|
+
* a single flag keeps them from overwriting each other.
|
|
43
|
+
*/
|
|
44
|
+
private confirmOnCloseSources;
|
|
33
45
|
constructor(options?: ConstructorOptions);
|
|
46
|
+
/** Whether closing this overlay currently requires a confirmation. */
|
|
47
|
+
get confirmOnCloseEnabled(): boolean;
|
|
34
48
|
useUpdateOptions(options?: OverlayControllerOptions): void;
|
|
49
|
+
/**
|
|
50
|
+
* Registers the calling component as a close confirmation source for as long
|
|
51
|
+
* as it is mounted. `undefined` contributes nothing at all.
|
|
52
|
+
*/
|
|
53
|
+
private useConfirmOnCloseSource;
|
|
54
|
+
private setConfirmOnCloseSource;
|
|
55
|
+
private removeConfirmOnCloseSource;
|
|
35
56
|
/**
|
|
36
57
|
* Can be used to execute a callback when the Overlay has unmounted – means
|
|
37
58
|
* after any closing animation.
|
|
@@ -57,6 +78,7 @@ export declare class OverlayController {
|
|
|
57
78
|
useIsOpen(): boolean;
|
|
58
79
|
useIsContentSuspended(): boolean;
|
|
59
80
|
useShowConfirmationModal(): boolean;
|
|
81
|
+
useConfirmOnCloseEnabled(): boolean;
|
|
60
82
|
useConfirmationController(): {
|
|
61
83
|
readonly controller: OverlayController;
|
|
62
84
|
readonly cancel: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OverlayController.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/overlay/OverlayController.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OverlayController.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/overlay/OverlayController.ts"],"names":[],"mappings":"AASA,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAE/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC;AAC/C,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC;AAChD,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;AAMnE,KAAK,UAAU,GAAG,MAAM,IAAI,CAAC;AAE7B,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,iBAAiB,GAAG,iBAAiB,CAAC;IAC/C,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,cAAc,CAAC;CAC/B;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;AAErE,KAAK,YAAY,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAE5D,MAAM,WAAW,wBAAwB;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,YAAY,CAAC,EAAE,uBAAuB,CAAC;IACvC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,KAAK,kBAAkB,GAAG,IAAI,CAC5B,wBAAwB,EACxB,eAAe,GAAG,gBAAgB,CACnC,CAAC;AAEF,qBAAa,iBAAiB;IACrB,MAAM,UAAS;IACf,kBAAkB,UAAS;IAClC,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,oBAAoB,CAAsC;IAE3D,qBAAqB,UAAS;IAC9B,gBAAgB,UAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAU;IACpD;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB,CAAqC;gBAE/C,OAAO,GAAE,kBAAuB;IAmBnD,sEAAsE;IACtE,IAAW,qBAAqB,IAAI,OAAO,CAK1C;IAEM,gBAAgB,CAAC,OAAO,GAAE,wBAA6B,GAAG,IAAI;IAgBrE;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,0BAA0B;IAIlC;;;;;OAKG;IACI,WAAW,CAChB,QAAQ,EAAE,MAAM,OAAO,EACvB,OAAO,GAAE,sBAA2B;WAsBxB,MAAM,CAClB,OAAO,GAAE,wBAA6B,GACrC,iBAAiB;IAMpB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IAIpB,UAAU,CAAC,OAAO,EAAE,mBAAmB;IAIvC,SAAS,CAAC,OAAO,EAAE,kBAAkB;IAIrC,eAAe,CAAC,OAAO,EAAE,uBAAuB;IAIhD,IAAI,IAAI,IAAI;IAIZ,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAInC,MAAM,IAAI,IAAI;IAId,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,IAAI;IAiC1D,qBAAqB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAIxC,SAAS;IAIT,qBAAqB;IAIrB,wBAAwB;IAIxB,wBAAwB;IAIxB,yBAAyB;;;;;IAIzB,YAAY,IAAI,IAAI;IAKpB,kBAAkB,IAAI,IAAI;CAGlC"}
|