@creekjs/web-components 1.0.5 → 1.0.7

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 (162) hide show
  1. package/.turbo/turbo-father$colon$build.log +32 -16
  2. package/README.md +117 -66
  3. package/dist/creek-config-provider/CreekConfigContext.d.ts +4 -0
  4. package/dist/creek-config-provider/CreekConfigContext.js.map +2 -2
  5. package/dist/creek-config-provider/CreekI18nProvider.d.ts +22 -0
  6. package/dist/creek-config-provider/CreekI18nProvider.js +92 -0
  7. package/dist/creek-config-provider/CreekI18nProvider.js.map +7 -0
  8. package/dist/creek-config-provider/index.d.ts +5 -3
  9. package/dist/creek-config-provider/index.js +47 -4
  10. package/dist/creek-config-provider/index.js.map +3 -3
  11. package/dist/creek-hooks/useApp/index.d.ts +3 -3
  12. package/dist/creek-keep-alive/index.d.ts +24 -1
  13. package/dist/creek-keep-alive/index.js +141 -4
  14. package/dist/creek-keep-alive/index.js.map +2 -2
  15. package/dist/creek-layout/ActionRender/FullScreen.js +3 -1
  16. package/dist/creek-layout/ActionRender/FullScreen.js.map +2 -2
  17. package/dist/creek-layout/ActionRender/LayoutSettings.d.ts +5 -0
  18. package/dist/creek-layout/ActionRender/LayoutSettings.js +73 -0
  19. package/dist/creek-layout/ActionRender/LayoutSettings.js.map +7 -0
  20. package/dist/creek-layout/ActionRender/UserInfo.js.map +2 -2
  21. package/dist/creek-layout/ActionRender/index.d.ts +1 -0
  22. package/dist/creek-layout/ActionRender/index.js +3 -0
  23. package/dist/creek-layout/ActionRender/index.js.map +2 -2
  24. package/dist/creek-layout/index.d.ts +5 -5
  25. package/dist/creek-layout/index.js +79 -16
  26. package/dist/creek-layout/index.js.map +3 -3
  27. package/dist/creek-layout/useLayoutSettingsStore.d.ts +20 -0
  28. package/dist/creek-layout/useLayoutSettingsStore.js +45 -0
  29. package/dist/creek-layout/useLayoutSettingsStore.js.map +7 -0
  30. package/dist/creek-locale-button/index.d.ts +1 -0
  31. package/dist/creek-locale-button/index.js +66 -0
  32. package/dist/creek-locale-button/index.js.map +7 -0
  33. package/dist/creek-page-container/index.d.ts +4 -0
  34. package/dist/creek-page-container/index.js +68 -0
  35. package/dist/creek-page-container/index.js.map +7 -0
  36. package/dist/creek-style/index.d.ts +1 -0
  37. package/dist/creek-style/index.js +24 -0
  38. package/dist/creek-style/index.js.map +7 -0
  39. package/dist/creek-style/scrollbar.d.ts +2 -0
  40. package/dist/creek-style/scrollbar.js +55 -0
  41. package/dist/creek-style/scrollbar.js.map +7 -0
  42. package/dist/creek-table/SearchTable.d.ts +9 -0
  43. package/dist/creek-table/SearchTable.js +109 -72
  44. package/dist/creek-table/SearchTable.js.map +3 -3
  45. package/dist/creek-table/components/DensityIcon.d.ts +9 -0
  46. package/dist/creek-table/components/DensityIcon.js +77 -0
  47. package/dist/creek-table/components/DensityIcon.js.map +7 -0
  48. package/dist/creek-table/components/EllipsisTooltip.d.ts +9 -0
  49. package/dist/creek-table/components/EllipsisTooltip.js +122 -0
  50. package/dist/creek-table/components/EllipsisTooltip.js.map +7 -0
  51. package/dist/creek-table/components/index.d.ts +2 -0
  52. package/dist/creek-table/components/index.js +26 -0
  53. package/dist/creek-table/components/index.js.map +7 -0
  54. package/dist/creek-table/hooks/index.d.ts +5 -0
  55. package/dist/creek-table/hooks/index.js +10 -0
  56. package/dist/creek-table/hooks/index.js.map +2 -2
  57. package/dist/creek-table/hooks/useAutoWidthColumns.d.ts +1 -1
  58. package/dist/creek-table/hooks/useAutoWidthColumns.js +76 -17
  59. package/dist/creek-table/hooks/useAutoWidthColumns.js.map +2 -2
  60. package/dist/creek-table/hooks/useEllipsisColumns.d.ts +8 -0
  61. package/dist/creek-table/hooks/useEllipsisColumns.js +58 -0
  62. package/dist/creek-table/hooks/useEllipsisColumns.js.map +7 -0
  63. package/dist/creek-table/hooks/useIndexColumn.d.ts +2 -0
  64. package/dist/creek-table/hooks/useIndexColumn.js +52 -0
  65. package/dist/creek-table/hooks/useIndexColumn.js.map +7 -0
  66. package/dist/creek-table/hooks/useResizableColumns.d.ts +20 -0
  67. package/dist/creek-table/hooks/useResizableColumns.js +279 -0
  68. package/dist/creek-table/hooks/useResizableColumns.js.map +7 -0
  69. package/dist/creek-table/hooks/useStatusColumns.d.ts +2 -0
  70. package/dist/creek-table/hooks/useStatusColumns.js +215 -0
  71. package/dist/creek-table/hooks/useStatusColumns.js.map +7 -0
  72. package/dist/creek-table/hooks/useTableOptions.d.ts +15 -0
  73. package/dist/creek-table/hooks/useTableOptions.js +78 -0
  74. package/dist/creek-table/hooks/useTableOptions.js.map +7 -0
  75. package/dist/creek-table/hooks/useTableScrollHeight.d.ts +6 -1
  76. package/dist/creek-table/hooks/useTableScrollHeight.js +44 -5
  77. package/dist/creek-table/hooks/useTableScrollHeight.js.map +2 -2
  78. package/dist/creek-table/type.d.ts +4 -6
  79. package/dist/creek-table/type.js.map +1 -1
  80. package/dist/index.d.ts +4 -0
  81. package/dist/index.js +8 -0
  82. package/dist/index.js.map +2 -2
  83. package/dist/locales/en-US.d.ts +25 -0
  84. package/dist/locales/en-US.js +49 -0
  85. package/dist/locales/en-US.js.map +7 -0
  86. package/dist/locales/zh-CN.d.ts +25 -0
  87. package/dist/locales/zh-CN.js +49 -0
  88. package/dist/locales/zh-CN.js.map +7 -0
  89. package/dist/utils/i18n.d.ts +2 -0
  90. package/dist/utils/i18n.js +34 -0
  91. package/dist/utils/i18n.js.map +7 -0
  92. package/i18n.config.ts +27 -0
  93. package/package.json +22 -8
  94. package/src/creek-config-provider/CreekConfigContext.tsx +5 -1
  95. package/src/creek-config-provider/CreekI18nProvider.tsx +87 -0
  96. package/src/creek-config-provider/index.tsx +53 -4
  97. package/src/creek-keep-alive/index.tsx +225 -6
  98. package/src/creek-layout/ActionRender/FullScreen.tsx +10 -6
  99. package/src/creek-layout/ActionRender/LayoutSettings.tsx +67 -0
  100. package/src/creek-layout/ActionRender/UserInfo.tsx +1 -1
  101. package/src/creek-layout/ActionRender/index.tsx +1 -0
  102. package/src/creek-layout/index.tsx +89 -22
  103. package/src/creek-layout/useLayoutSettingsStore.ts +25 -0
  104. package/src/creek-locale-button/index.tsx +42 -0
  105. package/src/creek-page-container/index.tsx +32 -0
  106. package/src/creek-style/index.ts +1 -0
  107. package/src/creek-style/scrollbar.ts +29 -0
  108. package/src/creek-table/SearchTable.tsx +125 -72
  109. package/src/creek-table/components/DensityIcon.tsx +63 -0
  110. package/src/creek-table/components/EllipsisTooltip.tsx +116 -0
  111. package/src/creek-table/components/index.tsx +3 -0
  112. package/src/creek-table/hooks/index.ts +5 -1
  113. package/src/creek-table/hooks/useAutoWidthColumns.tsx +93 -19
  114. package/src/creek-table/hooks/useEllipsisColumns.tsx +47 -0
  115. package/src/creek-table/hooks/useIndexColumn.tsx +27 -0
  116. package/src/creek-table/hooks/useResizableColumns.tsx +323 -0
  117. package/src/creek-table/hooks/useStatusColumns.tsx +252 -0
  118. package/src/creek-table/hooks/useTableOptions.tsx +81 -0
  119. package/src/creek-table/hooks/useTableScrollHeight.tsx +61 -6
  120. package/src/creek-table/type.ts +5 -7
  121. package/src/index.tsx +4 -0
  122. package/src/locales/en-US.ts +24 -0
  123. package/src/locales/zh-CN.ts +24 -0
  124. package/src/utils/i18n.ts +4 -0
  125. package/dist/creek-config-provider/CreekConfigContext.d.ts.map +0 -1
  126. package/dist/creek-config-provider/index.d.ts.map +0 -1
  127. package/dist/creek-hooks/index.d.ts.map +0 -1
  128. package/dist/creek-hooks/useApp/DrawerHelper.d.ts.map +0 -1
  129. package/dist/creek-hooks/useApp/ModalHelper.d.ts.map +0 -1
  130. package/dist/creek-hooks/useApp/index.d.ts.map +0 -1
  131. package/dist/creek-hooks/useApp/types.d.ts.map +0 -1
  132. package/dist/creek-hooks/useViewportHeight.d.ts.map +0 -1
  133. package/dist/creek-icon/index.d.ts.map +0 -1
  134. package/dist/creek-keep-alive/index.d.ts.map +0 -1
  135. package/dist/creek-layout/ActionRender/FullScreen.d.ts.map +0 -1
  136. package/dist/creek-layout/ActionRender/UserInfo.d.ts.map +0 -1
  137. package/dist/creek-layout/ActionRender/index.d.ts.map +0 -1
  138. package/dist/creek-layout/CollapseButton.d.ts.map +0 -1
  139. package/dist/creek-layout/Exception/NotFound.d.ts.map +0 -1
  140. package/dist/creek-layout/Exception/NotFoundPage.d.ts.map +0 -1
  141. package/dist/creek-layout/Exception/index.d.ts.map +0 -1
  142. package/dist/creek-layout/index.d.ts.map +0 -1
  143. package/dist/creek-loading/index.d.ts.map +0 -1
  144. package/dist/creek-table/SearchTable.d.ts.map +0 -1
  145. package/dist/creek-table/TableOptionRender.d.ts +0 -9
  146. package/dist/creek-table/TableOptionRender.d.ts.map +0 -1
  147. package/dist/creek-table/TableOptionRender.js +0 -74
  148. package/dist/creek-table/TableOptionRender.js.map +0 -7
  149. package/dist/creek-table/hooks/index.d.ts.map +0 -1
  150. package/dist/creek-table/hooks/useAdaptiveToolBar.d.ts.map +0 -1
  151. package/dist/creek-table/hooks/useAutoWidthColumns.d.ts.map +0 -1
  152. package/dist/creek-table/hooks/useElementDistance.d.ts.map +0 -1
  153. package/dist/creek-table/hooks/useTableScrollHeight.d.ts.map +0 -1
  154. package/dist/creek-table/index.d.ts.map +0 -1
  155. package/dist/creek-table/toolBarRender.d.ts +0 -5
  156. package/dist/creek-table/toolBarRender.d.ts.map +0 -1
  157. package/dist/creek-table/toolBarRender.js +0 -58
  158. package/dist/creek-table/toolBarRender.js.map +0 -7
  159. package/dist/creek-table/type.d.ts.map +0 -1
  160. package/dist/index.d.ts.map +0 -1
  161. package/src/creek-table/TableOptionRender.tsx +0 -57
  162. package/src/creek-table/toolBarRender.tsx +0 -28
