@refinedev/antd 5.37.3 → 5.37.5

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 (172) hide show
  1. package/CHANGELOG.md +1766 -1776
  2. package/dist/components/autoSaveIndicator/index.d.ts.map +1 -1
  3. package/dist/components/breadcrumb/index.d.ts.map +1 -1
  4. package/dist/components/buttons/create/index.d.ts.map +1 -1
  5. package/dist/components/buttons/delete/index.d.ts.map +1 -1
  6. package/dist/components/buttons/import/index.d.ts.map +1 -1
  7. package/dist/components/buttons/types.d.ts.map +1 -1
  8. package/dist/components/crud/edit/index.d.ts.map +1 -1
  9. package/dist/components/crud/list/index.d.ts.map +1 -1
  10. package/dist/components/crud/show/index.d.ts.map +1 -1
  11. package/dist/components/crud/types.d.ts.map +1 -1
  12. package/dist/components/fields/date/index.d.ts.map +1 -1
  13. package/dist/components/fields/email/index.d.ts.map +1 -1
  14. package/dist/components/fields/number/index.d.ts.map +1 -1
  15. package/dist/components/fields/text/index.d.ts.map +1 -1
  16. package/dist/components/fields/types.d.ts.map +1 -1
  17. package/dist/components/fields/url/index.d.ts.map +1 -1
  18. package/dist/components/layout/header/index.d.ts.map +1 -1
  19. package/dist/components/layout/sider/index.d.ts.map +1 -1
  20. package/dist/components/layout/title/index.d.ts.map +1 -1
  21. package/dist/components/layout/types.d.ts.map +1 -1
  22. package/dist/components/pageHeader/index.d.ts.map +1 -1
  23. package/dist/components/pages/auth/components/forgotPassword/index.d.ts.map +1 -1
  24. package/dist/components/pages/auth/components/login/index.d.ts.map +1 -1
  25. package/dist/components/pages/auth/components/register/index.d.ts.map +1 -1
  26. package/dist/components/pages/auth/components/updatePassword/index.d.ts.map +1 -1
  27. package/dist/components/pages/auth/index.d.ts.map +1 -1
  28. package/dist/components/pages/error/index.d.ts.map +1 -1
  29. package/dist/components/pages/login/index.d.ts.map +1 -1
  30. package/dist/components/pages/ready/index.d.ts.map +1 -1
  31. package/dist/components/table/components/filterDropdown/index.d.ts.map +1 -1
  32. package/dist/components/themedLayout/header/index.d.ts.map +1 -1
  33. package/dist/components/themedLayout/sider/index.d.ts.map +1 -1
  34. package/dist/components/themedLayout/title/index.d.ts.map +1 -1
  35. package/dist/components/themedLayout/types.d.ts.map +1 -1
  36. package/dist/components/themedLayoutV2/header/index.d.ts.map +1 -1
  37. package/dist/components/themedLayoutV2/index.d.ts.map +1 -1
  38. package/dist/components/themedLayoutV2/sider/index.d.ts.map +1 -1
  39. package/dist/components/themedLayoutV2/title/index.d.ts.map +1 -1
  40. package/dist/components/themedLayoutV2/types.d.ts.map +1 -1
  41. package/dist/components/undoableNotification/index.d.ts.map +1 -1
  42. package/dist/contexts/index.d.ts.map +1 -1
  43. package/dist/contexts/themedLayoutContext/IThemedLayoutContext.d.ts.map +1 -1
  44. package/dist/contexts/themedLayoutContext/index.d.ts.map +1 -1
  45. package/dist/definitions/table/index.d.ts.map +1 -1
  46. package/dist/definitions/themes/index.d.ts.map +1 -1
  47. package/dist/esm/index.js +2 -1
  48. package/dist/esm/index.js.map +1 -1
  49. package/dist/hooks/fields/useCheckboxGroup/index.d.ts.map +1 -1
  50. package/dist/hooks/fields/useRadioGroup/index.d.ts.map +1 -1
  51. package/dist/hooks/fields/useSelect/index.d.ts.map +1 -1
  52. package/dist/hooks/form/index.d.ts.map +1 -1
  53. package/dist/hooks/form/useDrawerForm/index.d.ts.map +1 -1
  54. package/dist/hooks/form/useDrawerForm/useDrawerForm.d.ts.map +1 -1
  55. package/dist/hooks/form/useForm.d.ts.map +1 -1
  56. package/dist/hooks/form/useModalForm/index.d.ts.map +1 -1
  57. package/dist/hooks/form/useModalForm/useModalForm.d.ts.map +1 -1
  58. package/dist/hooks/form/useStepsForm/index.d.ts.map +1 -1
  59. package/dist/hooks/form/useStepsForm/useStepsForm.d.ts.map +1 -1
  60. package/dist/hooks/import/index.d.ts.map +1 -1
  61. package/dist/hooks/list/useSimpleList/useSimpleList.d.ts.map +1 -1
  62. package/dist/hooks/modal/useModal/index.d.ts.map +1 -1
  63. package/dist/hooks/table/useEditableTable/useEditableTable.d.ts.map +1 -1
  64. package/dist/hooks/table/useTable/paginationLink.d.ts.map +1 -1
  65. package/dist/hooks/table/useTable/useTable.d.ts.map +1 -1
  66. package/dist/hooks/useFileUploadState/index.d.ts.map +1 -1
  67. package/dist/hooks/useSiderVisible/index.d.ts.map +1 -1
  68. package/dist/iife/index.js +11 -10
  69. package/dist/iife/index.js.map +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +2 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/interfaces/field.d.ts.map +1 -1
  74. package/dist/interfaces/index.d.ts.map +1 -1
  75. package/dist/interfaces/upload.d.ts.map +1 -1
  76. package/package.json +32 -32
  77. package/refine.config.js +497 -524
  78. package/src/components/autoSaveIndicator/index.tsx +69 -70
  79. package/src/components/breadcrumb/index.tsx +63 -65
  80. package/src/components/buttons/clone/index.tsx +86 -86
  81. package/src/components/buttons/create/index.tsx +85 -86
  82. package/src/components/buttons/delete/index.tsx +114 -119
  83. package/src/components/buttons/edit/index.tsx +86 -86
  84. package/src/components/buttons/export/index.tsx +17 -17
  85. package/src/components/buttons/import/index.tsx +19 -20
  86. package/src/components/buttons/list/index.tsx +105 -105
  87. package/src/components/buttons/refresh/index.tsx +50 -50
  88. package/src/components/buttons/save/index.tsx +17 -17
  89. package/src/components/buttons/show/index.tsx +86 -86
  90. package/src/components/buttons/types.ts +20 -20
  91. package/src/components/crud/create/index.tsx +120 -120
  92. package/src/components/crud/edit/index.tsx +205 -207
  93. package/src/components/crud/list/index.tsx +88 -90
  94. package/src/components/crud/show/index.tsx +175 -185
  95. package/src/components/crud/types.ts +41 -56
  96. package/src/components/fields/boolean/index.tsx +11 -11
  97. package/src/components/fields/date/index.tsx +13 -15
  98. package/src/components/fields/email/index.tsx +5 -7
  99. package/src/components/fields/file/index.tsx +8 -8
  100. package/src/components/fields/image/index.tsx +4 -4
  101. package/src/components/fields/markdown/index.tsx +9 -9
  102. package/src/components/fields/number/index.tsx +17 -19
  103. package/src/components/fields/tag/index.tsx +1 -1
  104. package/src/components/fields/text/index.tsx +1 -3
  105. package/src/components/fields/types.ts +18 -18
  106. package/src/components/fields/url/index.tsx +8 -10
  107. package/src/components/layout/header/index.tsx +25 -26
  108. package/src/components/layout/index.tsx +30 -30
  109. package/src/components/layout/sider/index.tsx +238 -248
  110. package/src/components/layout/sider/styles.ts +5 -5
  111. package/src/components/layout/title/index.tsx +40 -40
  112. package/src/components/layout/types.ts +6 -6
  113. package/src/components/pageHeader/index.tsx +44 -44
  114. package/src/components/pages/auth/components/forgotPassword/index.tsx +177 -183
  115. package/src/components/pages/auth/components/login/index.tsx +258 -274
  116. package/src/components/pages/auth/components/register/index.tsx +247 -266
  117. package/src/components/pages/auth/components/styles.ts +16 -16
  118. package/src/components/pages/auth/components/updatePassword/index.tsx +160 -177
  119. package/src/components/pages/auth/index.tsx +23 -23
  120. package/src/components/pages/error/index.tsx +57 -59
  121. package/src/components/pages/login/index.tsx +120 -147
  122. package/src/components/pages/login/styles.ts +12 -12
  123. package/src/components/pages/ready/index.tsx +72 -80
  124. package/src/components/pages/welcome/index.tsx +1 -1
  125. package/src/components/table/components/filterDropdown/index.tsx +89 -92
  126. package/src/components/themedLayout/header/index.tsx +28 -33
  127. package/src/components/themedLayout/index.tsx +30 -30
  128. package/src/components/themedLayout/sider/index.tsx +279 -282
  129. package/src/components/themedLayout/sider/styles.ts +5 -5
  130. package/src/components/themedLayout/title/index.tsx +66 -68
  131. package/src/components/themedLayout/types.ts +8 -8
  132. package/src/components/themedLayoutV2/header/index.tsx +43 -48
  133. package/src/components/themedLayoutV2/index.tsx +34 -36
  134. package/src/components/themedLayoutV2/sider/index.tsx +309 -316
  135. package/src/components/themedLayoutV2/sider/styles.ts +5 -5
  136. package/src/components/themedLayoutV2/title/index.tsx +66 -68
  137. package/src/components/themedLayoutV2/types.ts +9 -9
  138. package/src/components/undoableNotification/index.tsx +31 -31
  139. package/src/contexts/index.ts +2 -2
  140. package/src/contexts/themedLayoutContext/IThemedLayoutContext.ts +4 -4
  141. package/src/contexts/themedLayoutContext/index.tsx +22 -22
  142. package/src/definitions/table/index.ts +81 -82
  143. package/src/definitions/themes/index.ts +35 -35
  144. package/src/definitions/upload/index.ts +17 -17
  145. package/src/hooks/fields/useCheckboxGroup/index.ts +64 -64
  146. package/src/hooks/fields/useRadioGroup/index.ts +60 -63
  147. package/src/hooks/fields/useSelect/index.ts +30 -30
  148. package/src/hooks/form/index.ts +10 -10
  149. package/src/hooks/form/useDrawerForm/index.ts +4 -4
  150. package/src/hooks/form/useDrawerForm/useDrawerForm.ts +257 -261
  151. package/src/hooks/form/useForm.ts +256 -259
  152. package/src/hooks/form/useModalForm/index.ts +3 -3
  153. package/src/hooks/form/useModalForm/useModalForm.ts +289 -295
  154. package/src/hooks/form/useStepsForm/index.ts +3 -3
  155. package/src/hooks/form/useStepsForm/useStepsForm.ts +96 -96
  156. package/src/hooks/import/index.tsx +104 -106
  157. package/src/hooks/list/useSimpleList/useSimpleList.ts +179 -185
  158. package/src/hooks/modal/useModal/index.tsx +24 -24
  159. package/src/hooks/table/useEditableTable/useEditableTable.ts +85 -85
  160. package/src/hooks/table/useTable/paginationLink.tsx +17 -17
  161. package/src/hooks/table/useTable/useTable.ts +199 -205
  162. package/src/hooks/useFileUploadState/index.ts +20 -20
  163. package/src/hooks/useSiderVisible/index.ts +16 -16
  164. package/src/hooks/useThemedLayoutContext/index.ts +12 -12
  165. package/src/index.tsx +4 -4
  166. package/src/interfaces/field.ts +1 -1
  167. package/src/interfaces/index.ts +7 -8
  168. package/src/interfaces/upload.ts +7 -7
  169. package/src/providers/notificationProvider/index.tsx +78 -78
  170. package/src/types/index.d.ts +2 -2
  171. package/src/types/sunflower.d.ts +68 -68
  172. package/tsconfig.json +26 -26
