@creekjs/web-components 1.0.15 → 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.
Files changed (55) hide show
  1. package/.turbo/turbo-father$colon$build.log +32 -32
  2. package/dist/creek-config-provider/CreekConfigContext.d.ts.map +1 -0
  3. package/dist/creek-config-provider/CreekI18nProvider.d.ts.map +1 -0
  4. package/dist/creek-config-provider/index.d.ts.map +1 -0
  5. package/dist/creek-hooks/index.d.ts.map +1 -0
  6. package/dist/creek-hooks/useApp/DrawerHelper.d.ts.map +1 -0
  7. package/dist/creek-hooks/useApp/ModalHelper.d.ts.map +1 -0
  8. package/dist/creek-hooks/useApp/index.d.ts.map +1 -0
  9. package/dist/creek-hooks/useApp/types.d.ts.map +1 -0
  10. package/dist/creek-hooks/useViewportHeight.d.ts.map +1 -0
  11. package/dist/creek-icon/index.d.ts.map +1 -0
  12. package/dist/creek-keep-alive/index.d.ts +4 -0
  13. package/dist/creek-keep-alive/index.d.ts.map +1 -0
  14. package/dist/creek-keep-alive/index.js +43 -28
  15. package/dist/creek-keep-alive/index.js.map +3 -3
  16. package/dist/creek-layout/ActionRender/FullScreen.d.ts.map +1 -0
  17. package/dist/creek-layout/ActionRender/LayoutSettings.d.ts.map +1 -0
  18. package/dist/creek-layout/ActionRender/UserInfo.d.ts.map +1 -0
  19. package/dist/creek-layout/ActionRender/index.d.ts.map +1 -0
  20. package/dist/creek-layout/CollapseButton.d.ts.map +1 -0
  21. package/dist/creek-layout/Exception/NotFound.d.ts.map +1 -0
  22. package/dist/creek-layout/Exception/NotFoundPage.d.ts.map +1 -0
  23. package/dist/creek-layout/Exception/index.d.ts.map +1 -0
  24. package/dist/creek-layout/index.d.ts +1 -0
  25. package/dist/creek-layout/index.d.ts.map +1 -0
  26. package/dist/creek-layout/index.js +2 -1
  27. package/dist/creek-layout/index.js.map +2 -2
  28. package/dist/creek-layout/useLayoutSettingsStore.d.ts.map +1 -0
  29. package/dist/creek-loading/index.d.ts.map +1 -0
  30. package/dist/creek-locale-button/index.d.ts.map +1 -0
  31. package/dist/creek-page-container/index.d.ts.map +1 -0
  32. package/dist/creek-style/index.d.ts.map +1 -0
  33. package/dist/creek-style/scrollbar.d.ts.map +1 -0
  34. package/dist/creek-table/SearchTable.d.ts.map +1 -0
  35. package/dist/creek-table/components/DensityIcon.d.ts.map +1 -0
  36. package/dist/creek-table/components/EllipsisTooltip.d.ts.map +1 -0
  37. package/dist/creek-table/components/index.d.ts.map +1 -0
  38. package/dist/creek-table/hooks/index.d.ts.map +1 -0
  39. package/dist/creek-table/hooks/useAdaptiveToolBar.d.ts.map +1 -0
  40. package/dist/creek-table/hooks/useAutoWidthColumns.d.ts.map +1 -0
  41. package/dist/creek-table/hooks/useElementDistance.d.ts.map +1 -0
  42. package/dist/creek-table/hooks/useEllipsisColumns.d.ts.map +1 -0
  43. package/dist/creek-table/hooks/useIndexColumn.d.ts.map +1 -0
  44. package/dist/creek-table/hooks/useResizableColumns.d.ts.map +1 -0
  45. package/dist/creek-table/hooks/useStatusColumns.d.ts.map +1 -0
  46. package/dist/creek-table/hooks/useTableOptions.d.ts.map +1 -0
  47. package/dist/creek-table/hooks/useTableScrollHeight.d.ts.map +1 -0
  48. package/dist/creek-table/index.d.ts.map +1 -0
  49. package/dist/creek-table/type.d.ts.map +1 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/locales/en_US.d.ts.map +1 -0
  52. package/dist/locales/zh_CN.d.ts.map +1 -0
  53. package/package.json +1 -1
  54. package/src/creek-keep-alive/index.tsx +58 -51
  55. package/src/creek-layout/index.tsx +3 -1