@@ -22,14 +22,151 @@ __export(creek_keep_alive_exports, {
22
22
  CreekKeepAlive: () => CreekKeepAlive
23
23
  });
24
24
  module.exports = __toCommonJS(creek_keep_alive_exports);
25
+ var import_ahooks = require("ahooks");
26
+ var import_antd = require("antd");
27
+ var import_lodash = require("lodash");
25
28
  var import_react = require("react");
29
+ var import_react_router_dom = require("react-router-dom");
30
+ var import_i18n = require("../utils/i18n");
26
31
  var import_jsx_runtime = require("react/jsx-runtime");
27
- var CreekKeepAlive = () => {
28
- const [isMounted, setIsMounted] = (0, import_react.useState)(false);
32
+ var CreekKeepAlive = (props) => {
33
+ const { exclude = [], getTabTitle, homePath = "/", tabBarStyle, maxTabCount = 20 } = props;
34
+ const t = (0, import_i18n.useT)();
35
+ const outlet = (0, import_react_router_dom.useOutlet)();
36
+ const location = (0, import_react_router_dom.useLocation)();
37
+ const navigate = (0, import_react_router_dom.useNavigate)();
38
+ const [tabItems, setTabItems] = (0, import_react.useState)([]);
39
+ const [activeKey, setActiveKey] = (0, import_react.useState)("");
40
+ const [cachedPages, setCachedPages] = (0, import_react.useState)({});
41
+ const isPathExcluded = (path) => {
42
+ return exclude.some((item) => {
43
+ if ((0, import_lodash.isString)(item)) {
44
+ return item === path;
45
+ }
46
+ if ((0, import_lodash.isRegExp)(item)) {
47
+ return item.test(path);
48
+ }
49
+ return false;
50
+ });
51
+ };
52
+ (0, import_react.useEffect)(() => {
53
+ const currentPath = location.pathname;
54
+ setActiveKey(currentPath);
55
+ setCachedPages((prev) => {
56
+ if (prev[currentPath]) {
57
+ return prev;
58
+ }
59
+ return {
60
+ ...prev,
61
+ [currentPath]: outlet
62
+ };
63
+ });
64
+ setTabItems((prev) => {
65
+ if (prev.find((i) => i.key === currentPath)) {
66
+ return prev;
67
+ }
68
+ const title = (getTabTitle == null ? void 0 : getTabTitle(currentPath)) || currentPath;
69
+ const newItems = [...prev, { key: currentPath, label: title, closable: currentPath !== homePath }];
70
+ if (newItems.length > maxTabCount) {
71
+ const indexToRemove = newItems.findIndex((item) => item.closable && item.key !== currentPath);
72
+ if (indexToRemove !== -1) {
73
+ const itemToRemove = newItems[indexToRemove];
74
+ setCachedPages((currentCached) => (0, import_lodash.omit)(currentCached, [itemToRemove.key]));
75
+ newItems.splice(indexToRemove, 1);
76
+ }
77
+ }
78
+ return newItems;
79
+ });
80
+ }, [location.pathname, outlet, getTabTitle, homePath, maxTabCount]);
29
81
  (0, import_react.useEffect)(() => {
30
- setIsMounted(true);
31
82
  }, []);
32
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: "KeepAlive" });
83
+ const closeTab = (0, import_ahooks.useMemoizedFn)((targetKey) => {
84
+ const targetIndex = tabItems.findIndex((item) => item.key === targetKey);
85
+ const newTabItems = tabItems.filter((item) => item.key !== targetKey);
86
+ setCachedPages((prev) => (0, import_lodash.omit)(prev, [targetKey]));
87
+ setTabItems(newTabItems);
88
+ if (targetKey === activeKey) {
89
+ if (newTabItems.length > 0) {
90
+ const nextIndex = targetIndex >= newTabItems.length ? newTabItems.length - 1 : targetIndex;
91
+ const nextKey = newTabItems[nextIndex].key;
92
+ navigate(nextKey);
93
+ } else {
94
+ navigate(homePath);
95
+ }
96
+ }
97
+ });
98
+ const closeOtherTabs = (0, import_ahooks.useMemoizedFn)((currentKey) => {
99
+ const newTabItems = tabItems.filter((item) => item.key === currentKey || item.key === homePath);
100
+ setTabItems(newTabItems);
101
+ const keepKeys = newTabItems.map((i) => i.key);
102
+ setCachedPages((prev) => {
103
+ const newCachedPages = {};
104
+ keepKeys.forEach((k) => {
105
+ if (prev[k])
106
+ newCachedPages[k] = prev[k];
107
+ });
108
+ return newCachedPages;
109
+ });
110
+ if (activeKey !== currentKey) {
111
+ navigate(currentKey);
112
+ }
113
+ });
114
+ const closeRightTabs = (0, import_ahooks.useMemoizedFn)((currentKey) => {
115
+ const currentIndex = tabItems.findIndex((i) => i.key === currentKey);
116
+ const rightItems = tabItems.slice(currentIndex + 1);
117
+ const rightKeys = rightItems.map((i) => i.key);
118
+ const newTabItems = tabItems.filter((i) => !rightKeys.includes(i.key));
119
+ setTabItems(newTabItems);
120
+ setCachedPages((prev) => (0, import_lodash.omit)(prev, rightKeys));
121
+ if (rightKeys.includes(activeKey)) {
122
+ navigate(currentKey);
123
+ }
124
+ });
125
+ const handleTabEdit = (targetKey, action) => {
126
+ if (action === "remove" && (0, import_lodash.isString)(targetKey)) {
127
+ closeTab(targetKey);
128
+ }
129
+ };
130
+ const handleTabClick = (key) => {
131
+ navigate(key);
132
+ };
133
+ const renderTabLabel = (item) => {
134
+ const menuItems = [
135
+ {
136
+ key: "close",
137
+ label: t("creek-keep-alive.index.guanBiDangQian", "关闭当前"),
138
+ disabled: item.key === homePath,
139
+ onClick: () => closeTab(item.key)
140
+ },
141
+ {
142
+ key: "closeOthers",
143
+ label: t("creek-keep-alive.index.guanBiQiTa", "关闭其他"),
144
+ onClick: () => closeOtherTabs(item.key)
145
+ },
146
+ {
147
+ key: "closeRight",
148
+ label: t("creek-keep-alive.index.guanBiYouCe", "关闭右侧"),
149
+ onClick: () => closeRightTabs(item.key)
150
+ }
151
+ ];
152
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Dropdown, { menu: { items: menuItems }, trigger: ["contextMenu"], children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: item.label }) });
153
+ };
154
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "creek-keep-alive", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
155
+ import_antd.Tabs,
156
+ {
157
+ activeKey,
158
+ type: "editable-card",
159
+ hideAdd: true,
160
+ onChange: handleTabClick,
161
+ onEdit: handleTabEdit,
162
+ tabBarStyle: { margin: 0, ...tabBarStyle },
163
+ items: tabItems.map((item) => ({
164
+ ...item,
165
+ label: renderTabLabel(item),
166
+ 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)
167
+ }))
168
+ }
169
+ ) });
33
170
  };
