mod-arch-shared 1.1.4 → 1.2.0
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/dist/components/DashboardDescriptionListGroup.d.ts.map +1 -1
- package/dist/components/DashboardDescriptionListGroup.js +24 -15
- package/dist/components/DashboardDescriptionListGroup.js.map +1 -1
- package/dist/components/NavigationBlockerModal.d.ts +12 -0
- package/dist/components/NavigationBlockerModal.d.ts.map +1 -0
- package/dist/components/NavigationBlockerModal.js +61 -0
- package/dist/components/NavigationBlockerModal.js.map +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/utilities/index.d.ts +1 -0
- package/dist/utilities/index.d.ts.map +1 -1
- package/dist/utilities/index.js +1 -0
- package/dist/utilities/index.js.map +1 -1
- package/dist/utilities/useBrowserUnloadBlocker.d.ts +6 -0
- package/dist/utilities/useBrowserUnloadBlocker.d.ts.map +1 -0
- package/dist/utilities/useBrowserUnloadBlocker.js +23 -0
- package/dist/utilities/useBrowserUnloadBlocker.js.map +1 -0
- package/package.json +4 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardDescriptionListGroup.d.ts","sourceRoot":"","sources":["../../components/DashboardDescriptionListGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsB/B,OAAO,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"DashboardDescriptionListGroup.d.ts","sourceRoot":"","sources":["../../components/DashboardDescriptionListGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsB/B,OAAO,sCAAsC,CAAC;AAK9C,KAAK,aAAa,GAAG;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,EAAE,KAAK,CAAC,SAAS,CAAC;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,CAAC,CAAC;IAAE,UAAU,EAAE,IAAI,CAAA;CAAE,GAAG,aAAa,CAAC,GAAG,CAAC;IAAE,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAEjG,QAAA,MAAM,6BAA6B,EAAE,KAAK,CAAC,EAAE,CAAC,kCAAkC,CA6G/E,CAAC;AAEF,eAAe,6BAA6B,CAAC"}
|
|
@@ -4,23 +4,32 @@ import text from '@patternfly/react-styles/css/utilities/Text/text';
|
|
|
4
4
|
import { CheckIcon, PencilAltIcon, TimesIcon, OutlinedQuestionCircleIcon, } from '@patternfly/react-icons';
|
|
5
5
|
import './DashboardDescriptionListGroup.scss';
|
|
6
6
|
import DashboardPopupIconButton from '../components/dashboard/DashboardPopupIconButton';
|
|
7
|
+
import { useBrowserUnloadBlocker } from '../utilities/useBrowserUnloadBlocker';
|
|
8
|
+
import NavigationBlockerModal from './NavigationBlockerModal';
|
|
7
9
|
const DashboardDescriptionListGroup = (props) => {
|
|
8
10
|
const { title, popover, action, isEmpty, contentWhenEmpty, isEditable = false, isEditing, contentWhenEditing, isSavingEdits = false, onEditClick, onSaveEditsClick, onDiscardEditsClick, children, groupTestId, editButtonTestId, saveButtonTestId, cancelButtonTestId, isSaveDisabled, } = props;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
11
|
+
const hasUnsavedChanges = !!(isEditable && isEditing);
|
|
12
|
+
useBrowserUnloadBlocker(hasUnsavedChanges);
|
|
13
|
+
const handleDiscardEditsClick = React.useCallback(() => {
|
|
14
|
+
onDiscardEditsClick?.();
|
|
15
|
+
}, [onDiscardEditsClick]);
|
|
16
|
+
return (React.createElement(React.Fragment, null,
|
|
17
|
+
React.createElement(DescriptionListGroup, { "data-testid": groupTestId },
|
|
18
|
+
action || isEditable ? (React.createElement(DescriptionListTerm, { className: "kubeflow-custom-description-list-term-with-action" },
|
|
19
|
+
React.createElement(Split, null,
|
|
20
|
+
React.createElement(SplitItem, { isFilled: true }, title),
|
|
21
|
+
React.createElement(SplitItem, null, action ||
|
|
22
|
+
(isEditing ? (React.createElement(ActionList, { isIconList: true },
|
|
23
|
+
React.createElement(ActionListItem, null,
|
|
24
|
+
React.createElement(Button, { "data-testid": saveButtonTestId, icon: React.createElement(CheckIcon, null), "aria-label": `Save edits to ${title}`, variant: "link", onClick: onSaveEditsClick, isDisabled: isSavingEdits || isSaveDisabled })),
|
|
25
|
+
React.createElement(ActionListItem, null,
|
|
26
|
+
React.createElement(Button, { "data-testid": cancelButtonTestId, icon: React.createElement(TimesIcon, null), "aria-label": `Discard edits to ${title} `, variant: "plain", onClick: onDiscardEditsClick, isDisabled: isSavingEdits })))) : (React.createElement(Button, { "data-testid": editButtonTestId, "aria-label": `Edit ${title}`, variant: "link", icon: React.createElement(PencilAltIcon, null), iconPosition: "start", onClick: onEditClick }, "Edit"))))))) : (React.createElement(DescriptionListTerm, null,
|
|
27
|
+
React.createElement(Flex, { spaceItems: { default: 'spaceItemsNone' }, alignItems: { default: 'alignItemsCenter' } },
|
|
28
|
+
React.createElement(FlexItem, null, title),
|
|
29
|
+
popover && (React.createElement(Popover, { bodyContent: popover },
|
|
30
|
+
React.createElement(DashboardPopupIconButton, { icon: React.createElement(OutlinedQuestionCircleIcon, null), "aria-label": "More info" })))))),
|
|
31
|
+
React.createElement(DescriptionListDescription, { className: isEmpty && !isEditing ? text.textColorDisabled : '', "aria-disabled": !!(isEmpty && !isEditing) }, isEditing ? contentWhenEditing : isEmpty ? contentWhenEmpty : children)),
|
|
32
|
+
hasUnsavedChanges && (React.createElement(NavigationBlockerModal, { hasUnsavedChanges: hasUnsavedChanges, onDiscardEditsClick: handleDiscardEditsClick }))));
|
|
24
33
|
};
|
|
25
34
|
export default DashboardDescriptionListGroup;
|
|
26
35
|
//# sourceMappingURL=DashboardDescriptionListGroup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardDescriptionListGroup.js","sourceRoot":"","sources":["../../components/DashboardDescriptionListGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,cAAc,EACd,MAAM,EACN,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACnB,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,KAAK,EACL,SAAS,GACV,MAAM,wBAAwB,CAAC;AAChC,OAAO,IAAI,MAAM,kDAAkD,CAAC;AACpE,OAAO,EACL,SAAS,EACT,aAAa,EACb,SAAS,EACT,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,wBAAwB,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"DashboardDescriptionListGroup.js","sourceRoot":"","sources":["../../components/DashboardDescriptionListGroup.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
interface NavigationBlockerModalProps {
|
|
3
|
+
hasUnsavedChanges: boolean;
|
|
4
|
+
onDiscardEditsClick?: () => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* A modal that warns users they have unsaved changes when they try to navigate away.
|
|
8
|
+
* Uses React Router's useBlocker hook to detect navigation attempts.
|
|
9
|
+
*/
|
|
10
|
+
declare const NavigationBlockerModal: React.FC<NavigationBlockerModalProps>;
|
|
11
|
+
export default NavigationBlockerModal;
|
|
12
|
+
//# sourceMappingURL=NavigationBlockerModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationBlockerModal.d.ts","sourceRoot":"","sources":["../../components/NavigationBlockerModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,UAAU,2BAA2B;IACnC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED;;;GAGG;AACH,QAAA,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CA4FjE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useBlocker } from 'react-router-dom';
|
|
3
|
+
import { Button } from '@patternfly/react-core';
|
|
4
|
+
import { Modal, ModalVariant } from '@patternfly/react-core/deprecated';
|
|
5
|
+
/**
|
|
6
|
+
* A modal that warns users they have unsaved changes when they try to navigate away.
|
|
7
|
+
* Uses React Router's useBlocker hook to detect navigation attempts.
|
|
8
|
+
*/
|
|
9
|
+
const NavigationBlockerModal = ({ hasUnsavedChanges, onDiscardEditsClick, }) => {
|
|
10
|
+
const [showModal, setShowModal] = React.useState(false);
|
|
11
|
+
const proceedRef = React.useRef();
|
|
12
|
+
const resetRef = React.useRef();
|
|
13
|
+
const handlingRef = React.useRef(false);
|
|
14
|
+
const blocker = useBlocker(React.useCallback(({ currentLocation, nextLocation }) => hasUnsavedChanges &&
|
|
15
|
+
currentLocation.pathname !== nextLocation.pathname &&
|
|
16
|
+
!handlingRef.current, [hasUnsavedChanges]));
|
|
17
|
+
React.useEffect(() => {
|
|
18
|
+
if (!hasUnsavedChanges && showModal && proceedRef.current) {
|
|
19
|
+
handlingRef.current = true;
|
|
20
|
+
proceedRef.current();
|
|
21
|
+
setShowModal(false);
|
|
22
|
+
}
|
|
23
|
+
}, [hasUnsavedChanges, showModal]);
|
|
24
|
+
React.useEffect(() => {
|
|
25
|
+
switch (blocker.state) {
|
|
26
|
+
case 'blocked':
|
|
27
|
+
proceedRef.current = blocker.proceed;
|
|
28
|
+
resetRef.current = blocker.reset;
|
|
29
|
+
setShowModal(true);
|
|
30
|
+
break;
|
|
31
|
+
case 'proceeding':
|
|
32
|
+
handlingRef.current = true;
|
|
33
|
+
setShowModal(false);
|
|
34
|
+
break;
|
|
35
|
+
default:
|
|
36
|
+
handlingRef.current = false;
|
|
37
|
+
}
|
|
38
|
+
}, [blocker]);
|
|
39
|
+
const handleConfirm = () => {
|
|
40
|
+
handlingRef.current = true;
|
|
41
|
+
onDiscardEditsClick?.();
|
|
42
|
+
setShowModal(false);
|
|
43
|
+
proceedRef.current?.();
|
|
44
|
+
};
|
|
45
|
+
const handleCancel = () => {
|
|
46
|
+
setShowModal(false);
|
|
47
|
+
resetRef.current?.();
|
|
48
|
+
setTimeout(() => {
|
|
49
|
+
handlingRef.current = false;
|
|
50
|
+
}, 100);
|
|
51
|
+
};
|
|
52
|
+
if (!showModal) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return (React.createElement(Modal, { variant: ModalVariant.small, title: "Discard unsaved changes?", isOpen: true, onClose: handleCancel, actions: [
|
|
56
|
+
React.createElement(Button, { key: "confirm", variant: "primary", onClick: handleConfirm, "data-testid": "confirm-discard-changes" }, "Discard"),
|
|
57
|
+
React.createElement(Button, { key: "cancel", variant: "link", onClick: handleCancel, "data-testid": "cancel-discard-changes" }, "Cancel"),
|
|
58
|
+
] }, "One or more of your changes on this page are not saved yet. Discard your changes and leave this page, or cancel to continue editing."));
|
|
59
|
+
};
|
|
60
|
+
export default NavigationBlockerModal;
|
|
61
|
+
//# sourceMappingURL=NavigationBlockerModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationBlockerModal.js","sourceRoot":"","sources":["../../components/NavigationBlockerModal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ export { default as DashboardDescriptionListGroup } from './DashboardDescription
|
|
|
3
3
|
export { default as DashboardEmptyTableView } from './DashboardEmptyTableView';
|
|
4
4
|
export { default as DashboardHelpTooltip } from './DashboardHelpTooltip';
|
|
5
5
|
export { default as DashboardModalFooter } from './DashboardModalFooter';
|
|
6
|
+
export { default as NavigationBlockerModal } from './NavigationBlockerModal';
|
|
6
7
|
export { default as DashboardSearchField } from './DashboardSearchField';
|
|
7
8
|
export { default as EditableLabelsDescriptionListGroup } from './EditableLabelsDescriptionListGroup';
|
|
8
9
|
export { default as EditableTextDescriptionListGroup } from './EditableTextDescriptionListGroup';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../components/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AACrG,OAAO,EAAE,OAAO,IAAI,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGvE,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../components/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AACrG,OAAO,EAAE,OAAO,IAAI,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGvE,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
|
package/dist/components/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export { default as DashboardDescriptionListGroup } from './DashboardDescription
|
|
|
4
4
|
export { default as DashboardEmptyTableView } from './DashboardEmptyTableView';
|
|
5
5
|
export { default as DashboardHelpTooltip } from './DashboardHelpTooltip';
|
|
6
6
|
export { default as DashboardModalFooter } from './DashboardModalFooter';
|
|
7
|
+
export { default as NavigationBlockerModal } from './NavigationBlockerModal';
|
|
7
8
|
export { default as DashboardSearchField } from './DashboardSearchField';
|
|
8
9
|
export { default as EditableLabelsDescriptionListGroup } from './EditableLabelsDescriptionListGroup';
|
|
9
10
|
export { default as EditableTextDescriptionListGroup } from './EditableTextDescriptionListGroup';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../components/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AACrG,OAAO,EAAE,OAAO,IAAI,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEvE,sCAAsC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../components/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AACrG,OAAO,EAAE,OAAO,IAAI,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEvE,sCAAsC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../utilities/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../utilities/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,2BAA2B,CAAC"}
|
package/dist/utilities/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../utilities/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../utilities/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use this hook to block the browser from unloading when the user has unsaved changes.
|
|
3
|
+
* @param shouldBlock - Whether to block the browser from unloading.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useBrowserUnloadBlocker(shouldBlock: boolean): void;
|
|
6
|
+
//# sourceMappingURL=useBrowserUnloadBlocker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBrowserUnloadBlocker.d.ts","sourceRoot":"","sources":["../../utilities/useBrowserUnloadBlocker.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAsBlE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useEffect, useCallback } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Use this hook to block the browser from unloading when the user has unsaved changes.
|
|
4
|
+
* @param shouldBlock - Whether to block the browser from unloading.
|
|
5
|
+
*/
|
|
6
|
+
export function useBrowserUnloadBlocker(shouldBlock) {
|
|
7
|
+
const handleBeforeUnload = useCallback((e) => {
|
|
8
|
+
if (shouldBlock) {
|
|
9
|
+
e.preventDefault();
|
|
10
|
+
e.returnValue = '';
|
|
11
|
+
}
|
|
12
|
+
}, [shouldBlock]);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (!shouldBlock) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
window.addEventListener('beforeunload', handleBeforeUnload);
|
|
18
|
+
return () => {
|
|
19
|
+
window.removeEventListener('beforeunload', handleBeforeUnload);
|
|
20
|
+
};
|
|
21
|
+
}, [shouldBlock, handleBeforeUnload]);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=useBrowserUnloadBlocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBrowserUnloadBlocker.js","sourceRoot":"","sources":["../../utilities/useBrowserUnloadBlocker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE/C;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAAoB;IAC1D,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,CAAoB,EAAE,EAAE;QACvB,IAAI,WAAW,EAAE,CAAC;YAChB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,EACD,CAAC,WAAW,CAAC,CACd,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAE5D,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACjE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC;AACxC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mod-arch-shared",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Shared UI components and utilities for modular architecture micro-frontend projects",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -53,7 +53,8 @@
|
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"react": ">=16.8.0",
|
|
56
|
-
"react-dom": ">=16.8.0"
|
|
56
|
+
"react-dom": ">=16.8.0",
|
|
57
|
+
"react-router-dom": ">=6.4.0"
|
|
57
58
|
},
|
|
58
59
|
"devDependencies": {
|
|
59
60
|
"@babel/preset-env": "^7.21.5",
|
|
@@ -80,6 +81,7 @@
|
|
|
80
81
|
"npm-run-all2": "^7.0.1",
|
|
81
82
|
"react": "^18.3.1",
|
|
82
83
|
"react-dom": "^18.3.1",
|
|
84
|
+
"react-router-dom": "^6.26.2",
|
|
83
85
|
"sass": "^1.83.0",
|
|
84
86
|
"ts-jest": "^29.2.6",
|
|
85
87
|
"tsc-alias": "^1.8.15",
|