@zat-design/sisyphus-react 4.5.9 → 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.
Files changed (280) hide show
  1. package/dist/index.esm.css +1 -1
  2. package/dist/less.esm.css +1 -1
  3. package/es/FormsProvider/index.js +14 -21
  4. package/es/ProAction/components/CheckModalContent/index.js +12 -26
  5. package/es/ProAction/index.js +79 -83
  6. package/es/ProAction/propsType.js +0 -1
  7. package/es/ProConfigProvider/index.js +63 -110
  8. package/es/ProConfigProvider/propsType.js +0 -1
  9. package/es/ProDownload/index.d.ts +2 -1
  10. package/es/ProDownload/index.js +74 -69
  11. package/es/ProDownload/propsType.js +0 -1
  12. package/es/ProDownload/utils.d.ts +10 -5
  13. package/es/ProDownload/utils.js +63 -95
  14. package/es/ProDrawerForm/components/ProDrawer/index.js +83 -113
  15. package/es/ProDrawerForm/components/ProModal/index.js +77 -108
  16. package/es/ProDrawerForm/components/index.js +6 -2
  17. package/es/ProDrawerForm/hooks/useConfirmClose.js +20 -39
  18. package/es/ProDrawerForm/index.js +29 -38
  19. package/es/ProDrawerForm/propsType.js +0 -1
  20. package/es/ProDrawerForm/utils/index.js +18 -36
  21. package/es/ProEditLabel/components/RenderProForm.js +45 -49
  22. package/es/ProEditLabel/index.js +126 -163
  23. package/es/ProEditLabel/propsType.js +0 -1
  24. package/es/ProEditLabel/utils/index.js +5 -8
  25. package/es/ProEditTable/components/ActionButton/index.js +111 -119
  26. package/es/ProEditTable/components/RcTable/BaseTable.js +38 -51
  27. package/es/ProEditTable/components/RcTable/DraggableTable.js +97 -129
  28. package/es/ProEditTable/components/RcTable/index.js +6 -4
  29. package/es/ProEditTable/components/RenderField/ListChangedWrapper.js +77 -95
  30. package/es/ProEditTable/components/RenderField/index.js +490 -587
  31. package/es/ProEditTable/components/RenderField/propsType.js +0 -1
  32. package/es/ProEditTable/components/RenderField/tools.js +115 -112
  33. package/es/ProEditTable/components/RenderToolbar/index.js +47 -73
  34. package/es/ProEditTable/components/Summary/index.js +38 -64
  35. package/es/ProEditTable/components/Validator/index.js +46 -46
  36. package/es/ProEditTable/components/index.js +12 -5
  37. package/es/ProEditTable/index.js +456 -378
  38. package/es/ProEditTable/propsType.js +0 -1
  39. package/es/ProEditTable/utils/config.js +60 -122
  40. package/es/ProEditTable/utils/diffOriginal.js +45 -82
  41. package/es/ProEditTable/utils/getDefaultProps.js +19 -24
  42. package/es/ProEditTable/utils/index.js +154 -235
  43. package/es/ProEditTable/utils/tools.js +149 -286
  44. package/es/ProEditTable/utils/transform.js +25 -30
  45. package/es/ProEditTable/utils/useEditTableError.js +30 -43
  46. package/es/ProEditTable/utils/useShouldUpdateForTable.js +42 -72
  47. package/es/ProEditTable/utils/validateAll.js +87 -154
  48. package/es/ProEnum/components/Group.js +38 -30
  49. package/es/ProEnum/components/Tag.js +22 -26
  50. package/es/ProEnum/hooks/useEnum.js +48 -116
  51. package/es/ProEnum/hooks/useEnumRequest.js +182 -212
  52. package/es/ProEnum/hooks/useFrequentEnumRequest.js +40 -48
  53. package/es/ProEnum/index.js +162 -172
  54. package/es/ProEnum/propsType.js +0 -1
  55. package/es/ProEnum/utils/eventCenter.js +10 -12
  56. package/es/ProEnum/utils/frequentEnum.js +35 -92
  57. package/es/ProEnum/utils/getEnum.js +32 -90
  58. package/es/ProEnum/utils/getEnumLabel.js +44 -49
  59. package/es/ProEnum/utils/index.js +93 -207
  60. package/es/ProForm/components/Container.js +13 -28
  61. package/es/ProForm/components/FormFooter/index.js +36 -44
  62. package/es/ProForm/components/FormFooter/propsType.js +0 -1
  63. package/es/ProForm/components/base/Checkbox/index.js +32 -59
  64. package/es/ProForm/components/base/DatePicker/index.js +49 -71
  65. package/es/ProForm/components/base/Input/index.js +63 -97
  66. package/es/ProForm/components/base/Input/propsType.js +0 -1
  67. package/es/ProForm/components/base/InputNumber/index.js +118 -172
  68. package/es/ProForm/components/base/Radio/index.js +39 -52
  69. package/es/ProForm/components/base/RangePicker/index.js +109 -127
  70. package/es/ProForm/components/base/RangePicker/useDateRange.js +20 -17
  71. package/es/ProForm/components/base/Select/index.js +63 -89
  72. package/es/ProForm/components/base/Switch/index.js +27 -35
  73. package/es/ProForm/components/base/SwitchCheckbox/index.js +36 -54
  74. package/es/ProForm/components/base/TextArea/index.js +30 -41
  75. package/es/ProForm/components/base/TimePicker/index.js +27 -37
  76. package/es/ProForm/components/combination/Container/index.js +37 -47
  77. package/es/ProForm/components/combination/Container/propsType.js +0 -1
  78. package/es/ProForm/components/combination/FormList/components/ActionButton.js +165 -237
  79. package/es/ProForm/components/combination/FormList/components/BlockFields.js +98 -102
  80. package/es/ProForm/components/combination/FormList/components/Empty.js +28 -55
  81. package/es/ProForm/components/combination/FormList/components/LineFields.js +57 -54
  82. package/es/ProForm/components/combination/FormList/components/ToolbarButton.js +61 -109
  83. package/es/ProForm/components/combination/FormList/index.js +151 -161
  84. package/es/ProForm/components/combination/FormList/propsType.js +0 -1
  85. package/es/ProForm/components/combination/FormList/style/index.less +6 -0
  86. package/es/ProForm/components/combination/FormList/utils.js +22 -38
  87. package/es/ProForm/components/combination/Group/component/AddonWrapper/index.js +12 -28
  88. package/es/ProForm/components/combination/Group/component/ComRender.js +50 -111
  89. package/es/ProForm/components/combination/Group/component/FlexibleGroup.js +106 -213
  90. package/es/ProForm/components/combination/Group/hooks/index.js +69 -129
  91. package/es/ProForm/components/combination/Group/index.js +87 -126
  92. package/es/ProForm/components/combination/Group/propsType.js +0 -1
  93. package/es/ProForm/components/combination/Group/utils/index.js +124 -239
  94. package/es/ProForm/components/combination/ProCascader/index.js +156 -199
  95. package/es/ProForm/components/combination/ProCascader/propsType.js +0 -1
  96. package/es/ProForm/components/combination/ProCascader/utils/index.js +12 -21
  97. package/es/ProForm/components/combination/ProModalSelect/hooks/useRequestList.js +72 -70
  98. package/es/ProForm/components/combination/ProModalSelect/index.js +309 -347
  99. package/es/ProForm/components/combination/ProModalSelect/propsType.js +0 -1
  100. package/es/ProForm/components/combination/ProModalSelect/utils/index.js +32 -39
  101. package/es/ProForm/components/combination/ProNumberRange/index.js +100 -156
  102. package/es/ProForm/components/combination/ProNumberRange/propsType.js +0 -1
  103. package/es/ProForm/components/combination/ProRangeLimit/index.js +104 -115
  104. package/es/ProForm/components/combination/ProRangeLimit/propsType.js +0 -1
  105. package/es/ProForm/components/combination/ProTimeLimit/hooks/useControlled.js +16 -16
  106. package/es/ProForm/components/combination/ProTimeLimit/index.js +75 -109
  107. package/es/ProForm/components/index.js +56 -34
  108. package/es/ProForm/components/render/ChangedWrapper.js +85 -94
  109. package/es/ProForm/components/render/ConfirmWrapper.js +27 -39
  110. package/es/ProForm/components/render/CustomComponentViewWrapper.js +65 -82
  111. package/es/ProForm/components/render/Render.js +223 -329
  112. package/es/ProForm/components/render/RenderFields.js +76 -113
  113. package/es/ProForm/components/render/propsType.js +0 -1
  114. package/es/ProForm/hooks/useControlled.js +8 -10
  115. package/es/ProForm/hooks/useDeepCompareMemo.js +11 -11
  116. package/es/ProForm/hooks/useFieldProps.js +8 -4
  117. package/es/ProForm/hooks/useForm.js +50 -110
  118. package/es/ProForm/hooks/useRules.js +17 -33
  119. package/es/ProForm/hooks/useShouldUpdate.js +77 -152
  120. package/es/ProForm/hooks/useWatch.js +62 -134
  121. package/es/ProForm/index.js +157 -194
  122. package/es/ProForm/propsType.js +15 -7
  123. package/es/ProForm/utils/buildFormItemProps.js +51 -58
  124. package/es/ProForm/utils/diffOriginal.js +43 -73
  125. package/es/ProForm/utils/getDefaultProps.js +18 -24
  126. package/es/ProForm/utils/index.js +160 -235
  127. package/es/ProForm/utils/processDependencies.js +21 -60
  128. package/es/ProForm/utils/reactiveValues.js +20 -34
  129. package/es/ProForm/utils/rulesCreator.js +42 -40
  130. package/es/ProForm/utils/transformNames.js +10 -13
  131. package/es/ProForm/utils/transformValue.js +16 -29
  132. package/es/ProForm/utils/valueType.js +96 -178
  133. package/es/ProIcon/config/index.js +340 -274
  134. package/es/ProIcon/index.js +135 -209
  135. package/es/ProIcon/propsTypes.js +0 -1
  136. package/es/ProIcon/utils/index.js +24 -39
  137. package/es/ProLayout/components/Layout/Header/index.js +108 -141
  138. package/es/ProLayout/components/Layout/Menu/FoldMenu/index.js +134 -190
  139. package/es/ProLayout/components/Layout/Menu/OpenMenu/index.js +113 -139
  140. package/es/ProLayout/components/Layout/Menu/OpenMenu/propsType.js +0 -1
  141. package/es/ProLayout/components/Layout/Menu/SideMenu/index.js +23 -31
  142. package/es/ProLayout/components/Layout/Menu/index.js +92 -89
  143. package/es/ProLayout/components/Layout/Notice/index.js +13 -27
  144. package/es/ProLayout/components/Layout/index.js +8 -3
  145. package/es/ProLayout/components/ProCollapse/PropTypes.js +0 -1
  146. package/es/ProLayout/components/ProCollapse/index.js +89 -111
  147. package/es/ProLayout/components/ProFooter/PropTypes.js +0 -1
  148. package/es/ProLayout/components/ProFooter/index.js +27 -24
  149. package/es/ProLayout/components/ProHeader/PropTypes.js +0 -1
  150. package/es/ProLayout/components/ProHeader/components/Copy/index.js +23 -21
  151. package/es/ProLayout/components/ProHeader/components/Describe/index.js +67 -84
  152. package/es/ProLayout/components/ProHeader/components/ProBackBtn/index.js +18 -21
  153. package/es/ProLayout/components/ProHeader/components/ProBackBtn/propsType.js +0 -1
  154. package/es/ProLayout/components/ProHeader/components/index.js +6 -2
  155. package/es/ProLayout/components/ProHeader/index.js +216 -356
  156. package/es/ProLayout/components/ProHeader/utils/index.js +19 -26
  157. package/es/ProLayout/components/TabsManager/components/TabContextMenu.js +92 -85
  158. package/es/ProLayout/components/TabsManager/components/TabItem.js +53 -63
  159. package/es/ProLayout/components/TabsManager/components/TabsContext.js +5 -5
  160. package/es/ProLayout/components/TabsManager/components/TabsHeader.js +42 -52
  161. package/es/ProLayout/components/TabsManager/hooks/useActiveTab.js +8 -9
  162. package/es/ProLayout/components/TabsManager/hooks/useIframeRoute.js +19 -32
  163. package/es/ProLayout/components/TabsManager/hooks/useProLayoutTabs.js +6 -20
  164. package/es/ProLayout/components/TabsManager/hooks/useTabsCache.js +25 -42
  165. package/es/ProLayout/components/TabsManager/hooks/useTabsState.js +320 -350
  166. package/es/ProLayout/components/TabsManager/hooks/useTabsUrlSync.d.ts +19 -0
  167. package/es/ProLayout/components/TabsManager/hooks/useTabsUrlSync.js +332 -0
  168. package/es/ProLayout/components/TabsManager/index.js +407 -351
  169. package/es/ProLayout/components/TabsManager/propTypes.d.ts +4 -0
  170. package/es/ProLayout/components/TabsManager/propTypes.js +7 -15
  171. package/es/ProLayout/components/TabsManager/style/index.less +1 -1
  172. package/es/ProLayout/components/TabsManager/utils/historyObserver.d.ts +7 -0
  173. package/es/ProLayout/components/TabsManager/utils/historyObserver.js +65 -0
  174. package/es/ProLayout/components/TabsManager/utils/index.d.ts +15 -2
  175. package/es/ProLayout/components/TabsManager/utils/index.js +156 -159
  176. package/es/ProLayout/components/index.js +8 -3
  177. package/es/ProLayout/index.js +173 -228
  178. package/es/ProLayout/propTypes.d.ts +28 -1
  179. package/es/ProLayout/propTypes.js +12 -52
  180. package/es/ProLayout/utils/index.js +48 -128
  181. package/es/ProSelect/components/AdaptiveTooltip.js +26 -25
  182. package/es/ProSelect/index.js +187 -223
  183. package/es/ProSelect/propsType.js +0 -1
  184. package/es/ProSelect/style/index.less +13 -0
  185. package/es/ProSelect/utils/index.js +100 -146
  186. package/es/ProStep/components/Anchor/index.js +71 -82
  187. package/es/ProStep/components/Item/index.js +49 -56
  188. package/es/ProStep/components/LazyLoad/index.js +23 -29
  189. package/es/ProStep/components/Listener/index.js +20 -33
  190. package/es/ProStep/components/Step/index.js +31 -38
  191. package/es/ProStep/constants.js +4 -1
  192. package/es/ProStep/index.js +166 -153
  193. package/es/ProStep/propsType.js +0 -1
  194. package/es/ProStep/style/index.less +1 -1
  195. package/es/ProStep/utils/index.js +29 -55
  196. package/es/ProStepTab/index.js +83 -138
  197. package/es/ProStepTab/propsType.js +0 -1
  198. package/es/ProTable/components/EditableCell/EditIcon.js +10 -14
  199. package/es/ProTable/components/EditableCell/index.js +37 -71
  200. package/es/ProTable/components/EditableCell/propsType.js +0 -1
  201. package/es/ProTable/components/FormatColumn/index.js +209 -340
  202. package/es/ProTable/components/FormatColumn/propsType.js +0 -1
  203. package/es/ProTable/components/RcTable/components/BaseTable/index.js +35 -39
  204. package/es/ProTable/components/RcTable/components/DraggableTable/components/DndWrapper/index.js +80 -107
  205. package/es/ProTable/components/RcTable/components/DraggableTable/components/DndWrapper/utils/index.js +54 -48
  206. package/es/ProTable/components/RcTable/components/DraggableTable/components/DndWrapper/utils/propsType.js +0 -1
  207. package/es/ProTable/components/RcTable/components/DraggableTable/index.js +47 -54
  208. package/es/ProTable/components/RcTable/index.js +6 -4
  209. package/es/ProTable/components/RenderColumn/index.js +158 -186
  210. package/es/ProTable/components/RenderEmptyText/index.js +12 -21
  211. package/es/ProTable/components/RenderFooter/index.js +15 -15
  212. package/es/ProTable/components/RenderSummary/index.js +33 -50
  213. package/es/ProTable/components/RenderTableHeader/index.js +44 -46
  214. package/es/ProTable/components/RenderTabs/index.js +47 -51
  215. package/es/ProTable/components/TableResizable/index.js +56 -72
  216. package/es/ProTable/components/TooltipTitle/index.js +13 -21
  217. package/es/ProTable/components/index.js +16 -36
  218. package/es/ProTable/hooks/useAntdTable.js +191 -224
  219. package/es/ProTable/index.js +232 -249
  220. package/es/ProTable/propsType.js +0 -1
  221. package/es/ProTable/utils/columnStorage.js +63 -88
  222. package/es/ProTable/utils/index.js +57 -90
  223. package/es/ProTabs/components/Card/index.js +20 -48
  224. package/es/ProTabs/components/index.js +4 -1
  225. package/es/ProTabs/index.js +41 -58
  226. package/es/ProTabs/propType.js +0 -1
  227. package/es/ProThemeTools/component/ProTools/index.js +106 -158
  228. package/es/ProThemeTools/component/index.js +4 -1
  229. package/es/ProThemeTools/context/ThemeContext.js +67 -146
  230. package/es/ProThemeTools/index.js +103 -156
  231. package/es/ProThemeTools/propsType.js +0 -1
  232. package/es/ProThemeTools/utils/index.js +60 -109
  233. package/es/ProTooltip/index.js +132 -168
  234. package/es/ProTooltip/propsType.js +0 -1
  235. package/es/ProTree/components/AdaptiveTooltip.js +15 -17
  236. package/es/ProTree/components/CloseIcon.js +18 -26
  237. package/es/ProTree/components/List.js +28 -47
  238. package/es/ProTree/components/ProTree.js +152 -211
  239. package/es/ProTree/components/ProTreeSelect/index.js +255 -459
  240. package/es/ProTree/components/ProTreeSelect/propsType.js +0 -1
  241. package/es/ProTree/components/SearchTitle.js +23 -42
  242. package/es/ProTree/components/Tree.js +147 -195
  243. package/es/ProTree/components/index.js +10 -5
  244. package/es/ProTree/index.js +12 -16
  245. package/es/ProTree/propsType.js +0 -1
  246. package/es/ProTree/utils.js +46 -118
  247. package/es/ProTreeModal/components/Cascader.js +56 -64
  248. package/es/ProTreeModal/components/CloseIcon.js +18 -26
  249. package/es/ProTreeModal/components/List.js +114 -180
  250. package/es/ProTreeModal/components/SearchTitle.js +15 -18
  251. package/es/ProTreeModal/components/SortableItem.js +29 -58
  252. package/es/ProTreeModal/components/Tree.js +99 -113
  253. package/es/ProTreeModal/components/Trigger.js +87 -121
  254. package/es/ProTreeModal/components/index.js +14 -6
  255. package/es/ProTreeModal/index.js +397 -438
  256. package/es/ProTreeModal/propsType.js +0 -1
  257. package/es/ProTreeModal/utils.js +52 -95
  258. package/es/ProUpload/components/ButtonRender.js +44 -54
  259. package/es/ProUpload/components/DragRender.js +94 -148
  260. package/es/ProUpload/components/DraggableUploadListItem.js +12 -25
  261. package/es/ProUpload/components/Example.js +27 -31
  262. package/es/ProUpload/components/FileItem.js +69 -163
  263. package/es/ProUpload/components/ImageRender.js +134 -170
  264. package/es/ProUpload/index.js +68 -100
  265. package/es/ProUpload/propsType.js +0 -1
  266. package/es/ProUpload/uitls.js +8 -4
  267. package/es/ProUtils/utils/index.js +17 -13
  268. package/es/ProViewer/index.js +154 -175
  269. package/es/ProViewer/propsType.js +0 -5
  270. package/es/ProWaterMark/index.js +9 -16
  271. package/es/ProWaterMark/propsType.js +0 -1
  272. package/es/hooks/useDraggableRow.js +25 -53
  273. package/es/index.js +57 -77
  274. package/es/locale/en_US.js +153 -142
  275. package/es/locale/index.js +23 -36
  276. package/es/locale/zh_CN.js +145 -142
  277. package/es/tokens.js +84 -83
  278. package/es/utils/index.js +24 -51
  279. package/package.json +4 -2
  280. package/es/ProConfigProvider/demo/locale.js +0 -58