@@ -1,54 +1,54 @@
1
1
 
2
2
  
3
- > @creekjs/web-components@1.0.14 father:build /Users/ernestwang/Documents/code-resoorce/creek/packages/web-components
3
+ > @creekjs/web-components@1.0.15 father:build /Users/ernestwang/Documents/code-resoorce/creek/packages/web-components
4
4
  > father build
5
5
 
6
6
  info - Clean output directories
7
7
  info - Bundless for src directory to cjs format
8
8
  event - Bundless CreekConfigContext.tsx to dist/creek-config-provider/CreekConfigContext.js (with declaration)
9
- event - Bundless useViewportHeight.tsx to dist/creek-hooks/useViewportHeight.js (with declaration)
10
- event - Bundless type.ts to dist/creek-table/type.js (with declaration)
11
- event - Bundless useIndexColumn.tsx to dist/creek-table/hooks/useIndexColumn.js (with declaration)
12
- event - Bundless NotFoundPage.tsx to dist/creek-layout/Exception/NotFoundPage.js (with declaration)
13
- event - Bundless useTableOptions.tsx to dist/creek-table/hooks/useTableOptions.js (with declaration)
9
+ event - Bundless index.tsx to dist/creek-config-provider/index.js (with declaration)
10
+ event - Bundless ModalHelper.tsx to dist/creek-hooks/useApp/ModalHelper.js (with declaration)
11
+ event - Bundless index.ts to dist/creek-hooks/index.js (with declaration)
12
+ event - Bundless index.tsx to dist/creek-hooks/useApp/index.js (with declaration)
13
+ event - Bundless index.tsx to dist/creek-icon/index.js (with declaration)
14
14
  event - Bundless types.ts to dist/creek-hooks/useApp/types.js (with declaration)
15
- event - Bundless useEllipsisColumns.tsx to dist/creek-table/hooks/useEllipsisColumns.js (with declaration)
16
15
  event - Bundless DrawerHelper.tsx to dist/creek-hooks/useApp/DrawerHelper.js (with declaration)
17
- event - Bundless useElementDistance.tsx to dist/creek-table/hooks/useElementDistance.js (with declaration)
18
- event - Bundless useLayoutSettingsStore.ts to dist/creek-layout/useLayoutSettingsStore.js (with declaration)
16
+ event - Bundless useViewportHeight.tsx to dist/creek-hooks/useViewportHeight.js (with declaration)
17
+ event - Bundless FullScreen.tsx to dist/creek-layout/ActionRender/FullScreen.js (with declaration)
18
+ event - Bundless CreekI18nProvider.tsx to dist/creek-config-provider/CreekI18nProvider.js (with declaration)
19
+ event - Bundless index.tsx to dist/creek-layout/ActionRender/index.js (with declaration)
19
20
  event - Bundless UserInfo.tsx to dist/creek-layout/ActionRender/UserInfo.js (with declaration)
20
21
  event - Bundless NotFound.tsx to dist/creek-layout/Exception/NotFound.js (with declaration)
21
22
  event - Bundless index.tsx to dist/creek-layout/Exception/index.js (with declaration)
22
- event - Bundless scrollbar.ts to dist/creek-style/scrollbar.js (with declaration)
23
- event - Bundless index.tsx to dist/creek-table/components/index.js (with declaration)
23
+ event - Bundless NotFoundPage.tsx to dist/creek-layout/Exception/NotFoundPage.js (with declaration)
24
24
  event - Bundless index.ts to dist/creek-style/index.js (with declaration)