34
171
  // Annotate the CommonJS export names for ESM import in node:
35
172
  0 && (module.exports = {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/creek-keep-alive/index.tsx"],
4
- "sourcesContent": ["import { useEffect, useState } from 'react';\n\nexport const CreekKeepAlive = () => {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n return <div>KeepAlive</div>;\n};"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAoC;AAS3B;AAPF,IAAM,iBAAiB,MAAM;AAClC,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAEhD,8BAAU,MAAM;AACd,iBAAa,IAAI;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,SAAO,4CAAC,SAAI,uBAAS;AACvB;",
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 '@/utils/i18n';\n\nexport interface CreekKeepAliveProps {\n /**\n * 不需要缓存的路径\n */\n exclude?: (string | RegExp)[];\n /**\n * 自定义Tab标题获取方法\n */\n getTabTitle?: (pathname: string) => React.ReactNode;\n /**\n * 默认首页路径\n */\n homePath?: string;\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, homePath = '/', 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 return prev;\n }\n const title = getTabTitle?.(currentPath) || currentPath;\n const newItems = [...prev, { key: currentPath, label: title, closable: currentPath !== homePath }];\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, homePath, 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 } else {\n navigate(homePath);\n }\n }\n });\n\n const closeOtherTabs = useMemoizedFn((currentKey: string) => {\n const newTabItems = tabItems.filter((item) => item.key === currentKey || item.key === homePath);\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: item.key === homePath,\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
6
  "names": []
7
7
  }
@@ -27,6 +27,7 @@ var import_icons = require("@ant-design/icons");
27
27
  var import_ahooks = require("ahooks");
28
28
  var import_antd = require("antd");
29
29
  var import_zustand = require("zustand");
30
+ var import_i18n = require("../../utils/i18n");
30
31
  var import_jsx_runtime = require("react/jsx-runtime");
31
32
  var useFullScreenStore = (0, import_zustand.create)((set, get) => {
32
33
  return {
@@ -40,13 +41,14 @@ var useFullScreenStore = (0, import_zustand.create)((set, get) => {
40
41
  };
41
42
  });
42
43
  var FullScreen = () => {
44
+ const t = (0, import_i18n.useT)();
43
45
  const [, { toggleFullscreen }] = (0, import_ahooks.useFullscreen)(document.body);
44
46
  const { isFullScreen, changeFullScreen } = useFullScreenStore.getState();
45
47
  const handleFullScreen = (0, import_ahooks.useMemoizedFn)(() => {
46
48
  toggleFullscreen();
47
49
  changeFullScreen();
48
50
  });
49
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: isFullScreen ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: "退出全屏", placement: "top", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.FullscreenExitOutlined, { onClick: handleFullScreen }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: "全屏", placement: "top", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.FullscreenOutlined, { onClick: handleFullScreen }) }) });
51
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: isFullScreen ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: t("creek-layout.ActionRender.FullScreen.tuiChuQuanPing", "退出全屏"), placement: "top", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.FullscreenExitOutlined, { onClick: handleFullScreen }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: t("creek-layout.ActionRender.FullScreen.quanPing", "全屏"), placement: "top", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.FullscreenOutlined, { onClick: handleFullScreen }) }) });
50
52
  };
51
53
  // Annotate the CommonJS export names for ESM import in node:
