@orbe-agro/client-core 5.6.123 → 5.6.125

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 (75) hide show
  1. package/dist/@ecme/assets/styles/app.css +15 -0
  2. package/dist/@ecme/assets/styles/tailwind/index.css +15 -0
  3. package/dist/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.js +40 -6
  4. package/dist/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.js.map +1 -1
  5. package/dist/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.stories.js +234 -0
  6. package/dist/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.stories.js.map +1 -0
  7. package/dist/@ecme/components/template/VerticalMenuContent/VerticalSingleMenuItem.js +18 -40
  8. package/dist/@ecme/components/template/VerticalMenuContent/VerticalSingleMenuItem.js.map +1 -1
  9. package/dist/@ecme/components/ui/Button/Button.stories.js +17 -0
  10. package/dist/@ecme/components/ui/Button/Button.stories.js.map +1 -0
  11. package/dist/@types/@ecme/@types/navigation.d.ts +1 -0
  12. package/dist/@types/@ecme/@types/navigation.d.ts.map +1 -1
  13. package/dist/@types/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.d.ts +3 -3
  14. package/dist/@types/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.d.ts.map +1 -1
  15. package/dist/@types/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.stories.d.ts +13 -0
  16. package/dist/@types/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.stories.d.ts.map +1 -0
  17. package/dist/@types/@ecme/components/template/VerticalMenuContent/VerticalSingleMenuItem.d.ts +3 -3
  18. package/dist/@types/@ecme/components/template/VerticalMenuContent/VerticalSingleMenuItem.d.ts.map +1 -1
  19. package/dist/@types/@ecme/components/ui/Button/Button.stories.d.ts +9 -0
  20. package/dist/@types/@ecme/components/ui/Button/Button.stories.d.ts.map +1 -0
  21. package/dist/@types/base/configs/navigation.config/modules.submenu/Ticket/ticket.navigation.d.ts.map +1 -1
  22. package/dist/@types/base/configs/navigation.config/modules.submenu/compras/submenu.compras.d.ts.map +1 -1
  23. package/dist/@types/base/configs/navigation.config/modules.submenu/dadosunificados/dadosunificados.navigation.d.ts.map +1 -1
  24. package/dist/@types/base/configs/navigation.config/submenu/compras/cadastros.submenu.d.ts.map +1 -1
  25. package/dist/@types/base/configs/navigation.config/submenu/compras/config/cadastroEstrategiaLiberacaoValor.submenu.d.ts.map +1 -1
  26. package/dist/@types/base/configs/navigation.config/submenu/compras/config/cotacao.submenu.d.ts.map +1 -1
  27. package/dist/@types/base/configs/navigation.config/submenu/compras/config/localRecepcao.submenu.d.ts.map +1 -1
  28. package/dist/@types/base/configs/navigation.config/submenu/compras/config/ordemCompra.submenu.d.ts.map +1 -1
  29. package/dist/@types/base/configs/navigation.config/submenu/compras/config/requisicaoAgrupada.submenu.d.ts.map +1 -1
  30. package/dist/@types/base/configs/navigation.config/submenu/compras/config/requisicaoCompra.submenu.d.ts.map +1 -1
  31. package/dist/@types/base/configs/navigation.config/submenu/ticket/cadastros.submenu.d.ts.map +1 -1
  32. package/dist/@types/base/configs/navigation.config/submenu/ticket/relatorios.submenu.d.ts.map +1 -1
  33. package/dist/base/assets/styles/init.css +15 -0
  34. package/dist/base/configs/navigation.config/modules.submenu/Ticket/ticket.navigation.js +5 -3
  35. package/dist/base/configs/navigation.config/modules.submenu/Ticket/ticket.navigation.js.map +1 -1
  36. package/dist/base/configs/navigation.config/modules.submenu/compras/submenu.compras.js +8 -12
  37. package/dist/base/configs/navigation.config/modules.submenu/compras/submenu.compras.js.map +1 -1
  38. package/dist/base/configs/navigation.config/modules.submenu/dadosunificados/dadosunificados.navigation.js +2 -23
  39. package/dist/base/configs/navigation.config/modules.submenu/dadosunificados/dadosunificados.navigation.js.map +1 -1
  40. package/dist/base/configs/navigation.config/submenu/compras/cadastros.submenu.js +1 -3
  41. package/dist/base/configs/navigation.config/submenu/compras/cadastros.submenu.js.map +1 -1
  42. package/dist/base/configs/navigation.config/submenu/compras/config/cadastroEstrategiaLiberacaoValor.submenu.js +1 -0
  43. package/dist/base/configs/navigation.config/submenu/compras/config/cadastroEstrategiaLiberacaoValor.submenu.js.map +1 -1
  44. package/dist/base/configs/navigation.config/submenu/compras/config/cotacao.submenu.js +1 -0
  45. package/dist/base/configs/navigation.config/submenu/compras/config/cotacao.submenu.js.map +1 -1
  46. package/dist/base/configs/navigation.config/submenu/compras/config/localRecepcao.submenu.js +1 -0
  47. package/dist/base/configs/navigation.config/submenu/compras/config/localRecepcao.submenu.js.map +1 -1
  48. package/dist/base/configs/navigation.config/submenu/compras/config/ordemCompra.submenu.js +1 -0
  49. package/dist/base/configs/navigation.config/submenu/compras/config/ordemCompra.submenu.js.map +1 -1
  50. package/dist/base/configs/navigation.config/submenu/compras/config/requisicaoAgrupada.submenu.js +1 -0
  51. package/dist/base/configs/navigation.config/submenu/compras/config/requisicaoAgrupada.submenu.js.map +1 -1
  52. package/dist/base/configs/navigation.config/submenu/compras/config/requisicaoCompra.submenu.js +1 -0
  53. package/dist/base/configs/navigation.config/submenu/compras/config/requisicaoCompra.submenu.js.map +1 -1
  54. package/dist/base/configs/navigation.config/submenu/ticket/cadastros.submenu.js +8 -18
  55. package/dist/base/configs/navigation.config/submenu/ticket/cadastros.submenu.js.map +1 -1
  56. package/dist/base/configs/navigation.config/submenu/ticket/relatorios.submenu.js +10 -12
  57. package/dist/base/configs/navigation.config/submenu/ticket/relatorios.submenu.js.map +1 -1
  58. package/lib/@ecme/@types/navigation.ts +1 -0
  59. package/lib/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.stories.tsx +244 -0
  60. package/lib/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.tsx +214 -172
  61. package/lib/@ecme/components/template/VerticalMenuContent/VerticalSingleMenuItem.tsx +135 -157
  62. package/lib/@ecme/components/ui/Button/Button.stories.tsx +22 -0
  63. package/lib/base/configs/navigation.config/modules.submenu/Ticket/ticket.navigation.ts +5 -3
  64. package/lib/base/configs/navigation.config/modules.submenu/compras/submenu.compras.ts +8 -12
  65. package/lib/base/configs/navigation.config/modules.submenu/dadosunificados/dadosunificados.navigation.ts +3 -27
  66. package/lib/base/configs/navigation.config/submenu/compras/cadastros.submenu.ts +0 -2
  67. package/lib/base/configs/navigation.config/submenu/compras/config/cadastroEstrategiaLiberacaoValor.submenu.ts +1 -0
  68. package/lib/base/configs/navigation.config/submenu/compras/config/cotacao.submenu.ts +1 -0
  69. package/lib/base/configs/navigation.config/submenu/compras/config/localRecepcao.submenu.ts +1 -0
  70. package/lib/base/configs/navigation.config/submenu/compras/config/ordemCompra.submenu.ts +1 -0
  71. package/lib/base/configs/navigation.config/submenu/compras/config/requisicaoAgrupada.submenu.ts +1 -0
  72. package/lib/base/configs/navigation.config/submenu/compras/config/requisicaoCompra.submenu.ts +1 -0
  73. package/lib/base/configs/navigation.config/submenu/ticket/cadastros.submenu.ts +8 -18
  74. package/lib/base/configs/navigation.config/submenu/ticket/relatorios.submenu.ts +5 -19
  75. package/package.json +9 -1