25
- event - Bundless index.tsx to dist/creek-layout/ActionRender/index.js (with declaration)
26
- event - Bundless useTableScrollHeight.tsx to dist/creek-table/hooks/useTableScrollHeight.js (with declaration)
25
+ event - Bundless LayoutSettings.tsx to dist/creek-layout/ActionRender/LayoutSettings.js (with declaration)
26
+ event - Bundless index.tsx to dist/creek-layout/index.js (with declaration)
27
+ event - Bundless index.tsx to dist/creek-page-container/index.js (with declaration)
28
+ event - Bundless useLayoutSettingsStore.ts to dist/creek-layout/useLayoutSettingsStore.js (with declaration)
29
+ event - Bundless scrollbar.ts to dist/creek-style/scrollbar.js (with declaration)
27
30
  event - Bundless DensityIcon.tsx to dist/creek-table/components/DensityIcon.js (with declaration)
31
+ event - Bundless index.tsx to dist/creek-loading/index.js (with declaration)
28
32
  event - Bundless index.tsx to dist/creek-locale-button/index.js (with declaration)
33
+ event - Bundless index.tsx to dist/creek-table/components/index.js (with declaration)
34
+ event - Bundless useElementDistance.tsx to dist/creek-table/hooks/useElementDistance.js (with declaration)
29
35
  event - Bundless useAdaptiveToolBar.tsx to dist/creek-table/hooks/useAdaptiveToolBar.js (with declaration)
30
- event - Bundless CreekI18nProvider.tsx to dist/creek-config-provider/CreekI18nProvider.js (with declaration)
31
- event - Bundless ModalHelper.tsx to dist/creek-hooks/useApp/ModalHelper.js (with declaration)
36
+ event - Bundless useIndexColumn.tsx to dist/creek-table/hooks/useIndexColumn.js (with declaration)
37
+ event - Bundless EllipsisTooltip.tsx to dist/creek-table/components/EllipsisTooltip.js (with declaration)
38
+ event - Bundless useAutoWidthColumns.tsx to dist/creek-table/hooks/useAutoWidthColumns.js (with declaration)
39
+ event - Bundless useEllipsisColumns.tsx to dist/creek-table/hooks/useEllipsisColumns.js (with declaration)
40
+ event - Bundless useTableOptions.tsx to dist/creek-table/hooks/useTableOptions.js (with declaration)
41
+ event - Bundless index.ts to dist/creek-table/hooks/index.js (with declaration)
32
42
  event - Bundless index.tsx to dist/creek-table/index.js (with declaration)
33
- event - Bundless zh_CN.ts to dist/locales/zh_CN.js (with declaration)
34
- event - Bundless FullScreen.tsx to dist/creek-layout/ActionRender/FullScreen.js (with declaration)
35
- event - Bundless index.ts to dist/creek-hooks/index.js (with declaration)
36
- event - Bundless CollapseButton.tsx to dist/creek-layout/CollapseButton.js (with declaration)
43
+ event - Bundless useTableScrollHeight.tsx to dist/creek-table/hooks/useTableScrollHeight.js (with declaration)
44
+ event - Bundless type.ts to dist/creek-table/type.js (with declaration)
37
45
  event - Bundless index.tsx to dist/index.js (with declaration)
46
+ event - Bundless SearchTable.tsx to dist/creek-table/SearchTable.js (with declaration)
47
+ event - Bundless zh_CN.ts to dist/locales/zh_CN.js (with declaration)
38
48
  event - Bundless en_US.ts to dist/locales/en_US.js (with declaration)