52
54
  0 && (module.exports = {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/creek-layout/ActionRender/FullScreen.tsx"],
4
- "sourcesContent": ["import { FullscreenExitOutlined, FullscreenOutlined } from \"@ant-design/icons\";\nimport { useFullscreen, useMemoizedFn } from \"ahooks\";\nimport { Tooltip } from \"antd\";\nimport { create } from \"zustand\";\n\nexport type FullScreenStore = {\n isFullScreen: boolean;\n changeFullScreen: () => void;\n};\n\nexport const useFullScreenStore = create<FullScreenStore>((set, get) => {\n return {\n isFullScreen: false,\n changeFullScreen: () => {\n const _isFullScreen = get().isFullScreen;\n set({\n isFullScreen: !_isFullScreen,\n });\n },\n };\n});\n\nexport const FullScreen = () => {\n const [, { toggleFullscreen }] = useFullscreen(document.body);\n\n const { isFullScreen, changeFullScreen } = useFullScreenStore.getState();\n\n const handleFullScreen = useMemoizedFn(() => {\n toggleFullscreen();\n changeFullScreen();\n });\n\n return (\n <>\n {isFullScreen ? (\n <Tooltip title=\"退出全屏\" placement=\"top\">\n <FullscreenExitOutlined onClick={handleFullScreen} />\n </Tooltip>\n ) : (\n <Tooltip title=\"全屏\" placement=\"top\">\n <FullscreenOutlined onClick={handleFullScreen} />\n </Tooltip>\n )}\n </>\n );\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA2D;AAC3D,oBAA6C;AAC7C,kBAAwB;AACxB,qBAAuB;AA8BnB;AAvBG,IAAM,yBAAqB,uBAAwB,CAAC,KAAK,QAAQ;AACtE,SAAO;AAAA,IACL,cAAc;AAAA,IACd,kBAAkB,MAAM;AACtB,YAAM,gBAAgB,IAAI,EAAE;AAC5B,UAAI;AAAA,QACF,cAAc,CAAC;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAEM,IAAM,aAAa,MAAM;AAC9B,QAAM,CAAC,EAAE,EAAE,iBAAiB,CAAC,QAAI,6BAAc,SAAS,IAAI;AAE5D,QAAM,EAAE,cAAc,iBAAiB,IAAI,mBAAmB,SAAS;AAEvE,QAAM,uBAAmB,6BAAc,MAAM;AAC3C,qBAAiB;AACjB,qBAAiB;AAAA,EACnB,CAAC;AAED,SACE,2EACG,yBACC,4CAAC,uBAAQ,OAAM,QAAO,WAAU,OAC9B,sDAAC,uCAAuB,SAAS,kBAAkB,GACrD,IAEA,4CAAC,uBAAQ,OAAM,MAAK,WAAU,OAC5B,sDAAC,mCAAmB,SAAS,kBAAkB,GACjD,GAEJ;AAEJ;",
4
+ "sourcesContent": ["import { FullscreenExitOutlined, FullscreenOutlined } from '@ant-design/icons';\nimport { useFullscreen, useMemoizedFn } from 'ahooks';\nimport { Tooltip } from 'antd';\n\nimport { create } from 'zustand';\n\nimport { useT } from '@/utils/i18n';\n\nexport type FullScreenStore = {\n isFullScreen: boolean;\n changeFullScreen: () => void;\n};\n\nexport const useFullScreenStore = create<FullScreenStore>((set, get) => {\n return {\n isFullScreen: false,\n changeFullScreen: () => {\n const _isFullScreen = get().isFullScreen;\n set({\n isFullScreen: !_isFullScreen,\n });\n },\n };\n});\n\nexport const FullScreen = () => {\n const t = useT();\n const [, { toggleFullscreen }] = useFullscreen(document.body);\n\n const { isFullScreen, changeFullScreen } = useFullScreenStore.getState();\n\n const handleFullScreen = useMemoizedFn(() => {\n toggleFullscreen();\n changeFullScreen();\n });\n\n return (\n <>\n {isFullScreen ? (\n <Tooltip title={t('creek-layout.ActionRender.FullScreen.tuiChuQuanPing', '退出全屏')} placement=\"top\">\n <FullscreenExitOutlined onClick={handleFullScreen} />\n </Tooltip>\n ) : (\n <Tooltip title={t('creek-layout.ActionRender.FullScreen.quanPing', '全屏')} placement=\"top\">\n <FullscreenOutlined onClick={handleFullScreen} />\n </Tooltip>\n )}\n </>\n );\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA2D;AAC3D,oBAA6C;AAC7C,kBAAwB;AAExB,qBAAuB;AAEvB,kBAAqB;AA+BjB;AAxBG,IAAM,yBAAqB,uBAAwB,CAAC,KAAK,QAAQ;AACtE,SAAO;AAAA,IACL,cAAc;AAAA,IACd,kBAAkB,MAAM;AACtB,YAAM,gBAAgB,IAAI,EAAE;AAC5B,UAAI;AAAA,QACF,cAAc,CAAC;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAEM,IAAM,aAAa,MAAM;AAC9B,QAAM,QAAI,kBAAK;AACf,QAAM,CAAC,EAAE,EAAE,iBAAiB,CAAC,QAAI,6BAAc,SAAS,IAAI;AAE5D,QAAM,EAAE,cAAc,iBAAiB,IAAI,mBAAmB,SAAS;AAEvE,QAAM,uBAAmB,6BAAc,MAAM;AAC3C,qBAAiB;AACjB,qBAAiB;AAAA,EACnB,CAAC;AAED,SACE,2EACG,yBACC,4CAAC,uBAAQ,OAAO,EAAE,uDAAuD,MAAM,GAAG,WAAU,OAC1F,sDAAC,uCAAuB,SAAS,kBAAkB,GACrD,IAEA,4CAAC,uBAAQ,OAAO,EAAE,iDAAiD,IAAI,GAAG,WAAU,OAClF,sDAAC,mCAAmB,SAAS,kBAAkB,GACjD,GAEJ;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,5 @@
1
+ export declare const LayoutSettings: ({ defaultShowFullScreen, defaultShowLocaleButton, defaultKeepAlive, }: {
2
+ defaultShowFullScreen?: boolean | undefined;
3
+ defaultShowLocaleButton?: boolean | undefined;
4
+ defaultKeepAlive?: boolean | undefined;
5
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,73 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/creek-layout/ActionRender/LayoutSettings.tsx
20
+ var LayoutSettings_exports = {};
21
+ __export(LayoutSettings_exports, {
22
+ LayoutSettings: () => LayoutSettings
23
+ });
24
+ module.exports = __toCommonJS(LayoutSettings_exports);
25
+ var import_icons = require("@ant-design/icons");
26
+ var import_antd = require("antd");
27
+ var import_react = require("@creekjs/i18n/react");
28
+ var import_creek_hooks = require("../../creek-hooks");
29
+ var import_useLayoutSettingsStore = require("../useLayoutSettingsStore");
30
+ var import_jsx_runtime = require("react/jsx-runtime");
31
+ var SettingsForm = ({ defaultShowFullScreen, defaultShowLocaleButton, defaultKeepAlive }) => {
32
+ const t = (0, import_react.useT)();
33
+ const { colorPrimary, showFullScreen, showLocaleButton, keepAlive, setSettings } = (0, import_useLayoutSettingsStore.useLayoutSettingsStore)();
34
+ const currentShowFullScreen = showFullScreen ?? defaultShowFullScreen ?? false;
35
+ const currentShowLocaleButton = showLocaleButton ?? defaultShowLocaleButton ?? true;
36
+ const currentKeepAlive = keepAlive ?? defaultKeepAlive ?? true;
37
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_antd.Form, { layout: "vertical", children: [
38
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: t("creek-layout.ActionRender.LayoutSettings.themeColor", "主题色"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
39
+ import_antd.ColorPicker,
40
+ {
41
+ value: colorPrimary,
42
+ onChange: (color, hex) => {
43
+ setSettings({ colorPrimary: hex || void 0 });
44
+ },
45
+ allowClear: true
46
+ }
47
+ ) }),
48
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: t("creek-layout.ActionRender.LayoutSettings.showFullScreen", "展示全屏按钮"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Switch, { checked: currentShowFullScreen, onChange: (checked) => setSettings({ showFullScreen: checked }) }) }),
49
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: t("creek-layout.ActionRender.LayoutSettings.showLocaleButton", "展示国际化按钮"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Switch, { checked: currentShowLocaleButton, onChange: (checked) => setSettings({ showLocaleButton: checked }) }) }),
50
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Form.Item, { label: t("creek-layout.ActionRender.LayoutSettings.keepAlive", "开启页面缓存 (Keep Alive)"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Switch, { checked: currentKeepAlive, onChange: (checked) => setSettings({ keepAlive: checked }) }) })
51
+ ] });
52
+ };
53
+ var LayoutSettings = ({
54
+ defaultShowFullScreen,
55
+ defaultShowLocaleButton,
56
+ defaultKeepAlive
57
+ }) => {
58
+ const t = (0, import_react.useT)();
59
+ const { drawer } = (0, import_creek_hooks.useApp)();
60
+ const handleOpenSettings = () => {
61
+ drawer.open({
62
+ title: t("creek-layout.ActionRender.LayoutSettings.title", "系统设置"),
63
+ placement: "right",
64
+ content: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SettingsForm, { defaultShowFullScreen, defaultShowLocaleButton, defaultKeepAlive })
65
+ });
66
+ };
67
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_antd.Tooltip, { title: t("creek-layout.ActionRender.LayoutSettings.title", "系统设置"), placement: "top", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.SettingOutlined, { onClick: handleOpenSettings }) });
68
+ };
69
+ // Annotate the CommonJS export names for ESM import in node:
70
+ 0 && (module.exports = {
71
+ LayoutSettings
72
+ });
73
+ //# sourceMappingURL=LayoutSettings.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/creek-layout/ActionRender/LayoutSettings.tsx"],
4
+ "sourcesContent": ["import { SettingOutlined } from '@ant-design/icons';\nimport { ColorPicker, Form, Switch, Tooltip } from 'antd';\n\nimport { useT } from '@creekjs/i18n/react';\n\nimport { useApp } from '../../creek-hooks';\nimport { useLayoutSettingsStore } from '../useLayoutSettingsStore';\n\nconst SettingsForm = ({ defaultShowFullScreen, defaultShowLocaleButton, defaultKeepAlive }: { defaultShowFullScreen?: boolean; defaultShowLocaleButton?: boolean; defaultKeepAlive?: boolean }) => {\n const t = useT();\n const { colorPrimary, showFullScreen, showLocaleButton, keepAlive, setSettings } = useLayoutSettingsStore();\n\n const currentShowFullScreen = showFullScreen ?? defaultShowFullScreen ?? false;\n const currentShowLocaleButton = showLocaleButton ?? defaultShowLocaleButton ?? true;\n const currentKeepAlive = keepAlive ?? defaultKeepAlive ?? true;\n\n return (\n <Form layout=\"vertical\">\n <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.themeColor', '主题色')}>\n <ColorPicker\n value={colorPrimary}\n onChange={(color, hex) => {\n setSettings({ colorPrimary: hex || undefined });\n }}\n allowClear\n />\n </Form.Item>\n <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.showFullScreen', '展示全屏按钮')}>\n <Switch checked={currentShowFullScreen} onChange={(checked) => setSettings({ showFullScreen: checked })} />\n </Form.Item>\n <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.showLocaleButton', '展示国际化按钮')}>\n <Switch checked={currentShowLocaleButton} onChange={(checked) => setSettings({ showLocaleButton: checked })} />\n </Form.Item>\n <Form.Item label={t('creek-layout.ActionRender.LayoutSettings.keepAlive', '开启页面缓存 (Keep Alive)')}>\n <Switch checked={currentKeepAlive} onChange={(checked) => setSettings({ keepAlive: checked })} />\n </Form.Item>\n </Form>\n );\n};\n\nexport const LayoutSettings = ({\n defaultShowFullScreen,\n defaultShowLocaleButton,\n defaultKeepAlive,\n}: {\n defaultShowFullScreen?: boolean;\n defaultShowLocaleButton?: boolean;\n defaultKeepAlive?: boolean;\n}) => {\n const t = useT();\n const { drawer } = useApp();\n\n const handleOpenSettings = () => {\n drawer.open({\n title: t('creek-layout.ActionRender.LayoutSettings.title', '系统设置'),\n placement: 'right',\n\n content: <SettingsForm defaultShowFullScreen={defaultShowFullScreen} defaultShowLocaleButton={defaultShowLocaleButton} defaultKeepAlive={defaultKeepAlive} />,\n });\n };\n\n return (\n <Tooltip title={t('creek-layout.ActionRender.LayoutSettings.title', '系统设置')} placement=\"top\">\n <SettingOutlined onClick={handleOpenSettings} />\n </Tooltip>\n );\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAgC;AAChC,kBAAmD;AAEnD,mBAAqB;AAErB,yBAAuB;AACvB,oCAAuC;AAWnC;AATJ,IAAM,eAAe,CAAC,EAAE,uBAAuB,yBAAyB,iBAAiB,MAA0G;AACjM,QAAM,QAAI,mBAAK;AACf,QAAM,EAAE,cAAc,gBAAgB,kBAAkB,WAAW,YAAY,QAAI,sDAAuB;AAE1G,QAAM,wBAAwB,kBAAkB,yBAAyB;AACzE,QAAM,0BAA0B,oBAAoB,2BAA2B;AAC/E,QAAM,mBAAmB,aAAa,oBAAoB;AAE1D,SACE,6CAAC,oBAAK,QAAO,YACX;AAAA,gDAAC,iBAAK,MAAL,EAAU,OAAO,EAAE,uDAAuD,KAAK,GAC9E;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU,CAAC,OAAO,QAAQ;AACxB,sBAAY,EAAE,cAAc,OAAO,OAAU,CAAC;AAAA,QAChD;AAAA,QACA,YAAU;AAAA;AAAA,IACZ,GACF;AAAA,IACA,4CAAC,iBAAK,MAAL,EAAU,OAAO,EAAE,2DAA2D,QAAQ,GACrF,sDAAC,sBAAO,SAAS,uBAAuB,UAAU,CAAC,YAAY,YAAY,EAAE,gBAAgB,QAAQ,CAAC,GAAG,GAC3G;AAAA,IACA,4CAAC,iBAAK,MAAL,EAAU,OAAO,EAAE,6DAA6D,SAAS,GACxF,sDAAC,sBAAO,SAAS,yBAAyB,UAAU,CAAC,YAAY,YAAY,EAAE,kBAAkB,QAAQ,CAAC,GAAG,GAC/G;AAAA,IACA,4CAAC,iBAAK,MAAL,EAAU,OAAO,EAAE,sDAAsD,qBAAqB,GAC7F,sDAAC,sBAAO,SAAS,kBAAkB,UAAU,CAAC,YAAY,YAAY,EAAE,WAAW,QAAQ,CAAC,GAAG,GACjG;AAAA,KACF;AAEJ;AAEO,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,QAAM,QAAI,mBAAK;AACf,QAAM,EAAE,OAAO,QAAI,2BAAO;AAE1B,QAAM,qBAAqB,MAAM;AAC/B,WAAO,KAAK;AAAA,MACV,OAAO,EAAE,kDAAkD,MAAM;AAAA,MACjE,WAAW;AAAA,MAEX,SAAS,4CAAC,gBAAa,uBAA8C,yBAAkD,kBAAoC;AAAA,IAC7J,CAAC;AAAA,EACH;AAEA,SACE,4CAAC,uBAAQ,OAAO,EAAE,kDAAkD,MAAM,GAAG,WAAU,OACrF,sDAAC,gCAAgB,SAAS,oBAAoB,GAChD;AAEJ;",
6
+ "names": []
7
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/creek-layout/ActionRender/UserInfo.tsx"],
4
- "sourcesContent": ["import { Avatar, Dropdown, DropDownProps, Space } from \"antd\";\nimport { createStyles } from \"antd-style\";\n\nconst useStyles = createStyles(({ token }) => ({\n avatarContainer: {\n backgroundColor: token.colorPrimary,\n width: 24,\n height: 24,\n },\n userInfoDropdownOverlay: {\n \".ant-dropdown-menu\": {\n padding: \"8px 0\",\n },\n \".ant-dropdown-menu-item\": {\n \".ant-dropdown-menu-item-icon\": {\n fontSize: \"18px\",\n marginRight: \"8px\",\n },\n },\n },\n}));\n\nexport interface UserInfoProps {\n name?: React.ReactNode;\n avatar?: string;\n menu?: DropDownProps['menu'];\n}\n\nexport const UserInfo = (props: UserInfoProps) => {\n const { styles } = useStyles();\n const { name, avatar, menu } = props;\n\n return (\n <Dropdown arrow placement=\"bottom\" overlayClassName={styles.userInfoDropdownOverlay} menu={menu}>\n <Space size={4} align=\"center\">\n <Avatar className={styles.avatarContainer} src={avatar}>\n {name}\n </Avatar>\n <span>{name}</span>\n </Space>\n </Dropdown>\n );\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAuD;AACvD,wBAA6B;AAiCvB;AA/BN,IAAM,gBAAY,gCAAa,CAAC,EAAE,MAAM,OAAO;AAAA,EAC7C,iBAAiB;AAAA,IACf,iBAAiB,MAAM;AAAA,IACvB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,yBAAyB;AAAA,IACvB,sBAAsB;AAAA,MACpB,SAAS;AAAA,IACX;AAAA,IACA,2BAA2B;AAAA,MACzB,gCAAgC;AAAA,QAC9B,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF,EAAE;AAQK,IAAM,WAAW,CAAC,UAAyB;AAChD,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,EAAE,MAAM,QAAQ,KAAK,IAAI;AAE/B,SACE,4CAAC,wBAAS,OAAK,MAAC,WAAU,UAAS,kBAAkB,OAAO,yBAAyB,MACnF,uDAAC,qBAAM,MAAM,GAAG,OAAM,UACpB;AAAA,gDAAC,sBAAO,WAAW,OAAO,iBAAiB,KAAK,QAC7C,gBACH;AAAA,IACA,4CAAC,UAAM,gBAAK;AAAA,KACd,GACF;AAEJ;",
4
+ "sourcesContent": ["import { Avatar, Dropdown, DropDownProps, Space } from \"antd\";\nimport { createStyles } from \"antd-style\";\n\nconst useStyles = createStyles(({ token}) => ({\n avatarContainer: {\n backgroundColor: token.colorPrimary,\n width: 24,\n height: 24,\n },\n userInfoDropdownOverlay: {\n \".ant-dropdown-menu\": {\n padding: \"8px 0\",\n },\n \".ant-dropdown-menu-item\": {\n \".ant-dropdown-menu-item-icon\": {\n fontSize: \"18px\",\n marginRight: \"8px\",\n },\n },\n },\n}));\n\nexport interface UserInfoProps {\n name?: React.ReactNode;\n avatar?: string;\n menu?: DropDownProps['menu'];\n}\n\nexport const UserInfo = (props: UserInfoProps) => {\n const { styles } = useStyles();\n const { name, avatar, menu } = props;\n\n return (\n <Dropdown arrow placement=\"bottom\" overlayClassName={styles.userInfoDropdownOverlay} menu={menu}>\n <Space size={4} align=\"center\">\n <Avatar className={styles.avatarContainer} src={avatar}>\n {name}\n </Avatar>\n <span>{name}</span>\n </Space>\n </Dropdown>\n );\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAuD;AACvD,wBAA6B;AAiCvB;AA/BN,IAAM,gBAAY,gCAAa,CAAC,EAAE,MAAK,OAAO;AAAA,EAC5C,iBAAiB;AAAA,IACf,iBAAiB,MAAM;AAAA,IACvB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,yBAAyB;AAAA,IACvB,sBAAsB;AAAA,MACpB,SAAS;AAAA,IACX;AAAA,IACA,2BAA2B;AAAA,MACzB,gCAAgC;AAAA,QAC9B,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF,EAAE;AAQK,IAAM,WAAW,CAAC,UAAyB;AAChD,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,EAAE,MAAM,QAAQ,KAAK,IAAI;AAE/B,SACE,4CAAC,wBAAS,OAAK,MAAC,WAAU,UAAS,kBAAkB,OAAO,yBAAyB,MACnF,uDAAC,qBAAM,MAAM,GAAG,OAAM,UACpB;AAAA,gDAAC,sBAAO,WAAW,OAAO,iBAAiB,KAAK,QAC7C,gBACH;AAAA,IACA,4CAAC,UAAM,gBAAK;AAAA,KACd,GACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,3 @@
1
1
  export { FullScreen } from './FullScreen';
2
2
  export { UserInfo } from './UserInfo';
3
+ export { LayoutSettings } from './LayoutSettings';
@@ -20,14 +20,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  var ActionRender_exports = {};
21
21
  __export(ActionRender_exports, {
22
22
  FullScreen: () => import_FullScreen.FullScreen,
23
+ LayoutSettings: () => import_LayoutSettings.LayoutSettings,
23
24
  UserInfo: () => import_UserInfo.UserInfo
24
25
  });
25
26
  module.exports = __toCommonJS(ActionRender_exports);
26
27
  var import_FullScreen = require("./FullScreen");
27
28
  var import_UserInfo = require("./UserInfo");
29
+ var import_LayoutSettings = require("./LayoutSettings");
28
30
  // Annotate the CommonJS export names for ESM import in node:
29
31
  0 && (module.exports = {
30
32
  FullScreen,
33
+ LayoutSettings,
31
34
  UserInfo
32
35
  });
33
36
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/creek-layout/ActionRender/index.tsx"],
4
- "sourcesContent": ["export { FullScreen } from './FullScreen';\nexport { UserInfo } from './UserInfo';\n\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA2B;AAC3B,sBAAyB;",
4
+ "sourcesContent": ["export { FullScreen } from './FullScreen';\nexport { UserInfo } from './UserInfo';\nexport { LayoutSettings } from './LayoutSettings';\n\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA2B;AAC3B,sBAAyB;AACzB,4BAA+B;",
6
6
  "names": []
7
7
  }
@@ -1,20 +1,20 @@
1
1
  /// <reference types="react" />
2
2
  import { ProLayoutProps } from '@ant-design/pro-components';
3
+ import { CreekKeepAliveProps } from '../creek-keep-alive';
3
4
  export type LayoutProps = ProLayoutProps & {
4
5
  runtimeConfig: ProLayoutProps;
5
6
  userConfig?: ProLayoutProps;
6
7
  navigate?: (path?: string | number) => void;
7
8
  showFullScreen?: boolean;
8
- userInfo?: {
9
- name?: React.ReactNode;
10
- avatar?: string;
11
- menu?: any;
12
- };
9
+ showLocaleButton?: boolean;
10
+ showSettingsButton?: boolean;
13
11
  initialInfo?: {
14
12
  initialState: any;
15
13
  loading: boolean;
16
14
  setInitialState: () => void;
17
15
  };
16
+ keepAlive?: boolean | CreekKeepAliveProps;
17
+ extraActions?: React.ReactNode[];
18
18
  };
19
19
  export declare const CreekLayout: (props: LayoutProps) => import("react/jsx-runtime").JSX.Element;
20
20
  export * from './Exception';
@@ -36,17 +36,45 @@ module.exports = __toCommonJS(creek_layout_exports);
36
36
  var import_pro_components = require("@ant-design/pro-components");
37
37
  var import_ahooks = require("ahooks");
38
38
  var import_antd = require("antd");
39
+ var import_lodash = __toESM(require("lodash"));
39
40
  var import_classnames = __toESM(require("classnames"));
41
+ var import_react = require("@creekjs/i18n/react");
42
+ var import_creek_keep_alive = require("../creek-keep-alive");
43
+ var import_creek_locale_button = require("../creek-locale-button");
44
+ var import_scrollbar = require("../creek-style/scrollbar");
40
45
  var import_ActionRender = require("./ActionRender");
41
46
  var import_CollapseButton = require("./CollapseButton");
42
47
  var import_Exception = require("./Exception");
48
+ var import_useLayoutSettingsStore = require("./useLayoutSettingsStore");
43
49
  __reExport(creek_layout_exports, require("./Exception"), module.exports);
44
50
  var import_jsx_runtime = require("react/jsx-runtime");
51
+ var MenuName = ({ name, path }) => {
52
+ const t = (0, import_react.useT)();
53
+ const key = !path || path === "/" ? "menu.home" : `menu${path.replace(/\//g, ".")}`;
54
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: t(key, name) });
55
+ };
45
56
  var CreekLayout = (props) => {
46
- const { route, userConfig, runtimeConfig, children, location, navigate, showFullScreen, userInfo, ...more } = props;
57
+ const { route, userConfig, runtimeConfig, children, location, navigate, showFullScreen, showLocaleButton = true, showSettingsButton = true, keepAlive = true, extraActions = [], ...more } = props;
47
58
  const { useToken } = import_antd.theme;
48
59
  const { token } = useToken();
49
60
  const { collapsed } = (0, import_CollapseButton.useCollapsedStore)();
61
+ const settingsStore = (0, import_useLayoutSettingsStore.useLayoutSettingsStore)();
62
+ const actualShowFullScreen = settingsStore.showFullScreen ?? showFullScreen ?? false;
63
+ const actualShowLocaleButton = settingsStore.showLocaleButton ?? showLocaleButton ?? true;
64
+ const colorPrimary = settingsStore.colorPrimary || token.colorPrimary;
65
+ const actualKeepAlive = settingsStore.keepAlive ?? keepAlive ?? true;
66
+ const menuDataRender = (0, import_ahooks.useMemoizedFn)((menuData) => {
67
+ const mapMenu = (items) => {
68
+ return items.map((item) => {
69
+ return {
70
+ ...item,
71
+ name: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MenuName, { name: item.name, path: item.path }),
72
+ children: item.children ? mapMenu(item.children) : void 0
73
+ };
74
+ });
75
+ };
76
+ return mapMenu(menuData);
77
+ });
50
78
  const menuItemRender = (0, import_ahooks.useMemoizedFn)((itemProps, defaultDom) => {
51
79
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
52
80
  "span",
@@ -60,41 +88,72 @@ var CreekLayout = (props) => {
60
88
  }
61
89
  );
62
90
  });
63
- const actions = [];
64
- if (showFullScreen) {
91
+ const getTabTitle = (0, import_ahooks.useMemoizedFn)((pathname) => {
92
+ const findTitle = (routes) => {
93
+ for (const r of routes) {
94
+ if (r.path === pathname)
95
+ return r.name || r.title;
96
+ if (r.children) {
97
+ const found = findTitle(r.children);
98
+ if (found)
99
+ return found;
100
+ }
101
+ }
102
+ return void 0;
103
+ };
104
+ return findTitle((route == null ? void 0 : route.routes) || []) || pathname;
105
+ });
106
+ const actions = [...extraActions];
107
+ if (actualShowFullScreen) {
65
108
  actions.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ActionRender.FullScreen, {}, "full-screen"));
66
109
  }