@@ -0,0 +1,244 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { BrowserRouter } from 'react-router-dom'
3
+ import VerticalMenuContent from './VerticalMenuContent'
4
+ import type { NavigationTree } from '@/@types/navigation'
5
+ import {
6
+ NAV_ITEM_TYPE_COLLAPSE,
7
+ NAV_ITEM_TYPE_ITEM,
8
+ } from '@/constants/navigation.constant'
9
+
10
+ const mockNavigationTree: NavigationTree[] = [
11
+ {
12
+ key: 'inicio',
13
+ path: '/inicio',
14
+ title: 'Início',
15
+ translateKey: 'nav.inicio',
16
+ icon: '',
17
+ type: NAV_ITEM_TYPE_ITEM,
18
+ authority: ['/inicio'],
19
+ subMenu: [],
20
+ },
21
+ {
22
+ key: 'cadastros',
23
+ path: '',
24
+ title: 'Cadastros',
25
+ translateKey: 'nav.cadastros',
26
+ icon: '',
27
+ type: NAV_ITEM_TYPE_COLLAPSE,
28
+ authority: ['/cadastros'],
29
+ subMenu: [
30
+ {
31
+ key: 'clientes',
32
+ path: '/cadastros/clientes',
33
+ title: 'Clientes',
34
+ translateKey: 'nav.clientes',
35
+ icon: '',
36
+ type: NAV_ITEM_TYPE_ITEM,
37
+ authority: ['/cadastros/clientes'],
38
+ subMenu: [],
39
+ },
40
+ {
41
+ key: 'fornecedores',
42
+ path: '/cadastros/fornecedores',
43
+ title: 'Fornecedores',
44
+ translateKey: 'nav.fornecedores',
45
+ icon: '',
46
+ type: NAV_ITEM_TYPE_ITEM,
47
+ authority: ['/cadastros/fornecedores'],
48
+ subMenu: [],
49
+ },
50
+ ],
51
+ },
52
+ {
53
+ key: 'relatorios',
54
+ path: '/relatorios',
55
+ title: 'Relatórios',
56
+ translateKey: 'nav.relatorios',
57
+ icon: 'ChartBarIcon',
58
+ type: NAV_ITEM_TYPE_ITEM,
59
+ authority: ['/relatorios'],
60
+ subMenu: [],
61
+ },
62
+ {
63
+ key: 'configuracoes',
64
+ path: '',
65
+ title: 'Configurações',
66
+ translateKey: 'nav.configuracoes',
67
+ icon: '',
68
+ type: NAV_ITEM_TYPE_COLLAPSE,
69
+ authority: ['/configuracoes'],
70
+ subMenu: [
71
+ {
72
+ key: 'perfil',
73
+ path: '/configuracoes/perfil',
74
+ title: 'Perfil',
75
+ translateKey: 'nav.perfil',
76
+ icon: '',
77
+ type: NAV_ITEM_TYPE_ITEM,
78
+ authority: ['/configuracoes/perfil'],
79
+ subMenu: [],
80
+ },
81
+ {
82
+ key: 'integracoes',
83
+ path: '',
84
+ title: 'Integrações',
85
+ translateKey: 'nav.integracoes',
86
+ icon: '',
87
+ type: NAV_ITEM_TYPE_COLLAPSE,
88
+ authority: ['/configuracoes/integracoes'],
89
+ subMenu: [
90
+ {
91
+ key: 'webhooks',
92
+ path: '/configuracoes/integracoes/webhooks',
93
+ title: 'Webhooks',
94
+ translateKey: 'nav.webhooks',
95
+ icon: 'WebhookIcon',
96
+ type: NAV_ITEM_TYPE_ITEM,
97
+ authority: ['/configuracoes/integracoes/webhooks'],
98
+ subMenu: [],
99
+ },
100
+ {
101
+ key: 'lorem.ipsum',
102
+ path: '/configuracoes/integracoes/lorem-ipsum',
103
+ title: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',
104
+ translateKey: 'nav.loremIpsum',
105
+ icon: 'LoremIpsumIcon',
106
+ type: NAV_ITEM_TYPE_ITEM,
107
+ authority: ['/configuracoes/integracoes/lorem-ipsum'],
108
+ subMenu: [],
109
+ },
110
+ ],
111
+ },
112
+ ],
113
+ },
114
+ ]
115
+
116
+ const allUserAuthority = [
117
+ '/inicio',
118
+ '/cadastros/clientes',
119
+ '/cadastros/fornecedores',
120
+ '/relatorios',
121
+ '/configuracoes/perfil',
122
+ '/configuracoes/integracoes/webhooks',
123
+ '/configuracoes/integracoes/lorem-ipsum',
124
+ ]
125
+
126
+ const meta: Meta<typeof VerticalMenuContent> = {
127
+ title: '@ecme/Template/VerticalMenuContent',
128
+ component: VerticalMenuContent,
129
+ parameters: {
130
+ layout: 'padded',
131
+ },
132
+ tags: ['autodocs'],
133
+ decorators: [
134
+ (Story) => (
135
+ <BrowserRouter>
136
+ <Story />
137
+ </BrowserRouter>
138
+ ),
139
+ ],
140
+ argTypes: {
141
+ collapsed: {
142
+ control: 'boolean',
143
+ },
144
+ direction: {
145
+ control: { type: 'select' },
146
+ options: ['ltr', 'rtl'],
147
+ },
148
+ routeKey: {
149
+ control: 'text',
150
+ },
151
+ },
152
+ }
153
+
154
+ export default meta
155
+ type TStory = StoryObj<typeof VerticalMenuContent>
156
+
157
+ export const Default: TStory = {
158
+ args: {
159
+ collapsed: false,
160
+ routeKey: '/inicio',
161
+ navigationTree: mockNavigationTree,
162
+ userAuthority: allUserAuthority,
163
+ direction: 'ltr',
164
+ translationSetup: true,
165
+ },
166
+ }
167
+
168
+ export const Collapsed: TStory = {
169
+ args: {
170
+ collapsed: true,
171
+ routeKey: '/cadastros/clientes',
172
+ navigationTree: mockNavigationTree,
173
+ userAuthority: allUserAuthority,
174
+ direction: 'ltr',
175
+ translationSetup: true,
176
+ },
177
+ }
178
+
179
+ export const WithExpandedMenu: TStory = {
180
+ args: {
181
+ collapsed: false,
182
+ routeKey: '/configuracoes/integracoes/webhooks',
183
+ navigationTree: mockNavigationTree,
184
+ userAuthority: allUserAuthority,
185
+ direction: 'ltr',
186
+ translationSetup: true,
187
+ },
188
+ }
189
+
190
+ export const LimitedAuthority: TStory = {
191
+ args: {
192
+ collapsed: false,
193
+ routeKey: '/inicio',
194
+ navigationTree: mockNavigationTree,
195
+ userAuthority: ['/inicio', '/relatorios'],
196
+ direction: 'ltr',
197
+ translationSetup: true,
198
+ },
199
+ }
200
+
201
+ export const RTLDirection: TStory = {
202
+ args: {
203
+ collapsed: false,
204
+ routeKey: '/inicio',
205
+ navigationTree: mockNavigationTree,
206
+ userAuthority: allUserAuthority,
207
+ direction: 'rtl',
208
+ translationSetup: true,
209
+ },
210
+ }
211
+
212
+ export const MinimalNavigation: TStory = {
213
+ args: {
214
+ collapsed: false,
215
+ routeKey: '/inicio',
216
+ navigationTree: [
217
+ {
218
+ key: 'inicio',
219
+ path: '/inicio',
220
+ title: 'Início',
221
+ translateKey: 'nav.inicio',
222
+ icon: '',
223
+ type: NAV_ITEM_TYPE_ITEM,
224
+ authority: ['/inicio'],
225
+ subMenu: [],
226
+ },
227
+ ],
228
+ userAuthority: ['/inicio'],
229
+ direction: 'ltr',
230
+ translationSetup: true,
231
+ },
232
+ }
233
+
234
+ export const WithMenuClick: TStory = {
235
+ args: {
236
+ collapsed: false,
237
+ routeKey: '/inicio',
238
+ navigationTree: mockNavigationTree,
239
+ userAuthority: allUserAuthority,
240
+ direction: 'ltr',
241
+ translationSetup: true,
242
+ onMenuItemClick: () => alert('Menu item clicked!'),
243
+ },
244
+ }
@@ -1,192 +1,234 @@
1
- import { useState, useEffect, useMemo, Fragment } from "react";
2
- import Menu from "@/components/ui/Menu";
3
- import VerticalSingleMenuItem from "./VerticalSingleMenuItem";
4
- import VerticalCollapsedMenuItem from "./VerticalCollapsedMenuItem";
5
- import { themeConfig } from "@/configs/theme.config";
1
+ import { useState, useEffect, useMemo, Fragment } from 'react'
2
+ import Menu from '@/components/ui/Menu'
3
+ import VerticalSingleMenuItem from './VerticalSingleMenuItem'
4
+ import VerticalCollapsedMenuItem from './VerticalCollapsedMenuItem'
5
+ import { themeConfig } from '@/configs/theme.config'
6
6
  import {
7
- NAV_ITEM_TYPE_TITLE,
8
- NAV_ITEM_TYPE_COLLAPSE,
9
- NAV_ITEM_TYPE_ITEM,
10
- } from "@/constants/navigation.constant";
11
- import useMenuActive from "@/utils/hooks/useMenuActive";
12
- import useTranslation from "@/utils/hooks/useTranslation";
13
- import { Direction } from "@/@types/theme";
14
- import type { NavigationTree } from "@/@types/navigation";
15
- import type { TraslationFn } from "@/@types/common";
16
- import { LinkRenderer } from "@/components/layouts/Layouts";
7
+ NAV_ITEM_TYPE_TITLE,
8
+ NAV_ITEM_TYPE_COLLAPSE,
9
+ NAV_ITEM_TYPE_ITEM,
10
+ } from '@/constants/navigation.constant'
11
+ import useMenuActive from '@/utils/hooks/useMenuActive'
12
+ import useTranslation from '@/utils/hooks/useTranslation'
13
+ import { Direction } from '@/@types/theme'
14
+ import type { NavigationTree } from '@/@types/navigation'
15
+ import type { TraslationFn } from '@/@types/common'
16
+ import { LinkRenderer } from '@/components/layouts/Layouts'
17
17
 
