@zat-design/sisyphus-react 4.5.10-beta.1 → 4.5.10-beta.2
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/es/FormsProvider/index.js +14 -21
- package/es/ProAction/components/CheckModalContent/index.js +12 -26
- package/es/ProAction/index.js +79 -83
- package/es/ProAction/propsType.js +0 -1
- package/es/ProConfigProvider/index.js +63 -110
- package/es/ProConfigProvider/propsType.js +0 -1
- package/es/ProDownload/index.js +55 -65
- package/es/ProDownload/propsType.js +0 -1
- package/es/ProDownload/utils.js +61 -95
- package/es/ProDrawerForm/components/ProDrawer/index.js +83 -113
- package/es/ProDrawerForm/components/ProModal/index.js +77 -108
- package/es/ProDrawerForm/components/index.js +6 -2
- package/es/ProDrawerForm/hooks/useConfirmClose.js +20 -39
- package/es/ProDrawerForm/index.js +29 -38
- package/es/ProDrawerForm/propsType.js +0 -1
- package/es/ProDrawerForm/utils/index.js +18 -36
- package/es/ProEditLabel/components/RenderProForm.js +45 -49
- package/es/ProEditLabel/index.js +126 -163
- package/es/ProEditLabel/propsType.js +0 -1
- package/es/ProEditLabel/utils/index.js +5 -8
- package/es/ProEditTable/components/ActionButton/index.js +111 -119
- package/es/ProEditTable/components/RcTable/BaseTable.js +38 -51
- package/es/ProEditTable/components/RcTable/DraggableTable.js +97 -129
- package/es/ProEditTable/components/RcTable/index.js +6 -4
- package/es/ProEditTable/components/RenderField/ListChangedWrapper.js +77 -95
- package/es/ProEditTable/components/RenderField/index.js +490 -587
- package/es/ProEditTable/components/RenderField/propsType.js +0 -1
- package/es/ProEditTable/components/RenderField/tools.js +115 -112
- package/es/ProEditTable/components/RenderToolbar/index.js +47 -73
- package/es/ProEditTable/components/Summary/index.js +38 -64
- package/es/ProEditTable/components/Validator/index.js +46 -46
- package/es/ProEditTable/components/index.js +12 -5
- package/es/ProEditTable/index.js +456 -378
- package/es/ProEditTable/propsType.js +0 -1
- package/es/ProEditTable/utils/config.js +60 -122
- package/es/ProEditTable/utils/diffOriginal.js +45 -82
- package/es/ProEditTable/utils/getDefaultProps.js +19 -24
- package/es/ProEditTable/utils/index.js +150 -236
- package/es/ProEditTable/utils/tools.js +149 -286
- package/es/ProEditTable/utils/transform.js +25 -30
- package/es/ProEditTable/utils/useEditTableError.js +30 -43
- package/es/ProEditTable/utils/useShouldUpdateForTable.js +42 -72
- package/es/ProEditTable/utils/validateAll.js +87 -154
- package/es/ProEnum/components/Group.js +38 -30
- package/es/ProEnum/components/Tag.js +22 -26
- package/es/ProEnum/hooks/useEnum.js +48 -116
- package/es/ProEnum/hooks/useEnumRequest.js +128 -179
- package/es/ProEnum/hooks/useFrequentEnumRequest.js +40 -48
- package/es/ProEnum/index.js +162 -172
- package/es/ProEnum/propsType.js +0 -1
- package/es/ProEnum/utils/eventCenter.js +10 -12
- package/es/ProEnum/utils/frequentEnum.js +35 -92
- package/es/ProEnum/utils/getEnum.js +32 -90
- package/es/ProEnum/utils/getEnumLabel.js +44 -49
- package/es/ProEnum/utils/index.js +93 -207
- package/es/ProForm/components/Container.js +13 -28
- package/es/ProForm/components/FormFooter/index.js +36 -44
- package/es/ProForm/components/FormFooter/propsType.js +0 -1
- package/es/ProForm/components/base/Checkbox/index.js +32 -59
- package/es/ProForm/components/base/DatePicker/index.js +49 -71
- package/es/ProForm/components/base/Input/index.js +63 -97
- package/es/ProForm/components/base/Input/propsType.js +0 -1
- package/es/ProForm/components/base/InputNumber/index.js +118 -172
- package/es/ProForm/components/base/Radio/index.js +39 -52
- package/es/ProForm/components/base/RangePicker/index.js +109 -127
- package/es/ProForm/components/base/RangePicker/useDateRange.js +20 -17
- package/es/ProForm/components/base/Select/index.js +63 -89
- package/es/ProForm/components/base/Switch/index.js +27 -35
- package/es/ProForm/components/base/SwitchCheckbox/index.js +36 -54
- package/es/ProForm/components/base/TextArea/index.js +30 -41
- package/es/ProForm/components/base/TimePicker/index.js +27 -37
- package/es/ProForm/components/combination/Container/index.js +37 -47
- package/es/ProForm/components/combination/Container/propsType.js +0 -1
- package/es/ProForm/components/combination/FormList/components/ActionButton.js +165 -237
- package/es/ProForm/components/combination/FormList/components/BlockFields.js +98 -103
- package/es/ProForm/components/combination/FormList/components/Empty.js +27 -54
- package/es/ProForm/components/combination/FormList/components/LineFields.js +57 -54
- package/es/ProForm/components/combination/FormList/components/ToolbarButton.js +61 -109
- package/es/ProForm/components/combination/FormList/index.js +151 -161
- package/es/ProForm/components/combination/FormList/propsType.js +0 -1
- package/es/ProForm/components/combination/FormList/utils.js +22 -38
- package/es/ProForm/components/combination/Group/component/AddonWrapper/index.js +12 -28
- package/es/ProForm/components/combination/Group/component/ComRender.js +50 -111
- package/es/ProForm/components/combination/Group/component/FlexibleGroup.js +105 -206
- package/es/ProForm/components/combination/Group/hooks/index.js +68 -128
- package/es/ProForm/components/combination/Group/index.js +87 -126
- package/es/ProForm/components/combination/Group/propsType.js +0 -1
- package/es/ProForm/components/combination/Group/utils/index.js +124 -239
- package/es/ProForm/components/combination/ProCascader/index.js +156 -199
- package/es/ProForm/components/combination/ProCascader/propsType.js +0 -1
- package/es/ProForm/components/combination/ProCascader/utils/index.js +12 -21
- package/es/ProForm/components/combination/ProModalSelect/hooks/useRequestList.js +63 -75
- package/es/ProForm/components/combination/ProModalSelect/index.js +290 -348
- package/es/ProForm/components/combination/ProModalSelect/propsType.js +0 -1
- package/es/ProForm/components/combination/ProModalSelect/utils/index.js +32 -39
- package/es/ProForm/components/combination/ProNumberRange/index.js +100 -156
- package/es/ProForm/components/combination/ProNumberRange/propsType.js +0 -1
- package/es/ProForm/components/combination/ProRangeLimit/index.js +104 -115
- package/es/ProForm/components/combination/ProRangeLimit/propsType.js +0 -1
- package/es/ProForm/components/combination/ProTimeLimit/hooks/useControlled.js +16 -16
- package/es/ProForm/components/combination/ProTimeLimit/index.js +75 -109
- package/es/ProForm/components/index.js +56 -34
- package/es/ProForm/components/render/ChangedWrapper.js +85 -94
- package/es/ProForm/components/render/ConfirmWrapper.js +27 -39
- package/es/ProForm/components/render/CustomComponentViewWrapper.js +65 -82
- package/es/ProForm/components/render/Render.js +223 -329
- package/es/ProForm/components/render/RenderFields.js +76 -113
- package/es/ProForm/components/render/propsType.js +0 -1
- package/es/ProForm/hooks/useControlled.js +8 -10
- package/es/ProForm/hooks/useDeepCompareMemo.js +11 -11
- package/es/ProForm/hooks/useFieldProps.js +8 -4
- package/es/ProForm/hooks/useForm.js +50 -110
- package/es/ProForm/hooks/useRules.js +17 -33
- package/es/ProForm/hooks/useShouldUpdate.js +77 -152
- package/es/ProForm/hooks/useWatch.js +58 -129
- package/es/ProForm/index.js +157 -194
- package/es/ProForm/propsType.js +15 -7
- package/es/ProForm/utils/buildFormItemProps.js +51 -58
- package/es/ProForm/utils/diffOriginal.js +43 -73
- package/es/ProForm/utils/getDefaultProps.js +18 -24
- package/es/ProForm/utils/index.js +159 -234
- package/es/ProForm/utils/processDependencies.js +21 -60
- package/es/ProForm/utils/reactiveValues.js +20 -34
- package/es/ProForm/utils/rulesCreator.js +42 -40
- package/es/ProForm/utils/transformNames.js +10 -13
- package/es/ProForm/utils/transformValue.js +16 -29
- package/es/ProForm/utils/valueType.js +96 -178
- package/es/ProIcon/config/index.js +340 -274
- package/es/ProIcon/index.js +135 -209
- package/es/ProIcon/propsTypes.js +0 -1
- package/es/ProIcon/utils/index.js +24 -39
- package/es/ProLayout/components/Layout/Header/index.js +108 -141
- package/es/ProLayout/components/Layout/Menu/FoldMenu/index.js +134 -190
- package/es/ProLayout/components/Layout/Menu/OpenMenu/index.js +111 -137
- package/es/ProLayout/components/Layout/Menu/OpenMenu/propsType.js +0 -1
- package/es/ProLayout/components/Layout/Menu/SideMenu/index.js +23 -31
- package/es/ProLayout/components/Layout/Menu/index.js +92 -89
- package/es/ProLayout/components/Layout/Notice/index.js +13 -27
- package/es/ProLayout/components/Layout/index.js +8 -3
- package/es/ProLayout/components/ProCollapse/PropTypes.js +0 -1
- package/es/ProLayout/components/ProCollapse/index.js +89 -111
- package/es/ProLayout/components/ProFooter/PropTypes.js +0 -1
- package/es/ProLayout/components/ProFooter/index.js +27 -25
- package/es/ProLayout/components/ProHeader/PropTypes.js +0 -1
- package/es/ProLayout/components/ProHeader/components/Copy/index.js +23 -21
- package/es/ProLayout/components/ProHeader/components/Describe/index.js +67 -86
- package/es/ProLayout/components/ProHeader/components/ProBackBtn/index.js +18 -21
- package/es/ProLayout/components/ProHeader/components/ProBackBtn/propsType.js +0 -1
- package/es/ProLayout/components/ProHeader/components/index.js +6 -2
- package/es/ProLayout/components/ProHeader/index.js +216 -356
- package/es/ProLayout/components/ProHeader/utils/index.js +19 -26
- package/es/ProLayout/components/TabsManager/components/TabContextMenu.js +92 -85
- package/es/ProLayout/components/TabsManager/components/TabItem.js +53 -64
- package/es/ProLayout/components/TabsManager/components/TabsContext.js +5 -5
- package/es/ProLayout/components/TabsManager/components/TabsHeader.js +42 -52
- package/es/ProLayout/components/TabsManager/hooks/useActiveTab.js +8 -9
- package/es/ProLayout/components/TabsManager/hooks/useIframeRoute.js +19 -32
- package/es/ProLayout/components/TabsManager/hooks/useProLayoutTabs.js +6 -20
- package/es/ProLayout/components/TabsManager/hooks/useTabsCache.js +25 -42
- package/es/ProLayout/components/TabsManager/hooks/useTabsState.js +290 -408
- package/es/ProLayout/components/TabsManager/hooks/useTabsUrlSync.js +132 -95
- package/es/ProLayout/components/TabsManager/index.js +406 -390
- package/es/ProLayout/components/TabsManager/propTypes.js +7 -15
- package/es/ProLayout/components/TabsManager/utils/historyObserver.js +26 -23
- package/es/ProLayout/components/TabsManager/utils/index.js +127 -184
- package/es/ProLayout/components/index.js +8 -3
- package/es/ProLayout/index.js +171 -229
- package/es/ProLayout/propTypes.js +12 -52
- package/es/ProLayout/utils/index.js +48 -128
- package/es/ProSelect/components/AdaptiveTooltip.js +26 -25
- package/es/ProSelect/index.js +184 -229
- package/es/ProSelect/propsType.js +0 -1
- package/es/ProSelect/utils/index.js +100 -146
- package/es/ProStep/components/Anchor/index.js +71 -82
- package/es/ProStep/components/Item/index.js +49 -56
- package/es/ProStep/components/LazyLoad/index.js +23 -29
- package/es/ProStep/components/Listener/index.js +20 -33
- package/es/ProStep/components/Step/index.js +31 -38
- package/es/ProStep/constants.js +4 -1
- package/es/ProStep/index.js +166 -153
- package/es/ProStep/propsType.js +0 -1
- package/es/ProStep/utils/index.js +29 -55
- package/es/ProStepTab/index.js +83 -138
- package/es/ProStepTab/propsType.js +0 -1
- package/es/ProTable/components/EditableCell/EditIcon.js +10 -14
- package/es/ProTable/components/EditableCell/index.js +37 -71
- package/es/ProTable/components/EditableCell/propsType.js +0 -1
- package/es/ProTable/components/FormatColumn/index.js +209 -340
- package/es/ProTable/components/FormatColumn/propsType.js +0 -1
- package/es/ProTable/components/RcTable/components/BaseTable/index.js +35 -39
- package/es/ProTable/components/RcTable/components/DraggableTable/components/DndWrapper/index.js +80 -107
- package/es/ProTable/components/RcTable/components/DraggableTable/components/DndWrapper/utils/index.js +54 -48
- package/es/ProTable/components/RcTable/components/DraggableTable/components/DndWrapper/utils/propsType.js +0 -1
- package/es/ProTable/components/RcTable/components/DraggableTable/index.js +47 -54
- package/es/ProTable/components/RcTable/index.js +6 -4
- package/es/ProTable/components/RenderColumn/index.js +158 -186
- package/es/ProTable/components/RenderEmptyText/index.js +12 -21
- package/es/ProTable/components/RenderFooter/index.js +15 -15
- package/es/ProTable/components/RenderSummary/index.js +33 -50
- package/es/ProTable/components/RenderTableHeader/index.js +44 -46
- package/es/ProTable/components/RenderTabs/index.js +47 -51
- package/es/ProTable/components/TableResizable/index.js +56 -72
- package/es/ProTable/components/TooltipTitle/index.js +13 -21
- package/es/ProTable/components/index.js +16 -36
- package/es/ProTable/hooks/useAntdTable.js +185 -219
- package/es/ProTable/index.js +232 -249
- package/es/ProTable/propsType.js +0 -1
- package/es/ProTable/utils/columnStorage.js +63 -88
- package/es/ProTable/utils/index.js +57 -90
- package/es/ProTabs/components/Card/index.js +20 -48
- package/es/ProTabs/components/index.js +4 -1
- package/es/ProTabs/index.js +39 -56
- package/es/ProTabs/propType.js +0 -1
- package/es/ProThemeTools/component/ProTools/index.js +106 -158
- package/es/ProThemeTools/component/index.js +4 -1
- package/es/ProThemeTools/context/ThemeContext.js +67 -146
- package/es/ProThemeTools/index.js +103 -156
- package/es/ProThemeTools/propsType.js +0 -1
- package/es/ProThemeTools/utils/index.js +60 -109
- package/es/ProTooltip/index.js +132 -165
- package/es/ProTooltip/propsType.js +0 -1
- package/es/ProTree/components/AdaptiveTooltip.js +15 -17
- package/es/ProTree/components/CloseIcon.js +18 -26
- package/es/ProTree/components/List.js +28 -47
- package/es/ProTree/components/ProTree.js +152 -211
- package/es/ProTree/components/ProTreeSelect/index.js +254 -458
- package/es/ProTree/components/ProTreeSelect/propsType.js +0 -1
- package/es/ProTree/components/SearchTitle.js +23 -42
- package/es/ProTree/components/Tree.js +147 -195
- package/es/ProTree/components/index.js +10 -5
- package/es/ProTree/index.js +12 -16
- package/es/ProTree/propsType.js +0 -1
- package/es/ProTree/utils.js +46 -118
- package/es/ProTreeModal/components/Cascader.js +56 -64
- package/es/ProTreeModal/components/CloseIcon.js +18 -26
- package/es/ProTreeModal/components/List.js +114 -180
- package/es/ProTreeModal/components/SearchTitle.js +15 -18
- package/es/ProTreeModal/components/SortableItem.js +29 -58
- package/es/ProTreeModal/components/Tree.js +99 -113
- package/es/ProTreeModal/components/Trigger.js +87 -121
- package/es/ProTreeModal/components/index.js +14 -6
- package/es/ProTreeModal/index.js +397 -435
- package/es/ProTreeModal/propsType.js +0 -1
- package/es/ProTreeModal/utils.js +52 -95
- package/es/ProUpload/components/ButtonRender.js +44 -54
- package/es/ProUpload/components/DragRender.js +94 -134
- package/es/ProUpload/components/DraggableUploadListItem.js +12 -25
- package/es/ProUpload/components/Example.js +27 -31
- package/es/ProUpload/components/FileItem.js +69 -163
- package/es/ProUpload/components/ImageRender.js +134 -170
- package/es/ProUpload/index.js +68 -100
- package/es/ProUpload/propsType.js +0 -1
- package/es/ProUpload/uitls.js +8 -4
- package/es/ProUtils/utils/index.js +17 -13
- package/es/ProViewer/index.js +154 -175
- package/es/ProViewer/propsType.js +0 -5
- package/es/ProWaterMark/index.js +9 -16
- package/es/ProWaterMark/propsType.js +0 -1
- package/es/hooks/useDraggableRow.js +25 -53
- package/es/index.js +57 -77
- package/es/locale/en_US.js +153 -142
- package/es/locale/index.js +23 -36
- package/es/locale/zh_CN.js +145 -142
- package/es/tokens.js +84 -83
- package/es/utils/index.js +24 -51
- package/package.json +4 -3
|
@@ -1,73 +1,82 @@
|
|
|
1
|
-
import { createContext, useContext, useEffect, useRef, useState } from
|
|
2
|
-
import * as ReactRouterDom from
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { createContext, useContext, useEffect, useRef, useState } from "react";
|
|
2
|
+
import * as ReactRouterDom from "react-router-dom";
|
|
3
|
+
import {
|
|
4
|
+
canOpenAsTab,
|
|
5
|
+
flattenMenuData,
|
|
6
|
+
getCurrentTabUrl,
|
|
7
|
+
getMenuRoute,
|
|
8
|
+
getTabUrlPathname,
|
|
9
|
+
normalizeTabUrl
|
|
10
|
+
} from "../utils";
|
|
11
|
+
import {
|
|
12
|
+
subscribeHistoryLocation
|
|
13
|
+
} from "../utils/historyObserver";
|
|
14
|
+
const getOptionalRouterContext = (exportName) => {
|
|
6
15
|
const descriptor = Object.getOwnPropertyDescriptor(ReactRouterDom, exportName);
|
|
7
|
-
return descriptor ? Reflect.get(ReactRouterDom, exportName) :
|
|
16
|
+
return descriptor ? Reflect.get(ReactRouterDom, exportName) : void 0;
|
|
8
17
|
};
|
|
9
|
-
const OptionalNavigationContext = getOptionalRouterContext(
|
|
10
|
-
|
|
11
|
-
// Data Router 从 react-router-dom 6.4 起提供;保留 6.0-6.3 peer 兼容。
|
|
12
|
-
const OptionalDataRouterContext = getOptionalRouterContext('UNSAFE_DataRouterContext') || /*#__PURE__*/createContext(null);
|
|
18
|
+
const OptionalNavigationContext = getOptionalRouterContext("UNSAFE_NavigationContext") || createContext(null);
|
|
19
|
+
const OptionalDataRouterContext = getOptionalRouterContext("UNSAFE_DataRouterContext") || createContext(null);
|
|
13
20
|
const getDataRouterUrl = (url, basename) => {
|
|
14
|
-
if (!basename || basename ===
|
|
21
|
+
if (!basename || basename === "/")
|
|
22
|
+
return url;
|
|
15
23
|
const pathname = getTabUrlPathname(url);
|
|
16
|
-
if (!pathname)
|
|
17
|
-
|
|
24
|
+
if (!pathname)
|
|
25
|
+
return url;
|
|
26
|
+
const normalizedBasename = `/${basename.replace(/^\/+|\/+$/g, "")}`;
|
|
18
27
|
const lowerPathname = pathname.toLowerCase();
|
|
19
28
|
const lowerBasename = normalizedBasename.toLowerCase();
|
|
20
29
|
const suffix = url.slice(pathname.length);
|
|
21
|
-
if (lowerPathname === lowerBasename)
|
|
30
|
+
if (lowerPathname === lowerBasename)
|
|
31
|
+
return `/${suffix}`;
|
|
22
32
|
if (lowerPathname.startsWith(`${lowerBasename}/`)) {
|
|
23
33
|
return `${pathname.slice(normalizedBasename.length)}${suffix}`;
|
|
24
34
|
}
|
|
25
35
|
return url;
|
|
26
36
|
};
|
|
27
37
|
const isCurrentDataRouterNavigation = (currentUrl, dataRouterContext) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
38
|
+
var _a, _b;
|
|
39
|
+
const navigationLocation = (_b = (_a = dataRouterContext == null ? void 0 : dataRouterContext.router.state) == null ? void 0 : _a.navigation) == null ? void 0 : _b.location;
|
|
40
|
+
if (!navigationLocation)
|
|
41
|
+
return false;
|
|
42
|
+
const navigationUrl = `${navigationLocation.pathname}${navigationLocation.search ?? ""}${navigationLocation.hash ?? ""}`;
|
|
43
|
+
return navigationUrl === currentUrl || navigationUrl === getDataRouterUrl(currentUrl, dataRouterContext == null ? void 0 : dataRouterContext.basename);
|
|
32
44
|
};
|
|
33
45
|
const isSameOrNestedPath = (basePathname, currentPathname) => {
|
|
34
|
-
if (!basePathname || !currentPathname)
|
|
35
|
-
|
|
36
|
-
|
|
46
|
+
if (!basePathname || !currentPathname)
|
|
47
|
+
return false;
|
|
48
|
+
const normalizedBase = basePathname === "/" ? "/" : basePathname.replace(/\/$/, "");
|
|
49
|
+
return currentPathname === normalizedBase || normalizedBase !== "/" && currentPathname.startsWith(`${normalizedBase}/`);
|
|
37
50
|
};
|
|
38
|
-
const getSourceMenus = dataSource => {
|
|
39
|
-
if (!dataSource || !(
|
|
51
|
+
const getSourceMenus = (dataSource) => {
|
|
52
|
+
if (!dataSource || !("menus" in dataSource) || !Array.isArray(dataSource.menus))
|
|
53
|
+
return [];
|
|
40
54
|
return flattenMenuData(dataSource.menus);
|
|
41
55
|
};
|
|
42
|
-
const createPushHistoryState = currentState => {
|
|
43
|
-
if (!currentState || typeof currentState !==
|
|
56
|
+
const createPushHistoryState = (currentState) => {
|
|
57
|
+
if (!currentState || typeof currentState !== "object" || Array.isArray(currentState)) {
|
|
44
58
|
return currentState;
|
|
45
59
|
}
|
|
46
|
-
const nextState = {
|
|
47
|
-
...currentState
|
|
48
|
-
};
|
|
60
|
+
const nextState = { ...currentState };
|
|
49
61
|
const currentIndex = nextState.idx;
|
|
50
62
|
const currentKey = nextState.key;
|
|
51
|
-
const isReactRouterState =
|
|
63
|
+
const isReactRouterState = "usr" in nextState && typeof currentIndex === "number" && typeof currentKey === "string";
|
|
52
64
|
if (isReactRouterState) {
|
|
53
65
|
nextState.idx = currentIndex + 1;
|
|
54
66
|
nextState.key = `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`;
|
|
55
67
|
}
|
|
56
68
|
return nextState;
|
|
57
69
|
};
|
|
58
|
-
const getRouterLocationState = currentState => {
|
|
59
|
-
if (!currentState || typeof currentState !==
|
|
70
|
+
const getRouterLocationState = (currentState) => {
|
|
71
|
+
if (!currentState || typeof currentState !== "object" || Array.isArray(currentState)) {
|
|
60
72
|
return currentState;
|
|
61
73
|
}
|
|
62
74
|
const state = currentState;
|
|
63
|
-
if (typeof state.idx !==
|
|
64
|
-
|
|
75
|
+
if (typeof state.idx !== "number")
|
|
76
|
+
return currentState;
|
|
77
|
+
return "usr" in state ? state.usr : null;
|
|
65
78
|
};
|
|
66
|
-
|
|
67
|
-
* 维护浏览器 location 与活动页签 URL 的双向同步。
|
|
68
|
-
* 未开启 config.urlSync 时不安装任何 History 监听或写入逻辑。
|
|
69
|
-
*/
|
|
70
|
-
export const useTabsUrlSync = ({
|
|
79
|
+
const useTabsUrlSync = ({
|
|
71
80
|
config,
|
|
72
81
|
dataSource,
|
|
73
82
|
state,
|
|
@@ -80,31 +89,31 @@ export const useTabsUrlSync = ({
|
|
|
80
89
|
}) => {
|
|
81
90
|
const navigationContext = useContext(OptionalNavigationContext);
|
|
82
91
|
const dataRouterContext = useContext(OptionalDataRouterContext);
|
|
83
|
-
const navigator = navigationContext
|
|
84
|
-
const enabled = config.urlSync === true || typeof config.urlSync ===
|
|
85
|
-
const historyMode = typeof config.urlSync ===
|
|
92
|
+
const navigator = navigationContext == null ? void 0 : navigationContext.navigator;
|
|
93
|
+
const enabled = config.urlSync === true || typeof config.urlSync === "object" && config.urlSync !== null;
|
|
94
|
+
const historyMode = typeof config.urlSync === "object" ? config.urlSync.history || "replace" : "replace";
|
|
86
95
|
const bootstrappedRef = useRef(false);
|
|
87
96
|
const writingUrlRef = useRef(false);
|
|
88
97
|
const preserveUrlInteractionRef = useRef(null);
|
|
89
98
|
const locationSequenceRef = useRef(0);
|
|
90
|
-
const handledLocationSequenceRef = useRef(
|
|
99
|
+
const handledLocationSequenceRef = useRef(void 0);
|
|
91
100
|
const committedActiveKeyRef = useRef(state.activeKey);
|
|
92
|
-
const committedTabIdsRef = useRef(new Set(state.tabsList.map(tab => tab.id)));
|
|
101
|
+
const committedTabIdsRef = useRef(new Set(state.tabsList.map((tab) => tab.id)));
|
|
93
102
|
const navigationAttemptRef = useRef(0);
|
|
94
103
|
const pendingDataNavigationRef = useRef(false);
|
|
95
104
|
const pendingDataNavigationUrlRef = useRef(null);
|
|
96
105
|
const ignoredHistoryUrlRef = useRef(null);
|
|
97
106
|
const [locationChange, setLocationChange] = useState(() => ({
|
|
98
|
-
url: typeof window ===
|
|
99
|
-
source:
|
|
107
|
+
url: typeof window === "undefined" ? "" : getCurrentTabUrl(),
|
|
108
|
+
source: "initial",
|
|
100
109
|
sequence: 0
|
|
101
110
|
}));
|
|
102
|
-
|
|
103
|
-
// History API 不会为 pushState/replaceState 触发 popstate,在挂载期间补齐通知。
|
|
104
111
|
useEffect(() => {
|
|
105
|
-
if (!enabled || typeof window ===
|
|
106
|
-
|
|
107
|
-
|
|
112
|
+
if (!enabled || typeof window === "undefined")
|
|
113
|
+
return void 0;
|
|
114
|
+
return subscribeHistoryLocation((source) => {
|
|
115
|
+
if (writingUrlRef.current)
|
|
116
|
+
return;
|
|
108
117
|
const currentUrl = getCurrentTabUrl();
|
|
109
118
|
if (ignoredHistoryUrlRef.current === currentUrl) {
|
|
110
119
|
ignoredHistoryUrlRef.current = null;
|
|
@@ -120,10 +129,13 @@ export const useTabsUrlSync = ({
|
|
|
120
129
|
pendingDataNavigationUrlRef.current = isPendingDataNavigationCommit ? currentUrl : null;
|
|
121
130
|
if (pendingDataNavigation && !isPendingDataNavigationCommit && dataRouterContext) {
|
|
122
131
|
ignoredHistoryUrlRef.current = currentUrl;
|
|
123
|
-
const cancellation = dataRouterContext.router.navigate(
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
132
|
+
const cancellation = dataRouterContext.router.navigate(
|
|
133
|
+
getDataRouterUrl(currentUrl, dataRouterContext.basename),
|
|
134
|
+
{
|
|
135
|
+
replace: true,
|
|
136
|
+
state: getRouterLocationState(window.history.state)
|
|
137
|
+
}
|
|
138
|
+
);
|
|
127
139
|
void cancellation.finally(() => {
|
|
128
140
|
if (ignoredHistoryUrlRef.current === currentUrl) {
|
|
129
141
|
ignoredHistoryUrlRef.current = null;
|
|
@@ -139,15 +151,16 @@ export const useTabsUrlSync = ({
|
|
|
139
151
|
});
|
|
140
152
|
});
|
|
141
153
|
}, [enabled, dataRouterContext]);
|
|
142
|
-
|
|
143
|
-
// URL -> Tabs:精确 URL 优先;同 pathname 视为当前页签内导航;
|
|
144
|
-
// 其次才按菜单 pathname 创建新页签。
|
|
145
154
|
useEffect(() => {
|
|
146
|
-
|
|
155
|
+
var _a, _b;
|
|
156
|
+
if (!enabled || !isInitialized || typeof window === "undefined")
|
|
157
|
+
return;
|
|
147
158
|
const currentUrl = normalizeTabUrl(locationChange.url);
|
|
148
|
-
if (!currentUrl)
|
|
149
|
-
|
|
150
|
-
|
|
159
|
+
if (!currentUrl)
|
|
160
|
+
return;
|
|
161
|
+
if (handledLocationSequenceRef.current === locationChange.sequence)
|
|
162
|
+
return;
|
|
163
|
+
const exactTab = state.tabsList.find((tab) => normalizeTabUrl(tab.url) === currentUrl);
|
|
151
164
|
if (exactTab) {
|
|
152
165
|
handledLocationSequenceRef.current = locationChange.sequence;
|
|
153
166
|
bootstrappedRef.current = true;
|
|
@@ -159,17 +172,19 @@ export const useTabsUrlSync = ({
|
|
|
159
172
|
}
|
|
160
173
|
const currentPathname = getTabUrlPathname(currentUrl);
|
|
161
174
|
const sourceMenus = getSourceMenus(dataSource);
|
|
162
|
-
const activeTab = state.tabsList.find(tab => tab.id === state.activeKey);
|
|
163
|
-
const activeCode = activeTab
|
|
164
|
-
const activeSourceMenu = activeCode ? sourceMenus.find(item => item.code === activeCode) :
|
|
165
|
-
const activeMenuItem = activeSourceMenu || activeTab
|
|
166
|
-
const activeBasePathname = activeMenuItem ? getTabUrlPathname(getMenuRoute(activeMenuItem)) : getTabUrlPathname(activeTab
|
|
167
|
-
const targetMenu = sourceMenus.map(item => ({
|
|
175
|
+
const activeTab = state.tabsList.find((tab) => tab.id === state.activeKey);
|
|
176
|
+
const activeCode = ((_a = activeTab == null ? void 0 : activeTab.menuItem) == null ? void 0 : _a.code) || (activeTab == null ? void 0 : activeTab.code);
|
|
177
|
+
const activeSourceMenu = activeCode ? sourceMenus.find((item) => item.code === activeCode) : void 0;
|
|
178
|
+
const activeMenuItem = activeSourceMenu || (activeTab == null ? void 0 : activeTab.menuItem);
|
|
179
|
+
const activeBasePathname = activeMenuItem ? getTabUrlPathname(getMenuRoute(activeMenuItem)) : getTabUrlPathname(activeTab == null ? void 0 : activeTab.url);
|
|
180
|
+
const targetMenu = (_b = sourceMenus.map((item) => ({
|
|
168
181
|
item,
|
|
169
182
|
pathname: getTabUrlPathname(getMenuRoute(item))
|
|
170
|
-
})).filter(
|
|
183
|
+
})).filter(
|
|
184
|
+
(entry) => !!entry.pathname && isSameOrNestedPath(entry.pathname, currentPathname)
|
|
185
|
+
).sort((left, right) => right.pathname.length - left.pathname.length)[0]) == null ? void 0 : _b.item;
|
|
171
186
|
const targetBelongsToActiveMenu = !targetMenu || !!activeCode && targetMenu.code === activeCode;
|
|
172
|
-
if (activeTab && locationChange.source !==
|
|
187
|
+
if (activeTab && locationChange.source !== "initial" && targetBelongsToActiveMenu && isSameOrNestedPath(activeBasePathname, currentPathname)) {
|
|
173
188
|
handledLocationSequenceRef.current = locationChange.sequence;
|
|
174
189
|
bootstrappedRef.current = true;
|
|
175
190
|
preserveUrlInteractionRef.current = null;
|
|
@@ -180,11 +195,7 @@ export const useTabsUrlSync = ({
|
|
|
180
195
|
handledLocationSequenceRef.current = locationChange.sequence;
|
|
181
196
|
bootstrappedRef.current = true;
|
|
182
197
|
preserveUrlInteractionRef.current = interactionSequence;
|
|
183
|
-
addTab({
|
|
184
|
-
...targetMenu,
|
|
185
|
-
url: currentUrl,
|
|
186
|
-
redirectUrl: undefined
|
|
187
|
-
});
|
|
198
|
+
addTab({ ...targetMenu, url: currentUrl, redirectUrl: void 0 });
|
|
188
199
|
return;
|
|
189
200
|
}
|
|
190
201
|
if (!bootstrappedRef.current) {
|
|
@@ -192,28 +203,37 @@ export const useTabsUrlSync = ({
|
|
|
192
203
|
preserveUrlInteractionRef.current = interactionSequence;
|
|
193
204
|
return;
|
|
194
205
|
}
|
|
195
|
-
if (activeTab && locationChange.source !==
|
|
206
|
+
if (activeTab && locationChange.source !== "initial") {
|
|
196
207
|
handledLocationSequenceRef.current = locationChange.sequence;
|
|
197
208
|
preserveUrlInteractionRef.current = null;
|
|
198
209
|
navigationAttemptRef.current += 1;
|
|
199
210
|
updateTabUrl(activeTab.id, currentUrl);
|
|
200
211
|
return;
|
|
201
212
|
}
|
|
202
|
-
if (locationChange.source !==
|
|
213
|
+
if (locationChange.source !== "initial") {
|
|
203
214
|
handledLocationSequenceRef.current = locationChange.sequence;
|
|
204
215
|
}
|
|
205
|
-
}, [
|
|
206
|
-
|
|
207
|
-
|
|
216
|
+
}, [
|
|
217
|
+
enabled,
|
|
218
|
+
isInitialized,
|
|
219
|
+
locationChange,
|
|
220
|
+
state.tabsList,
|
|
221
|
+
state.activeKey,
|
|
222
|
+
dataSource,
|
|
223
|
+
addTab,
|
|
224
|
+
switchTab,
|
|
225
|
+
updateTabUrl,
|
|
226
|
+
interactionSequence
|
|
227
|
+
]);
|
|
208
228
|
useEffect(() => {
|
|
209
|
-
if (!enabled || !isInitialized || !bootstrappedRef.current || typeof window ===
|
|
229
|
+
if (!enabled || !isInitialized || !bootstrappedRef.current || typeof window === "undefined") {
|
|
210
230
|
return;
|
|
211
231
|
}
|
|
212
|
-
const activeTab = state.tabsList.find(tab => tab.id === state.activeKey);
|
|
213
|
-
const targetUrl = normalizeTabUrl(activeTab
|
|
232
|
+
const activeTab = state.tabsList.find((tab) => tab.id === state.activeKey);
|
|
233
|
+
const targetUrl = normalizeTabUrl(activeTab == null ? void 0 : activeTab.url);
|
|
214
234
|
const commitActiveTab = () => {
|
|
215
235
|
committedActiveKeyRef.current = state.activeKey;
|
|
216
|
-
committedTabIdsRef.current = new Set(state.tabsList.map(tab => tab.id));
|
|
236
|
+
committedTabIdsRef.current = new Set(state.tabsList.map((tab) => tab.id));
|
|
217
237
|
};
|
|
218
238
|
if (preserveUrlInteractionRef.current !== null) {
|
|
219
239
|
if (preserveUrlInteractionRef.current === interactionSequence) {
|
|
@@ -233,10 +253,13 @@ export const useTabsUrlSync = ({
|
|
|
233
253
|
if (pendingNavigation && dataRouterContext) {
|
|
234
254
|
const cancellationUrl = getCurrentTabUrl();
|
|
235
255
|
ignoredHistoryUrlRef.current = cancellationUrl;
|
|
236
|
-
const cancellation = dataRouterContext.router.navigate(
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
256
|
+
const cancellation = dataRouterContext.router.navigate(
|
|
257
|
+
getDataRouterUrl(cancellationUrl, dataRouterContext.basename),
|
|
258
|
+
{
|
|
259
|
+
replace: true,
|
|
260
|
+
state: getRouterLocationState(window.history.state)
|
|
261
|
+
}
|
|
262
|
+
);
|
|
240
263
|
void cancellation.finally(() => {
|
|
241
264
|
if (ignoredHistoryUrlRef.current === cancellationUrl) {
|
|
242
265
|
ignoredHistoryUrlRef.current = null;
|
|
@@ -257,7 +280,8 @@ export const useTabsUrlSync = ({
|
|
|
257
280
|
const routerState = getRouterLocationState(window.history.state);
|
|
258
281
|
if (dataRouterContext) {
|
|
259
282
|
const settleNavigation = () => {
|
|
260
|
-
if (navigationAttemptRef.current !== navigationAttempt)
|
|
283
|
+
if (navigationAttemptRef.current !== navigationAttempt)
|
|
284
|
+
return;
|
|
261
285
|
const committedDataNavigationUrl = pendingDataNavigationUrlRef.current;
|
|
262
286
|
pendingDataNavigationRef.current = false;
|
|
263
287
|
pendingDataNavigationUrlRef.current = null;
|
|
@@ -271,25 +295,38 @@ export const useTabsUrlSync = ({
|
|
|
271
295
|
pendingDataNavigationRef.current = true;
|
|
272
296
|
pendingDataNavigationUrlRef.current = targetUrl;
|
|
273
297
|
void dataRouterContext.router.navigate(getDataRouterUrl(targetUrl, dataRouterContext.basename), {
|
|
274
|
-
replace: historyMode ===
|
|
298
|
+
replace: historyMode === "replace",
|
|
275
299
|
state: routerState
|
|
276
300
|
}).then(settleNavigation);
|
|
277
301
|
} else if (navigator) {
|
|
278
|
-
if (historyMode ===
|
|
302
|
+
if (historyMode === "push") {
|
|
279
303
|
navigator.push(targetUrl, routerState);
|
|
280
304
|
} else {
|
|
281
305
|
navigator.replace(targetUrl, routerState);
|
|
282
306
|
}
|
|
283
307
|
commitActiveTab();
|
|
284
|
-
} else if (historyMode ===
|
|
285
|
-
window.history.pushState(createPushHistoryState(window.history.state),
|
|
308
|
+
} else if (historyMode === "push") {
|
|
309
|
+
window.history.pushState(createPushHistoryState(window.history.state), "", targetUrl);
|
|
286
310
|
commitActiveTab();
|
|
287
311
|
} else {
|
|
288
|
-
window.history.replaceState(window.history.state,
|
|
312
|
+
window.history.replaceState(window.history.state, "", targetUrl);
|
|
289
313
|
commitActiveTab();
|
|
290
314
|
}
|
|
291
315
|
} finally {
|
|
292
316
|
writingUrlRef.current = false;
|
|
293
317
|
}
|
|
294
|
-
}, [
|
|
295
|
-
|
|
318
|
+
}, [
|
|
319
|
+
enabled,
|
|
320
|
+
historyMode,
|
|
321
|
+
isInitialized,
|
|
322
|
+
state.tabsList,
|
|
323
|
+
state.activeKey,
|
|
324
|
+
interactionSequence,
|
|
325
|
+
navigator,
|
|
326
|
+
dataRouterContext,
|
|
327
|
+
rollbackTabActivation
|
|
328
|
+
]);
|
|
329
|
+
};
|
|
330
|
+
export {
|
|
331
|
+
useTabsUrlSync
|
|
332
|
+
};
|