@@ -1,28 +1,28 @@
1
1
  import React from "react";
2
2
  import { Layout, Menu, Grid, Drawer, Button, theme } from "antd";
3
3
  import {
4
- DashboardOutlined,
5
- LogoutOutlined,
6
- UnorderedListOutlined,
7
- BarsOutlined,
8
- LeftOutlined,
9
- RightOutlined,
4
+ DashboardOutlined,
5
+ LogoutOutlined,
6
+ UnorderedListOutlined,
7
+ BarsOutlined,
8
+ LeftOutlined,
9
+ RightOutlined,
10
10
  } from "@ant-design/icons";
11
11
  import {
12
- useTranslate,
13
- useLogout,
14
- useTitle,
15
- CanAccess,
16
- ITreeMenu,
17
- useIsExistAuthentication,
18
- useRouterContext,
19
- useMenu,
20
- useRefineContext,
21
- useLink,
22
- useRouterType,
23
- useActiveAuthProvider,
24
- pickNotDeprecated,
25
- useWarnAboutChange,
12
+ useTranslate,
13
+ useLogout,
14
+ useTitle,
15
+ CanAccess,
16
+ ITreeMenu,
17
+ useIsExistAuthentication,
18
+ useRouterContext,
19
+ useMenu,
20
+ useRefineContext,
21
+ useLink,
22
+ useRouterType,
23
+ useActiveAuthProvider,
24
+ pickNotDeprecated,
25
+ useWarnAboutChange,
26
26
  } from "@refinedev/core";