18
18
  export interface VerticalMenuContentProps {
19
- collapsed?: boolean;
20
- routeKey: string;
21
- navigationTree?: NavigationTree[];
22
- onMenuItemClick?: () => void;
23
- direction?: Direction;
24
- translationSetup?: boolean;
25
- userAuthority: string[];
26
- linkRenderer?: LinkRenderer;
19
+ collapsed?: boolean
20
+ routeKey: string
21
+ navigationTree?: NavigationTree[]
22
+ onMenuItemClick?: () => void
23
+ direction?: Direction
24
+ translationSetup?: boolean
25
+ userAuthority: string[]
26
+ linkRenderer?: LinkRenderer
27
27
  }
28
28
 
29
- const { MenuGroup } = Menu;
29
+ const { MenuGroup } = Menu
30
30
 
31
31
  const findAncestorKeys = (
32
- navTree: NavigationTree[],
33
- targetKey: string
32
+ navTree: NavigationTree[],
33
+ targetKey: string,
34
34
  ): string[] | null => {
35
- for (const node of navTree) {
36
- if (node.key === targetKey) return [];
37
- if (node.subMenu && node.subMenu.length > 0) {
38
- const found = findAncestorKeys(node.subMenu, targetKey);
39
- if (found !== null) return [node.key, ...found];
35
+ for (const node of navTree) {
36
+ if (node.key === targetKey) return []
37
+ if (node.subMenu && node.subMenu.length > 0) {
38
+ const found = findAncestorKeys(node.subMenu, targetKey)
39
+ if (found !== null) return [node.key, ...found]
40
+ }
40
41
  }
41
- }
42
- return null;
43
- };
42
+ return null
43
+ }
44
44
 
