@creekjs/web-components 1.0.16 → 1.0.17
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/creek-config-provider/CreekConfigContext.d.ts.map +1 -0
- package/dist/creek-config-provider/CreekI18nProvider.d.ts.map +1 -0
- package/dist/creek-config-provider/index.d.ts.map +1 -0
- package/dist/creek-hooks/index.d.ts.map +1 -0
- package/dist/creek-hooks/useApp/DrawerHelper.d.ts.map +1 -0
- package/dist/creek-hooks/useApp/ModalHelper.d.ts.map +1 -0
- package/dist/creek-hooks/useApp/index.d.ts.map +1 -0
- package/dist/creek-hooks/useApp/types.d.ts.map +1 -0
- package/dist/creek-hooks/useViewportHeight.d.ts.map +1 -0
- package/dist/creek-icon/index.d.ts.map +1 -0
- package/dist/creek-keep-alive/index.d.ts +4 -0
- package/dist/creek-keep-alive/index.d.ts.map +1 -0
- package/dist/creek-keep-alive/index.js +43 -30
- package/dist/creek-keep-alive/index.js.map +3 -3
- package/dist/creek-layout/ActionRender/FullScreen.d.ts.map +1 -0
- package/dist/creek-layout/ActionRender/LayoutSettings.d.ts.map +1 -0
- package/dist/creek-layout/ActionRender/UserInfo.d.ts.map +1 -0
- package/dist/creek-layout/ActionRender/index.d.ts.map +1 -0
- package/dist/creek-layout/CollapseButton.d.ts.map +1 -0
- package/dist/creek-layout/Exception/NotFound.d.ts.map +1 -0
- package/dist/creek-layout/Exception/NotFoundPage.d.ts.map +1 -0
- package/dist/creek-layout/Exception/index.d.ts.map +1 -0
- package/dist/creek-layout/index.d.ts +1 -0
- package/dist/creek-layout/index.d.ts.map +1 -0
- package/dist/creek-layout/index.js +2 -1
- package/dist/creek-layout/index.js.map +2 -2
- package/dist/creek-layout/useLayoutSettingsStore.d.ts.map +1 -0
- package/dist/creek-loading/index.d.ts.map +1 -0
- package/dist/creek-locale-button/index.d.ts.map +1 -0
- package/dist/creek-page-container/index.d.ts.map +1 -0
- package/dist/creek-style/index.d.ts.map +1 -0
- package/dist/creek-style/scrollbar.d.ts.map +1 -0
- package/dist/creek-table/SearchTable.d.ts.map +1 -0
- package/dist/creek-table/components/DensityIcon.d.ts.map +1 -0
- package/dist/creek-table/components/EllipsisTooltip.d.ts.map +1 -0
- package/dist/creek-table/components/index.d.ts.map +1 -0
- package/dist/creek-table/hooks/index.d.ts.map +1 -0
- package/dist/creek-table/hooks/useAdaptiveToolBar.d.ts.map +1 -0
- package/dist/creek-table/hooks/useAutoWidthColumns.d.ts.map +1 -0
- package/dist/creek-table/hooks/useElementDistance.d.ts.map +1 -0
- package/dist/creek-table/hooks/useEllipsisColumns.d.ts.map +1 -0
- package/dist/creek-table/hooks/useIndexColumn.d.ts.map +1 -0
- package/dist/creek-table/hooks/useResizableColumns.d.ts.map +1 -0
- package/dist/creek-table/hooks/useStatusColumns.d.ts.map +1 -0
- package/dist/creek-table/hooks/useTableOptions.d.ts.map +1 -0
- package/dist/creek-table/hooks/useTableScrollHeight.d.ts.map +1 -0
- package/dist/creek-table/index.d.ts.map +1 -0
- package/dist/creek-table/type.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/locales/en_US.d.ts.map +1 -0
- package/dist/locales/zh_CN.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/creek-keep-alive/index.tsx +58 -58
- package/src/creek-layout/index.tsx +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreekConfigContext.d.ts","sourceRoot":"","sources":["../../src/creek-config-provider/CreekConfigContext.tsx"],"names":[],"mappings":";AAEA,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,kBAAkB,kDAA6C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreekI18nProvider.d.ts","sourceRoot":"","sources":["../../src/creek-config-provider/CreekI18nProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAU3C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAOD,eAAO,MAAM,aAAa;;yBAEH,MAAM;EAC3B,CAAC;AAEH,eAAO,MAAM,YAAY;;yBAHF,MAAM;CAG8B,CAAC;AAE5D,eAAO,MAAM,iBAAiB,UAAW,sBAAsB,4CAqE9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-config-provider/index.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAOhD,OAAO,EAAsB,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAc,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOzH,MAAM,MAAM,wBAAwB,GAAG,uBAAuB,GAAG,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG,sBAAsB,CAAC;AAE9H,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AAC1D,YAAY,EAAE,sBAAsB,EAAE,CAAC;AAqCvC,eAAO,MAAM,mBAAmB;YAAW,wBAAwB;;CAQlE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawerHelper.d.ts","sourceRoot":"","sources":["../../../src/creek-hooks/useApp/DrawerHelper.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAwC,MAAM,SAAS,CAAC;AAE7E,UAAU,iBAAiB;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA8BpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModalHelper.d.ts","sourceRoot":"","sources":["../../../src/creek-hooks/useApp/ModalHelper.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAmB,WAAW,EAAqB,MAAM,SAAS,CAAC;AAE1E,UAAU,gBAAgB;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA8BlD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/creek-hooks/useApp/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAI5E,OAAO,EAGL,gBAAgB,EAChB,eAAe,EAEf,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAsBjB,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CA6B/D,CAAC;AAEF,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;CAiDlB,CAAC;AAEF,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/creek-hooks/useApp/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAC9E,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1G,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAG9D,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,WAAW,GAAG;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAChF,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5G,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useViewportHeight.d.ts","sourceRoot":"","sources":["../../src/creek-hooks/useViewportHeight.tsx"],"names":[],"mappings":";AAGA,UAAU,wBAAwB;IAChC,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yBAAyB;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,IAAI,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC;IAE5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,iBAAiB,aAAa,wBAAwB;IAuJ/D,wBAAwB;;IAExB,kBAAkB;;IAElB,kBAAkB;;IAElB,gBAAgB;;CAGnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-icon/index.tsx"],"names":[],"mappings":"AAAA,OAAO,IAA8B,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAIrC,OAAO,EAAuB,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzF,KAAK,wBAAwB,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,wBAAwB,GAAG;IACtD,WAAW,CAAC,EAAE,wBAAwB,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,wBAAwB,CAAC,WAAW,CAAC,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,SAAS,UAAW,cAAc,mDAkB9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-keep-alive/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC9B;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IACpD;;OAEG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAClC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB;AAQD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA0MxD,CAAC"}
|
|
@@ -30,16 +30,21 @@ var import_react_router_dom = require("react-router-dom");
|
|
|
30
30
|
var import_react2 = require("@creekjs/i18n/react");
|
|
31
31
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
32
32
|
var CreekKeepAlive = (props) => {
|
|
33
|
-
const { exclude = [], getTabTitle, tabBarStyle, maxTabCount = 20 } = props;
|
|
33
|
+
const { exclude = [], getTabTitle, tabBarStyle, maxTabCount = 20, routes = [] } = props;
|
|
34
34
|
const t = (0, import_react2.useT)();
|
|
35
|
-
const outlet = (0, import_react_router_dom.useOutlet)();
|
|
36
35
|
const location = (0, import_react_router_dom.useLocation)();
|
|
37
36
|
const navigate = (0, import_react_router_dom.useNavigate)();
|
|
38
37
|
const [tabItems, setTabItems] = (0, import_react.useState)([]);
|
|
39
38
|
const [activeKey, setActiveKey] = (0, import_react.useState)("");
|
|
40
|
-
const [
|
|
41
|
-
const
|
|
42
|
-
|
|
39
|
+
const [cachedElements, setCachedElements] = (0, import_react.useState)({});
|
|
40
|
+
const resolveElement = (path) => {
|
|
41
|
+
if (!(routes == null ? void 0 : routes.length))
|
|
42
|
+
return null;
|
|
43
|
+
const matches = (0, import_react_router_dom.matchRoutes)(routes, path);
|
|
44
|
+
if (!(matches == null ? void 0 : matches.length))
|
|
45
|
+
return null;
|
|
46
|
+
return matches[matches.length - 1].route.element ?? null;
|
|
47
|
+
};
|
|
43
48
|
const isPathExcluded = (path) => {
|
|
44
49
|
return exclude.some((item) => {
|
|
45
50
|
if ((0, import_lodash.isString)(item)) {
|
|
@@ -54,19 +59,15 @@ var CreekKeepAlive = (props) => {
|
|
|
54
59
|
(0, import_react.useEffect)(() => {
|
|
55
60
|
const currentPath = location.pathname;
|
|
56
61
|
setActiveKey(currentPath);
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
62
|
+
if (!cachedElements[currentPath] && !isPathExcluded(currentPath)) {
|
|
63
|
+
const element = resolveElement(currentPath);
|
|
64
|
+
if (element) {
|
|
65
|
+
setCachedElements((prev) => ({ ...prev, [currentPath]: element }));
|
|
60
66
|
}
|
|
61
|
-
|
|
62
|
-
...prev,
|
|
63
|
-
[currentPath]: outletRef.current
|
|
64
|
-
};
|
|
65
|
-
});
|
|
67
|
+
}
|
|
66
68
|
setTabItems((prev) => {
|
|
67
69
|
if (prev.find((i) => i.key === currentPath)) {
|
|
68
|
-
|
|
69
|
-
return updated;
|
|
70
|
+
return prev.map((i) => ({ ...i, closable: prev.length > 1 }));
|
|
70
71
|
}
|
|
71
72
|
const title = (getTabTitle == null ? void 0 : getTabTitle(currentPath)) || currentPath;
|
|
72
73
|
const newItems = [...prev, { key: currentPath, label: title, closable: prev.length > 0 }];
|
|
@@ -77,19 +78,25 @@ var CreekKeepAlive = (props) => {
|
|
|
77
78
|
const indexToRemove = newItems.findIndex((item) => item.closable && item.key !== currentPath);
|
|
78
79
|
if (indexToRemove !== -1) {
|
|
79
80
|
const itemToRemove = newItems[indexToRemove];
|
|
80
|
-
|
|
81
|
+
setCachedElements((prev2) => {
|
|
82
|
+
const next = { ...prev2 };
|
|
83
|
+
delete next[itemToRemove.key];
|
|
84
|
+
return next;
|
|
85
|
+
});
|
|
81
86
|
newItems.splice(indexToRemove, 1);
|
|
82
87
|
}
|
|
83
88
|
}
|
|
84
89
|
return newItems;
|
|
85
90
|
});
|
|
86
|
-
}, [location.pathname, getTabTitle, maxTabCount]);
|
|
87
|
-
(0, import_react.useEffect)(() => {
|
|
88
|
-
}, []);
|
|
91
|
+
}, [location.pathname, getTabTitle, maxTabCount, cachedElements]);
|
|
89
92
|
const closeTab = (0, import_ahooks.useMemoizedFn)((targetKey) => {
|
|
90
93
|
const targetIndex = tabItems.findIndex((item) => item.key === targetKey);
|
|
91
94
|
const newTabItems = tabItems.filter((item) => item.key !== targetKey);
|
|
92
|
-
|
|
95
|
+
setCachedElements((prev) => {
|
|
96
|
+
const next = { ...prev };
|
|
97
|
+
delete next[targetKey];
|
|
98
|
+
return next;
|
|
99
|
+
});
|
|
93
100
|
setTabItems(newTabItems);
|
|
94
101
|
if (targetKey === activeKey) {
|
|
95
102
|
if (newTabItems.length > 0) {
|
|
@@ -105,14 +112,14 @@ var CreekKeepAlive = (props) => {
|
|
|
105
112
|
return;
|
|
106
113
|
const newTabItems = [{ ...currentTab, closable: false }];
|
|
107
114
|
setTabItems(newTabItems);
|
|
108
|
-
const keepKeys = newTabItems.map((i) => i.key);
|
|
109
|
-
|
|
110
|
-
const
|
|
115
|
+
const keepKeys = new Set(newTabItems.map((i) => i.key));
|
|
116
|
+
setCachedElements((prev) => {
|
|
117
|
+
const next = {};
|
|
111
118
|
keepKeys.forEach((k) => {
|
|
112
119
|
if (prev[k])
|
|
113
|
-
|
|
120
|
+
next[k] = prev[k];
|
|
114
121
|
});
|
|
115
|
-
return
|
|
122
|
+
return next;
|
|
116
123
|
});
|
|
117
124
|
if (activeKey !== currentKey) {
|
|
118
125
|
navigate(currentKey);
|
|
@@ -121,11 +128,17 @@ var CreekKeepAlive = (props) => {
|
|
|
121
128
|
const closeRightTabs = (0, import_ahooks.useMemoizedFn)((currentKey) => {
|
|
122
129
|
const currentIndex = tabItems.findIndex((i) => i.key === currentKey);
|
|
123
130
|
const rightItems = tabItems.slice(currentIndex + 1);
|
|
124
|
-
const rightKeys = rightItems.map((i) => i.key);
|
|
125
|
-
const newTabItems = tabItems.filter((i) => !rightKeys.
|
|
131
|
+
const rightKeys = new Set(rightItems.map((i) => i.key));
|
|
132
|
+
const newTabItems = tabItems.filter((i) => !rightKeys.has(i.key));
|
|
126
133
|
setTabItems(newTabItems);
|
|
127
|
-
|
|
128
|
-
|
|
134
|
+
setCachedElements((prev) => {
|
|
135
|
+
const next = { ...prev };
|
|
136
|
+
rightKeys.forEach((key) => {
|
|
137
|
+
delete next[key];
|
|
138
|
+
});
|
|
139
|
+
return next;
|
|
140
|
+
});
|
|
141
|
+
if (rightKeys.has(activeKey)) {
|
|
129
142
|
navigate(currentKey);
|
|
130
143
|
}
|
|
131
144
|
});
|
|
@@ -170,7 +183,7 @@ var CreekKeepAlive = (props) => {
|
|
|
170
183
|
items: tabItems.map((item) => ({
|
|
171
184
|
...item,
|
|
172
185
|
label: renderTabLabel(item),
|
|
173
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { height: "100%", display: activeKey === item.key ? "block" : "none" }, children:
|
|
186
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { height: "100%", display: activeKey === item.key ? "block" : "none" }, children: cachedElements[item.key] ?? null }, item.key)
|
|
174
187
|
}))
|
|
175
188
|
}
|
|
176
189
|
) });
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/creek-keep-alive/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { useMemoizedFn } from 'ahooks';\nimport { Dropdown, MenuProps, Tabs } from 'antd';\nimport { isRegExp, isString
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA8B;AAC9B,kBAA0C;AAC1C,
|
|
6
|
-
"names": ["import_react"]
|
|
4
|
+
"sourcesContent": ["import { useMemoizedFn } from 'ahooks';\nimport { Dropdown, MenuProps, Tabs } from 'antd';\nimport { isRegExp, isString } from 'lodash';\nimport React, { useEffect, useState } from 'react';\nimport { matchRoutes, useLocation, useNavigate } from 'react-router-dom';\n\nimport { useT } from '@creekjs/i18n/react';\n\nexport interface CreekKeepAliveProps {\n /**\n * 不需要缓存的路径\n */\n exclude?: (string | RegExp)[];\n /**\n * 自定义Tab标题获取方法\n */\n getTabTitle?: (pathname: string) => React.ReactNode;\n /**\n * Tabs的样式\n */\n tabBarStyle?: React.CSSProperties;\n /**\n * 最大缓存数量,默认为 20\n */\n maxTabCount?: number;\n /**\n * 路由配置(含 element),用于解析每个路径对应的页面组件\n */\n routes?: any[];\n}\n\ninterface TabItem {\n key: string;\n label: React.ReactNode;\n closable?: boolean;\n}\n\nexport const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {\n const { exclude = [], getTabTitle, tabBarStyle, maxTabCount = 20, routes = [] } = props;\n\n const t = useT();\n const location = useLocation();\n const navigate = useNavigate();\n\n const [tabItems, setTabItems] = useState<TabItem[]>([]);\n const [activeKey, setActiveKey] = useState<string>('');\n\n // 缓存每个路径对应的 React element,保证同一页面始终复用同一个 element 引用\n // 这样 React reconciler 不会卸载/重新挂载组件,从而实现 keep-alive\n // 使用 state 以便缓存变化时触发重新渲染\n const [cachedElements, setCachedElements] = useState<Record<string, React.ReactNode>>({});\n\n // 根据路由配置,解析指定路径对应的叶子路由 element\n const resolveElement = (path: string): React.ReactNode | null => {\n if (!routes?.length) return null;\n const matches = matchRoutes(routes, path);\n if (!matches?.length) return null;\n // 取最后一个 match(叶子路由),即实际页面组件\n return matches[matches.length - 1].route.element ?? null;\n };\n\n // 判断是否不需要缓存\n const isPathExcluded = (path: string) => {\n return exclude.some((item) => {\n if (isString(item)) {\n return item === path;\n }\n if (isRegExp(item)) {\n return item.test(path);\n }\n return false;\n });\n };\n\n // 初始化或路由变化时更新\n useEffect(() => {\n const currentPath = location.pathname;\n setActiveKey(currentPath);\n\n // 缓存当前路径的 element(仅首次缓存,后续复用同一个 element 引用)\n if (!cachedElements[currentPath] && !isPathExcluded(currentPath)) {\n const element = resolveElement(currentPath);\n if (element) {\n setCachedElements((prev) => ({ ...prev, [currentPath]: element }));\n }\n }\n\n // 更新 Tab 列表\n setTabItems((prev) => {\n if (prev.find((i) => i.key === currentPath)) {\n // 更新现有 tab 的 closable 状态(只有最后一个 tab 时不可关闭)\n return prev.map((i) => ({ ...i, closable: prev.length > 1 }));\n }\n const title = getTabTitle?.(currentPath) || currentPath;\n const newItems = [...prev, { key: currentPath, label: title, closable: prev.length > 0 }];\n\n // 只有1个 tab 时不可关闭\n if (newItems.length === 1) {\n newItems[0].closable = false;\n }\n\n // 超过最大数量限制,移除最早的可关闭 tab\n if (newItems.length > maxTabCount) {\n const indexToRemove = newItems.findIndex((item) => item.closable && item.key !== currentPath);\n if (indexToRemove !== -1) {\n const itemToRemove = newItems[indexToRemove];\n setCachedElements((prev) => {\n const next = { ...prev };\n delete next[itemToRemove.key];\n return next;\n });\n newItems.splice(indexToRemove, 1);\n }\n }\n return newItems;\n });\n }, [location.pathname, getTabTitle, maxTabCount, cachedElements]);\n\n const closeTab = useMemoizedFn((targetKey: string) => {\n const targetIndex = tabItems.findIndex((item) => item.key === targetKey);\n const newTabItems = tabItems.filter((item) => item.key !== targetKey);\n\n // 移除缓存,组件将卸载\n setCachedElements((prev) => {\n const next = { ...prev };\n delete next[targetKey];\n return next;\n });\n setTabItems(newTabItems);\n\n // 如果关闭的是当前页,跳转到临近页\n if (targetKey === activeKey) {\n if (newTabItems.length > 0) {\n const nextIndex = targetIndex >= newTabItems.length ? newTabItems.length - 1 : targetIndex;\n const nextKey = newTabItems[nextIndex].key;\n navigate(nextKey);\n }\n }\n });\n\n const closeOtherTabs = useMemoizedFn((currentKey: string) => {\n const currentTab = tabItems.find((item) => item.key === currentKey);\n if (!currentTab) return;\n const newTabItems = [{ ...currentTab, closable: false }];\n setTabItems(newTabItems);\n\n // 仅保留当前 tab 的缓存\n const keepKeys = new Set(newTabItems.map((i) => i.key));\n setCachedElements((prev) => {\n const next: Record<string, React.ReactNode> = {};\n keepKeys.forEach((k) => {\n if (prev[k]) next[k] = prev[k];\n });\n return next;\n });\n\n if (activeKey !== currentKey) {\n navigate(currentKey);\n }\n });\n\n const closeRightTabs = useMemoizedFn((currentKey: string) => {\n const currentIndex = tabItems.findIndex((i) => i.key === currentKey);\n const rightItems = tabItems.slice(currentIndex + 1);\n const rightKeys = new Set(rightItems.map((i) => i.key));\n\n const newTabItems = tabItems.filter((i) => !rightKeys.has(i.key));\n setTabItems(newTabItems);\n\n // 移除右侧 tab 的缓存\n setCachedElements((prev) => {\n const next = { ...prev };\n rightKeys.forEach((key) => { delete next[key]; });\n return next;\n });\n\n if (rightKeys.has(activeKey)) {\n navigate(currentKey);\n }\n });\n\n const handleTabEdit = (targetKey: React.MouseEvent | React.KeyboardEvent | string, action: 'add' | 'remove') => {\n if (action === 'remove' && isString(targetKey)) {\n closeTab(targetKey);\n }\n };\n\n const handleTabClick = (key: string) => {\n navigate(key);\n };\n\n const renderTabLabel = (item: TabItem) => {\n const menuItems: MenuProps['items'] = [\n {\n key: 'close',\n label: t('creek-keep-alive.index.guanBiDangQian', '关闭当前'),\n disabled: tabItems.length <= 1,\n onClick: () => closeTab(item.key),\n },\n {\n key: 'closeOthers',\n label: t('creek-keep-alive.index.guanBiQiTa', '关闭其他'),\n onClick: () => closeOtherTabs(item.key),\n },\n {\n key: 'closeRight',\n label: t('creek-keep-alive.index.guanBiYouCe', '关闭右侧'),\n onClick: () => closeRightTabs(item.key),\n },\n ];\n\n return (\n <Dropdown menu={{ items: menuItems }} trigger={['contextMenu']}>\n <span>{item.label}</span>\n </Dropdown>\n );\n };\n\n return (\n <div className=\"creek-keep-alive\">\n <Tabs\n activeKey={activeKey}\n type=\"editable-card\"\n hideAdd\n onChange={handleTabClick}\n onEdit={handleTabEdit}\n tabBarStyle={{ margin: 0, ...tabBarStyle }}\n items={tabItems.map((item) => ({\n ...item,\n label: renderTabLabel(item),\n children: (\n <div key={item.key} style={{ height: '100%', display: activeKey === item.key ? 'block' : 'none' }}>\n {cachedElements[item.key] ?? null}\n </div>\n ),\n }))}\n />\n </div>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_react", "prev"]
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FullScreen.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/ActionRender/FullScreen.tsx"],"names":[],"mappings":"AAQA,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,8EAU7B,CAAC;AAEH,eAAO,MAAM,UAAU,+CAwBtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LayoutSettings.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/ActionRender/LayoutSettings.tsx"],"names":[],"mappings":"AAgDA,eAAO,MAAM,cAAc;;;;;6CA4B1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserInfo.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/ActionRender/UserInfo.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAoB,aAAa,EAAS,MAAM,MAAM,CAAC;AAsB9D,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,eAAO,MAAM,QAAQ,UAAW,aAAa,4CAc5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/ActionRender/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollapseButton.d.ts","sourceRoot":"","sources":["../../src/creek-layout/CollapseButton.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AAiBF,eAAO,MAAM,iBAAiB,mFAU5B,CAAC;AAEH,eAAO,MAAM,eAAe,UAAW,oBAAoB,4CAwB1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotFound.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/Exception/NotFound.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,+CASpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotFoundPage.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/Exception/NotFoundPage.tsx"],"names":[],"mappings":";AACA,wBAEE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/creek-layout/Exception/index.tsx"],"names":[],"mappings":";AAAA,cAAc,YAAY,CAAC;AAE3B,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,SAAS,UAAW,cAAc,4CAG9C,CAAC"}
|
|
@@ -16,6 +16,7 @@ export type LayoutProps = ProLayoutProps & {
|
|
|
16
16
|
};
|
|
17
17
|
keepAlive?: boolean | CreekKeepAliveProps;
|
|
18
18
|
extraActions?: React.ReactNode[];
|
|
19
|
+
clientRoutes?: any[];
|
|
19
20
|
};
|
|
20
21
|
export declare const CreekLayout: (props: LayoutProps) => import("react/jsx-runtime").JSX.Element;
|
|
21
22
|
export * from './Exception';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-layout/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA2B,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAUrF,OAAO,EAAkB,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAQ1E,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG;IACzC,aAAa,EAAE,cAAc,CAAC;IAC9B,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC5C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE;QACZ,YAAY,EAAE,GAAG,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,eAAe,EAAE,MAAM,IAAI,CAAC;KAC7B,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAAC;IAC1C,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;CACtB,CAAC;AAQF,eAAO,MAAM,WAAW,UAAW,WAAW,4CA+I7C,CAAC;AAEF,cAAc,aAAa,CAAC"}
|
|
@@ -68,6 +68,7 @@ var CreekLayout = (props) => {
|
|
|
68
68
|
showThemeColor = true,
|
|
69
69
|
keepAlive = false,
|
|
70
70
|
extraActions = [],
|
|
71
|
+
clientRoutes,
|
|
71
72
|
...more
|
|
72
73
|
} = props;
|
|
73
74
|
const { useToken } = import_antd.theme;
|
|
@@ -175,7 +176,7 @@ var CreekLayout = (props) => {
|
|
|
175
176
|
...more,
|
|
176
177
|
children: [
|
|
177
178
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_scrollbar.GlobalScrollbarStyle, {}),
|
|
178
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Exception.Exception, { children: actualKeepAlive ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_creek_keep_alive.CreekKeepAlive, { getTabTitle, ...keepAliveProps }) : children })
|
|
179
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Exception.Exception, { children: actualKeepAlive ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_creek_keep_alive.CreekKeepAlive, { getTabTitle, routes: clientRoutes ?? (route == null ? void 0 : route.routes), ...keepAliveProps }) : children })
|
|
179
180
|
]
|
|
180
181
|
}
|
|
181
182
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/creek-layout/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { MenuDataItem, ProLayout, ProLayoutProps } from '@ant-design/pro-components';\nimport { useMemoizedFn } from 'ahooks';\nimport { theme } from 'antd';\nimport _ from 'lodash';\nimport { useContext } from 'react';\n\nimport classnames from 'classnames';\n\nimport { IntlContext, useT } from '@creekjs/i18n/react';\n\nimport { CreekKeepAlive, CreekKeepAliveProps } from '../creek-keep-alive';\nimport { CreekLocaleButton } from '../creek-locale-button';\nimport { GlobalScrollbarStyle } from '../creek-style/scrollbar';\nimport { FullScreen, LayoutSettings } from './ActionRender';\nimport { CollapsedButton, useCollapsedStore } from './CollapseButton';\nimport { Exception } from './Exception';\nimport { useLayoutSettingsStore } from './useLayoutSettingsStore';\n\nexport type LayoutProps = ProLayoutProps & {\n runtimeConfig: ProLayoutProps;\n userConfig?: ProLayoutProps;\n navigate?: (path?: string | number) => void;\n showFullScreen?: boolean;\n showLocaleButton?: boolean;\n showSettingsButton?: boolean;\n showThemeColor?: boolean;\n initialInfo?: {\n initialState: any;\n loading: boolean;\n setInitialState: () => void;\n };\n keepAlive?: boolean | CreekKeepAliveProps;\n extraActions?: React.ReactNode[];\n};\n\nconst MenuName = ({ name, path }: { name?: string; path?: string }) => {\n const t = useT();\n const key = !path || path === '/' ? 'menu.home' : `menu${path.replace(/\\//g, '.')}`;\n return t(key, name);\n};\n\nexport const CreekLayout = (props: LayoutProps) => {\n const {\n route,\n userConfig,\n runtimeConfig,\n children,\n location,\n navigate,\n showFullScreen = false,\n showLocaleButton = false,\n showSettingsButton = false,\n showThemeColor = true,\n keepAlive = false,\n extraActions = [],\n ...more\n } = props;\n\n const { useToken } = theme;\n const { token } = useToken();\n\n const { collapsed } = useCollapsedStore();\n const settingsStore = useLayoutSettingsStore();\n\n const actualShowFullScreen = showFullScreen && (settingsStore.showFullScreen ?? true);\n const actualShowLocaleButton = showLocaleButton && (settingsStore.showLocaleButton ?? true);\n const colorPrimary = settingsStore.colorPrimary || token.colorPrimary;\n const actualKeepAlive = keepAlive && (settingsStore.keepAlive ?? true);\n\n const _userConfig = { ...userConfig, ...runtimeConfig };\n\n const intlContext = useContext(IntlContext);\n const hasI18n = !!intlContext && actualShowLocaleButton;\n\n const menuDataRender = useMemoizedFn((menuData: MenuDataItem[]) => {\n // 根据当前是否开启了国际化(上下文是否存在)以及用户配置来判断是否包裹菜单翻译\n const isLocaleEnabled = hasI18n;\n\n const mapMenu = (items: MenuDataItem[]): MenuDataItem[] => {\n return items.map((item) => {\n return {\n ...item,\n name: (isLocaleEnabled ? <MenuName name={item.name} path={item.path} /> : item.name) as string,\n children: item.children ? mapMenu(item.children) : undefined,\n };\n });\n };\n return mapMenu(menuData);\n });\n\n const menuItemRender: ProLayoutProps['menuItemRender'] = useMemoizedFn((itemProps, defaultDom) => {\n return (\n <span\n onClick={() => {\n if (navigate) {\n navigate(itemProps.path);\n }\n }}\n >\n {defaultDom}\n </span>\n );\n });\n\n const getTabTitle = useMemoizedFn((pathname: string): string | React.ReactNode => {\n const routes = (route?.routes ?? []) as MenuDataItem[];\n\n const findTitle = (items: MenuDataItem[]): string | undefined => {\n for (const item of items) {\n if (item.path === pathname) return item.name ?? item.title;\n if (item.children) {\n const found = findTitle(item.children);\n if (found) return found;\n }\n }\n };\n\n const title = findTitle(routes) ?? pathname;\n\n return hasI18n ? <MenuName name={title} path={pathname} /> : title;\n });\n\n const actions: React.ReactNode[] = [...extraActions];\n\n if (actualShowFullScreen) {\n actions.push(<FullScreen key=\"full-screen\" />);\n }\n\n if (actualShowLocaleButton) {\n actions.push(<CreekLocaleButton key=\"locale-button\" />);\n }\n\n if (showSettingsButton) {\n actions.push(<LayoutSettings key=\"settings\" defaultShowFullScreen={showFullScreen} defaultShowLocaleButton={showLocaleButton} defaultShowThemeColor={showThemeColor} defaultKeepAlive={_.isBoolean(keepAlive) ? keepAlive : true} />);\n }\n\n const keepAliveProps = _.isBoolean(keepAlive) ? {} : keepAlive;\n\n const layoutContent = (\n <ProLayout\n className={classnames('creek-layout-container', _userConfig?.className)}\n route={route}\n title={_userConfig?.title}\n siderWidth={200}\n location={location}\n menuDataRender={menuDataRender}\n menuItemRender={menuItemRender}\n actionsRender={() => actions}\n token={{\n header: {\n colorBgHeader: '#fff',\n colorHeaderTitle: 'rgba(0, 0, 0, 0.80);',\n colorTextMenuSelected: colorPrimary,\n heightLayoutHeader: 48,\n },\n sider: {\n colorMenuBackground: '#f7f8fa',\n colorBgMenuItemSelected: 'transparent',\n colorTextMenuActive: colorPrimary,\n colorTextMenuSelected: colorPrimary,\n colorTextMenuItemHover: colorPrimary,\n colorTextMenu: '#333',\n },\n pageContainer: {\n paddingBlockPageContainerContent: 0,\n paddingInlinePageContainerContent: 0,\n colorBgPageContainer: 'linear-gradient(180deg, #F7F9FF 0%, #FFF 45.59%);',\n },\n }}\n fixSiderbar\n fixedHeader\n collapsed={collapsed}\n collapsedButtonRender={(collapsed) => {\n return <CollapsedButton collapsed={collapsed} />;\n }}\n {...more}\n >\n <GlobalScrollbarStyle />\n <Exception>{actualKeepAlive ? <CreekKeepAlive getTabTitle={getTabTitle} {...keepAliveProps} /> : children}</Exception>\n </ProLayout>\n );\n\n return layoutContent;\n};\n\nexport * from './Exception';\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAwD;AACxD,oBAA8B;AAC9B,kBAAsB;AACtB,oBAAc;AACd,mBAA2B;AAE3B,wBAAuB;AAEvB,IAAAA,gBAAkC;AAElC,8BAAoD;AACpD,iCAAkC;AAClC,uBAAqC;AACrC,0BAA2C;AAC3C,4BAAmD;AACnD,uBAA0B;AAC1B,oCAAuC;
|
|
4
|
+
"sourcesContent": ["import { MenuDataItem, ProLayout, ProLayoutProps } from '@ant-design/pro-components';\nimport { useMemoizedFn } from 'ahooks';\nimport { theme } from 'antd';\nimport _ from 'lodash';\nimport { useContext } from 'react';\n\nimport classnames from 'classnames';\n\nimport { IntlContext, useT } from '@creekjs/i18n/react';\n\nimport { CreekKeepAlive, CreekKeepAliveProps } from '../creek-keep-alive';\nimport { CreekLocaleButton } from '../creek-locale-button';\nimport { GlobalScrollbarStyle } from '../creek-style/scrollbar';\nimport { FullScreen, LayoutSettings } from './ActionRender';\nimport { CollapsedButton, useCollapsedStore } from './CollapseButton';\nimport { Exception } from './Exception';\nimport { useLayoutSettingsStore } from './useLayoutSettingsStore';\n\nexport type LayoutProps = ProLayoutProps & {\n runtimeConfig: ProLayoutProps;\n userConfig?: ProLayoutProps;\n navigate?: (path?: string | number) => void;\n showFullScreen?: boolean;\n showLocaleButton?: boolean;\n showSettingsButton?: boolean;\n showThemeColor?: boolean;\n initialInfo?: {\n initialState: any;\n loading: boolean;\n setInitialState: () => void;\n };\n keepAlive?: boolean | CreekKeepAliveProps;\n extraActions?: React.ReactNode[];\n clientRoutes?: any[];\n};\n\nconst MenuName = ({ name, path }: { name?: string; path?: string }) => {\n const t = useT();\n const key = !path || path === '/' ? 'menu.home' : `menu${path.replace(/\\//g, '.')}`;\n return t(key, name);\n};\n\nexport const CreekLayout = (props: LayoutProps) => {\n const {\n route,\n userConfig,\n runtimeConfig,\n children,\n location,\n navigate,\n showFullScreen = false,\n showLocaleButton = false,\n showSettingsButton = false,\n showThemeColor = true,\n keepAlive = false,\n extraActions = [],\n clientRoutes,\n ...more\n } = props;\n\n const { useToken } = theme;\n const { token } = useToken();\n\n const { collapsed } = useCollapsedStore();\n const settingsStore = useLayoutSettingsStore();\n\n const actualShowFullScreen = showFullScreen && (settingsStore.showFullScreen ?? true);\n const actualShowLocaleButton = showLocaleButton && (settingsStore.showLocaleButton ?? true);\n const colorPrimary = settingsStore.colorPrimary || token.colorPrimary;\n const actualKeepAlive = keepAlive && (settingsStore.keepAlive ?? true);\n\n const _userConfig = { ...userConfig, ...runtimeConfig };\n\n const intlContext = useContext(IntlContext);\n const hasI18n = !!intlContext && actualShowLocaleButton;\n\n const menuDataRender = useMemoizedFn((menuData: MenuDataItem[]) => {\n // 根据当前是否开启了国际化(上下文是否存在)以及用户配置来判断是否包裹菜单翻译\n const isLocaleEnabled = hasI18n;\n\n const mapMenu = (items: MenuDataItem[]): MenuDataItem[] => {\n return items.map((item) => {\n return {\n ...item,\n name: (isLocaleEnabled ? <MenuName name={item.name} path={item.path} /> : item.name) as string,\n children: item.children ? mapMenu(item.children) : undefined,\n };\n });\n };\n return mapMenu(menuData);\n });\n\n const menuItemRender: ProLayoutProps['menuItemRender'] = useMemoizedFn((itemProps, defaultDom) => {\n return (\n <span\n onClick={() => {\n if (navigate) {\n navigate(itemProps.path);\n }\n }}\n >\n {defaultDom}\n </span>\n );\n });\n\n const getTabTitle = useMemoizedFn((pathname: string): string | React.ReactNode => {\n const routes = (route?.routes ?? []) as MenuDataItem[];\n\n const findTitle = (items: MenuDataItem[]): string | undefined => {\n for (const item of items) {\n if (item.path === pathname) return item.name ?? item.title;\n if (item.children) {\n const found = findTitle(item.children);\n if (found) return found;\n }\n }\n };\n\n const title = findTitle(routes) ?? pathname;\n\n return hasI18n ? <MenuName name={title} path={pathname} /> : title;\n });\n\n const actions: React.ReactNode[] = [...extraActions];\n\n if (actualShowFullScreen) {\n actions.push(<FullScreen key=\"full-screen\" />);\n }\n\n if (actualShowLocaleButton) {\n actions.push(<CreekLocaleButton key=\"locale-button\" />);\n }\n\n if (showSettingsButton) {\n actions.push(<LayoutSettings key=\"settings\" defaultShowFullScreen={showFullScreen} defaultShowLocaleButton={showLocaleButton} defaultShowThemeColor={showThemeColor} defaultKeepAlive={_.isBoolean(keepAlive) ? keepAlive : true} />);\n }\n\n const keepAliveProps = _.isBoolean(keepAlive) ? {} : keepAlive;\n\n const layoutContent = (\n <ProLayout\n className={classnames('creek-layout-container', _userConfig?.className)}\n route={route}\n title={_userConfig?.title}\n siderWidth={200}\n location={location}\n menuDataRender={menuDataRender}\n menuItemRender={menuItemRender}\n actionsRender={() => actions}\n token={{\n header: {\n colorBgHeader: '#fff',\n colorHeaderTitle: 'rgba(0, 0, 0, 0.80);',\n colorTextMenuSelected: colorPrimary,\n heightLayoutHeader: 48,\n },\n sider: {\n colorMenuBackground: '#f7f8fa',\n colorBgMenuItemSelected: 'transparent',\n colorTextMenuActive: colorPrimary,\n colorTextMenuSelected: colorPrimary,\n colorTextMenuItemHover: colorPrimary,\n colorTextMenu: '#333',\n },\n pageContainer: {\n paddingBlockPageContainerContent: 0,\n paddingInlinePageContainerContent: 0,\n colorBgPageContainer: 'linear-gradient(180deg, #F7F9FF 0%, #FFF 45.59%);',\n },\n }}\n fixSiderbar\n fixedHeader\n collapsed={collapsed}\n collapsedButtonRender={(collapsed) => {\n return <CollapsedButton collapsed={collapsed} />;\n }}\n {...more}\n >\n <GlobalScrollbarStyle />\n <Exception>{actualKeepAlive ? <CreekKeepAlive getTabTitle={getTabTitle} routes={clientRoutes ?? route?.routes} {...keepAliveProps} /> : children}</Exception>\n </ProLayout>\n );\n\n return layoutContent;\n};\n\nexport * from './Exception';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_react", "_", "classnames", "collapsed"]
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLayoutSettingsStore.d.ts","sourceRoot":"","sources":["../../src/creek-layout/useLayoutSettingsStore.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;CAC/D,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAsBlC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-loading/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAC,SAAS,CAA+B;IACvD,OAAO,CAAC,MAAM,CAAC,IAAI,CAA8C;IAEjE,OAAO,CAAC,MAAM,CAAC,eAAe;IAS9B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC;IAMtD,MAAM,CAAC,KAAK;CAWb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-locale-button/index.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB,+CAkC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-page-container/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,CAAC;AAEzD,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAiBhE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-style/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollbar.d.ts","sourceRoot":"","sources":["../../src/creek-style/scrollbar.ts"],"names":[],"mappings":";AAEA,eAAO,MAAM,oBAAoB,8CA0B/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchTable.d.ts","sourceRoot":"","sources":["../../src/creek-table/SearchTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,MAAM,4BAA4B,CAAC;AASlE,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzC,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAiFF,eAAO,MAAM,cAAc,0EAA2E,gBAAgB,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,4CAgFrI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DensityIcon.d.ts","sourceRoot":"","sources":["../../../src/creek-table/components/DensityIcon.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,UAAU,gBAAgB;IACxB,SAAS,EAAE,QAAQ,CAAC;IACpB,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CACxC;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAgDlD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EllipsisTooltip.d.ts","sourceRoot":"","sources":["../../../src/creek-table/components/EllipsisTooltip.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAuCvE;;;;GAIG;AACH,eAAO,MAAM,eAAe;cAA8B,MAAM,SAAS;6CAwExE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/creek-table/components/index.tsx"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/creek-table/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAdaptiveToolBar.d.ts","sourceRoot":"","sources":["../../../src/creek-table/hooks/useAdaptiveToolBar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA+B,MAAM,OAAO,CAAC;AAGtE,eAAO,MAAM,kBAAkB,YAAa;IAC1C,YAAY,EAAE,iBAAiB,WAAW,GAAG,IAAI,CAAC,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;;CAoCA,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAutoWidthColumns.d.ts","sourceRoot":"","sources":["../../../src/creek-table/hooks/useAutoWidthColumns.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAwC,MAAM,OAAO,CAAC;AA4FxE,eAAO,MAAM,mBAAmB,0BACrB,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,YACrC,UAAU,cAAc,CAAC,kBACnB,OAAO,MAAM,EAAE,MAAM,CAAC,aAC3B,OAAO,SACX,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ;aAClC,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS;gBAAc,MAAM,GAAG,SAAS;CAwLnF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useElementDistance.d.ts","sourceRoot":"","sources":["../../../src/creek-table/hooks/useElementDistance.tsx"],"names":[],"mappings":";AAGA,KAAK,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AAO/C,UAAU,QAAQ;IAChB,CAAC,EAAE,MAAM,CAAC;CACX;AAeD,eAAO,MAAM,kBAAkB,wDAAuD,QAAQ,GAAG,IAoChG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEllipsisColumns.d.ts","sourceRoot":"","sources":["../../../src/creek-table/hooks/useEllipsisColumns.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAIzE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,sDACpB,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,2CAwChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIndexColumn.d.ts","sourceRoot":"","sources":["../../../src/creek-table/hooks/useIndexColumn.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAKxD,eAAO,MAAM,cAAc,0CAA0C,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,cAAkB,OAAO,+BAqBvH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useResizableColumns.d.ts","sourceRoot":"","sources":["../../../src/creek-table/hooks/useResizableColumns.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAIxD,OAAO,KAAgE,MAAM,OAAO,CAAC;AACrF,OAAO,EAAa,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEhE,UAAU,mBAAoB,SAAQ,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC;IAC9E,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACvE,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5E,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC3E,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgLD,eAAO,MAAM,mBAAmB,0BACrB,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,cACpC,OAAO,sBACE,OAAO,MAAM,EAAE,MAAM,CAAC,yBACnB,MAAM,QAAQ,CAAC,MAAM,cAAc,CAAC,OAAO,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,aACxE,MAAM,SAAS,CAAC,cAAc,CAAC;aAEjC,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS;gBACnC;QAAE,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,aAAa,CAAC,mBAAmB,CAAC,CAAA;SAAE,CAAA;KAAE,GAAG,SAAS;mBACvE,OAAO,MAAM,EAAE,MAAM,CAAC;CA4HtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStatusColumns.d.ts","sourceRoot":"","sources":["../../../src/creek-table/hooks/useStatusColumns.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA+HxD,eAAO,MAAM,gBAAgB,2BACjB,WAAW,CAAC,EAAE,SAAS,CAAC,EAAE,2CA2HrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTableOptions.d.ts","sourceRoot":"","sources":["../../../src/creek-table/hooks/useTableOptions.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAKvE;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,4EACjB,cAAc,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC,SAC3C,cAAc,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,kBAC7B,cAAc,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,eAAe,CAAC;kBAEjD,cAAc,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC;eAC5C,cAAc,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC;kBACnC,MAAM,QAAQ,CAAC,MAAM,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBAC7E,OAAO;wBACA,cAAc,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,eAAe,CAAC;CA2DpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTableScrollHeight.d.ts","sourceRoot":"","sources":["../../../src/creek-table/hooks/useTableScrollHeight.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,cAAe,MAAM,YAAY,MAAM,SAAS,CAAC,cAAc,CAAC,oBAAmB,OAAO,iBAAuB,MAAM;;;;;CAkHvJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/creek-table/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzC,eAAO,MAAM,UAAU,0EAA2E,gBAAgB,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,4CAMjI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/creek-table/type.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEvE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,SAAS,UAAU,EAAE,SAAS,GAAG,MAAM,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,GAAG;IAC7H,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE;QACtB,+BAA+B;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sBAAsB;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AACA,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en_US.d.ts","sourceRoot":"","sources":["../../src/locales/en_US.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAuBE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zh_CN.d.ts","sourceRoot":"","sources":["../../src/locales/zh_CN.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAuBE"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useMemoizedFn } from 'ahooks';
|
|
2
2
|
import { Dropdown, MenuProps, Tabs } from 'antd';
|
|
3
|
-
import { isRegExp, isString
|
|
4
|
-
import React, { useEffect,
|
|
5
|
-
import { useLocation, useNavigate
|
|
3
|
+
import { isRegExp, isString } from 'lodash';
|
|
4
|
+
import React, { useEffect, useState } from 'react';
|
|
5
|
+
import { matchRoutes, useLocation, useNavigate } from 'react-router-dom';
|
|
6
6
|
|
|
7
7
|
import { useT } from '@creekjs/i18n/react';
|
|
8
8
|
|
|
@@ -23,6 +23,10 @@ export interface CreekKeepAliveProps {
|
|
|
23
23
|
* 最大缓存数量,默认为 20
|
|
24
24
|
*/
|
|
25
25
|
maxTabCount?: number;
|
|
26
|
+
/**
|
|
27
|
+
* 路由配置(含 element),用于解析每个路径对应的页面组件
|
|
28
|
+
*/
|
|
29
|
+
routes?: any[];
|
|
26
30
|
}
|
|
27
31
|
|
|
28
32
|
interface TabItem {
|
|
@@ -32,20 +36,28 @@ interface TabItem {
|
|
|
32
36
|
}
|
|
33
37
|
|
|
34
38
|
export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
|
|
35
|
-
const { exclude = [], getTabTitle, tabBarStyle, maxTabCount = 20 } = props;
|
|
39
|
+
const { exclude = [], getTabTitle, tabBarStyle, maxTabCount = 20, routes = [] } = props;
|
|
36
40
|
|
|
37
41
|
const t = useT();
|
|
38
|
-
const outlet = useOutlet();
|
|
39
42
|
const location = useLocation();
|
|
40
43
|
const navigate = useNavigate();
|
|
41
44
|
|
|
42
45
|
const [tabItems, setTabItems] = useState<TabItem[]>([]);
|
|
43
46
|
const [activeKey, setActiveKey] = useState<string>('');
|
|
44
|
-
const [cachedPages, setCachedPages] = useState<Record<string, React.ReactNode>>({});
|
|
45
47
|
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
// 缓存每个路径对应的 React element,保证同一页面始终复用同一个 element 引用
|
|
49
|
+
// 这样 React reconciler 不会卸载/重新挂载组件,从而实现 keep-alive
|
|
50
|
+
// 使用 state 以便缓存变化时触发重新渲染
|
|
51
|
+
const [cachedElements, setCachedElements] = useState<Record<string, React.ReactNode>>({});
|
|
52
|
+
|
|
53
|
+
// 根据路由配置,解析指定路径对应的叶子路由 element
|
|
54
|
+
const resolveElement = (path: string): React.ReactNode | null => {
|
|
55
|
+
if (!routes?.length) return null;
|
|
56
|
+
const matches = matchRoutes(routes, path);
|
|
57
|
+
if (!matches?.length) return null;
|
|
58
|
+
// 取最后一个 match(叶子路由),即实际页面组件
|
|
59
|
+
return matches[matches.length - 1].route.element ?? null;
|
|
60
|
+
};
|
|
49
61
|
|
|
50
62
|
// 判断是否不需要缓存
|
|
51
63
|
const isPathExcluded = (path: string) => {
|
|
@@ -65,73 +77,60 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
|
|
|
65
77
|
const currentPath = location.pathname;
|
|
66
78
|
setActiveKey(currentPath);
|
|
67
79
|
|
|
68
|
-
//
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
// 缓存当前路径的 element(仅首次缓存,后续复用同一个 element 引用)
|
|
81
|
+
if (!cachedElements[currentPath] && !isPathExcluded(currentPath)) {
|
|
82
|
+
const element = resolveElement(currentPath);
|
|
83
|
+
if (element) {
|
|
84
|
+
setCachedElements((prev) => ({ ...prev, [currentPath]: element }));
|
|
72
85
|
}
|
|
73
|
-
|
|
74
|
-
...prev,
|
|
75
|
-
[currentPath]: outletRef.current,
|
|
76
|
-
};
|
|
77
|
-
});
|
|
86
|
+
}
|
|
78
87
|
|
|
79
88
|
// 更新 Tab 列表
|
|
80
89
|
setTabItems((prev) => {
|
|
81
90
|
if (prev.find((i) => i.key === currentPath)) {
|
|
82
91
|
// 更新现有 tab 的 closable 状态(只有最后一个 tab 时不可关闭)
|
|
83
|
-
|
|
84
|
-
return updated;
|
|
92
|
+
return prev.map((i) => ({ ...i, closable: prev.length > 1 }));
|
|
85
93
|
}
|
|
86
94
|
const title = getTabTitle?.(currentPath) || currentPath;
|
|
87
95
|
const newItems = [...prev, { key: currentPath, label: title, closable: prev.length > 0 }];
|
|
88
96
|
|
|
89
|
-
//
|
|
97
|
+
// 只有1个 tab 时不可关闭
|
|
90
98
|
if (newItems.length === 1) {
|
|
91
99
|
newItems[0].closable = false;
|
|
92
100
|
}
|
|
93
101
|
|
|
94
|
-
//
|
|
102
|
+
// 超过最大数量限制,移除最早的可关闭 tab
|
|
95
103
|
if (newItems.length > maxTabCount) {
|
|
96
|
-
// 找到第一个可以关闭的 Tab(非首页、非当前页)
|
|
97
|
-
// 这里策略是移除最早加入的那个可关闭 Tab。prev[0] 是最早的。
|
|
98
|
-
// 但要注意不要移除当前页(currentPath),虽然 currentPath 是刚加进去的,但在极端情况下(比如 max=1)
|
|
99
|
-
// 简单策略:移除第一个 closable 且 key !== currentPath 的 item
|
|
100
104
|
const indexToRemove = newItems.findIndex((item) => item.closable && item.key !== currentPath);
|
|
101
105
|
if (indexToRemove !== -1) {
|
|
102
106
|
const itemToRemove = newItems[indexToRemove];
|
|
103
|
-
|
|
104
|
-
|
|
107
|
+
setCachedElements((prev) => {
|
|
108
|
+
const next = { ...prev };
|
|
109
|
+
delete next[itemToRemove.key];
|
|
110
|
+
return next;
|
|
111
|
+
});
|
|
105
112
|
newItems.splice(indexToRemove, 1);
|
|
106
113
|
}
|
|
107
114
|
}
|
|
108
115
|
return newItems;
|
|
109
116
|
});
|
|
110
|
-
}, [location.pathname, getTabTitle, maxTabCount]);
|
|
111
|
-
|
|
112
|
-
// 清理不需要缓存的页面
|
|
113
|
-
useEffect(() => {
|
|
114
|
-
// 监听路由离开
|
|
115
|
-
// 这里比较 tricky,因为 useEffect 拿到的 activeKey 已经是新的了
|
|
116
|
-
// 我们需要知道"上一个"路径
|
|
117
|
-
// 简化处理:每次 render 时,检查 pages 里哪些是不需要缓存且不处于 active 状态的,将其移除?
|
|
118
|
-
// 但如果在 setState 里做会导致死循环。
|
|
119
|
-
// 另一种策略:不缓存 = 离开时销毁。
|
|
120
|
-
// 我们可以在 pages 渲染时控制。
|
|
121
|
-
}, []);
|
|
117
|
+
}, [location.pathname, getTabTitle, maxTabCount, cachedElements]);
|
|
122
118
|
|
|
123
119
|
const closeTab = useMemoizedFn((targetKey: string) => {
|
|
124
120
|
const targetIndex = tabItems.findIndex((item) => item.key === targetKey);
|
|
125
121
|
const newTabItems = tabItems.filter((item) => item.key !== targetKey);
|
|
126
122
|
|
|
127
|
-
//
|
|
128
|
-
|
|
123
|
+
// 移除缓存,组件将卸载
|
|
124
|
+
setCachedElements((prev) => {
|
|
125
|
+
const next = { ...prev };
|
|
126
|
+
delete next[targetKey];
|
|
127
|
+
return next;
|
|
128
|
+
});
|
|
129
129
|
setTabItems(newTabItems);
|
|
130
130
|
|
|
131
131
|
// 如果关闭的是当前页,跳转到临近页
|
|
132
132
|
if (targetKey === activeKey) {
|
|
133
133
|
if (newTabItems.length > 0) {
|
|
134
|
-
// 尝试跳到右边,没有则左边
|
|
135
134
|
const nextIndex = targetIndex >= newTabItems.length ? newTabItems.length - 1 : targetIndex;
|
|
136
135
|
const nextKey = newTabItems[nextIndex].key;
|
|
137
136
|
navigate(nextKey);
|
|
@@ -145,13 +144,14 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
|
|
|
145
144
|
const newTabItems = [{ ...currentTab, closable: false }];
|
|
146
145
|
setTabItems(newTabItems);
|
|
147
146
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
147
|
+
// 仅保留当前 tab 的缓存
|
|
148
|
+
const keepKeys = new Set(newTabItems.map((i) => i.key));
|
|
149
|
+
setCachedElements((prev) => {
|
|
150
|
+
const next: Record<string, React.ReactNode> = {};
|
|
151
151
|
keepKeys.forEach((k) => {
|
|
152
|
-
if (prev[k])
|
|
152
|
+
if (prev[k]) next[k] = prev[k];
|
|
153
153
|
});
|
|
154
|
-
return
|
|
154
|
+
return next;
|
|
155
155
|
});
|
|
156
156
|
|
|
157
157
|
if (activeKey !== currentKey) {
|
|
@@ -162,14 +162,19 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
|
|
|
162
162
|
const closeRightTabs = useMemoizedFn((currentKey: string) => {
|
|
163
163
|
const currentIndex = tabItems.findIndex((i) => i.key === currentKey);
|
|
164
164
|
const rightItems = tabItems.slice(currentIndex + 1);
|
|
165
|
-
const rightKeys = rightItems.map((i) => i.key);
|
|
165
|
+
const rightKeys = new Set(rightItems.map((i) => i.key));
|
|
166
166
|
|
|
167
|
-
const newTabItems = tabItems.filter((i) => !rightKeys.
|
|
167
|
+
const newTabItems = tabItems.filter((i) => !rightKeys.has(i.key));
|
|
168
168
|
setTabItems(newTabItems);
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
// 移除右侧 tab 的缓存
|
|
171
|
+
setCachedElements((prev) => {
|
|
172
|
+
const next = { ...prev };
|
|
173
|
+
rightKeys.forEach((key) => { delete next[key]; });
|
|
174
|
+
return next;
|
|
175
|
+
});
|
|
171
176
|
|
|
172
|
-
if (rightKeys.
|
|
177
|
+
if (rightKeys.has(activeKey)) {
|
|
173
178
|
navigate(currentKey);
|
|
174
179
|
}
|
|
175
180
|
});
|
|
@@ -225,12 +230,7 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
|
|
|
225
230
|
label: renderTabLabel(item),
|
|
226
231
|
children: (
|
|
227
232
|
<div key={item.key} style={{ height: '100%', display: activeKey === item.key ? 'block' : 'none' }}>
|
|
228
|
-
{
|
|
229
|
-
{activeKey === item.key
|
|
230
|
-
? outlet
|
|
231
|
-
: !isPathExcluded(item.key)
|
|
232
|
-
? cachedPages[item.key]
|
|
233
|
-
: null}
|
|
233
|
+
{cachedElements[item.key] ?? null}
|
|
234
234
|
</div>
|
|
235
235
|
),
|
|
236
236
|
}))}
|
|
@@ -31,6 +31,7 @@ export type LayoutProps = ProLayoutProps & {
|
|
|
31
31
|
};
|
|
32
32
|
keepAlive?: boolean | CreekKeepAliveProps;
|
|
33
33
|
extraActions?: React.ReactNode[];
|
|
34
|
+
clientRoutes?: any[];
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
const MenuName = ({ name, path }: { name?: string; path?: string }) => {
|
|
@@ -53,6 +54,7 @@ export const CreekLayout = (props: LayoutProps) => {
|
|
|
53
54
|
showThemeColor = true,
|
|
54
55
|
keepAlive = false,
|
|
55
56
|
extraActions = [],
|
|
57
|
+
clientRoutes,
|
|
56
58
|
...more
|
|
57
59
|
} = props;
|
|
58
60
|
|
|
@@ -176,7 +178,7 @@ export const CreekLayout = (props: LayoutProps) => {
|
|
|
176
178
|
{...more}
|
|
177
179
|
>
|
|
178
180
|
<GlobalScrollbarStyle />
|
|
179
|
-
<Exception>{actualKeepAlive ? <CreekKeepAlive getTabTitle={getTabTitle} {...keepAliveProps} /> : children}</Exception>
|
|
181
|
+
<Exception>{actualKeepAlive ? <CreekKeepAlive getTabTitle={getTabTitle} routes={clientRoutes ?? route?.routes} {...keepAliveProps} /> : children}</Exception>
|
|
180
182
|
</ProLayout>
|
|
181
183
|
);
|
|
182
184
|
|