67
- if (userInfo) {
68
- actions.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ActionRender.UserInfo, { ...userInfo }, "user-info"));
110
+ if (actualShowLocaleButton) {
111
+ actions.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_creek_locale_button.CreekLocaleButton, {}, "locale-button"));
112
+ }
113
+ if (showSettingsButton) {
114
+ actions.push(
115
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
116
+ import_ActionRender.LayoutSettings,
117
+ {
118
+ defaultShowFullScreen: showFullScreen,
119
+ defaultShowLocaleButton: showLocaleButton,
120
+ defaultKeepAlive: import_lodash.default.isBoolean(keepAlive) ? keepAlive : true
121
+ },
122
+ "settings"
123
+ )
124
+ );
69
125
  }
70
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
126
+ const keepAliveProps = import_lodash.default.isBoolean(keepAlive) ? {} : keepAlive;
127
+ const _userConfig = { ...userConfig, ...runtimeConfig };
128
+ const layoutContent = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
71
129
  import_pro_components.ProLayout,
72
130
  {
73
- className: (0, import_classnames.default)("creek-layout-container", userConfig == null ? void 0 : userConfig.className),
131
+ className: (0, import_classnames.default)("creek-layout-container", _userConfig == null ? void 0 : _userConfig.className),
74
132
  route,
75
- title: userConfig == null ? void 0 : userConfig.title,
76
- siderWidth: 212,
133
+ title: _userConfig == null ? void 0 : _userConfig.title,
134
+ siderWidth: 200,
77
135
  location,
136
+ menuDataRender,
78
137
  menuItemRender,
79
138
  actionsRender: () => actions,
80
139
  token: {
81
140
  header: {
82
141
  colorBgHeader: "#fff",
83
142
  colorHeaderTitle: "rgba(0, 0, 0, 0.80);",
84
- colorTextMenuSelected: token.colorPrimary,
143
+ colorTextMenuSelected: colorPrimary,
85
144
  heightLayoutHeader: 48
86
145
  },
87
146
  sider: {
88
147
  colorMenuBackground: "#f7f8fa",
89
148
  colorBgMenuItemSelected: "transparent",
90
- colorTextMenuActive: token.colorPrimary,
91
- colorTextMenuSelected: token.colorPrimary,
92
- colorTextMenuItemHover: token.colorPrimary,
149
+ colorTextMenuActive: colorPrimary,
150
+ colorTextMenuSelected: colorPrimary,
151
+ colorTextMenuItemHover: colorPrimary,
93
152
  colorTextMenu: "#333"
94
153
  },
95
154
  pageContainer: {
96
- paddingBlockPageContainerContent: token.padding,
97
- paddingInlinePageContainerContent: token.padding,
155
+ paddingBlockPageContainerContent: 0,
156
+ paddingInlinePageContainerContent: 0,
98
157
  colorBgPageContainer: "linear-gradient(180deg, #F7F9FF 0%, #FFF 45.59%);"
99
158
  }
100
159
  },
@@ -105,9 +164,13 @@ var CreekLayout = (props) => {
105
164
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_CollapseButton.CollapsedButton, { collapsed: collapsed2 });
106
165
  },