45
45
  const filterNavigationByAuthority = (
46
- navTree: NavigationTree[],
47
- userAuthority: string[]
46
+ navTree: NavigationTree[],
47
+ userAuthority: string[],
48
48
  ): NavigationTree[] => {
49
- return navTree.reduce((acc: NavigationTree[], nav) => {
50
- // Verifica se deve excluir o item quando o usuário possui alguma funcionalidade específica
51
- if (nav.excludeWhenHasPaths && nav.excludeWhenHasPaths.length > 0) {
52
- const shouldExclude = nav.excludeWhenHasPaths.some((path) =>
53
- userAuthority.includes(path)
54
- );
55
- if (shouldExclude) {
56
- return acc;
57
- }
58
- }
49
+ return navTree.reduce((acc: NavigationTree[], nav) => {
50
+ // Verifica se deve excluir o item quando o usuário possui alguma funcionalidade específica
51
+ if (nav.excludeWhenHasPaths && nav.excludeWhenHasPaths.length > 0) {
52
+ const shouldExclude = nav.excludeWhenHasPaths.some((path) =>
53
+ userAuthority.includes(path),
54
+ )
55
+ if (shouldExclude) {
56
+ return acc
57
+ }
58
+ }
59
59
 
60
- if (nav.subMenu && nav.subMenu.length > 0) {
61
- const filteredSubMenu = filterNavigationByAuthority(
62
- nav.subMenu,
63
- userAuthority
64
- );
65
- if (filteredSubMenu.length > 0) {
66
- acc.push({ ...nav, subMenu: filteredSubMenu });
67
- }
68
- } else {
69
- if ((nav.path && userAuthority.includes(nav.path)) || !nav.path) {
70
- acc.push(nav);
71
- }
72
- }
73
- return acc;
74
- }, []);
75
- };
60
+ if (nav.subMenu && nav.subMenu.length > 0) {
61
+ const filteredSubMenu = filterNavigationByAuthority(
62
+ nav.subMenu,
63
+ userAuthority,
64
+ )
65
+ if (filteredSubMenu.length > 0) {
66
+ acc.push({ ...nav, subMenu: filteredSubMenu })
67
+ }
68
+ } else {
69
+ if ((nav.path && userAuthority.includes(nav.path)) || !nav.path) {
70
+ acc.push(nav)
71
+ }
72
+ }
73
+ return acc
74
+ }, [])
75
+ }
76
+
77
+ const sortNavigationRecursively = (
78
+ navTree: NavigationTree[],
79
+ ): NavigationTree[] => {
80
+ return [...navTree]
81
+ .map((nav) => ({
82
+ ...nav,
83
+ subMenu: nav.subMenu
84
+ ? sortNavigationRecursively(nav.subMenu)
85
+ : nav.subMenu,
86
+ }))
87
+ .sort((a, b) => {
88
+ if (a.sortOrder !== undefined || b.sortOrder !== undefined) {
89
+ const orderA = a.sortOrder ?? Number.MAX_SAFE_INTEGER
90
+ const orderB = b.sortOrder ?? Number.MAX_SAFE_INTEGER
91
+
92
+ if (orderA !== orderB) {
93
+ return orderA - orderB
94
+ }
95
+ }
96
+
97
+ return a.title.localeCompare(b.title, 'pt-BR')
98
+ })
99
+ }
76
100
 
