@orbe-agro/client-core 5.6.123 → 5.6.124

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 (22) 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 +31 -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/components/template/VerticalMenuContent/VerticalMenuContent.d.ts +3 -3
  12. package/dist/@types/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.d.ts.map +1 -1
  13. package/dist/@types/@ecme/components/template/VerticalMenuContent/VerticalSingleMenuItem.d.ts +3 -3
  14. package/dist/@types/@ecme/components/template/VerticalMenuContent/VerticalSingleMenuItem.d.ts.map +1 -1
  15. package/dist/@types/@ecme/components/ui/Button/Button.stories.d.ts +9 -0
  16. package/dist/@types/@ecme/components/ui/Button/Button.stories.d.ts.map +1 -0
  17. package/dist/base/assets/styles/init.css +15 -0
  18. package/lib/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.stories.tsx +244 -0
  19. package/lib/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.tsx +203 -172
  20. package/lib/@ecme/components/template/VerticalMenuContent/VerticalSingleMenuItem.tsx +135 -157
  21. package/lib/@ecme/components/ui/Button/Button.stories.tsx +22 -0
  22. package/package.json +9 -1
@@ -1,192 +1,223 @@
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) => a.title.localeCompare(b.title, 'pt-BR'))
88
+ }
76
89
 
77
90
  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 ?? []);
91
+ const {
92
+ collapsed,
93
+ routeKey,
94
+ navigationTree = [],
95
+ onMenuItemClick,
96
+ direction = themeConfig.direction,
97
+ translationSetup,
98
+ userAuthority,
99
+ linkRenderer,
100
+ } = props
101
+
102
+ const { t } = useTranslation(!translationSetup)
103
+ const [defaulExpandKey, setDefaulExpandKey] = useState<string[]>([])
104
+
105
+ const filteredNavigationTree = useMemo(() => {
106
+ const filteredTree = filterNavigationByAuthority(
107
+ navigationTree,
108
+ userAuthority,
109
+ )
110
+
111
+ return sortNavigationRecursively(filteredTree)
112
+ }, [navigationTree, userAuthority])
113
+
114
+ console.log('Filtered Navigation Tree:', filteredNavigationTree)
115
+
116
+ const { activedRoute } = useMenuActive(filteredNavigationTree, routeKey)
117
+
118
+ useEffect(() => {
119
+ if (activedRoute?.key) {
120
+ const ancestors = findAncestorKeys(
121
+ filteredNavigationTree,
122
+ activedRoute.key,
123
+ )
124
+ setDefaulExpandKey(ancestors ?? [])
125
+ }
126
+ }, [activedRoute?.key, filteredNavigationTree])
127
+
128
+ const handleLinkClick = () => {
129
+ onMenuItemClick?.()
105
130
  }
106
- }, [activedRoute?.key, filteredNavigationTree]);
107
131
 
108
- const handleLinkClick = () => {
109
- onMenuItemClick?.();
110
- };
132
+ const renderNavigation = (
133
+ navTree: NavigationTree[],
134
+ cascade: number = 0,
135
+ indent?: boolean,
136
+ ) => {
137
+ const nextCascade = cascade + 1
111
138
 
112
- const renderNavigation = (
113
- navTree: NavigationTree[],
114
- cascade: number = 0,
115
- indent?: boolean
116
- ) => {
117
- const nextCascade = cascade + 1;
139
+ return (
140
+ <>
141
+ {navTree.map((nav) => (
142
+ <Fragment key={nav.key}>
143
+ {nav.type === NAV_ITEM_TYPE_ITEM && (
144
+ <VerticalSingleMenuItem
145
+ key={nav.key}
146
+ currentKey={activedRoute?.key}
147
+ parentKeys={defaulExpandKey}
148
+ nav={nav}
149
+ sideCollapsed={collapsed}
150
+ direction={direction}
151
+ indent={indent}
152
+ renderAsIcon={cascade <= 0}
153
+ showIcon={cascade <= 0}
154
+ userAuthority={userAuthority}
155
+ showTitle={
156
+ nav.forceShowTitle ??
157
+ (collapsed ? cascade >= 1 : cascade <= 1)
158
+ }
159
+ t={t as TraslationFn}
160
+ onLinkClick={handleLinkClick}
161
+ linkRenderer={linkRenderer}
162
+ />
163
+ )}
164
+ {nav.type === NAV_ITEM_TYPE_COLLAPSE && (
165
+ <VerticalCollapsedMenuItem
166
+ key={nav.key}
167
+ currentKey={activedRoute?.key}
168
+ parentKeys={defaulExpandKey}
169
+ nav={nav}
170
+ sideCollapsed={collapsed}
171
+ direction={direction}
172
+ indent={nextCascade >= 2}
173
+ dotIndent={nextCascade >= 2}
174
+ renderAsIcon={nextCascade <= 1}
175
+ userAuthority={userAuthority}
176
+ t={t as TraslationFn}
177
+ onLinkClick={onMenuItemClick}
178
+ >
179
+ {nav.subMenu &&
180
+ nav.subMenu.length > 0 &&
181
+ renderNavigation(
182
+ nav.subMenu,
183
+ nextCascade,
184
+ true,
185
+ )}
186
+ </VerticalCollapsedMenuItem>
187
+ )}
188
+ {nav.type === NAV_ITEM_TYPE_TITLE && (
189
+ <MenuGroup
190
+ key={nav.key}
191
+ label={t(nav.translateKey) || nav.title}
192
+ >
193
+ {nav.subMenu &&
194
+ nav.subMenu.length > 0 &&
195
+ renderNavigation(
196
+ nav.subMenu,
197
+ cascade,
198
+ false,
199
+ )}
200
+ </MenuGroup>
201
+ )}
202
+ </Fragment>
203
+ ))}
204
+ </>
205
+ )
206
+ }
118
207
 
119
208
  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;
209
+ <Menu
210
+ className="px-4 pb-4"
211
+ sideCollapsed={collapsed}
212
+ defaultActiveKeys={activedRoute?.key ? [activedRoute.key] : []}
213
+ defaultExpandedKeys={defaulExpandKey}
214
+ defaultCollapseActiveKeys={
215
+ activedRoute?.parentKey ? [activedRoute.parentKey] : []
216
+ }
217
+ >
218
+ {renderNavigation(filteredNavigationTree, 0)}
219
+ </Menu>
220
+ )
221
+ }
222
+
223
+ export default VerticalMenuContent