diff --git a/src/Pages/Dashboard.tsx b/src/Pages/Dashboard.tsx index 60603cd..79839c1 100644 --- a/src/Pages/Dashboard.tsx +++ b/src/Pages/Dashboard.tsx @@ -118,6 +118,41 @@ export default function Dashboard() { })) .filter((item) => item.subItems.length > 0); + const adminFilteredItems = filteredMenuItems.filter( + (item) => item.en === "admin", + ); + const nonAdminFilteredItems = filteredMenuItems.filter( + (item) => item.en !== "admin", + ); + + const permissionDomainMap = new Map(); + (profile?.permissions || []).forEach((permission: any) => { + if (permission?.page_name) { + permissionDomainMap.set( + permission.page_name, + permission?.domain_fa_name || "سایر حوزه ها", + ); + } + }); + + const groupedFilteredItems = nonAdminFilteredItems.reduce( + (acc, item) => { + const firstSubItem = item.subItems?.find((sub) => + permissionDomainMap.has(sub.name), + ); + const domainTitle = firstSubItem + ? permissionDomainMap.get(firstSubItem.name) || "سایر حوزه ها" + : "سایر حوزه ها"; + if (!acc[domainTitle]) { + acc[domainTitle] = []; + } + acc[domainTitle].push(item); + return acc; + }, + {} as Record, + ); + const showDomainGrouping = Object.keys(groupedFilteredItems).length > 1; + function findSubItemByPath( items: ItemWithSubItems[], path: string, @@ -243,110 +278,322 @@ export default function Dashboard() { }`} > {checkIsMobile() - ? filteredMenuItems.map(({ fa, icon: Icon, subItems }, index) => { - const filteredSubItems = subItems.filter( - (item) => - !item.path.includes("$") && - getFaPermissions(item.name).includes(search.trim()), - ); - - if (filteredSubItems.length === 0) return null; - - return ( -
-
- -

- {fa} -

-
- -
- {filteredSubItems.map((sub, subIndex) => ( - navigate({ to: sub.path })} - whileHover={{ scale: 1.03 }} - whileTap={{ scale: 0.97 }} - className="flex items-center gap-2 cursor-pointer bg-gray-50 dark:bg-dark-700 text-right border border-gray-200 dark:border-dark-600 hover:border-primary-500 dark:hover:border-primary-400 shadow-sm rounded-xl p-3 transition-all duration-200" - > - - - {getFaPermissions(sub.name)} - - - ))} -
-
- ); - }) - : filteredMenuItems.map(({ fa, icon: Icon, subItems }, index) => ( - -
-
-
- + ? ( + <> + {adminFilteredItems.map(({ fa, icon: Icon, subItems }, index) => ( +
+
+ +

+ {fa} +

- - {fa} - -
-
- -
- {subItems.map((sub, subIndex) => { - const isActive = tabs.some( - (tab) => - tab.path === sub.path && activeTabId === tab.id, - ); - return ( - openTab(sub)} - className={`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md cursor-pointer transition-all duration-200 focus:outline-none ${ - isActive - ? "backdrop-blur-sm bg-primary-500/20 dark:bg-primary-400/20 text-primary-700 dark:text-primary-300 " - : "hover:backdrop-blur-sm hover:bg-white/30 dark:hover:bg-dark-600/30 border-none" - }`} - > -
- + {subItems.map((sub, subIndex) => ( + navigate({ to: sub.path })} + whileHover={{ scale: 1.03 }} + whileTap={{ scale: 0.97 }} + className="flex items-center gap-2 cursor-pointer bg-gray-50 dark:bg-dark-700 text-right border border-gray-200 dark:border-dark-600 hover:border-primary-500 dark:hover:border-primary-400 shadow-sm rounded-xl p-3 transition-all duration-200" > - {getFaPermissions(sub.name)} + + + {getFaPermissions(sub.name)} + + + ))} +
+ + ))} + {showDomainGrouping + ? Object.entries(groupedFilteredItems).map( + ([domainTitle, domainItems], domainIndex) => ( +
+
+ +

+ {domainTitle} +

+
+ {domainItems.map(({ fa, icon: Icon, subItems }, index) => ( +
+
+ +

+ {fa} +

+
+
+ {subItems.map((sub, subIndex) => ( + navigate({ to: sub.path })} + whileHover={{ scale: 1.03 }} + whileTap={{ scale: 0.97 }} + className="flex items-center gap-2 cursor-pointer bg-white dark:bg-dark-800 text-right border border-gray-200 dark:border-dark-600 hover:border-primary-500 dark:hover:border-primary-400 shadow-sm rounded-xl p-3 transition-all duration-200" + > + + + {getFaPermissions(sub.name)} + + + ))} +
+
+ ))} +
+ ), + ) + : nonAdminFilteredItems.map(({ fa, icon: Icon, subItems }, index) => ( +
+
+ +

+ {fa} +

+
+
+ {subItems.map((sub, subIndex) => ( + navigate({ to: sub.path })} + whileHover={{ scale: 1.03 }} + whileTap={{ scale: 0.97 }} + className="flex items-center gap-2 cursor-pointer bg-gray-50 dark:bg-dark-700 text-right border border-gray-200 dark:border-dark-600 hover:border-primary-500 dark:hover:border-primary-400 shadow-sm rounded-xl p-3 transition-all duration-200" + > + + + {getFaPermissions(sub.name)} + + + ))} +
+
+ ))} + + ) + : ( + <> + {adminFilteredItems.map(({ fa, icon: Icon, subItems }, index) => ( + +
+
+
+ +
+ + {fa} +
+
+
+ {subItems.map((sub, subIndex) => { + const isActive = tabs.some( + (tab) => tab.path === sub.path && activeTabId === tab.id, + ); + return ( + openTab(sub)} + className={`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md cursor-pointer transition-all duration-200 focus:outline-none ${ + isActive + ? "backdrop-blur-sm bg-primary-500/20 dark:bg-primary-400/20 text-primary-700 dark:text-primary-300 " + : "hover:backdrop-blur-sm hover:bg-white/30 dark:hover:bg-dark-600/30 border-none" + }`} + > +
+ + {getFaPermissions(sub.name)} + + + ); + })} +
+
+ ))} + {showDomainGrouping + ? Object.entries(groupedFilteredItems).map( + ([domainTitle, domainItems], domainIndex) => ( +
+
+ + + {domainTitle} + +
+
+ {domainItems.map(({ fa, icon: Icon, subItems }, index) => ( + +
+
+
+ +
+ + {fa} + +
+
+
+ {subItems.map((sub, subIndex) => { + const isActive = tabs.some( + (tab) => + tab.path === sub.path && + activeTabId === tab.id, + ); + return ( + openTab(sub)} + className={`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md cursor-pointer transition-all duration-200 focus:outline-none ${ + isActive + ? "backdrop-blur-sm bg-primary-500/20 dark:bg-primary-400/20 text-primary-700 dark:text-primary-300 " + : "hover:backdrop-blur-sm hover:bg-white/30 dark:hover:bg-dark-600/30 border-none" + }`} + > +
+ + {getFaPermissions(sub.name)} + + + ); + })} +
+
+ ))} +
+
+ ), + ) + : nonAdminFilteredItems.map(({ fa, icon: Icon, subItems }, index) => ( + +
+
+
+ +
+ + {fa} + +
+
+
+ {subItems.map((sub, subIndex) => { + const isActive = tabs.some( + (tab) => + tab.path === sub.path && activeTabId === tab.id, + ); + return ( + openTab(sub)} + className={`flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-md cursor-pointer transition-all duration-200 focus:outline-none ${ + isActive + ? "backdrop-blur-sm bg-primary-500/20 dark:bg-primary-400/20 text-primary-700 dark:text-primary-300 " + : "hover:backdrop-blur-sm hover:bg-white/30 dark:hover:bg-dark-600/30 border-none" + }`} + > +
+ + {getFaPermissions(sub.name)} + + + ); + })} +
- ); - })} -
-
- ))} + ))} + + )}
)}