77
101
  const VerticalMenuContent = (props: VerticalMenuContentProps) => {
78
- const {
79
- collapsed,
80
- routeKey,
81
- navigationTree = [],
82
- onMenuItemClick,
83
- direction = themeConfig.direction,
84
- translationSetup,
85
- userAuthority,
86
- linkRenderer,
87
- } = props;
88
-
89
- const { t } = useTranslation(!translationSetup);
90
- const [defaulExpandKey, setDefaulExpandKey] = useState<string[]>([]);
91
- const filteredNavigationTree = useMemo(
92
- () => filterNavigationByAuthority(navigationTree, userAuthority),
93
- [navigationTree, userAuthority]
94
- );
95
-
96
- const { activedRoute } = useMenuActive(filteredNavigationTree, routeKey);
97
-
98
- useEffect(() => {
99
- if (activedRoute?.key) {
100
- const ancestors = findAncestorKeys(
101
- filteredNavigationTree,
102
- activedRoute.key
103
- );
104
- setDefaulExpandKey(ancestors ?? []);
102
+ const {
103
+ collapsed,
104
+ routeKey,
105
+ navigationTree = [],
106
+ onMenuItemClick,
107
+ direction = themeConfig.direction,
108
+ translationSetup,
109
+ userAuthority,
110
+ linkRenderer,
111
+ } = props
112
+
113
+ const { t } = useTranslation(!translationSetup)
114
+ const [defaulExpandKey, setDefaulExpandKey] = useState<string[]>([])
115
+
116
+ const filteredNavigationTree = useMemo(() => {
117
+ const filteredTree = filterNavigationByAuthority(
118
+ navigationTree,
119
+ userAuthority,
120
+ )
121
+
122
+ return sortNavigationRecursively(filteredTree)
123
+ }, [navigationTree, userAuthority])
124
+
125
+ console.log('Filtered Navigation Tree:', filteredNavigationTree)
126
+
127
+ const { activedRoute } = useMenuActive(filteredNavigationTree, routeKey)
128
+
129
+ useEffect(() => {
130
+ if (activedRoute?.key) {
131
+ const ancestors = findAncestorKeys(
132
+ filteredNavigationTree,
133
+ activedRoute.key,
134
+ )
135
+ setDefaulExpandKey(ancestors ?? [])
136
+ }
137
+ }, [activedRoute?.key, filteredNavigationTree])
138
+
139
+ const handleLinkClick = () => {
140
+ onMenuItemClick?.()
105
141
  }
106
- }, [activedRoute?.key, filteredNavigationTree]);
107
142
 
108
- const handleLinkClick = () => {
109
- onMenuItemClick?.();
110
- };
143
+ const renderNavigation = (
144
+ navTree: NavigationTree[],
145
+ cascade: number = 0,
146
+ indent?: boolean,
147
+ ) => {
148
+ const nextCascade = cascade + 1
111
149
 
112
- const renderNavigation = (
113
- navTree: NavigationTree[],
114
- cascade: number = 0,
115
- indent?: boolean
116
- ) => {
117
- const nextCascade = cascade + 1;
150
+ return (
151
+ <>
152
+ {navTree.map((nav) => (
153
+ <Fragment key={nav.key}>
154
+ {nav.type === NAV_ITEM_TYPE_ITEM && (
155
+ <VerticalSingleMenuItem
156
+ key={nav.key}
157
+ currentKey={activedRoute?.key}
158
+ parentKeys={defaulExpandKey}
159
+ nav={nav}
160
+ sideCollapsed={collapsed}
161
+ direction={direction}
162
+ indent={indent}
163
+ renderAsIcon={cascade <= 0}
164
+ showIcon={cascade <= 0}
165
+ userAuthority={userAuthority}
166
+ showTitle={
167
+ nav.forceShowTitle ??
168
+ (collapsed ? cascade >= 1 : cascade <= 1)
169
+ }
170
+ t={t as TraslationFn}
171
+ onLinkClick={handleLinkClick}
172
+ linkRenderer={linkRenderer}
173
+ />
174
+ )}
175
+ {nav.type === NAV_ITEM_TYPE_COLLAPSE && (
176
+ <VerticalCollapsedMenuItem
177
+ key={nav.key}
178
+ currentKey={activedRoute?.key}
179
+ parentKeys={defaulExpandKey}
180
+ nav={nav}
181
+ sideCollapsed={collapsed}
182
+ direction={direction}
183
+ indent={nextCascade >= 2}
184
+ dotIndent={nextCascade >= 2}
185
+ renderAsIcon={nextCascade <= 1}
186
+ userAuthority={userAuthority}
187
+ t={t as TraslationFn}
188
+ onLinkClick={onMenuItemClick}
189
+ >
190
+ {nav.subMenu &&
191
+ nav.subMenu.length > 0 &&
192
+ renderNavigation(
193
+ nav.subMenu,
194
+ nextCascade,
195
+ true,
196
+ )}
197
+ </VerticalCollapsedMenuItem>
198
+ )}
199
+ {nav.type === NAV_ITEM_TYPE_TITLE && (
200
+ <MenuGroup
201
+ key={nav.key}
202
+ label={t(nav.translateKey) || nav.title}
203
+ >
204
+ {nav.subMenu &&
205
+ nav.subMenu.length > 0 &&
206
+ renderNavigation(
207
+ nav.subMenu,
208
+ cascade,
209
+ false,
210
+ )}
211
+ </MenuGroup>
212
+ )}
213
+ </Fragment>
214
+ ))}
215
+ </>
216
+ )
217
+ }
118
218
 
119
219
  return (
120
- <>
121
- {navTree.map((nav) => (
122
- <Fragment key={nav.key}>
123
- {nav.type === NAV_ITEM_TYPE_ITEM && (
124
- <VerticalSingleMenuItem
125
- key={nav.key}
126
- currentKey={activedRoute?.key}
127
- parentKeys={defaulExpandKey}
128
- nav={nav}
129
- sideCollapsed={collapsed}
130
- direction={direction}
131
- indent={indent}
132
- renderAsIcon={cascade <= 0}
133
- showIcon={cascade <= 0}
134
- userAuthority={userAuthority}
135
- showTitle={
136
- nav.forceShowTitle ??
137
- (collapsed ? cascade >= 1 : cascade <= 1)
138
- }
139
- t={t as TraslationFn}
140
- onLinkClick={handleLinkClick}
141
- linkRenderer={linkRenderer}
142
- />
143
- )}
144
- {nav.type === NAV_ITEM_TYPE_COLLAPSE && (
145
- <VerticalCollapsedMenuItem
146
- key={nav.key}
147
- currentKey={activedRoute?.key}
148
- parentKeys={defaulExpandKey}
149
- nav={nav}
150
- sideCollapsed={collapsed}
151
- direction={direction}
152
- indent={nextCascade >= 2}
153
- dotIndent={nextCascade >= 2}
154
- renderAsIcon={nextCascade <= 1}
155
- userAuthority={userAuthority}
156
- t={t as TraslationFn}
157
- onLinkClick={onMenuItemClick}
158
- >
159
- {nav.subMenu &&
160
- nav.subMenu.length > 0 &&
161
- renderNavigation(nav.subMenu, nextCascade, true)}
162
- </VerticalCollapsedMenuItem>
163
- )}
164
- {nav.type === NAV_ITEM_TYPE_TITLE && (
165
- <MenuGroup key={nav.key} label={t(nav.translateKey) || nav.title}>
166
- {nav.subMenu &&
167
- nav.subMenu.length > 0 &&
168
- renderNavigation(nav.subMenu, cascade, false)}
169
- </MenuGroup>
170
- )}
171
- </Fragment>
172
- ))}
173
- </>
174
- );
175
- };
176
-
177
- return (
178
- <Menu
179
- className="px-4 pb-4"
180
- sideCollapsed={collapsed}
181
- defaultActiveKeys={activedRoute?.key ? [activedRoute.key] : []}
182
- defaultExpandedKeys={defaulExpandKey}
183
- defaultCollapseActiveKeys={
184
- activedRoute?.parentKey ? [activedRoute.parentKey] : []
185
- }
186
- >
187
- {renderNavigation(filteredNavigationTree, 0)}
188
- </Menu>
189
- );
190
- };
191
-
192
- export default VerticalMenuContent;
220
+ <Menu
221
+ className="px-4 pb-4"
222
+ sideCollapsed={collapsed}
223
+ defaultActiveKeys={activedRoute?.key ? [activedRoute.key] : []}
224
+ defaultExpandedKeys={defaulExpandKey}
225
+ defaultCollapseActiveKeys={
226
+ activedRoute?.parentKey ? [activedRoute.parentKey] : []
227
+ }
228
+ >
229
+ {renderNavigation(filteredNavigationTree, 0)}
230
+ </Menu>
231
+ )
232
+ }
233
+
234
+ export default VerticalMenuContent