39
- event - Bundless index.tsx to dist/creek-page-container/index.js (with declaration)
40
- event - Bundless index.tsx to dist/creek-config-provider/index.js (with declaration)
41
- event - Bundless useAutoWidthColumns.tsx to dist/creek-table/hooks/useAutoWidthColumns.js (with declaration)
42
- event - Bundless index.tsx to dist/creek-hooks/useApp/index.js (with declaration)
43
- event - Bundless index.tsx to dist/creek-loading/index.js (with declaration)
44
- event - Bundless index.tsx to dist/creek-keep-alive/index.js (with declaration)
45
- event - Bundless index.tsx to dist/creek-icon/index.js (with declaration)
49
+ event - Bundless CollapseButton.tsx to dist/creek-layout/CollapseButton.js (with declaration)
46
50
  event - Bundless useStatusColumns.tsx to dist/creek-table/hooks/useStatusColumns.js (with declaration)
47
- event - Bundless SearchTable.tsx to dist/creek-table/SearchTable.js (with declaration)
48
- event - Bundless LayoutSettings.tsx to dist/creek-layout/ActionRender/LayoutSettings.js (with declaration)
49
- event - Bundless index.ts to dist/creek-table/hooks/index.js (with declaration)
50
- event - Bundless EllipsisTooltip.tsx to dist/creek-table/components/EllipsisTooltip.js (with declaration)
51
- event - Bundless index.tsx to dist/creek-layout/index.js (with declaration)
52
51
  event - Bundless useResizableColumns.tsx to dist/creek-table/hooks/useResizableColumns.js (with declaration)
52
+ event - Bundless index.tsx to dist/creek-keep-alive/index.js (with declaration)
53
53
  event - Generate declaration files...
54
- event - Transformed successfully in 6931 ms (45 files)
54
+ event - Transformed successfully in 3562 ms (45 files)
@@ -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"}
@@ -16,5 +16,9 @@ export interface CreekKeepAliveProps {
16
16
  * 最大缓存数量,默认为 20
17
17
  */
18
18
  maxTabCount?: number;
19
+ /**
20
+ * 路由配置(含 element),用于解析每个路径对应的页面组件
21
+ */
22
+ routes?: any[];
19
23
  }
20
24
  export declare const CreekKeepAlive: React.FC<CreekKeepAliveProps>;