107
166
  ...more,
108
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Exception.Exception, { children })
167
+ children: [
168
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_scrollbar.GlobalScrollbarStyle, {}),
169
+ /* @__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 })
170
+ ]
109
171
  }
110
172
  );
173
+ return layoutContent;
111
174
  };
112
175
  // Annotate the CommonJS export names for ESM import in node:
113
176
  0 && (module.exports = {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/creek-layout/index.tsx"],
4
- "sourcesContent": ["import { ProLayout, ProLayoutProps } from '@ant-design/pro-components';\nimport { useMemoizedFn } from 'ahooks';\nimport { theme } from 'antd';\nimport classnames from 'classnames';\n\nimport { FullScreen, UserInfo } from './ActionRender';\nimport { CollapsedButton, useCollapsedStore } from './CollapseButton';\nimport { Exception } from './Exception';\n\nexport type LayoutProps = ProLayoutProps & {\n runtimeConfig: ProLayoutProps;\n userConfig?: ProLayoutProps;\n navigate?: (path?: string | number) => void;\n showFullScreen?: boolean;\n userInfo?: {\n name?: React.ReactNode;\n avatar?: string;\n menu?: any;\n };\n initialInfo?: {\n initialState: any;\n loading: boolean;\n setInitialState: () => void;\n };\n};\n\nexport const CreekLayout = (props: LayoutProps) => {\n const { route, userConfig, runtimeConfig, children, location, navigate, showFullScreen, userInfo, ...more } = props;\n\n const { useToken } = theme;\n const { token } = useToken();\n\n const { collapsed } = useCollapsedStore();\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 actions: React.ReactNode[] = [];\n if (showFullScreen) {\n actions.push(<FullScreen key=\"full-screen\" />);\n }\n if (userInfo) {\n actions.push(<UserInfo key=\"user-info\" {...userInfo} />);\n }\n\n return (\n <ProLayout\n className={classnames('creek-layout-container', userConfig?.className)}\n route={route}\n title={userConfig?.title}\n siderWidth={212}\n location={location}\n menuItemRender={menuItemRender}\n actionsRender={() => actions}\n token={{\n header: {\n colorBgHeader: '#fff',\n colorHeaderTitle: 'rgba(0, 0, 0, 0.80);',\n colorTextMenuSelected: token.colorPrimary,\n heightLayoutHeader: 48,\n },\n sider: {\n colorMenuBackground: '#f7f8fa',\n colorBgMenuItemSelected: 'transparent',\n colorTextMenuActive: token.colorPrimary,\n colorTextMenuSelected: token.colorPrimary,\n colorTextMenuItemHover: token.colorPrimary,\n colorTextMenu: '#333',\n },\n pageContainer: {\n paddingBlockPageContainerContent: token.padding,\n paddingInlinePageContainerContent: token.padding,\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 <Exception>{children}</Exception>\n </ProLayout>\n );\n};\n\nexport * from './Exception';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAA0C;AAC1C,oBAA8B;AAC9B,kBAAsB;AACtB,wBAAuB;AAEvB,0BAAqC;AACrC,4BAAmD;AACnD,uBAA0B;AA4F1B,iCAAc,wBAnGd;AAoCM;AAVC,IAAM,cAAc,CAAC,UAAuB;AACjD,QAAM,EAAE,OAAO,YAAY,eAAe,UAAU,UAAU,UAAU,gBAAgB,UAAU,GAAG,KAAK,IAAI;AAE9G,QAAM,EAAE,SAAS,IAAI;AACrB,QAAM,EAAE,MAAM,IAAI,SAAS;AAE3B,QAAM,EAAE,UAAU,QAAI,yCAAkB;AAExC,QAAM,qBAAmD,6BAAc,CAAC,WAAW,eAAe;AAChG,WACE;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM;AACb,cAAI,UAAU;AACZ,qBAAS,UAAU,IAAI;AAAA,UACzB;AAAA,QACF;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,EAEJ,CAAC;AAED,QAAM,UAA6B,CAAC;AACpC,MAAI,gBAAgB;AAClB,YAAQ,KAAK,4CAAC,oCAAe,aAAc,CAAE;AAAA,EAC/C;AACA,MAAI,UAAU;AACZ,YAAQ,KAAK,4CAAC,gCAA0B,GAAG,YAAhB,WAA0B,CAAE;AAAA,EACzD;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,kBAAAA,SAAW,0BAA0B,yCAAY,SAAS;AAAA,MACrE;AAAA,MACA,OAAO,yCAAY;AAAA,MACnB,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,eAAe,MAAM;AAAA,MACrB,OAAO;AAAA,QACL,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,uBAAuB,MAAM;AAAA,UAC7B,oBAAoB;AAAA,QACtB;AAAA,QACA,OAAO;AAAA,UACL,qBAAqB;AAAA,UACrB,yBAAyB;AAAA,UACzB,qBAAqB,MAAM;AAAA,UAC3B,uBAAuB,MAAM;AAAA,UAC7B,wBAAwB,MAAM;AAAA,UAC9B,eAAe;AAAA,QACjB;AAAA,QACA,eAAe;AAAA,UACb,kCAAkC,MAAM;AAAA,UACxC,mCAAmC,MAAM;AAAA,UACzC,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,MACA,aAAW;AAAA,MACX,aAAW;AAAA,MACX;AAAA,MACA,uBAAuB,CAACC,eAAc;AACpC,eAAO,4CAAC,yCAAgB,WAAWA,YAAW;AAAA,MAChD;AAAA,MACC,GAAG;AAAA,MAEJ,sDAAC,8BAAW,UAAS;AAAA;AAAA,EACvB;AAEJ;",
6
- "names": ["classnames", "collapsed"]
4
+ "sourcesContent": ["import { ProLayout, ProLayoutProps } from '@ant-design/pro-components';\nimport { useMemoizedFn } from 'ahooks';\nimport { theme } from 'antd';\nimport _ from 'lodash';\n\nimport classnames from 'classnames';\n\nimport { 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 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 { route, userConfig, runtimeConfig, children, location, navigate, showFullScreen, showLocaleButton = true, showSettingsButton = true, keepAlive = true, extraActions = [], ...more } = props;\n\n const { useToken } = theme;\n const { token } = useToken();\n\n const { collapsed } = useCollapsedStore();\n const settingsStore = useLayoutSettingsStore();\n\n const actualShowFullScreen = settingsStore.showFullScreen ?? showFullScreen ?? false;\n const actualShowLocaleButton = settingsStore.showLocaleButton ?? showLocaleButton ?? true;\n const colorPrimary = settingsStore.colorPrimary || token.colorPrimary;\n const actualKeepAlive = settingsStore.keepAlive ?? keepAlive ?? true;\n\n const menuDataRender = useMemoizedFn((menuData: any[]) => {\n const mapMenu = (items: any[]): any[] => {\n return items.map((item) => {\n return {\n ...item,\n name: <MenuName name={item.name} path={item.path} />,\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) => {\n const findTitle = (routes: any[]): string | React.ReactNode | undefined => {\n for (const r of routes) {\n if (r.path === pathname) return r.name || r.title;\n if (r.children) {\n const found = findTitle(r.children);\n if (found) return found;\n }\n }\n return undefined;\n };\n return findTitle(route?.routes || []) || pathname;\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(\n <LayoutSettings\n key=\"settings\"\n defaultShowFullScreen={showFullScreen}\n defaultShowLocaleButton={showLocaleButton}\n defaultKeepAlive={_.isBoolean(keepAlive) ? keepAlive : true}\n />\n );\n }\n\n const keepAliveProps = _.isBoolean(keepAlive) ? {} : keepAlive;\n\n const _userConfig = { ...userConfig, ...runtimeConfig };\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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",
6
+ "names": ["_", "classnames", "collapsed"]
7
7
  }
@@ -0,0 +1,20 @@
1
+ export type LayoutSettingsStore = {
2
+ colorPrimary?: string;
3
+ showFullScreen?: boolean;
4
+ showLocaleButton?: boolean;
5
+ keepAlive?: boolean;
6
+ setSettings: (settings: Partial<LayoutSettingsStore>) => void;
7
+ };
8
+ export declare const useLayoutSettingsStore: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<LayoutSettingsStore>, "setState" | "persist"> & {
9
+ setState(partial: LayoutSettingsStore | Partial<LayoutSettingsStore> | ((state: LayoutSettingsStore) => LayoutSettingsStore | Partial<LayoutSettingsStore>), replace?: false | undefined): unknown;
10
+ setState(state: LayoutSettingsStore | ((state: LayoutSettingsStore) => LayoutSettingsStore), replace: true): unknown;
11
+ persist: {
12
+ setOptions: (options: Partial<import("zustand/middleware").PersistOptions<LayoutSettingsStore, LayoutSettingsStore, unknown>>) => void;
13
+ clearStorage: () => void;
14
+ rehydrate: () => void | Promise<void>;
15
+ hasHydrated: () => boolean;
16
+ onHydrate: (fn: (state: LayoutSettingsStore) => void) => () => void;
17
+ onFinishHydration: (fn: (state: LayoutSettingsStore) => void) => () => void;
18
+ getOptions: () => Partial<import("zustand/middleware").PersistOptions<LayoutSettingsStore, LayoutSettingsStore, unknown>>;
19
+ };
20
+ }>;