27
27
 
28
28
  import { drawerButtonStyles } from "./styles";
@@ -30,324 +30,317 @@ import { RefineThemedLayoutV2SiderProps } from "../types";
30
30
  import { ThemedTitleV2 } from "@components";
31
31
  import { useThemedLayoutContext } from "@hooks";
32
32
 
33
- const { SubMenu } = Menu;
34
- const { useToken } = theme;
35
-
36
33
  export const ThemedSiderV2: React.FC<RefineThemedLayoutV2SiderProps> = ({
37
- Title: TitleFromProps,
38
- render,
39
- meta,
40
- fixed,
41
- activeItemDisabled = false,
34
+ Title: TitleFromProps,
35
+ render,
36
+ meta,
37
+ fixed,
38
+ activeItemDisabled = false,
42
39
  }) => {
43
- const { token } = useToken();
44
- const {
45
- siderCollapsed,
46
- setSiderCollapsed,
47
- mobileSiderOpen,
48
- setMobileSiderOpen,
49
- } = useThemedLayoutContext();
50
-
51
- const isExistAuthentication = useIsExistAuthentication();
52
- const routerType = useRouterType();
53
- const NewLink = useLink();
54
- const { warnWhen, setWarnWhen } = useWarnAboutChange();
55
- const { Link: LegacyLink } = useRouterContext();
56
- const Link = routerType === "legacy" ? LegacyLink : NewLink;
57
- const TitleFromContext = useTitle();
58
- const translate = useTranslate();
59
- const { menuItems, selectedKey, defaultOpenKeys } = useMenu({ meta });
60
- const breakpoint = Grid.useBreakpoint();
61
- const { hasDashboard } = useRefineContext();
62
- const authProvider = useActiveAuthProvider();
63
- const { mutate: mutateLogout } = useLogout({
64
- v3LegacyAuthProviderCompatible: Boolean(authProvider?.isLegacy),
65
- });
40
+ const { token } = theme.useToken();
41
+ const {
42
+ siderCollapsed,
43
+ setSiderCollapsed,
44
+ mobileSiderOpen,
45
+ setMobileSiderOpen,
46
+ } = useThemedLayoutContext();
66
47
 
67
- const isMobile =
68
- typeof breakpoint.lg === "undefined" ? false : !breakpoint.lg;
48
+ const isExistAuthentication = useIsExistAuthentication();
49
+ const routerType = useRouterType();
50
+ const NewLink = useLink();
51
+ const { warnWhen, setWarnWhen } = useWarnAboutChange();
52
+ const { Link: LegacyLink } = useRouterContext();
53
+ const Link = routerType === "legacy" ? LegacyLink : NewLink;
54
+ const TitleFromContext = useTitle();
55
+ const translate = useTranslate();
56
+ const { menuItems, selectedKey, defaultOpenKeys } = useMenu({ meta });
57
+ const breakpoint = Grid.useBreakpoint();
58
+ const { hasDashboard } = useRefineContext();
59
+ const authProvider = useActiveAuthProvider();
60
+ const { mutate: mutateLogout } = useLogout({
61
+ v3LegacyAuthProviderCompatible: Boolean(authProvider?.isLegacy),
62
+ });
69
63
 
70
- const RenderToTitle = TitleFromProps ?? TitleFromContext ?? ThemedTitleV2;
64
+ const isMobile =
65
+ typeof breakpoint.lg === "undefined" ? false : !breakpoint.lg;
71
66
 
72
- const renderTreeView = (tree: ITreeMenu[], selectedKey?: string) => {
73
- return tree.map((item: ITreeMenu) => {
74
- const {
75
- icon,
76
- label,
77
- route,
78
- key,
79
- name,
80
- children,
81
- parentName,
82
- meta,
83
- options,
84
- } = item;
67
+ const RenderToTitle = TitleFromProps ?? TitleFromContext ?? ThemedTitleV2;
85
68
 
86
- if (children.length > 0) {
87
- return (
88
- <CanAccess
89
- key={item.key}
90
- resource={name.toLowerCase()}
91
- action="list"
92
- params={{
93
- resource: item,
94
- }}
95
- >
96
- <SubMenu
97
- key={item.key}
98
- icon={icon ?? <UnorderedListOutlined />}
99
- title={label}
100
- >
101
- {renderTreeView(children, selectedKey)}
102
- </SubMenu>
103
- </CanAccess>
104
- );
105
- }
106
- const isSelected = key === selectedKey;
107
- const isRoute = !(
108
- pickNotDeprecated(meta?.parent, options?.parent, parentName) !==
109
- undefined && children.length === 0
110
- );
69
+ const renderTreeView = (tree: ITreeMenu[], selectedKey?: string) => {
70
+ return tree.map((item: ITreeMenu) => {
71
+ const {
72
+ icon,
73
+ label,
74
+ route,
75
+ key,
76
+ name,
77
+ children,
78
+ parentName,
79
+ meta,
80
+ options,
81
+ } = item;
111
82
 
112
- const linkStyle: React.CSSProperties =
113
- activeItemDisabled && isSelected
114
- ? { pointerEvents: "none" }
115
- : {};
116
-
117
- return (
118
- <CanAccess
119
- key={item.key}
120
- resource={name.toLowerCase()}
121
- action="list"
122
- params={{
123
- resource: item,
124
- }}
125
- >
126
- <Menu.Item
127
- key={item.key}
128
- icon={icon ?? (isRoute && <UnorderedListOutlined />)}
129
- style={linkStyle}
130
- >
131
- <Link to={route ?? ""} style={linkStyle}>
132
- {label}
133
- </Link>
134
- {!siderCollapsed && isSelected && (
135
- <div className="ant-menu-tree-arrow" />
136
- )}
137
- </Menu.Item>
138
- </CanAccess>
139
- );
140
- });
141
- };
142
-
143
- const handleLogout = () => {
144
- if (warnWhen) {
145
- const confirm = window.confirm(
146
- translate(
147
- "warnWhenUnsavedChanges",
148
- "Are you sure you want to leave? You have unsaved changes.",
149
- ),
150
- );
83
+ if (children.length > 0) {
84
+ return (
85
+ <CanAccess
86
+ key={item.key}
87
+ resource={name.toLowerCase()}
88
+ action="list"
89
+ params={{
90
+ resource: item,
91
+ }}
92
+ >
93
+ <Menu.SubMenu
94
+ key={item.key}
95
+ icon={icon ?? <UnorderedListOutlined />}
96
+ title={label}
97
+ >
98
+ {renderTreeView(children, selectedKey)}
99
+ </Menu.SubMenu>
100
+ </CanAccess>
101
+ );
102
+ }
103
+ const isSelected = key === selectedKey;
104
+ const isRoute = !(
105
+ pickNotDeprecated(meta?.parent, options?.parent, parentName) !==
106
+ undefined && children.length === 0
107
+ );
151
108
 
152
- if (confirm) {
153
- setWarnWhen(false);
154
- mutateLogout();
155
- }
156
- } else {
157
- mutateLogout();
158
- }
159
- };
109
+ const linkStyle: React.CSSProperties =
110
+ activeItemDisabled && isSelected ? { pointerEvents: "none" } : {};
160
111
 
161
- const logout = isExistAuthentication && (
162
- <Menu.Item
163
- key="logout"
164
- onClick={() => handleLogout()}
165
- icon={<LogoutOutlined />}
112
+ return (
113
+ <CanAccess
114
+ key={item.key}
115
+ resource={name.toLowerCase()}
116
+ action="list"
117
+ params={{
118
+ resource: item,
119
+ }}
166
120
  >
167
- {translate("buttons.logout", "Logout")}
168
- </Menu.Item>
169
- );
170
-
171
- const dashboard = hasDashboard ? (
172
- <Menu.Item key="dashboard" icon={<DashboardOutlined />}>
173
- <Link to="/">{translate("dashboard.title", "Dashboard")}</Link>
174
- {!siderCollapsed && selectedKey === "/" && (
175
- <div className="ant-menu-tree-arrow" />
121
+ <Menu.Item
122
+ key={item.key}
123
+ icon={icon ?? (isRoute && <UnorderedListOutlined />)}
124
+ style={linkStyle}
125
+ >
126
+ <Link to={route ?? ""} style={linkStyle}>
127
+ {label}
128
+ </Link>
129
+ {!siderCollapsed && isSelected && (
130
+ <div className="ant-menu-tree-arrow" />
176
131
  )}
177
- </Menu.Item>
178
- ) : null;
132
+ </Menu.Item>
133
+ </CanAccess>
134
+ );
135
+ });
136
+ };
179
137
 
180
- const items = renderTreeView(menuItems, selectedKey);
138
+ const handleLogout = () => {
139
+ if (warnWhen) {
140
+ const confirm = window.confirm(
141
+ translate(
142
+ "warnWhenUnsavedChanges",
143
+ "Are you sure you want to leave? You have unsaved changes.",
144
+ ),
145
+ );
181
146
 
182
- const renderSider = () => {
183
- if (render) {
184
- return render({
185
- dashboard,
186
- items,
187
- logout,
188
- collapsed: siderCollapsed,
189
- });
190
- }
191
- return (
192
- <>
193
- {dashboard}
194
- {items}
195
- {logout}
196
- </>
197
- );
198
- };
147
+ if (confirm) {
148
+ setWarnWhen(false);
149
+ mutateLogout();
150
+ }
151
+ } else {
152
+ mutateLogout();
153
+ }
154
+ };
199
155
 
200
- const renderMenu = () => {
201
- return (
202
- <Menu
203
- selectedKeys={selectedKey ? [selectedKey] : []}
204
- defaultOpenKeys={defaultOpenKeys}
205
- mode="inline"
206
- style={{
207
- paddingTop: "8px",
208
- border: "none",
209
- overflow: "auto",
210
- height: "calc(100% - 72px)",
211
- }}
212
- onClick={() => {
213
- setMobileSiderOpen(false);
214
- }}
215
- >
216
- {renderSider()}
217
- </Menu>
218
- );
219
- };
156
+ const logout = isExistAuthentication && (
157
+ <Menu.Item
158
+ key="logout"
159
+ onClick={() => handleLogout()}
160
+ icon={<LogoutOutlined />}
161
+ >
162
+ {translate("buttons.logout", "Logout")}
163
+ </Menu.Item>
164
+ );
220
165
 
221
- const renderDrawerSider = () => {
222
- return (
223
- <>
224
- <Drawer
225
- open={mobileSiderOpen}
226
- onClose={() => setMobileSiderOpen(false)}
227
- placement="left"
228
- closable={false}
229
- width={200}
230
- bodyStyle={{
231
- padding: 0,
232
- }}
233
- maskClosable={true}
234
- >
235
- <Layout>
236
- <Layout.Sider
237
- style={{
238
- height: "100vh",
239
- backgroundColor: token.colorBgContainer,
240
- borderRight: `1px solid ${token.colorBgElevated}`,
241
- }}
242
- >
243
- <div
244
- style={{
245
- width: "200px",
246
- padding: "0 16px",
247
- display: "flex",
248
- justifyContent: "flex-start",
249
- alignItems: "center",
250
- height: "64px",
251
- backgroundColor: token.colorBgElevated,
252
- }}
253
- >
254
- <RenderToTitle collapsed={false} />
255
- </div>
256
- {renderMenu()}
257
- </Layout.Sider>
258
- </Layout>
259
- </Drawer>
260
- <Button
261
- style={drawerButtonStyles}
262
- size="large"
263
- onClick={() => setMobileSiderOpen(true)}
264
- icon={<BarsOutlined />}
265
- ></Button>
266
- </>
267
- );
268
- };
166
+ const dashboard = hasDashboard ? (
167
+ <Menu.Item key="dashboard" icon={<DashboardOutlined />}>
168
+ <Link to="/">{translate("dashboard.title", "Dashboard")}</Link>
169
+ {!siderCollapsed && selectedKey === "/" && (
170
+ <div className="ant-menu-tree-arrow" />
171
+ )}
172
+ </Menu.Item>
173
+ ) : null;
269
174
 
270
- if (isMobile) {
271
- return renderDrawerSider();
272
- }
273
-
274
- const siderStyles: React.CSSProperties = {
275
- backgroundColor: token.colorBgContainer,
276
- borderRight: `1px solid ${token.colorBgElevated}`,
277
- };
175
+ const items = renderTreeView(menuItems, selectedKey);
278
176
 
279
- if (fixed) {
280
- siderStyles.position = "fixed";
281
- siderStyles.top = 0;
282
- siderStyles.height = "100vh";
283
- siderStyles.zIndex = 999;
177
+ const renderSider = () => {
178
+ if (render) {
179
+ return render({
180
+ dashboard,
181
+ items,
182
+ logout,
183
+ collapsed: siderCollapsed,
184
+ });
284
185
  }
186
+ return (
187
+ <>
188
+ {dashboard}
189
+ {items}
190
+ {logout}
191
+ </>
192
+ );
193
+ };
285
194
 
195
+ const renderMenu = () => {
286
196
  return (
287
- <>
288
- {fixed && (
289
- <div
290
- style={{
291
- width: siderCollapsed ? "80px" : "200px",
292
- transition: "all 0.2s",
293
- }}
294
- />
295
- )}
197
+ <Menu
198
+ selectedKeys={selectedKey ? [selectedKey] : []}
199
+ defaultOpenKeys={defaultOpenKeys}
200
+ mode="inline"
201
+ style={{
202
+ paddingTop: "8px",
203
+ border: "none",
204
+ overflow: "auto",
205
+ height: "calc(100% - 72px)",
206
+ }}
207
+ onClick={() => {
208
+ setMobileSiderOpen(false);
209
+ }}
210
+ >
211
+ {renderSider()}
212
+ </Menu>
213
+ );
214
+ };
215
+
216
+ const renderDrawerSider = () => {
217
+ return (
218
+ <>
219
+ <Drawer
220
+ open={mobileSiderOpen}
221
+ onClose={() => setMobileSiderOpen(false)}
222
+ placement="left"
223
+ closable={false}
224
+ width={200}
225
+ bodyStyle={{
226
+ padding: 0,
227
+ }}
228
+ maskClosable={true}
229
+ >
230
+ <Layout>
296
231
  <Layout.Sider
297
- style={siderStyles}
298
- collapsible
299
- collapsed={siderCollapsed}
300
- onCollapse={(collapsed, type) => {
301
- if (type === "clickTrigger") {
302
- setSiderCollapsed(collapsed);
303
- }
304
- }}
305
- collapsedWidth={80}
306
- breakpoint="lg"
307
- trigger={
308
- <Button
309
- type="text"
310
- style={{
311
- borderRadius: 0,
312
- height: "100%",
313
- width: "100%",
314
- backgroundColor: token.colorBgElevated,
315
- }}
316
- >
317
- {siderCollapsed ? (
318
- <RightOutlined
319
- style={{
320
- color: token.colorPrimary,
321
- }}
322
- />
323
- ) : (
324
- <LeftOutlined
325
- style={{
326
- color: token.colorPrimary,
327
- }}
328
- />
329
- )}
330
- </Button>
331
- }
232
+ style={{
233
+ height: "100vh",
234
+ backgroundColor: token.colorBgContainer,
235
+ borderRight: `1px solid ${token.colorBgElevated}`,
236
+ }}
332
237
  >
333
- <div
334
- style={{
335
- width: siderCollapsed ? "80px" : "200px",
336
- padding: siderCollapsed ? "0" : "0 16px",
337
- display: "flex",
338
- justifyContent: siderCollapsed
339
- ? "center"
340
- : "flex-start",
341
- alignItems: "center",
342
- height: "64px",
343
- backgroundColor: token.colorBgElevated,
344
- fontSize: "14px",
345
- }}
346
- >
347
- <RenderToTitle collapsed={siderCollapsed} />
348
- </div>
349
- {renderMenu()}
238
+ <div
239
+ style={{
240
+ width: "200px",
241
+ padding: "0 16px",
242
+ display: "flex",
243
+ justifyContent: "flex-start",
244
+ alignItems: "center",
245
+ height: "64px",
246
+ backgroundColor: token.colorBgElevated,
247
+ }}
248
+ >
249
+ <RenderToTitle collapsed={false} />
250
+ </div>
251
+ {renderMenu()}
350
252
  </Layout.Sider>
351
- </>
253
+ </Layout>
254
+ </Drawer>
255
+ <Button
256
+ style={drawerButtonStyles}
257
+ size="large"
258
+ onClick={() => setMobileSiderOpen(true)}
259
+ icon={<BarsOutlined />}
260
+ />
261
+ </>
352
262
  );
263
+ };
264
+
265
+ if (isMobile) {
266
+ return renderDrawerSider();
267
+ }
268
+
269
+ const siderStyles: React.CSSProperties = {
270
+ backgroundColor: token.colorBgContainer,
271
+ borderRight: `1px solid ${token.colorBgElevated}`,
272
+ };
273
+
274
+ if (fixed) {
275
+ siderStyles.position = "fixed";
276
+ siderStyles.top = 0;
277
+ siderStyles.height = "100vh";
278
+ siderStyles.zIndex = 999;
279
+ }
280
+
281
+ return (
282
+ <>
283
+ {fixed && (
284
+ <div
285
+ style={{
286
+ width: siderCollapsed ? "80px" : "200px",
287
+ transition: "all 0.2s",
288
+ }}
289
+ />
290
+ )}
291
+ <Layout.Sider
292
+ style={siderStyles}
293
+ collapsible
294
+ collapsed={siderCollapsed}
295
+ onCollapse={(collapsed, type) => {
296
+ if (type === "clickTrigger") {
297
+ setSiderCollapsed(collapsed);
298
+ }
299
+ }}
300
+ collapsedWidth={80}
301
+ breakpoint="lg"
302
+ trigger={
303
+ <Button
304
+ type="text"
305
+ style={{
306
+ borderRadius: 0,
307
+ height: "100%",
308
+ width: "100%",
309
+ backgroundColor: token.colorBgElevated,
310
+ }}
311
+ >
312
+ {siderCollapsed ? (
313
+ <RightOutlined
314
+ style={{
315
+ color: token.colorPrimary,
316
+ }}
317
+ />
318
+ ) : (
319
+ <LeftOutlined
320
+ style={{
321
+ color: token.colorPrimary,
322
+ }}
323
+ />
324
+ )}
325
+ </Button>
326
+ }
327
+ >
328
+ <div
329
+ style={{
330
+ width: siderCollapsed ? "80px" : "200px",
331
+ padding: siderCollapsed ? "0" : "0 16px",
332
+ display: "flex",
333
+ justifyContent: siderCollapsed ? "center" : "flex-start",
334
+ alignItems: "center",
335
+ height: "64px",
336
+ backgroundColor: token.colorBgElevated,
337
+ fontSize: "14px",
338
+ }}
339
+ >
340
+ <RenderToTitle collapsed={siderCollapsed} />
341
+ </div>
342
+ {renderMenu()}
343
+ </Layout.Sider>
344
+ </>
345
+ );
353
346
  };
@@ -1,9 +1,9 @@
1
1
  import { CSSProperties } from "react";
2
2
 
3
3
  export const drawerButtonStyles: CSSProperties = {
4
- borderTopLeftRadius: 0,
5
- borderBottomLeftRadius: 0,
6
- position: "fixed",
7
- top: 64,
8
- zIndex: 999,
4
+ borderTopLeftRadius: 0,
5
+ borderBottomLeftRadius: 0,
6
+ position: "fixed",
7
+ top: 64,
8
+ zIndex: 999,
9
9
  };