@@ -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,14 +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 [cachedPages, setCachedPages] = (0, import_react.useState)({});
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
+ };
41
48
  const isPathExcluded = (path) => {
42
49
  return exclude.some((item) => {
43
50
  if ((0, import_lodash.isString)(item)) {
@@ -52,19 +59,15 @@ var CreekKeepAlive = (props) => {
52
59
  (0, import_react.useEffect)(() => {
53
60
  const currentPath = location.pathname;
54
61
  setActiveKey(currentPath);
55
- setCachedPages((prev) => {
56
- if (prev[currentPath]) {
57
- return prev;
62
+ if (!cachedElements[currentPath] && !isPathExcluded(currentPath)) {
63
+ const element = resolveElement(currentPath);
64
+ if (element) {
65
+ setCachedElements((prev) => ({ ...prev, [currentPath]: element }));
58
66
  }
59
- return {
60
- ...prev,
61
- [currentPath]: outlet
62
- };
63
- });
67
+ }
64
68
  setTabItems((prev) => {
65
69
  if (prev.find((i) => i.key === currentPath)) {
66
- const updated = prev.map((i) => ({ ...i, closable: prev.length > 1 }));
67
- return updated;
70
+ return prev.map((i) => ({ ...i, closable: prev.length > 1 }));
68
71
  }
69
72
  const title = (getTabTitle == null ? void 0 : getTabTitle(currentPath)) || currentPath;
70
73
  const newItems = [...prev, { key: currentPath, label: title, closable: prev.length > 0 }];
@@ -75,19 +78,25 @@ var CreekKeepAlive = (props) => {
75
78
  const indexToRemove = newItems.findIndex((item) => item.closable && item.key !== currentPath);
76
79
  if (indexToRemove !== -1) {
77
80
  const itemToRemove = newItems[indexToRemove];
78
- setCachedPages((currentCached) => (0, import_lodash.omit)(currentCached, [itemToRemove.key]));
81
+ setCachedElements((prev2) => {
82
+ const next = { ...prev2 };
83
+ delete next[itemToRemove.key];
84
+ return next;
85
+ });
79
86
  newItems.splice(indexToRemove, 1);
80
87
  }
81
88
  }
82
89
  return newItems;
83
90
  });
84
- }, [location.pathname, outlet, getTabTitle, maxTabCount]);
85
- (0, import_react.useEffect)(() => {
86
- }, []);
91
+ }, [location.pathname, getTabTitle, maxTabCount, cachedElements]);
87
92
  const closeTab = (0, import_ahooks.useMemoizedFn)((targetKey) => {
88
93
  const targetIndex = tabItems.findIndex((item) => item.key === targetKey);
89
94
  const newTabItems = tabItems.filter((item) => item.key !== targetKey);
90
- setCachedPages((prev) => (0, import_lodash.omit)(prev, [targetKey]));
95
+ setCachedElements((prev) => {
96
+ const next = { ...prev };
97
+ delete next[targetKey];
98
+ return next;
99
+ });
91
100
  setTabItems(newTabItems);
92
101
  if (targetKey === activeKey) {
93
102
  if (newTabItems.length > 0) {
@@ -103,14 +112,14 @@ var CreekKeepAlive = (props) => {
103
112
  return;
104
113
  const newTabItems = [{ ...currentTab, closable: false }];
105
114
  setTabItems(newTabItems);
106
- const keepKeys = newTabItems.map((i) => i.key);
107
- setCachedPages((prev) => {
108
- const newCachedPages = {};
115
+ const keepKeys = new Set(newTabItems.map((i) => i.key));
116
+ setCachedElements((prev) => {
117
+ const next = {};
109
118
  keepKeys.forEach((k) => {
110
119
  if (prev[k])
111
- newCachedPages[k] = prev[k];
120
+ next[k] = prev[k];
112
121
  });
113
- return newCachedPages;
122
+ return next;
114
123
  });
115
124
  if (activeKey !== currentKey) {
116
125
  navigate(currentKey);
@@ -119,11 +128,17 @@ var CreekKeepAlive = (props) => {
119
128
  const closeRightTabs = (0, import_ahooks.useMemoizedFn)((currentKey) => {
120
129
  const currentIndex = tabItems.findIndex((i) => i.key === currentKey);
121
130
  const rightItems = tabItems.slice(currentIndex + 1);
122
- const rightKeys = rightItems.map((i) => i.key);
123
- const newTabItems = tabItems.filter((i) => !rightKeys.includes(i.key));
131
+ const rightKeys = new Set(rightItems.map((i) => i.key));
132
+ const newTabItems = tabItems.filter((i) => !rightKeys.has(i.key));
124
133
  setTabItems(newTabItems);
125
- setCachedPages((prev) => (0, import_lodash.omit)(prev, rightKeys));
126
- if (rightKeys.includes(activeKey)) {
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)) {
127
142
  navigate(currentKey);
128
143
  }
129
144
  });
@@ -168,7 +183,7 @@ var CreekKeepAlive = (props) => {
168
183
  items: tabItems.map((item) => ({
169
184
  ...item,
170
185
  label: renderTabLabel(item),
171
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { height: "100%", display: activeKey === item.key ? "block" : "none" }, children: !isPathExcluded(item.key) || activeKey === item.key ? cachedPages[item.key] : null }, item.key)
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)
172
187
  }))
173
188
  }
174
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, omit } from 'lodash';\nimport React, { useEffect, useState } from 'react';\nimport { useLocation, useNavigate, useOutlet } 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\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 } = props;\n\n const t = useT();\n const outlet = useOutlet();\n const location = useLocation();\n const navigate = useNavigate();\n\n const [tabItems, setTabItems] = useState<TabItem[]>([]);\n const [activeKey, setActiveKey] = useState<string>('');\n const [cachedPages, setCachedPages] = useState<Record<string, React.ReactNode>>({});\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 // 更新页面内容缓存\n setCachedPages((prev) => {\n if (prev[currentPath]) {\n return prev;\n }\n return {\n ...prev,\n [currentPath]: outlet,\n };\n });\n\n // 更新 Tab 列表\n setTabItems((prev) => {\n if (prev.find((i) => i.key === currentPath)) {\n // 更新现有 tab 的 closable 状态(只有最后一个 tab 时不可关闭)\n const updated = prev.map((i) => ({ ...i, closable: prev.length > 1 }));\n return updated;\n }\n const title = getTabTitle?.(currentPath) || currentPath;\n const newItems = [...prev, { key: currentPath, label: title, closable: prev.length > 0 }];\n\n // 更新所有 tab 的 closable 状态:只有1个 tab 时全部不可关闭\n if (newItems.length === 1) {\n newItems[0].closable = false;\n }\n\n // 超过最大数量限制\n if (newItems.length > maxTabCount) {\n // 找到第一个可以关闭的 Tab(非首页、非当前页)\n // 这里策略是移除最早加入的那个可关闭 Tab。prev[0] 是最早的。\n // 但要注意不要移除当前页(currentPath),虽然 currentPath 是刚加进去的,但在极端情况下(比如 max=1)\n // 简单策略:移除第一个 closable 且 key !== currentPath 的 item\n const indexToRemove = newItems.findIndex((item) => item.closable && item.key !== currentPath);\n if (indexToRemove !== -1) {\n const itemToRemove = newItems[indexToRemove];\n // 顺便移除缓存\n setCachedPages((currentCached) => omit(currentCached, [itemToRemove.key]));\n newItems.splice(indexToRemove, 1);\n }\n }\n return newItems;\n });\n }, [location.pathname, outlet, getTabTitle, maxTabCount]);\n\n // 清理不需要缓存的页面\n useEffect(() => {\n // 监听路由离开\n // 这里比较 tricky,因为 useEffect 拿到的 activeKey 已经是新的了\n // 我们需要知道\"上一个\"路径\n // 简化处理:每次 render 时,检查 pages 里哪些是不需要缓存且不处于 active 状态的,将其移除?\n // 但如果在 setState 里做会导致死循环。\n // 另一种策略:不缓存 = 离开时销毁。\n // 我们可以在 pages 渲染时控制。\n }, []);\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 setCachedPages((prev) => omit(prev, [targetKey]));\n setTabItems(newTabItems);\n\n // 如果关闭的是当前页,跳转到临近页\n if (targetKey === activeKey) {\n if (newTabItems.length > 0) {\n // 尝试跳到右边,没有则左边\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 const keepKeys = newTabItems.map((i) => i.key);\n setCachedPages((prev) => {\n const newCachedPages: Record<string, React.ReactNode> = {};\n keepKeys.forEach((k) => {\n if (prev[k]) newCachedPages[k] = prev[k];\n });\n return newCachedPages;\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 = rightItems.map((i) => i.key);\n\n const newTabItems = tabItems.filter((i) => !rightKeys.includes(i.key));\n setTabItems(newTabItems);\n\n setCachedPages((prev) => omit(prev, rightKeys));\n\n if (rightKeys.includes(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 {/* 如果是不缓存的页面,且不是当前页,则不渲染(销毁) */}\n {/* 如果是缓存页面,或者是当前页,则渲染 */}\n {!isPathExcluded(item.key) || activeKey === item.key ? cachedPages[item.key] : null}\n </div>\n ),\n }))}\n />\n </div>\n );\n};\n"],
5
- "mappings": "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",
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": "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",
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@creekjs/web-components",
3
- "version": "1.0.15",
3
+ "version": "1.0.17",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "keywords": [],
@@ -1,8 +1,8 @@
1
1
  import { useMemoizedFn } from 'ahooks';
2
2
  import { Dropdown, MenuProps, Tabs } from 'antd';
3
- import { isRegExp, isString, omit } from 'lodash';
3
+ import { isRegExp, isString } from 'lodash';
4
4
  import React, { useEffect, useState } from 'react';
5
- import { useLocation, useNavigate, useOutlet } from 'react-router-dom';
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,16 +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>>({});
47
+
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
+ };
45
61
 
46
62
  // 判断是否不需要缓存
47
63
  const isPathExcluded = (path: string) => {
@@ -61,73 +77,60 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
61
77
  const currentPath = location.pathname;
62
78
  setActiveKey(currentPath);
63
79
 
64
- // 更新页面内容缓存
65
- setCachedPages((prev) => {
66
- if (prev[currentPath]) {
67
- return prev;
80
+ // 缓存当前路径的 element(仅首次缓存,后续复用同一个 element 引用)
81
+ if (!cachedElements[currentPath] && !isPathExcluded(currentPath)) {
82
+ const element = resolveElement(currentPath);
83
+ if (element) {
84
+ setCachedElements((prev) => ({ ...prev, [currentPath]: element }));
68
85
  }
69
- return {
70
- ...prev,
71
- [currentPath]: outlet,
72
- };
73
- });
86
+ }
74
87
 
75
88
  // 更新 Tab 列表
76
89
  setTabItems((prev) => {
77
90
  if (prev.find((i) => i.key === currentPath)) {
78
91
  // 更新现有 tab 的 closable 状态(只有最后一个 tab 时不可关闭)
79
- const updated = prev.map((i) => ({ ...i, closable: prev.length > 1 }));
80
- return updated;
92
+ return prev.map((i) => ({ ...i, closable: prev.length > 1 }));
81
93
  }
82
94
  const title = getTabTitle?.(currentPath) || currentPath;
83
95
  const newItems = [...prev, { key: currentPath, label: title, closable: prev.length > 0 }];
84
96
 
85
- // 更新所有 tab 的 closable 状态:只有1个 tab 时全部不可关闭
97
+ // 只有1个 tab 时不可关闭
86
98
  if (newItems.length === 1) {
87
99
  newItems[0].closable = false;
88
100
  }
89
101
 
90
- // 超过最大数量限制
102
+ // 超过最大数量限制,移除最早的可关闭 tab
91
103
  if (newItems.length > maxTabCount) {
92
- // 找到第一个可以关闭的 Tab(非首页、非当前页)
93
- // 这里策略是移除最早加入的那个可关闭 Tab。prev[0] 是最早的。
94
- // 但要注意不要移除当前页(currentPath),虽然 currentPath 是刚加进去的,但在极端情况下(比如 max=1)
95
- // 简单策略:移除第一个 closable 且 key !== currentPath 的 item
96
104
  const indexToRemove = newItems.findIndex((item) => item.closable && item.key !== currentPath);
97
105
  if (indexToRemove !== -1) {
98
106
  const itemToRemove = newItems[indexToRemove];
99
- // 顺便移除缓存
100
- setCachedPages((currentCached) => omit(currentCached, [itemToRemove.key]));
107
+ setCachedElements((prev) => {
108
+ const next = { ...prev };
109
+ delete next[itemToRemove.key];
110
+ return next;
111
+ });
101
112
  newItems.splice(indexToRemove, 1);
102
113
  }
103
114
  }
104
115
  return newItems;
105
116
  });
106
- }, [location.pathname, outlet, getTabTitle, maxTabCount]);
107
-
108
- // 清理不需要缓存的页面
109
- useEffect(() => {
110
- // 监听路由离开
111
- // 这里比较 tricky,因为 useEffect 拿到的 activeKey 已经是新的了
112
- // 我们需要知道"上一个"路径
113
- // 简化处理:每次 render 时,检查 pages 里哪些是不需要缓存且不处于 active 状态的,将其移除?
114
- // 但如果在 setState 里做会导致死循环。
115
- // 另一种策略:不缓存 = 离开时销毁。
116
- // 我们可以在 pages 渲染时控制。
117
- }, []);
117
+ }, [location.pathname, getTabTitle, maxTabCount, cachedElements]);
118
118
 
119
119
  const closeTab = useMemoizedFn((targetKey: string) => {
120
120
  const targetIndex = tabItems.findIndex((item) => item.key === targetKey);
121
121
  const newTabItems = tabItems.filter((item) => item.key !== targetKey);
122
122
 
123
- // 移除缓存
124
- setCachedPages((prev) => omit(prev, [targetKey]));
123
+ // 移除缓存,组件将卸载
124
+ setCachedElements((prev) => {
125
+ const next = { ...prev };
126
+ delete next[targetKey];
127
+ return next;
128
+ });
125
129
  setTabItems(newTabItems);
126
130
 
127
131
  // 如果关闭的是当前页,跳转到临近页
128
132
  if (targetKey === activeKey) {
129
133
  if (newTabItems.length > 0) {
130
- // 尝试跳到右边,没有则左边
131
134
  const nextIndex = targetIndex >= newTabItems.length ? newTabItems.length - 1 : targetIndex;
132
135
  const nextKey = newTabItems[nextIndex].key;
133
136
  navigate(nextKey);
@@ -141,13 +144,14 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
141
144
  const newTabItems = [{ ...currentTab, closable: false }];
142
145
  setTabItems(newTabItems);
143
146
 
144
- const keepKeys = newTabItems.map((i) => i.key);
145
- setCachedPages((prev) => {
146
- const newCachedPages: Record<string, React.ReactNode> = {};
147
+ // 仅保留当前 tab 的缓存
148
+ const keepKeys = new Set(newTabItems.map((i) => i.key));
149
+ setCachedElements((prev) => {
150
+ const next: Record<string, React.ReactNode> = {};
147
151
  keepKeys.forEach((k) => {
148
- if (prev[k]) newCachedPages[k] = prev[k];
152
+ if (prev[k]) next[k] = prev[k];
149
153
  });
150
- return newCachedPages;
154
+ return next;
151
155
  });
152
156
 
153
157
  if (activeKey !== currentKey) {
@@ -158,14 +162,19 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
158
162
  const closeRightTabs = useMemoizedFn((currentKey: string) => {
159
163
  const currentIndex = tabItems.findIndex((i) => i.key === currentKey);
160
164
  const rightItems = tabItems.slice(currentIndex + 1);
161
- const rightKeys = rightItems.map((i) => i.key);
165
+ const rightKeys = new Set(rightItems.map((i) => i.key));
162
166
 
163
- const newTabItems = tabItems.filter((i) => !rightKeys.includes(i.key));
167
+ const newTabItems = tabItems.filter((i) => !rightKeys.has(i.key));
164
168
  setTabItems(newTabItems);
165
169
 
166
- setCachedPages((prev) => omit(prev, rightKeys));
170
+ // 移除右侧 tab 的缓存
171
+ setCachedElements((prev) => {
172
+ const next = { ...prev };
173
+ rightKeys.forEach((key) => { delete next[key]; });
174
+ return next;
175
+ });
167
176
 
168
- if (rightKeys.includes(activeKey)) {
177
+ if (rightKeys.has(activeKey)) {
169
178
  navigate(currentKey);
170
179
  }
171
180
  });
@@ -221,9 +230,7 @@ export const CreekKeepAlive: React.FC<CreekKeepAliveProps> = (props) => {
221
230
  label: renderTabLabel(item),
222
231
  children: (
223
232
  <div key={item.key} style={{ height: '100%', display: activeKey === item.key ? 'block' : 'none' }}>
224
- {/* 如果是不缓存的页面,且不是当前页,则不渲染(销毁) */}
225
- {/* 如果是缓存页面,或者是当前页,则渲染 */}
226
- {!isPathExcluded(item.key) || activeKey === item.key ? cachedPages[item.key] : null}
233
+ {cachedElements[item.key] ?? null}
227
234
  </div>
228
235
  ),
229
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