@admin-layout/tailwind-design-pro 12.0.16-alpha.24 → 12.0.16-alpha.26
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.
- package/lib/components/Layout/BasicLayout/index.d.ts +1 -1
- package/lib/components/Layout/BasicLayout/index.d.ts.map +1 -1
- package/lib/components/Layout/BasicLayout/index.js +12 -8
- package/lib/components/Layout/BasicLayout/index.js.map +1 -1
- package/lib/components/Layout/GlobalHeader/RightContent.d.ts +1 -0
- package/lib/components/Layout/GlobalHeader/RightContent.d.ts.map +1 -1
- package/lib/components/Layout/GlobalHeader/RightContent.js +74 -6
- package/lib/components/Layout/GlobalHeader/RightContent.js.map +1 -1
- package/lib/components/Layout/ProTailwindLayout.d.ts +2 -2
- package/lib/components/Layout/ProTailwindLayout.d.ts.map +1 -1
- package/lib/components/Layout/ProTailwindLayout.js +69 -7
- package/lib/components/Layout/ProTailwindLayout.js.map +1 -1
- package/lib/components/Layout/Sidebar/MainSidebar.d.ts.map +1 -1
- package/lib/components/Layout/Sidebar/MainSidebar.js +1 -2
- package/lib/components/Layout/Sidebar/MainSidebar.js.map +1 -1
- package/lib/components/Layout/Sidebar/MainSidebarMenu.d.ts +1 -1
- package/lib/components/Layout/Sidebar/MainSidebarMenu.d.ts.map +1 -1
- package/lib/components/Layout/Sidebar/MainSidebarMenu.js +250 -133
- package/lib/components/Layout/Sidebar/MainSidebarMenu.js.map +1 -1
- package/lib/components/Layout/TailwindLayout.d.ts.map +1 -1
- package/lib/components/Layout/TailwindLayout.js +8 -5
- package/lib/components/Layout/TailwindLayout.js.map +1 -1
- package/lib/components/SettingDrawer/MenuVisibilitySettings.d.ts +20 -0
- package/lib/components/SettingDrawer/MenuVisibilitySettings.d.ts.map +1 -0
- package/lib/components/SettingDrawer/MenuVisibilitySettings.js +120 -0
- package/lib/components/SettingDrawer/MenuVisibilitySettings.js.map +1 -0
- package/lib/components/SettingDrawer/SettingDrawer.d.ts.map +1 -1
- package/lib/components/SettingDrawer/SettingDrawer.js +10 -2
- package/lib/components/SettingDrawer/SettingDrawer.js.map +1 -1
- package/lib/machines/settingsMachine.d.ts.map +1 -1
- package/lib/machines/settingsMachine.js +4 -1
- package/lib/machines/settingsMachine.js.map +1 -1
- package/lib/machines/types.d.ts +2 -0
- package/lib/machines/types.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -1,4 +1,223 @@
|
|
|
1
|
-
import {jsx,jsxs}from'react/jsx-runtime';import {
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {generateMenuPath}from'@admin-layout/client';import {useLocation,Link}from'@remix-run/react';import React__default,{useState,useCallback}from'react';import {icons}from'../../../icons.js';// Constants moved outside component
|
|
2
|
+
const SIDEBAR_WIDTHS = {
|
|
3
|
+
COLLAPSED: 64,
|
|
4
|
+
EXPANDED: 256
|
|
5
|
+
};
|
|
6
|
+
const POPUP_CONFIG = {
|
|
7
|
+
MAX_HEIGHT: 400,
|
|
8
|
+
MIN_WIDTH: 220};
|
|
9
|
+
// Pure function moved outside component
|
|
10
|
+
const getFirstLetter = name => name.charAt(0).toUpperCase();
|
|
11
|
+
// Utility for determining active menu item
|
|
12
|
+
const isMenuItemActive = (itemPath, currentPath, routeParams) => {
|
|
13
|
+
const menuPath = generateMenuPath(itemPath, routeParams);
|
|
14
|
+
// Exact match
|
|
15
|
+
if (currentPath === menuPath) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
// Check if current path is a child of the menu item path
|
|
19
|
+
if (menuPath && currentPath.startsWith(menuPath + '/')) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
};
|
|
24
|
+
// CSS keyframes definition moved outside component
|
|
25
|
+
const POPUP_ANIMATION_CSS = `
|
|
26
|
+
@keyframes fadeIn {
|
|
27
|
+
from { opacity: 0; transform: translateX(-10px); }
|
|
28
|
+
to { opacity: 1; transform: translateX(0); }
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
const getTextColor = (active, navTheme) => {
|
|
32
|
+
if (active) return 'text-primary';
|
|
33
|
+
if (navTheme === 'realDark') return 'text-white';
|
|
34
|
+
return 'text-foreground';
|
|
35
|
+
};
|
|
36
|
+
const getIconColor = (active, navTheme) => {
|
|
37
|
+
if (active) return 'text-primary';
|
|
38
|
+
if (navTheme === 'realDark') return 'text-white';
|
|
39
|
+
return 'text-muted-foreground';
|
|
40
|
+
};
|
|
41
|
+
// Custom comparison function for React.memo
|
|
42
|
+
// Update the areMenuItemPropsEqual function to be more precise about location changes
|
|
43
|
+
const areMenuItemPropsEqual = (prevProps, nextProps) => {
|
|
44
|
+
// Always re-render if the item itself changed
|
|
45
|
+
if (prevProps.item !== nextProps.item) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
// Check only if active state changes instead of checking entire pathname
|
|
49
|
+
const prevIsActive = isMenuItemActive(prevProps.item.path, prevProps.locationPathname, prevProps.routeParams);
|
|
50
|
+
const nextIsActive = isMenuItemActive(nextProps.item.path, nextProps.locationPathname, nextProps.routeParams);
|
|
51
|
+
if (prevIsActive !== nextIsActive) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
// Rest of your existing checks...
|
|
55
|
+
if (prevProps.depth !== nextProps.depth || prevProps.isHoverMenu !== nextProps.isHoverMenu || prevProps.collapsed !== nextProps.collapsed || prevProps.navTheme !== nextProps.navTheme) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
// Check routeParams (shallow object comparison)
|
|
59
|
+
const prevRouteParamsKeys = Object.keys(prevProps.routeParams);
|
|
60
|
+
const nextRouteParamsKeys = Object.keys(nextProps.routeParams);
|
|
61
|
+
if (prevRouteParamsKeys.length !== nextRouteParamsKeys.length) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
for (const key of prevRouteParamsKeys) {
|
|
65
|
+
if (prevProps.routeParams[key] !== nextProps.routeParams[key]) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Check popupPosition
|
|
70
|
+
if (prevProps.popupPosition.top !== nextProps.popupPosition.top || prevProps.popupPosition.height !== nextProps.popupPosition.height) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// Check if this specific item's open state changed
|
|
74
|
+
const prevIsOpen = prevProps.openMenus.includes(prevProps.item.path);
|
|
75
|
+
const nextIsOpen = nextProps.openMenus.includes(nextProps.item.path);
|
|
76
|
+
if (prevIsOpen !== nextIsOpen) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
// Check if this specific item's hover state changed
|
|
80
|
+
const prevIsHovered = prevProps.hoveredMenu === prevProps.item.path;
|
|
81
|
+
const nextIsHovered = nextProps.hoveredMenu === nextProps.item.path;
|
|
82
|
+
if (prevIsHovered !== nextIsHovered) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
// If none of the relevant props changed, don't re-render
|
|
86
|
+
return true;
|
|
87
|
+
};
|
|
88
|
+
const MenuItem = React__default.memo(({
|
|
89
|
+
item,
|
|
90
|
+
depth,
|
|
91
|
+
isHoverMenu,
|
|
92
|
+
openMenus,
|
|
93
|
+
hoveredMenu,
|
|
94
|
+
collapsed,
|
|
95
|
+
navTheme,
|
|
96
|
+
locationPathname,
|
|
97
|
+
routeParams,
|
|
98
|
+
popupPosition,
|
|
99
|
+
onToggleMenu,
|
|
100
|
+
onMenuHover,
|
|
101
|
+
onMenuLeave,
|
|
102
|
+
ChevronUpIcon,
|
|
103
|
+
ChevronDownIcon
|
|
104
|
+
}) => {
|
|
105
|
+
// Only log when actually rendering (not on every navigation)
|
|
106
|
+
const hasChildren = item.children && item.children.length > 0;
|
|
107
|
+
const isOpen = openMenus.includes(item.path);
|
|
108
|
+
const isActive = isMenuItemActive(item.path, locationPathname, routeParams);
|
|
109
|
+
const isHovered = hoveredMenu === item.path;
|
|
110
|
+
const paddingLeft = `${depth * 1}rem`;
|
|
111
|
+
// Determine styling based on whether it's a parent or child item
|
|
112
|
+
const isParentWithChildren = hasChildren && depth === 0;
|
|
113
|
+
const shouldApplyBackground = isActive && !isParentWithChildren || isHovered;
|
|
114
|
+
const handleMenuClick = useCallback(e => {
|
|
115
|
+
if (hasChildren && !collapsed) {
|
|
116
|
+
onToggleMenu(item.path, depth, e);
|
|
117
|
+
}
|
|
118
|
+
}, [hasChildren, collapsed, item.path, depth, onToggleMenu]);
|
|
119
|
+
const renderPopupMenu = useCallback(() => {
|
|
120
|
+
if (!item.children || item.children.length === 0) return null;
|
|
121
|
+
return jsxs("div", {
|
|
122
|
+
className: "fixed shadow-themed-xl rounded-themed-lg border border-border z-[999] overflow-hidden themed-dropdown",
|
|
123
|
+
style: {
|
|
124
|
+
left: `${SIDEBAR_WIDTHS[collapsed ? 'COLLAPSED' : 'EXPANDED']}px`,
|
|
125
|
+
top: `${popupPosition.top}px`,
|
|
126
|
+
animation: 'fadeIn 0.2s ease-out forwards',
|
|
127
|
+
maxWidth: 'calc(100vw - 100px)',
|
|
128
|
+
width: 'max-content',
|
|
129
|
+
minWidth: POPUP_CONFIG.MIN_WIDTH
|
|
130
|
+
},
|
|
131
|
+
children: [jsx("style", {
|
|
132
|
+
dangerouslySetInnerHTML: {
|
|
133
|
+
__html: POPUP_ANIMATION_CSS
|
|
134
|
+
}
|
|
135
|
+
}), jsx("div", {
|
|
136
|
+
className: "font-medium text-sm px-4 py-3 border-b border-border whitespace-nowrap bg-muted",
|
|
137
|
+
children: jsx("span", {
|
|
138
|
+
className: "text-primary",
|
|
139
|
+
children: item.name
|
|
140
|
+
})
|
|
141
|
+
}), jsx("div", {
|
|
142
|
+
className: `max-h-[${POPUP_CONFIG.MAX_HEIGHT}px] overflow-y-auto overflow-x-hidden py-1`,
|
|
143
|
+
children: item.children.map(child => jsx(MenuItem, {
|
|
144
|
+
item: child,
|
|
145
|
+
depth: depth + 1,
|
|
146
|
+
isHoverMenu: true,
|
|
147
|
+
openMenus: openMenus,
|
|
148
|
+
hoveredMenu: hoveredMenu,
|
|
149
|
+
collapsed: collapsed,
|
|
150
|
+
navTheme: navTheme,
|
|
151
|
+
locationPathname: locationPathname,
|
|
152
|
+
routeParams: routeParams,
|
|
153
|
+
popupPosition: popupPosition,
|
|
154
|
+
onToggleMenu: onToggleMenu,
|
|
155
|
+
onMenuHover: onMenuHover,
|
|
156
|
+
onMenuLeave: onMenuLeave,
|
|
157
|
+
ChevronUpIcon: ChevronUpIcon,
|
|
158
|
+
ChevronDownIcon: ChevronDownIcon
|
|
159
|
+
}, child.path))
|
|
160
|
+
})]
|
|
161
|
+
});
|
|
162
|
+
}, [item, depth, collapsed, popupPosition.top, openMenus, hoveredMenu, navTheme, locationPathname, routeParams, onToggleMenu, onMenuHover, onMenuLeave, ChevronUpIcon, ChevronDownIcon]);
|
|
163
|
+
return jsxs("div", {
|
|
164
|
+
className: `w-full relative group ${isHovered && collapsed && !isHoverMenu ? 'rounded-themed' : ''}`,
|
|
165
|
+
style: {
|
|
166
|
+
backgroundColor: isHovered && !isHoverMenu ? 'hsl(var(--muted))' : ''
|
|
167
|
+
},
|
|
168
|
+
onMouseEnter: e => onMenuHover(e, item, isHoverMenu),
|
|
169
|
+
onMouseLeave: () => onMenuLeave(item, isHoverMenu),
|
|
170
|
+
children: [jsxs(Link, {
|
|
171
|
+
to: hasChildren && collapsed && !isHoverMenu ? '#' : generateMenuPath(item?.path, routeParams),
|
|
172
|
+
className: `flex items-center justify-between w-full px-1 py-2 hover:bg-muted text-sm cursor-pointer transition-colors rounded-themed mx-1 my-0.5 whitespace-nowrap overflow-hidden text-ellipsis ${shouldApplyBackground ? 'bg-muted' : ''}`,
|
|
173
|
+
style: {
|
|
174
|
+
paddingLeft: `calc(1rem + ${paddingLeft})`
|
|
175
|
+
},
|
|
176
|
+
onClick: handleMenuClick,
|
|
177
|
+
children: [jsxs("div", {
|
|
178
|
+
className: `flex items-center ${collapsed && !isHoverMenu ? 'justify-center w-full' : 'gap-3'}`,
|
|
179
|
+
children: [item.icon ? jsx("span", {
|
|
180
|
+
className: `flex-shrink-0 ${getIconColor(isActive, navTheme)}`,
|
|
181
|
+
children: item.icon
|
|
182
|
+
}) : collapsed && !isHoverMenu ? jsx("span", {
|
|
183
|
+
className: `flex items-center justify-center flex-shrink-0 ${getIconColor(isActive, navTheme)}`,
|
|
184
|
+
children: getFirstLetter(item.name)
|
|
185
|
+
}) : null, (!collapsed || isHoverMenu) && jsx("span", {
|
|
186
|
+
className: `font-medium whitespace-nowrap overflow-hidden text-ellipsis ${getTextColor(isActive, navTheme)}`,
|
|
187
|
+
children: item.name
|
|
188
|
+
})]
|
|
189
|
+
}), hasChildren && (!collapsed || isHoverMenu) && jsx("span", {
|
|
190
|
+
className: `flex-shrink-0 ml-1 ${getIconColor(isActive, navTheme)}`,
|
|
191
|
+
children: isOpen ? jsx(ChevronUpIcon, {
|
|
192
|
+
className: "h-4 w-4"
|
|
193
|
+
}) : jsx(ChevronDownIcon, {
|
|
194
|
+
className: "h-4 w-4"
|
|
195
|
+
})
|
|
196
|
+
})]
|
|
197
|
+
}), collapsed && hasChildren && isHovered && !isHoverMenu && item.children.length > 0 && renderPopupMenu(), hasChildren && isOpen && !collapsed && jsx("div", {
|
|
198
|
+
className: "transition-all duration-200 ease-in-out",
|
|
199
|
+
children: item.children.map(child => jsx(MenuItem, {
|
|
200
|
+
item: child,
|
|
201
|
+
depth: depth + 1,
|
|
202
|
+
isHoverMenu: false,
|
|
203
|
+
openMenus: openMenus,
|
|
204
|
+
hoveredMenu: hoveredMenu,
|
|
205
|
+
collapsed: collapsed,
|
|
206
|
+
navTheme: navTheme,
|
|
207
|
+
locationPathname: locationPathname,
|
|
208
|
+
routeParams: routeParams,
|
|
209
|
+
popupPosition: popupPosition,
|
|
210
|
+
onToggleMenu: onToggleMenu,
|
|
211
|
+
onMenuHover: onMenuHover,
|
|
212
|
+
onMenuLeave: onMenuLeave,
|
|
213
|
+
ChevronUpIcon: ChevronUpIcon,
|
|
214
|
+
ChevronDownIcon: ChevronDownIcon
|
|
215
|
+
}, child.path))
|
|
216
|
+
})]
|
|
217
|
+
});
|
|
218
|
+
}, areMenuItemPropsEqual);
|
|
219
|
+
MenuItem.displayName = 'MenuItem';
|
|
220
|
+
const MainSidebarMenuComponent = ({
|
|
2
221
|
menuData,
|
|
3
222
|
routeParams,
|
|
4
223
|
settings,
|
|
@@ -15,20 +234,9 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useState}from'react';import {us
|
|
|
15
234
|
ChevronUpIcon
|
|
16
235
|
} = icons;
|
|
17
236
|
const location = useLocation();
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
// Exact match
|
|
22
|
-
if (currentPath === menuPath) {
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
// Check if current path is a child of the menu item path
|
|
26
|
-
if (menuPath && currentPath.startsWith(menuPath + '/')) {
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
return false;
|
|
30
|
-
};
|
|
31
|
-
const toggleMenu = (path, depth, e) => {
|
|
237
|
+
const navTheme = settings?.navTheme;
|
|
238
|
+
// Event handler for toggling menu open/closed
|
|
239
|
+
const toggleMenu = useCallback((path, depth, e) => {
|
|
32
240
|
e.preventDefault();
|
|
33
241
|
if (collapsed) return;
|
|
34
242
|
setOpenMenus(prev => {
|
|
@@ -38,139 +246,48 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useState}from'react';import {us
|
|
|
38
246
|
return [...prev, path];
|
|
39
247
|
}
|
|
40
248
|
});
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
toggleMenu(path, depth, e);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
const getFirstLetter = name => {
|
|
48
|
-
return name.charAt(0).toUpperCase();
|
|
49
|
-
};
|
|
50
|
-
const handleMenuHover = (e, item, isHoverMenu) => {
|
|
249
|
+
}, [collapsed]);
|
|
250
|
+
// Event handlers for hover effects
|
|
251
|
+
const handleMenuHover = useCallback((e, item, isHoverMenu) => {
|
|
51
252
|
// Only set hover state if the menu has children
|
|
52
253
|
if (collapsed && !isHoverMenu && item.children && item.children.length > 0) {
|
|
53
254
|
const element = e.currentTarget;
|
|
54
255
|
const rect = element.getBoundingClientRect();
|
|
55
|
-
let top = rect.top;
|
|
56
|
-
// Store the height to use for positioning
|
|
57
256
|
setPopupPosition({
|
|
58
|
-
top: top,
|
|
257
|
+
top: rect.top,
|
|
59
258
|
height: rect.height
|
|
60
259
|
});
|
|
61
260
|
setHoveredMenu(item.path);
|
|
62
261
|
}
|
|
63
|
-
};
|
|
64
|
-
const handleMenuLeave = (item, isHoverMenu) => {
|
|
262
|
+
}, [collapsed]);
|
|
263
|
+
const handleMenuLeave = useCallback((item, isHoverMenu) => {
|
|
65
264
|
if (collapsed && !isHoverMenu) {
|
|
66
265
|
setHoveredMenu(null);
|
|
67
266
|
}
|
|
68
|
-
};
|
|
69
|
-
const renderPopupMenu = (item, depth = 0) => {
|
|
70
|
-
if (!item.children || item.children.length === 0) return null;
|
|
71
|
-
const sidebarWidth = collapsed ? 64 : 256; // 80px for collapsed (w-20), 256px for expanded (w-64)
|
|
72
|
-
return jsxs("div", {
|
|
73
|
-
className: "fixed shadow-themed-xl rounded-themed-lg border border-border z-[999] overflow-hidden themed-dropdown",
|
|
74
|
-
style: {
|
|
75
|
-
left: `${sidebarWidth}px`,
|
|
76
|
-
// Position right after sidebar
|
|
77
|
-
top: `${popupPosition.top}px`,
|
|
78
|
-
animation: 'fadeIn 0.2s ease-out forwards',
|
|
79
|
-
maxWidth: 'calc(100vw - 100px)',
|
|
80
|
-
// Prevent overflow on small screens
|
|
81
|
-
width: 'max-content',
|
|
82
|
-
minWidth: '220px'
|
|
83
|
-
},
|
|
84
|
-
children: [jsx("style", {
|
|
85
|
-
dangerouslySetInnerHTML: {
|
|
86
|
-
__html: `
|
|
87
|
-
@keyframes fadeIn {
|
|
88
|
-
from { opacity: 0; transform: translateX(-10px); }
|
|
89
|
-
to { opacity: 1; transform: translateX(0); }
|
|
90
|
-
}
|
|
91
|
-
`
|
|
92
|
-
}
|
|
93
|
-
}), jsx("div", {
|
|
94
|
-
className: "font-medium text-sm px-4 py-3 border-b border-border whitespace-nowrap bg-muted",
|
|
95
|
-
children: jsx("span", {
|
|
96
|
-
className: "text-primary",
|
|
97
|
-
children: item.name
|
|
98
|
-
})
|
|
99
|
-
}), jsx("div", {
|
|
100
|
-
className: "max-h-[400px] overflow-y-auto overflow-x-hidden py-1",
|
|
101
|
-
children: item.children.map(child => jsx("div", {
|
|
102
|
-
className: "w-full min-w-max",
|
|
103
|
-
children: renderMenuItem(child, depth + 1, true)
|
|
104
|
-
}, child.path))
|
|
105
|
-
})]
|
|
106
|
-
});
|
|
107
|
-
};
|
|
108
|
-
const renderMenuItem = (item, depth = 0, isHoverMenu = false) => {
|
|
109
|
-
const hasChildren = item.children && item.children.length > 0;
|
|
110
|
-
const isOpen = openMenus.includes(item.path);
|
|
111
|
-
const isActive = isMenuItemActive(item.path);
|
|
112
|
-
const isHovered = hoveredMenu === item.path;
|
|
113
|
-
const paddingLeft = `${depth * 1}rem`;
|
|
114
|
-
// Determine styling based on whether it's a parent or child item
|
|
115
|
-
const isParentWithChildren = hasChildren && depth === 0;
|
|
116
|
-
const shouldApplyBackground = isActive && !isParentWithChildren || isHovered;
|
|
117
|
-
return jsxs("div", {
|
|
118
|
-
className: `w-full relative group ${isHovered && collapsed && !isHoverMenu ? `rounded-themed` : ''}`,
|
|
119
|
-
style: {
|
|
120
|
-
backgroundColor: isHovered && !isHoverMenu ? 'hsl(var(--muted))' : ''
|
|
121
|
-
},
|
|
122
|
-
onMouseEnter: e => handleMenuHover(e, item, isHoverMenu),
|
|
123
|
-
onMouseLeave: () => handleMenuLeave(item, isHoverMenu),
|
|
124
|
-
children: [jsxs(Link, {
|
|
125
|
-
to: hasChildren && collapsed && !isHoverMenu ? '#' : generateMenuPath(item?.path, routeParams),
|
|
126
|
-
className: `flex items-center justify-between w-full px-1 py-2 hover:bg-muted text-sm cursor-pointer transition-colors rounded-themed mx-1 my-0.5 whitespace-nowrap overflow-hidden text-ellipsis ${shouldApplyBackground ? 'bg-muted' : ''}`,
|
|
127
|
-
style: {
|
|
128
|
-
paddingLeft: `calc(1rem + ${paddingLeft})`
|
|
129
|
-
},
|
|
130
|
-
onClick: e => handleMenuClick(item.path, hasChildren, depth, e),
|
|
131
|
-
children: [jsxs("div", {
|
|
132
|
-
className: `flex items-center ${collapsed && !isHoverMenu ? 'justify-center w-full' : 'gap-3'}`,
|
|
133
|
-
children: [item.icon ? jsx("span", {
|
|
134
|
-
className: `flex-shrink-0 ${isActive ? 'text-primary' : 'text-muted-foreground'}`,
|
|
135
|
-
style: {
|
|
136
|
-
color: !isActive && settings?.navTheme === 'realDark' ? '#fff' : undefined
|
|
137
|
-
},
|
|
138
|
-
children: item.icon
|
|
139
|
-
}) : collapsed && !isHoverMenu ? jsx("span", {
|
|
140
|
-
className: `flex items-center justify-center flex-shrink-0 ${isActive ? 'text-primary' : 'text-muted-foreground'}`,
|
|
141
|
-
style: {
|
|
142
|
-
color: !isActive && settings?.navTheme === 'realDark' ? '#fff' : undefined
|
|
143
|
-
},
|
|
144
|
-
children: getFirstLetter(item.name)
|
|
145
|
-
}) : null, (!collapsed || isHoverMenu) && jsx("span", {
|
|
146
|
-
className: `font-medium whitespace-nowrap overflow-hidden text-ellipsis ${isActive ? 'text-primary' : 'text-foreground'}`,
|
|
147
|
-
style: {
|
|
148
|
-
color: !isActive && settings?.navTheme === 'realDark' ? '#fff' : undefined
|
|
149
|
-
},
|
|
150
|
-
children: item.name
|
|
151
|
-
})]
|
|
152
|
-
}), hasChildren && (!collapsed || isHoverMenu) && jsx("span", {
|
|
153
|
-
className: `flex-shrink-0 ml-1 ${isActive ? 'text-primary' : 'text-muted-foreground'}`,
|
|
154
|
-
style: {
|
|
155
|
-
color: !isActive && settings?.navTheme === 'realDark' ? '#fff' : undefined
|
|
156
|
-
},
|
|
157
|
-
children: isOpen ? jsx(ChevronUpIcon, {
|
|
158
|
-
className: "h-4 w-4"
|
|
159
|
-
}) : jsx(ChevronDownIcon, {
|
|
160
|
-
className: "h-4 w-4"
|
|
161
|
-
})
|
|
162
|
-
})]
|
|
163
|
-
}), collapsed && hasChildren && isHovered && !isHoverMenu && item.children.length > 0 && renderPopupMenu(item, depth), hasChildren && isOpen && !collapsed && jsx("div", {
|
|
164
|
-
className: "transition-all duration-200 ease-in-out",
|
|
165
|
-
children: item.children.map(child => renderMenuItem(child, depth + 1))
|
|
166
|
-
})]
|
|
167
|
-
}, item.path);
|
|
168
|
-
};
|
|
267
|
+
}, [collapsed]);
|
|
169
268
|
return jsx("div", {
|
|
170
269
|
className: "overflow-hidden",
|
|
171
270
|
children: jsx("nav", {
|
|
172
271
|
className: `mt-2 ${collapsed ? 'px-1' : 'px-2'} overflow-x-hidden`,
|
|
173
|
-
children: menuData.map(item =>
|
|
272
|
+
children: menuData.map(item => jsx(MenuItem, {
|
|
273
|
+
item: item,
|
|
274
|
+
depth: 0,
|
|
275
|
+
isHoverMenu: false,
|
|
276
|
+
openMenus: openMenus,
|
|
277
|
+
hoveredMenu: hoveredMenu,
|
|
278
|
+
collapsed: collapsed,
|
|
279
|
+
navTheme: navTheme,
|
|
280
|
+
locationPathname: location.pathname,
|
|
281
|
+
routeParams: routeParams,
|
|
282
|
+
popupPosition: popupPosition,
|
|
283
|
+
onToggleMenu: toggleMenu,
|
|
284
|
+
onMenuHover: handleMenuHover,
|
|
285
|
+
onMenuLeave: handleMenuLeave,
|
|
286
|
+
ChevronUpIcon: ChevronUpIcon,
|
|
287
|
+
ChevronDownIcon: ChevronDownIcon
|
|
288
|
+
}, item.path))
|
|
174
289
|
})
|
|
175
290
|
});
|
|
176
|
-
};
|
|
291
|
+
};
|
|
292
|
+
// Export the memoized version to prevent unnecessary re-renders
|
|
293
|
+
const MainSidebarMenu = React__default.memo(MainSidebarMenuComponent);export{MainSidebarMenu};//# sourceMappingURL=MainSidebarMenu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MainSidebarMenu.js","sources":["../../../../src/components/Layout/Sidebar/MainSidebarMenu.tsx"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"MainSidebarMenu.js","sources":["../../../../src/components/Layout/Sidebar/MainSidebarMenu.tsx"],"sourcesContent":[null],"names":["React","_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TailwindLayout.d.ts","sourceRoot":"","sources":["../../../src/components/Layout/TailwindLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"TailwindLayout.d.ts","sourceRoot":"","sources":["../../../src/components/Layout/TailwindLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,sBAAsB,CAAC;AAK3E,OAAO,KAA+B,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAqEvF,KAAK,cAAc,GAAG,cAAc,CAAC,OAAO,SAAS,CAAC,CAAC;AAEvD,QAAA,MAAM,SAAS;;;0EAAoB,CAAC;AAEpC,KAAK,+BAA+B,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAEzE,QAAA,MAAM,mBAAmB,EAAE,kBAAkB,CACzC,KAAK,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,+BAA+B,KAAK,GAAG,CAAC,OAAO,CAAC,EAClF,GAAG,CAC8C,CAAC;AAEtD,eAAe,mBAAmB,CAAC"}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
import {jsx}from'react/jsx-runtime';import {useLayoutSettings}from'@admin-layout/client';import {userSelector}from'@adminide-stack/user-auth0-client';import {useMachine}from'@xstate/react';import React__default,{useMemo,useCallback}from'react';import {connect,useSelector}from'react-redux';import {settingsMachine}from'../../machines/settingsMachine.js';import {
|
|
1
|
+
import {jsx}from'react/jsx-runtime';import {useLayoutSettings}from'@admin-layout/client';import {TailwindThemeProvider}from'@admin-layout/tailwind-ui';import {userSelector}from'@adminide-stack/user-auth0-client';import {useRouteLoaderData}from'@remix-run/react';import {useMachine}from'@xstate/react';import React__default,{useMemo,useCallback}from'react';import {connect,useSelector}from'react-redux';import {settingsMachine}from'../../machines/settingsMachine.js';import {BasicLayout}from'./BasicLayout/index.js';function BasicLayoutWithAuthorities(props) {
|
|
2
2
|
const userData = useSelector(userSelector);
|
|
3
3
|
const {
|
|
4
4
|
settings: settingsFromLoader
|
|
5
5
|
} = useRouteLoaderData('root');
|
|
6
6
|
const {
|
|
7
|
-
settings,
|
|
8
7
|
setSettings
|
|
9
8
|
} = useLayoutSettings();
|
|
10
9
|
const [state, send, settingsActor] = useMachine(settingsMachine.provide({
|
|
11
10
|
actions: {
|
|
12
11
|
updateReduxSettings: ({
|
|
13
|
-
context
|
|
12
|
+
context,
|
|
13
|
+
event
|
|
14
14
|
}) => {
|
|
15
|
+
if (event?.type === 'ROUTE_CHANGE') {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
15
18
|
setSettings(context);
|
|
16
19
|
}
|
|
17
20
|
}
|
|
@@ -25,8 +28,8 @@ import {jsx}from'react/jsx-runtime';import {useLayoutSettings}from'@admin-layout
|
|
|
25
28
|
permissions
|
|
26
29
|
} = props;
|
|
27
30
|
const mainHeaderProps = useMemo(() => ({
|
|
28
|
-
picture: userData
|
|
29
|
-
}), [userData]);
|
|
31
|
+
picture: userData?.profile?.picture || null
|
|
32
|
+
}), [userData?.profile?.picture]);
|
|
30
33
|
const onSettingChange = useCallback(config => {
|
|
31
34
|
// Update Redux first
|
|
32
35
|
setSettings(config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TailwindLayout.js","sources":["../../../src/components/Layout/TailwindLayout.tsx"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TailwindLayout.js","sources":["../../../src/components/Layout/TailwindLayout.tsx"],"sourcesContent":[null],"names":[],"mappings":"mgBAYA,SAAS,0BAA0B,CAAC,KAAqC,EAAA;AACrE,EAAA,MAAA,WAAiB,WAAA,CAAA,YAAY,CAAA;QACvB;AACN,IAAA,QAAQ,EAAW;AACnB,GAAA,GAAA,kBAAoB,CAAA,MAAA,CAAA;AAEZ,EAAA,MAAA;;AAEQ,GAAA,GAAA,mBAAS;oBACL,EAAO,aAAA,CAAA,GAAA,UAAA,CAAA,eAAA,CAAA,OAAA,CAAA;;yBAEA,EAAA,CAAC;eACf;AACJ,QAAA;AACJ,OACD,KAAA;AACI,QAAA,IAAA,KAAO,EAAA,IAAA,KAAA,cAAA,EAAA;AACH,UAAA;AACH;AACJ,QACH,WAAA,CAAA,OAAA,CAAA;AAEF;AACA;AACA,GAAA,CAAA,EAAA;AAEQ,IAAA,KAAA,EAAA;MACF,QACO,EAAA;AAEb;;QAGQ,aAAkB,GAAA,KAAE,EAAA,OAAA;AACxB,EAAA,MACC;IAGL;MACM,KAAA;QAEC,eACmB,GAAA,OAAA,CAAA,OAAA;AAY9B,IAAC,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,OAAA,IAAA;AAED,GAAM,CAAA,EAAA,CAAA,QAAW,EAAA,OAAG,EAAA,OAAU,CAAA,CAAA;QAClB,eAAA,GAAA,WAAA,CAAA,MAAA,IAAA;;AAEX,IAAE,WAAA,CAAA,MAAA,CAAA;AAMH,GAAA,EAAA,CAAM,WAAY,CAAA,CAAA;AAIlB;AAKA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface MenuItem {
|
|
2
|
+
key: string;
|
|
3
|
+
name: string;
|
|
4
|
+
path: string;
|
|
5
|
+
position?: string;
|
|
6
|
+
children?: MenuItem[];
|
|
7
|
+
tab?: string;
|
|
8
|
+
[key: string]: any;
|
|
9
|
+
}
|
|
10
|
+
interface MenuVisibilitySettingsProps {
|
|
11
|
+
fullMenuData: MenuItem[];
|
|
12
|
+
settings: {
|
|
13
|
+
hiddenMenuKeys?: string[];
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
};
|
|
16
|
+
changeSetting: (key: string, value: any) => void;
|
|
17
|
+
}
|
|
18
|
+
export default function MenuVisibilitySettings({ fullMenuData, settings, changeSetting }: MenuVisibilitySettingsProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=MenuVisibilitySettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuVisibilitySettings.d.ts","sourceRoot":"","sources":["../../../src/components/SettingDrawer/MenuVisibilitySettings.tsx"],"names":[],"mappings":"AAQA,UAAU,QAAQ;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,UAAU,2BAA2B;IACjC,YAAY,EAAE,QAAQ,EAAE,CAAC;IACzB,QAAQ,EAAE;QACN,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACtB,CAAC;IACF,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,2BAA2B,2CAsFpH"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useState,useMemo,useCallback}from'react';import {useTranslation}from'react-i18next';// Constants
|
|
2
|
+
// all keys included now ['usermenu', 'topmenu']
|
|
3
|
+
const EXCLUDED_MENU_KEYS = [];
|
|
4
|
+
const MENU_POSITIONS = ['UPPER', 'MIDDLE', 'LOWER', 'BOTTOM'];
|
|
5
|
+
function MenuVisibilitySettings({
|
|
6
|
+
fullMenuData,
|
|
7
|
+
settings,
|
|
8
|
+
changeSetting
|
|
9
|
+
}) {
|
|
10
|
+
const {
|
|
11
|
+
t
|
|
12
|
+
} = useTranslation('settings');
|
|
13
|
+
const [isExpanded, setIsExpanded] = useState(false);
|
|
14
|
+
// Get deduplicated hidden menu keys
|
|
15
|
+
const hiddenMenuKeys = useMemo(() => {
|
|
16
|
+
return settings.hiddenMenuKeys ? Array.from(new Set(settings.hiddenMenuKeys)) : [];
|
|
17
|
+
}, [settings.hiddenMenuKeys]);
|
|
18
|
+
// Organize menu items by position
|
|
19
|
+
const allMenuItems = useMemo(() => {
|
|
20
|
+
const categories = [];
|
|
21
|
+
// Process defined positions
|
|
22
|
+
MENU_POSITIONS.forEach(position => {
|
|
23
|
+
const positionItems = fullMenuData.filter(item => item.position === position && item.key && !EXCLUDED_MENU_KEYS.includes(item.key));
|
|
24
|
+
categories.push(...positionItems);
|
|
25
|
+
});
|
|
26
|
+
// Handle items without position
|
|
27
|
+
const itemsWithoutPosition = fullMenuData.filter(item => !item.position && item.key && !EXCLUDED_MENU_KEYS.includes(item.key));
|
|
28
|
+
categories.push(...itemsWithoutPosition);
|
|
29
|
+
return categories;
|
|
30
|
+
}, [fullMenuData]);
|
|
31
|
+
// Create bound functions with current dependencies
|
|
32
|
+
const boundGetDisplayName = useCallback(item => getDisplayName(item, t), [t]);
|
|
33
|
+
const boundToggleMenuItem = useCallback(itemKey => toggleMenuItem(itemKey, hiddenMenuKeys, changeSetting), [hiddenMenuKeys, changeSetting]);
|
|
34
|
+
// Memoize rendered menu items to prevent unnecessary JSX creation
|
|
35
|
+
const renderedMenuItems = useMemo(() => {
|
|
36
|
+
return renderMenuItems(allMenuItems, 0, hiddenMenuKeys, boundGetDisplayName, boundToggleMenuItem);
|
|
37
|
+
}, [allMenuItems, hiddenMenuKeys, boundGetDisplayName, boundToggleMenuItem]);
|
|
38
|
+
return jsxs("div", {
|
|
39
|
+
className: "space-y-4",
|
|
40
|
+
children: [jsx("div", {
|
|
41
|
+
className: "flex items-center mb-2",
|
|
42
|
+
children: jsxs("button", {
|
|
43
|
+
onClick: () => setIsExpanded(!isExpanded),
|
|
44
|
+
className: "flex items-center gap-2 hover:opacity-80 transition-all duration-200",
|
|
45
|
+
children: [jsx("svg", {
|
|
46
|
+
className: `w-4 h-4 transition-transform duration-300 ease-in-out ${isExpanded ? 'rotate-180' : ''}`,
|
|
47
|
+
fill: "none",
|
|
48
|
+
stroke: "currentColor",
|
|
49
|
+
viewBox: "0 0 24 24",
|
|
50
|
+
children: jsx("path", {
|
|
51
|
+
strokeLinecap: "round",
|
|
52
|
+
strokeLinejoin: "round",
|
|
53
|
+
strokeWidth: 2,
|
|
54
|
+
d: "M19 9l-7 7-7-7"
|
|
55
|
+
})
|
|
56
|
+
}), jsx("p", {
|
|
57
|
+
className: "text-md font-medium text-black dark:text-white",
|
|
58
|
+
children: t('menu_visibility.title') || 'Menu Visibility'
|
|
59
|
+
})]
|
|
60
|
+
})
|
|
61
|
+
}), jsx("div", {
|
|
62
|
+
className: `grid transition-all duration-300 ease-in-out ${isExpanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'}`,
|
|
63
|
+
children: jsx("div", {
|
|
64
|
+
className: "overflow-hidden",
|
|
65
|
+
children: jsx("div", {
|
|
66
|
+
className: "ml-4 mb-4 border-l-2 border-gray-200 dark:border-gray-600 pl-4",
|
|
67
|
+
children: jsx("div", {
|
|
68
|
+
className: "space-y-2",
|
|
69
|
+
children: allMenuItems.length === 0 ? jsx("div", {
|
|
70
|
+
className: "text-center text-gray-500 dark:text-gray-400 py-4",
|
|
71
|
+
children: t('menu_visibility.no_items') || 'No menu items found'
|
|
72
|
+
}) : renderedMenuItems
|
|
73
|
+
})
|
|
74
|
+
})
|
|
75
|
+
})
|
|
76
|
+
})]
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// Helper functions
|
|
80
|
+
function getDisplayName(item, t) {
|
|
81
|
+
if (item.tab) return item.tab;
|
|
82
|
+
if (item.name?.startsWith('menu.')) {
|
|
83
|
+
const parts = item.name.split('.');
|
|
84
|
+
return parts.length > 1 ? parts[parts.length - 1].charAt(0).toUpperCase() + parts[parts.length - 1].slice(1) : item.name;
|
|
85
|
+
}
|
|
86
|
+
return t(item.name) || item.name;
|
|
87
|
+
}
|
|
88
|
+
function toggleMenuItem(itemKey, hiddenMenuKeys, changeSetting) {
|
|
89
|
+
const uniqueKeys = new Set(hiddenMenuKeys);
|
|
90
|
+
uniqueKeys.has(itemKey) ? uniqueKeys.delete(itemKey) : uniqueKeys.add(itemKey);
|
|
91
|
+
changeSetting('hiddenMenuKeys', Array.from(uniqueKeys));
|
|
92
|
+
}
|
|
93
|
+
function renderMenuItems(items, indent, hiddenMenuKeys, getDisplayNameFn, toggleMenuItemFn) {
|
|
94
|
+
return items.map(item => {
|
|
95
|
+
const isVisible = !hiddenMenuKeys.includes(item.key);
|
|
96
|
+
const displayName = getDisplayNameFn(item);
|
|
97
|
+
return jsxs("div", {
|
|
98
|
+
children: [jsxs("div", {
|
|
99
|
+
className: "flex items-center py-0.5",
|
|
100
|
+
children: [jsx("input", {
|
|
101
|
+
type: "checkbox",
|
|
102
|
+
id: `menu-item-${item.key}`,
|
|
103
|
+
className: "mr-2 h-3 w-3 rounded border-gray-300 dark:border-gray-600 text-primary dark:text-white focus:ring-primary dark:focus:ring-primary bg-white dark:bg-gray-700",
|
|
104
|
+
checked: isVisible,
|
|
105
|
+
onChange: () => toggleMenuItemFn(item.key)
|
|
106
|
+
}), jsx("label", {
|
|
107
|
+
htmlFor: `menu-item-${item.key}`,
|
|
108
|
+
className: "text-xs text-black dark:text-white cursor-pointer flex-1",
|
|
109
|
+
style: {
|
|
110
|
+
paddingLeft: `${indent * 12}px`
|
|
111
|
+
},
|
|
112
|
+
children: displayName
|
|
113
|
+
})]
|
|
114
|
+
}), isVisible && item.children && item.children.length > 0 && jsx("div", {
|
|
115
|
+
className: "ml-6",
|
|
116
|
+
children: renderMenuItems(item.children, indent + 1, hiddenMenuKeys, getDisplayNameFn, toggleMenuItemFn)
|
|
117
|
+
})]
|
|
118
|
+
}, item.key);
|
|
119
|
+
});
|
|
120
|
+
}export{MenuVisibilitySettings as default};//# sourceMappingURL=MenuVisibilitySettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuVisibilitySettings.js","sources":["../../../src/components/SettingDrawer/MenuVisibilitySettings.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
|