@@ -71,8 +71,12 @@ export interface UseTabsStateReturn {
71
71
  removeTab: (tabId: string) => void;
72
72
  /** 更新指定 id 的标签页字段(替换语义;找不到时 no-op) */
73
73
  updateTab: (tabId: string, updates: UpdateTabParams) => void;
74
+ /** 更新页签当前 URL,保持 tab.id 不变 */
75
+ updateTabUrl: (tabId: string, url: string) => void;
74
76
  /** 切换标签页 */
75
77
  switchTab: (tabId: string) => void;
78
+ /** URL 导航未提交时回滚本次激活 */
79
+ rollbackTabActivation: (previousTabId: string, attemptedTabId: string, removeAttemptedTab: boolean) => void;
76
80
  /** 关闭其他标签页 */
77
81
  closeOtherTabs: (currentTabId: string) => void;
78
82
  /** 关闭右侧标签页 */
@@ -1,15 +1,7 @@
1
- // TabsManager组件Props
2
-
3
- // 右键菜单组件Props
4
-
5
- // 状态管理Hook选项
6
-
7
- // 状态管理Hook返回值
8
-
9
- // 缓存管理器接口
10
-
11
- // 默认配置
12
- export const DEFAULT_TABS_CONFIG = {
13
- storage: 'localStorage',
14
- cacheKey: 'pro-layout-tabs'
15
- };
1
+ const DEFAULT_TABS_CONFIG = {
2
+ storage: "localStorage",
3
+ cacheKey: "pro-layout-tabs"
4
+ };
5
+ export {
6
+ DEFAULT_TABS_CONFIG
7
+ };
@@ -171,7 +171,7 @@
171
171
  padding: 4px 0 5px !important;
172
172
  margin-right: 8px !important;
173
173
  margin-left: 0;
174
- background: #F5F5F5;
174
+ background: #f5f5f5;
175
175
  transition: none;
176
176
  border-color: #e7e8ee;
177
177
  &.@{ant-prefix}-tabs-tab-active {
@@ -0,0 +1,7 @@
1
+ export type HistoryLocationChangeSource = 'push' | 'replace' | 'pop' | 'hash';
2
+ type HistoryLocationListener = (source: HistoryLocationChangeSource) => void;
3
+ /**
4
+ * 共享对原生 History 的唯一包装,避免多个 ProLayout 实例互相覆盖和泄漏。
5
+ */
6
+ export declare const subscribeHistoryLocation: (listener: HistoryLocationListener) => (() => void);
7
+ export {};
@@ -0,0 +1,65 @@
1
+ const listeners = /* @__PURE__ */ new Set();
2
+ let originalPushState;
3
+ let originalReplaceState;
4
+ let wrappedPushState;
5
+ let wrappedReplaceState;
6
+ let installationSequence = 0;
7
+ let activeInstallation = 0;
8
+ const notify = (source) => {
9
+ listeners.forEach((listener) => listener(source));
10
+ };
11
+ const handlePopState = () => notify("pop");
12
+ const handleHashChange = () => notify("hash");
13
+ const install = () => {
14
+ const browserHistory = window.history;
15
+ const installation = installationSequence + 1;
16
+ installationSequence = installation;
17
+ activeInstallation = installation;
18
+ originalPushState = browserHistory.pushState;
19
+ originalReplaceState = browserHistory.replaceState;
20
+ const installedPushState = originalPushState;
21
+ const installedReplaceState = originalReplaceState;
22
+ wrappedPushState = function pushState(...args) {
23
+ installedPushState.apply(browserHistory, args);
24
+ if (activeInstallation === installation)
25
+ notify("push");
26
+ };
27
+ wrappedReplaceState = function replaceState(...args) {
28
+ installedReplaceState.apply(browserHistory, args);
29
+ if (activeInstallation === installation)
30
+ notify("replace");
31
+ };
32
+ browserHistory.pushState = wrappedPushState;
33
+ browserHistory.replaceState = wrappedReplaceState;
34
+ window.addEventListener("popstate", handlePopState);
35
+ window.addEventListener("hashchange", handleHashChange);
36
+ };
37
+ const uninstall = () => {
38
+ const browserHistory = window.history;
39
+ activeInstallation = 0;
40
+ if (wrappedPushState && originalPushState && browserHistory.pushState === wrappedPushState) {
41
+ browserHistory.pushState = originalPushState;
42
+ }
43
+ if (wrappedReplaceState && originalReplaceState && browserHistory.replaceState === wrappedReplaceState) {
44
+ browserHistory.replaceState = originalReplaceState;
45
+ }
46
+ window.removeEventListener("popstate", handlePopState);
47
+ window.removeEventListener("hashchange", handleHashChange);
48
+ originalPushState = void 0;
49
+ originalReplaceState = void 0;
50
+ wrappedPushState = void 0;
51
+ wrappedReplaceState = void 0;
52
+ };
53
+ const subscribeHistoryLocation = (listener) => {
54
+ if (listeners.size === 0)
55
+ install();
56
+ listeners.add(listener);
57
+ return () => {
58
+ listeners.delete(listener);
59
+ if (listeners.size === 0)
60
+ uninstall();
61
+ };
62
+ };
63
+ export {
64
+ subscribeHistoryLocation
65
+ };
@@ -5,7 +5,20 @@ import { AddTabParams, TabItem, MenusType } from '../../../propTypes';
5
5
  */
6
6
  export declare const getMenuRoute: (menuItem: MenusType) => string;
7
7
  export declare const hasRelationKey: (relationKey: MenusType['relationKey']) => relationKey is string | number;
8
- export declare const findExistingTab: (tabsList: TabItem[], menuItem: MenusType) => TabItem | undefined;
8
+ /**
9
+ * 将同源 URL 规范化为应用内地址,保留 search 和 hash。
10
+ * 返回 undefined 表示 URL 无效或跨域。
11
+ */
12
+ export declare const normalizeTabUrl: (value?: string) => string | undefined;
13
+ /** 仅允许将跨域 HTTP(S) URL 交给浏览器外部打开。 */
14
+ export declare const isSafeExternalUrl: (value?: string) => boolean;
15
+ export declare const isSafeHttpUrl: (value?: string) => boolean;
16
+ export declare const getCurrentTabUrl: () => string;
17
+ export declare const getTabUrlPathname: (value?: string) => string | undefined;
18
+ export interface FindExistingTabOptions {
19
+ urlSync?: boolean;
20
+ }
21
+ export declare const findExistingTab: (tabsList: TabItem[], menuItem: MenusType, options?: FindExistingTabOptions) => TabItem | undefined;
9
22
  /**
10
23
  * 根据菜单项生成TabItem
11
24
  */
@@ -21,7 +34,7 @@ export declare const shouldOpenExternal: (menuItem: MenusType, target?: string)
21
34
  /**
22
35
  * 处理外部跳转
23
36
  */
24
- export declare const handleExternalOpen: (menuItem: MenusType) => void;
37
+ export declare const handleExternalOpen: (menuItem: MenusType, secure?: boolean) => void;
25
38
  /**
26
39
  * 检查是否超出最大标签页限制
27
40
  * @param currentTabs 当前标签页列表
@@ -1,25 +1,66 @@
1
- /**
2
- * 获取菜单实际用于路由/签页的路径
3
- * 约定优先使用 redirectUrl,其次回退 url
4
- */
5
- export const getMenuRoute = menuItem => {
6
- return menuItem.redirectUrl || menuItem.url || '';
7
- };
8
- export const hasRelationKey = relationKey => relationKey !== undefined && relationKey !== null && relationKey !== '';
9
- export const findExistingTab = (tabsList, menuItem) => {
1
+ const getMenuRoute = (menuItem) => {
2
+ return menuItem.redirectUrl || menuItem.url || "";
3
+ };
4
+ const hasRelationKey = (relationKey) => relationKey !== void 0 && relationKey !== null && relationKey !== "";
5
+ const resolveHttpUrl = (value) => {
6
+ if (!value || typeof window === "undefined")
7
+ return void 0;
8
+ try {
9
+ const resolved = new URL(value, window.location.origin);
10
+ return resolved.protocol === "http:" || resolved.protocol === "https:" ? resolved : void 0;
11
+ } catch (_error) {
12
+ return void 0;
13
+ }
14
+ };
15
+ const normalizeTabUrl = (value) => {
16
+ if (!value)
17
+ return void 0;
18
+ if (typeof window === "undefined") {
19
+ return value.startsWith("/") && !value.startsWith("//") ? value : void 0;
20
+ }
21
+ const resolved = resolveHttpUrl(value);
22
+ if (!resolved || resolved.origin !== window.location.origin)
23
+ return void 0;
24
+ return `${resolved.pathname}${resolved.search}${resolved.hash}`;
25
+ };
26
+ const isSafeExternalUrl = (value) => {
27
+ const resolved = resolveHttpUrl(value);
28
+ return !!resolved && resolved.origin !== window.location.origin;
29
+ };
30
+ const isSafeHttpUrl = (value) => !!resolveHttpUrl(value);
31
+ const getCurrentTabUrl = () => `${window.location.pathname}${window.location.search}${window.location.hash}`;
32
+ const getTabUrlPathname = (value) => {
33
+ const normalized = normalizeTabUrl(value);
34
+ if (!normalized || typeof window === "undefined")
35
+ return void 0;
36
+ return new URL(normalized, window.location.origin).pathname;
37
+ };
38
+ const findExistingTab = (tabsList, menuItem, options = {}) => {
39
+ if (options.urlSync) {
40
+ const targetUrl = normalizeTabUrl(getMenuRoute(menuItem));
41
+ if (!targetUrl)
42
+ return void 0;
43
+ return tabsList.find((tab) => normalizeTabUrl(tab.url) === targetUrl);
44
+ }
10
45
  if (hasRelationKey(menuItem.relationKey)) {
11
- return tabsList.find(tab => tab.relationKey === menuItem.relationKey || tab.menuItem?.relationKey === menuItem.relationKey);
46
+ return tabsList.find(
47
+ (tab) => {
48
+ var _a;
49
+ return tab.relationKey === menuItem.relationKey || ((_a = tab.menuItem) == null ? void 0 : _a.relationKey) === menuItem.relationKey;
50
+ }
51
+ );
12
52
  }
13
53
  const menuRoute = getMenuRoute(menuItem);
14
- return tabsList.find(tab => tab.menuItem?.code === menuItem.code || tab.url === menuRoute);
54
+ const hasCode = menuItem.code !== void 0 && menuItem.code !== null && menuItem.code !== "";
55
+ return tabsList.find(
56
+ (tab) => {
57
+ var _a;
58
+ return hasCode && ((_a = tab.menuItem) == null ? void 0 : _a.code) === menuItem.code || tab.url === menuRoute;
59
+ }
60
+ );
15
61
  };
16
-
17
- /**
18
- * 根据菜单项生成TabItem
19
- */
20
- export const createTabFromMenu = (menuItem, index = 0) => {
62
+ const createTabFromMenu = (menuItem, index = 0) => {
21
63
  const route = getMenuRoute(menuItem);
22
- // pinned 优先取菜单显式声明,否则由 closable===false 推导(声明式固定标签)
23
64
  const pinned = menuItem.pinned ?? menuItem.closable === false;
24
65
  const result = {
25
66
  id: String(menuItem.id || menuItem.code || menuItem.url || index),
@@ -31,74 +72,51 @@ export const createTabFromMenu = (menuItem, index = 0) => {
31
72
  pinned,
32
73
  menuItem,
33
74
  icon: menuItem.icon || menuItem.imgUrl,
34
- relationKey: menuItem.relationKey
75
+ relationKey: menuItem.relationKey,
76
+ menuCodeSource: menuItem.menuCodeSource
35
77
  };
36
78
  return result;
37
79
  };
38
-
39
- /**
40
- * 生成唯一的tab ID
41
- */
42
- export const generateTabId = (menuItem, existingIds) => {
80
+ const generateTabId = (menuItem, existingIds) => {
43
81
  const baseId = String(menuItem.id || menuItem.code || menuItem.url);
44
82
  let finalId = baseId;
45
83
  let counter = 1;
46
-
47
- // 如果ID已存在,则添加数字后缀
48
84
  while (existingIds.includes(finalId)) {
49
85
  finalId = `${baseId}_${counter}`;
50
86
  counter += 1;
51
87
  }
52
88
  return finalId;
53
89
  };
54
-
55
- /**
56
- * 检查菜单项是否应该外部跳转
57
- */
58
- export const shouldOpenExternal = (menuItem, target) => {
59
- const menuTarget = menuItem?.target || target;
60
- return menuTarget === '_blank' || menuItem.type === 'EXTERNAL';
61
- };
62
-
63
- /**
64
- * 处理外部跳转
65
- */
66
- export const handleExternalOpen = menuItem => {
90
+ const shouldOpenExternal = (menuItem, target) => {
91
+ const menuTarget = (menuItem == null ? void 0 : menuItem.target) || target;
92
+ return menuTarget === "_blank" || menuItem.type === "EXTERNAL";
93
+ };
94
+ const handleExternalOpen = (menuItem, secure = false) => {
67
95
  const url = getMenuRoute(menuItem);
68
- if (url) {
69
- window.open(url, menuItem.target || '_blank');
96
+ if (!url)
97
+ return;
98
+ const target = menuItem.target || "_blank";
99
+ if (secure && target === "_blank") {
100
+ window.open(url, target, "noopener,noreferrer");
101
+ return;
70
102
  }
103
+ window.open(url, target);
71
104
  };
72
-
73
- /**
74
- * 检查是否超出最大标签页限制
75
- * @param currentTabs 当前标签页列表
76
- * @param maxTabs 最大标签页数量,如果为 undefined 或 null,表示无限制
77
- * @returns 如果超出限制返回 true,否则返回 false
78
- */
79
- export const checkTabLimit = (currentTabs, maxTabs) => {
80
- // 如果 maxTabs 为 undefined 或 null,表示无限制
81
- if (maxTabs === undefined || maxTabs === null) {
105
+ const checkTabLimit = (currentTabs, maxTabs) => {
106
+ if (maxTabs === void 0 || maxTabs === null) {
82
107
  return false;
83
108
  }
84
109
  return currentTabs.length >= maxTabs;
85
110
  };
86
-
87
- /**
88
- * 获取右侧标签页
89
- */
90
- export const getRightTabs = (tabs, currentTabId) => {
91
- const currentIndex = tabs.findIndex(tab => tab.id === currentTabId);
92
- if (currentIndex === -1) return [];
111
+ const getRightTabs = (tabs, currentTabId) => {
112
+ const currentIndex = tabs.findIndex((tab) => tab.id === currentTabId);
113
+ if (currentIndex === -1)
114
+ return [];
93
115
  return tabs.slice(currentIndex + 1);
94
116
  };
95
-
96
- /**
97
- * 扁平化菜单数据
98
- */
99
- export const flattenMenuData = (menus = []) => {
117
+ const flattenMenuData = (menus = []) => {
100
118
  let flatMenus = [];
101
- menus.forEach(item => {
119
+ menus.forEach((item) => {
102
120
  flatMenus.push(item);
103
121
  if (item.children) {
104
122
  flatMenus = [...flatMenus, ...flattenMenuData(item.children)];
@@ -106,141 +124,120 @@ export const flattenMenuData = (menus = []) => {
106
124
  });
107
125
  return flatMenus;
108
126
  };
109
-
110
- /**
111
- * 将公开 addTab 参数解析为内部菜单项,统一 initialTabs 与实例 API 的匹配规则。
112
- */
113
- export const resolveTabMenuItem = (params, menus = []) => {
114
- const matchedMenu = flattenMenuData(menus).find(item => item.code === params.code);
127
+ const resolveTabMenuItem = (params, menus = []) => {
128
+ var _a, _b;
129
+ const matchedMenu = flattenMenuData(menus).find((item) => item.code === params.code);
130
+ const menuCodeSource = ((_a = params.menuCodeSource) == null ? void 0 : _a.trim()) || ((_b = matchedMenu == null ? void 0 : matchedMenu.menuCodeSource) == null ? void 0 : _b.trim()) || void 0;
115
131
  if (matchedMenu) {
116
132
  return {
117
133
  ...matchedMenu,
118
134
  name: params.name || matchedMenu.name,
135
+ ...params.url !== void 0 && { url: params.url, redirectUrl: void 0 },
119
136
  extra: params.extra ?? matchedMenu.extra,
120
- relationKey: params.relationKey ?? matchedMenu.relationKey
137
+ relationKey: params.relationKey ?? matchedMenu.relationKey,
138
+ menuCodeSource
121
139
  };
122
140
  }
123
141
  return {
124
142
  id: Date.now(),
125
143
  code: params.code,
126
144
  name: params.name,
127
- url: `/${params.code}`,
145
+ url: params.url || `/${params.code}`,
128
146
  extra: params.extra,
129
- relationKey: params.relationKey
147
+ relationKey: params.relationKey,
148
+ menuCodeSource
130
149
  };
131
150
  };
132
-
133
- /**
134
- * 判断菜单项是否为最后一级(叶子节点)
135
- * 只有当菜单项没有子菜单或子菜单为空时,才认为是叶子节点
136
- */
137
- export const isLeafMenuItem = menuItem => {
138
- const {
139
- children
140
- } = menuItem || {};
141
- // 如果 children 不存在、为 null、为 undefined,或者为空数组,则认为是叶子节点
151
+ const isLeafMenuItem = (menuItem) => {
152
+ const { children } = menuItem || {};
142
153
  return !children || Array.isArray(children) && children.length === 0;
143
154
  };
144
-
145
- /**
146
- * 判断菜单项是否可以在 Tabs 模式下打开
147
- * 规则:只有叶子节点(无 children)才可打开
148
- */
149
- export const canOpenAsTab = menuItem => {
150
- if (!menuItem) return false;
151
- if (!(menuItem.url || menuItem.redirectUrl)) return false;
155
+ const canOpenAsTab = (menuItem) => {
156
+ if (!menuItem)
157
+ return false;
158
+ if (!(menuItem.url || menuItem.redirectUrl))
159
+ return false;
152
160
  return isLeafMenuItem(menuItem);
153
161
  };
154
-
155
- /**
156
- * 推导标签页是否处于固定状态。
157
- * pinned 为本质状态;未显式设置 pinned 的旧缓存标签,用 closable===false 推导。
158
- */
159
- export const derivePinned = tab => tab.pinned ?? tab.closable === false;
160
-
161
- /**
162
- * 分区边界:第一个「非固定标签」的下标,等于固定标签的数量。
163
- * 约定固定区始终排在普通区左侧,故边界即两区分界点。
164
- */
165
- export const getPinnedBoundary = tabs => {
166
- const index = tabs.findIndex(tab => !derivePinned(tab));
162
+ const derivePinned = (tab) => tab.pinned ?? tab.closable === false;
163
+ const getPinnedBoundary = (tabs) => {
164
+ const index = tabs.findIndex((tab) => !derivePinned(tab));
167
165
  return index === -1 ? tabs.length : index;
168
166
  };
169
-
170
- /**
171
- * 不依赖外部库的数组移动(immutable)。
172
- * from/to 越界时返回原数组的浅拷贝。
173
- */
174
167
  const moveItem = (list, from, to) => {
175
168
  const result = [...list];
176
- if (from < 0 || from >= result.length || to < 0 || to >= result.length) return result;
169
+ if (from < 0 || from >= result.length || to < 0 || to >= result.length)
170
+ return result;
177
171
  const [removed] = result.splice(from, 1);
178
172
  result.splice(to, 0, removed);
179
173
  return result;
180
174
  };
181
-
182
- /**
183
- * 固定标签:将目标标签设为 pinned=true / closable=false,并移动到固定区末尾。
184
- * - 已固定则幂等(顺序不变)
185
- * - tabId 不存在时返回原数组引用
186
- */
187
- export const pinTab = (tabs, tabId) => {
188
- const index = tabs.findIndex(tab => tab.id === tabId);
189
- if (index === -1) return tabs;
190
- if (derivePinned(tabs[index])) return tabs;
191
- const pinnedTab = {
192
- ...tabs[index],
193
- pinned: true,
194
- closable: false
195
- };
196
- // 移除目标后计算固定区末尾位置(= 剩余标签中的固定数量)
175
+ const pinTab = (tabs, tabId) => {
176
+ const index = tabs.findIndex((tab) => tab.id === tabId);
177
+ if (index === -1)
178
+ return tabs;
179
+ if (derivePinned(tabs[index]))
180
+ return tabs;
181
+ const pinnedTab = { ...tabs[index], pinned: true, closable: false };
197
182
  const rest = tabs.filter((_, i) => i !== index);
198
183
  const insertAt = getPinnedBoundary(rest);
199
184
  return [...rest.slice(0, insertAt), pinnedTab, ...rest.slice(insertAt)];
200
185
  };
201
-
202
- /**
203
- * 取消固定:将目标标签设为 pinned=false / closable=true,并移动到普通区最前
204
- * (即剩余固定区之后的第一位)。
205
- * - 已是普通标签则幂等(顺序不变)
206
- * - tabId 不存在时返回原数组引用
207
- */
208
- export const unpinTab = (tabs, tabId) => {
209
- const index = tabs.findIndex(tab => tab.id === tabId);
210
- if (index === -1) return tabs;
211
- if (!derivePinned(tabs[index])) return tabs;
212
- const normalTab = {
213
- ...tabs[index],
214
- pinned: false,
215
- closable: true
216
- };
186
+ const unpinTab = (tabs, tabId) => {
187
+ const index = tabs.findIndex((tab) => tab.id === tabId);
188
+ if (index === -1)
189
+ return tabs;
190
+ if (!derivePinned(tabs[index]))
191
+ return tabs;
192
+ const normalTab = { ...tabs[index], pinned: false, closable: true };
217
193
  const rest = tabs.filter((_, i) => i !== index);
218
194
  const insertAt = getPinnedBoundary(rest);
219
195
  return [...rest.slice(0, insertAt), normalTab, ...rest.slice(insertAt)];
220
196
  };
221
-
222
- /**
223
- * 约束重排:在普通 arrayMove 基础上,钳制落点以维持「固定区在左、普通区在右」不变量。
224
- * - 被拖动的普通标签:落点钳制到 >= boundary(不进固定区)
225
- * - 被拖动的固定标签:落点钳制到 <= boundary-1(不出固定区)
226
- * - 钳制后落点等于原位、或 id 相同/无效时,返回原数组引用(避免无效更新)
227
- */
228
- export const reorderWithPinConstraint = (tabs, activeId, overId) => {
229
- if (activeId === overId) return tabs;
230
- const activeIndex = tabs.findIndex(tab => tab.id === activeId);
231
- const overIndex = tabs.findIndex(tab => tab.id === overId);
232
- if (activeIndex === -1 || overIndex === -1) return tabs;
197
+ const reorderWithPinConstraint = (tabs, activeId, overId) => {
198
+ if (activeId === overId)
199
+ return tabs;
200
+ const activeIndex = tabs.findIndex((tab) => tab.id === activeId);
201
+ const overIndex = tabs.findIndex((tab) => tab.id === overId);
202
+ if (activeIndex === -1 || overIndex === -1)
203
+ return tabs;
233
204
  const boundary = getPinnedBoundary(tabs);
234
205
  const activePinned = derivePinned(tabs[activeIndex]);
235
206
  let targetIndex = overIndex;
236
207
  if (activePinned) {
237
- // 固定标签只能落在固定区内:[0, boundary-1]
238
208
  const maxIndex = boundary - 1;
239
- if (targetIndex > maxIndex) targetIndex = maxIndex;
209
+ if (targetIndex > maxIndex)
210
+ targetIndex = maxIndex;
240
211
  } else {
241
- // 普通标签只能落在普通区内:[boundary, length-1]
242
- if (targetIndex < boundary) targetIndex = boundary;
212
+ if (targetIndex < boundary)
213
+ targetIndex = boundary;
243
214
  }
244
- if (targetIndex === activeIndex) return tabs;
215
+ if (targetIndex === activeIndex)
216
+ return tabs;
245
217
  return moveItem(tabs, activeIndex, targetIndex);
246
- };
218
+ };
219
+ export {
220
+ canOpenAsTab,
221
+ checkTabLimit,
222
+ createTabFromMenu,
223
+ derivePinned,
224
+ findExistingTab,
225
+ flattenMenuData,
226
+ generateTabId,
227
+ getCurrentTabUrl,
228
+ getMenuRoute,
229
+ getPinnedBoundary,
230
+ getRightTabs,
231
+ getTabUrlPathname,
232
+ handleExternalOpen,
233
+ hasRelationKey,
234
+ isLeafMenuItem,
235
+ isSafeExternalUrl,
236
+ isSafeHttpUrl,
237
+ normalizeTabUrl,
238
+ pinTab,
239
+ reorderWithPinConstraint,
240
+ resolveTabMenuItem,
241
+ shouldOpenExternal,
242
+ unpinTab
243
+ };
@@ -1,3 +1,8 @@
1
- export { default as ProCollapse } from "./ProCollapse";
2
- export { default as ProFooter } from "./ProFooter";
3
- export { default as ProHeader } from "./ProHeader";
1
+ import { default as default2 } from "./ProCollapse";
2
+ import { default as default3 } from "./ProFooter";
3
+ import { default as default4 } from "./ProHeader";
4
+ export {
5
+ default2 as ProCollapse,
6
+ default3 as ProFooter,
7
+ default4 as ProHeader
8
+ };