From 70d99473e1ebbd98518d4258345be5459e0a8cb3 Mon Sep 17 00:00:00 2001 From: Mohamadzadeh <7796733@gmail.com> Date: Wed, 19 Aug 2026 18:16:49 +0330 Subject: [PATCH] fix sidebar --- README.md | 4 +- dist/layout.js | 160 ++++++++++++++++++++--------------------- src/layout/Sidebar.jsx | 11 +-- 3 files changed, 83 insertions(+), 92 deletions(-) diff --git a/README.md b/README.md index f422837..d7da3f4 100644 --- a/README.md +++ b/README.md @@ -178,7 +178,9 @@ function AppSidebar() { } ``` -`Sidebar` باید داخل `BiProvider` استفاده شود. Permission هر آیتم از `perm` توسط خود UI Kit بررسی می‌شود، خروج با Keycloak توسط خود UI Kit انجام می‌شود و دسترسی `panel_access` نیز داخل Sidebar کنترل می‌شود. سامانه مقصد نیازی به `usePermission` یا `logoutKeycloak` برای Sidebar ندارد. +`Sidebar` باید داخل `BiProvider` استفاده شود. Permission هر آیتم از `perm` توسط خود UI Kit بررسی می‌شود و خروج با Keycloak توسط خود UI Kit انجام می‌شود. سامانه مقصد نیازی به `usePermission` یا `logoutKeycloak` برای Sidebar ندارد. + +کنترل دسترسی کلی `panel_access` عمداً داخل Sidebar انجام نمی‌شود تا navigation هنگام render باعث redirect و لغو route در Next.js نشود. اگر سامانه به این guard نیاز دارد، از `PanelAccessGuard` موجود در `uikit/core` در سطح Layout/App استفاده کنید. `aliases` نیز پشتیبانی می‌شود و برای تشخیص آیتم active استفاده می‌شود: diff --git a/dist/layout.js b/dist/layout.js index 78381b6..95a0c83 100644 --- a/dist/layout.js +++ b/dist/layout.js @@ -1,11 +1,11 @@ -import { jsx as A, jsxs as g, Fragment as K } from "react/jsx-runtime"; -import { Box as c, HStack as p, VStack as s, Image as N, Text as d, useDisclosure as q, Stack as _, Tooltip as T, IconButton as j, Icon as C, Drawer as $, DrawerOverlay as AA, DrawerContent as oA, DrawerCloseButton as eA, DrawerHeader as nA, DrawerBody as tA, SimpleGrid as rA, Link as gA } from "@chakra-ui/react"; -import { useRef as lA, Children as iA, isValidElement as IA, useEffect as aA, forwardRef as cA } from "react"; -import { FiMoreHorizontal as dA } from "react-icons/fi/index.js"; -import { IoExit as CA } from "react-icons/io5/index.js"; -import { u as sA, l as E } from "./chunks/permission-DL7ciWwc.js"; -const bA = "data:image/webp;base64,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MCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE4LTA4LTEzVDE0OjI1OjUzKzA0OjMwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE4LTA4LTEzVDE0OjI1OjUzKzA0OjMwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOC0wOC0xM1QxNDoyNTo1MyswNDozMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0wOC0xM1QxNDoyNTo1MyswNDozMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDoxMDU3ZjgxNy03YTEzLThiNGEtODc1Ni1lYWM1MWEyZDRiYTY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDgtMTNUMTQ6MjU6NTMrMDQ6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MDZjNmM4ODYtZDY2My1jMzQzLTkwZTUtNjQ4ZWJlYTkxYzgxPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjEwNTdmODE3LTdhMTMtOGI0YS04NzU2LWVhYzUxYTJkNGJhNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NWI3ZmJlNDgtMDc0ZS01NzRhLWFlNTctN2RmYjA4NmI1N2Q3PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjA2YzZjODg2LWQ2NjMtYzM0My05MGU1LTY0OGViZWE5MWM4MTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPnNSR0IgSUVDNjE5NjYtMi4xPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4KICAgICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgICAgIDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmEwYjgxNWMzLTkzYjMtODU0MC04NmY0LTA0OTEyZTY5Y2Y4NTwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgIDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K"; -function pA({ children: o, ...n }) { +import { jsx as A, jsxs as g, Fragment as H } from "react/jsx-runtime"; +import { Box as c, HStack as p, VStack as s, Image as Y, Text as d, useDisclosure as F, Stack as J, Tooltip as k, IconButton as N, Icon as C, Drawer as K, DrawerOverlay as q, DrawerContent as _, DrawerCloseButton as $, DrawerHeader as AA, DrawerBody as oA, SimpleGrid as eA, Link as nA } from "@chakra-ui/react"; +import { useRef as tA, Children as rA, isValidElement as gA, forwardRef as lA } from "react"; +import { FiMoreHorizontal as iA } from "react-icons/fi/index.js"; +import { IoExit as IA } from "react-icons/io5/index.js"; +import { u as aA, l as cA } from "./chunks/permission-DL7ciWwc.js"; +const dA = "data:image/webp;base64,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MCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE4LTA4LTEzVDE0OjI1OjUzKzA0OjMwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE4LTA4LTEzVDE0OjI1OjUzKzA0OjMwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOC0wOC0xM1QxNDoyNTo1MyswNDozMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0wOC0xM1QxNDoyNTo1MyswNDozMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDoxMDU3ZjgxNy03YTEzLThiNGEtODc1Ni1lYWM1MWEyZDRiYTY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDgtMTNUMTQ6MjU6NTMrMDQ6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MDZjNmM4ODYtZDY2My1jMzQzLTkwZTUtNjQ4ZWJlYTkxYzgxPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjEwNTdmODE3LTdhMTMtOGI0YS04NzU2LWVhYzUxYTJkNGJhNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NWI3ZmJlNDgtMDc0ZS01NzRhLWFlNTctN2RmYjA4NmI1N2Q3PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjA2YzZjODg2LWQ2NjMtYzM0My05MGU1LTY0OGViZWE5MWM4MTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPnNSR0IgSUVDNjE5NjYtMi4xPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4KICAgICAgICAgICAgPHJkZjpCYWc+CiAgICAgICAgICAgICAgIDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmEwYjgxNWMzLTkzYjMtODU0MC04NmY0LTA0OTEyZTY5Y2Y4NTwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAgIDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K"; +function CA({ children: o, ...n }) { return /* @__PURE__ */ A( c, { @@ -24,13 +24,13 @@ function pA({ children: o, ...n }) { } ); } -function hA({ children: o, ...n }) { +function sA({ children: o, ...n }) { return /* @__PURE__ */ A(p, { alignItems: "center", h: "100%", py: "10px", ...n, children: o }); } -function uA(o) { - return /* @__PURE__ */ A(N, { loading: "lazy", alt: "logo", maxW: "80px", maxH: "80px", ...o }); +function bA(o) { + return /* @__PURE__ */ A(Y, { loading: "lazy", alt: "logo", maxW: "80px", maxH: "80px", ...o }); } -function xA({ children: o, ...n }) { +function pA({ children: o, ...n }) { return /* @__PURE__ */ A( s, { @@ -43,13 +43,13 @@ function xA({ children: o, ...n }) { } ); } -function RA({ children: o, ...n }) { +function hA({ children: o, ...n }) { return /* @__PURE__ */ A(d, { fontWeight: "bold", fontSize: "20px", ...n, children: o }); } -function DA({ children: o, ...n }) { +function uA({ children: o, ...n }) { return /* @__PURE__ */ A(d, { ...n, children: o }); } -function mA({ logoSrc: o = bA, ...n }) { +function xA({ logoSrc: o = dA, ...n }) { return /* @__PURE__ */ g( s, { @@ -59,29 +59,29 @@ function mA({ logoSrc: o = bA, ...n }) { py: "10px", ...n, children: [ - /* @__PURE__ */ A(N, { src: o, loading: "lazy", maxW: "90px" }), + /* @__PURE__ */ A(Y, { src: o, loading: "lazy", maxW: "90px" }), /* @__PURE__ */ A(d, { fontSize: "xs", fontWeight: "bold", textAlign: "center", children: "مؤسسه تولید سیستم‌های خبره و هوشمند اسلامی باقرالعلوم(ع)" }) ] } ); } -const SA = Object.assign(pA, { - BrandSection: hA, - Logo: uA, - Brand: xA, - Title: RA, - Description: DA, - Bi: mA -}), B = (o, n) => { +const WA = Object.assign(CA, { + BrandSection: sA, + Logo: bA, + Brand: pA, + Title: hA, + Description: uA, + Bi: xA +}), E = (o, n) => { const t = (o == null ? void 0 : o.split("?")[0]) || ""; return [n == null ? void 0 : n.path, ...(n == null ? void 0 : n.aliases) || []].filter(Boolean).some( (l) => t === l || t.startsWith(`${l}/`) ); -}, YA = (o = [], n) => o.find((t) => B(n, t)), h = cA( - ({ linkComponent: o, href: n, children: t, ...r }, l) => /* @__PURE__ */ A(gA, { ref: l, href: n, ...o ? { as: o } : {}, ...r, children: t }) +}, MA = (o = [], n) => o.find((t) => E(n, t)), h = lA( + ({ linkComponent: o, href: n, children: t, ...r }, l) => /* @__PURE__ */ A(nA, { ref: l, href: n, ...o ? { as: o } : {}, ...r, children: t }) ); h.displayName = "SidebarLink"; -const ZA = ({ +const RA = ({ item: o, isActive: n, isDisabled: t, @@ -89,7 +89,7 @@ const ZA = ({ onNavigate: l }) => { const i = /* @__PURE__ */ A( - j, + N, { variant: "ghost", icon: /* @__PURE__ */ A(C, { as: o.icon }), @@ -103,7 +103,7 @@ const ZA = ({ } ); return /* @__PURE__ */ A( - T, + k, { label: t ? "عدم دسترسی" : o.title, placement: "left-start", @@ -124,7 +124,7 @@ const ZA = ({ ) } ); -}, yA = ({ +}, DA = ({ item: o, isActive: n, isDisabled: t, @@ -188,33 +188,29 @@ const ZA = ({ children: i } ); -}, Q = () => null, GA = ({ +}, T = () => null, mA = ({ items: o = [], currentPath: n, linkComponent: t, onNavigate: r, children: l, primaryMobileCount: i = 4, - moreTitle: O = "بیشتر", - moreDrawerTitle: P = "سایر بخش‌های سامانه", - desktopProps: L, - mobileProps: V + moreTitle: j = "بیشتر", + moreDrawerTitle: B = "سایر بخش‌های سامانه", + desktopProps: Q, + mobileProps: O }) => { - var S, Y; - const { isOpen: U, onOpen: X, onClose: u } = q(), G = lA(), { cannot: H, can: f, isLoading: w } = sA(), I = iA.toArray(l).find( - (e) => IA(e) && e.type === Q - ), x = !!I, R = ((S = I == null ? void 0 : I.props) == null ? void 0 : S.title) || "خروج", v = ((Y = I == null ? void 0 : I.props) == null ? void 0 : Y.icon) || CA; - aA(() => { - w || f("panel_access") || E(); - }, [f, w]); - const F = n ?? (typeof window < "u" ? `${window.location.pathname}${window.location.search}` : ""), J = o.slice(0, i), D = o.slice(i), m = (e) => (Array.isArray(e == null ? void 0 : e.perm) ? e.perm : [e == null ? void 0 : e.perm]).filter(Boolean).some((a) => H(a)), b = (e) => B(F, e), Z = D.some(b), W = D.length > 0 || x, M = (e) => { + var M, z; + const { isOpen: P, onOpen: L, onClose: u } = F(), G = tA(), { cannot: V } = aA(), I = rA.toArray(l).find( + (e) => gA(e) && e.type === T + ), x = !!I, R = ((M = I == null ? void 0 : I.props) == null ? void 0 : M.title) || "خروج", w = ((z = I == null ? void 0 : I.props) == null ? void 0 : z.icon) || IA, U = n ?? (typeof window < "u" ? `${window.location.pathname}${window.location.search}` : ""), X = o.slice(0, i), D = o.slice(i), m = (e) => (Array.isArray(e == null ? void 0 : e.perm) ? e.perm : [e == null ? void 0 : e.perm]).filter(Boolean).some((a) => V(a)), b = (e) => E(U, e), Z = D.some(b), f = D.length > 0 || x, v = (e) => { r == null || r(e), u(); - }, z = () => { - u(), E(); + }, W = () => { + u(), cA(); }; - return /* @__PURE__ */ g(K, { children: [ + return /* @__PURE__ */ g(H, { children: [ /* @__PURE__ */ A( - _, + J, { py: 6, as: "nav", @@ -230,10 +226,10 @@ const ZA = ({ msOverflowStyle: "none" }, display: { base: "none", lg: "flex" }, - ...L, + ...Q, children: /* @__PURE__ */ g(s, { spacing: 2, children: [ o.map((e) => /* @__PURE__ */ A( - ZA, + RA, { item: e, isDisabled: m(e), @@ -244,7 +240,7 @@ const ZA = ({ e.path )), x && /* @__PURE__ */ A( - T, + k, { label: R, placement: "left-start", @@ -255,14 +251,14 @@ const ZA = ({ fontWeight: "bold", closeDelay: 150, children: /* @__PURE__ */ A( - j, + N, { variant: "ghost", - icon: /* @__PURE__ */ A(C, { as: v }), + icon: /* @__PURE__ */ A(C, { as: w }), fontSize: "xl", size: { base: "sm", lg: "lg" }, "aria-label": R, - onClick: z + onClick: W } ) } @@ -285,20 +281,20 @@ const ZA = ({ borderColor: "gray.200", boxShadow: "0 -6px 18px rgba(0, 0, 0, 0.08)", pb: "env(safe-area-inset-bottom)", - ...V, + ...O, children: /* @__PURE__ */ g(p, { h: "56px", px: 1.5, spacing: 1, align: "stretch", children: [ - J.map((e) => /* @__PURE__ */ A( - yA, + X.map((e) => /* @__PURE__ */ A( + DA, { item: e, isDisabled: m(e), isActive: b(e), linkComponent: t, - onNavigate: () => M(e) + onNavigate: () => v(e) }, e.path )), - W && /* @__PURE__ */ A( + f && /* @__PURE__ */ A( c, { as: "button", @@ -315,7 +311,7 @@ const ZA = ({ alignItems: "center", justifyContent: "center", cursor: "pointer", - onClick: X, + onClick: L, "aria-label": "نمایش سایر بخش‌ها", children: /* @__PURE__ */ g( s, @@ -328,14 +324,14 @@ const ZA = ({ color: Z ? "blue.600" : "gray.600", bg: Z ? "blue.50" : "transparent", children: [ - /* @__PURE__ */ A(C, { as: dA, boxSize: 5 }), + /* @__PURE__ */ A(C, { as: iA, boxSize: 5 }), /* @__PURE__ */ A( d, { fontSize: "10px", fontWeight: Z ? "bold" : "medium", lineHeight: "short", - children: O + children: j } ) ] @@ -346,27 +342,27 @@ const ZA = ({ ] }) } ), - W && /* @__PURE__ */ g( - $, + f && /* @__PURE__ */ g( + K, { - isOpen: U, + isOpen: P, placement: "bottom", onClose: u, finalFocusRef: G, children: [ - /* @__PURE__ */ A(AA, {}), + /* @__PURE__ */ A(q, {}), /* @__PURE__ */ g( - oA, + _, { borderTopRadius: "2xl", maxH: "min(78dvh, 620px)", pb: "env(safe-area-inset-bottom)", children: [ - /* @__PURE__ */ A(eA, { insetInlineEnd: 3, insetInlineStart: "auto" }), - /* @__PURE__ */ A(nA, { borderBottomWidth: "1px", fontSize: "md", children: P }), - /* @__PURE__ */ g(tA, { py: 4, overflowY: "auto", children: [ - /* @__PURE__ */ A(rA, { columns: 4, spacing: 2, children: D.map((e) => { - const y = m(e), a = b(e), k = /* @__PURE__ */ g( + /* @__PURE__ */ A($, { insetInlineEnd: 3, insetInlineStart: "auto" }), + /* @__PURE__ */ A(AA, { borderBottomWidth: "1px", fontSize: "md", children: B }), + /* @__PURE__ */ g(oA, { py: 4, overflowY: "auto", children: [ + /* @__PURE__ */ A(eA, { columns: 4, spacing: 2, children: D.map((e) => { + const y = m(e), a = b(e), S = /* @__PURE__ */ g( s, { h: "70px", @@ -397,15 +393,15 @@ const ZA = ({ ] } ); - return y ? /* @__PURE__ */ A(c, { children: k }, e.path) : /* @__PURE__ */ A( + return y ? /* @__PURE__ */ A(c, { children: S }, e.path) : /* @__PURE__ */ A( h, { linkComponent: t, href: e.path, _hover: { textDecoration: "none" }, - onClick: () => M(e), + onClick: () => v(e), "aria-current": a ? "page" : void 0, - children: k + children: S }, e.path ); @@ -423,9 +419,9 @@ const ZA = ({ color: "red.600", bg: "red.50", cursor: "pointer", - onClick: z, + onClick: W, children: [ - /* @__PURE__ */ A(C, { as: v, boxSize: 5 }), + /* @__PURE__ */ A(C, { as: w, boxSize: 5 }), /* @__PURE__ */ A(d, { fontWeight: "bold", children: R }) ] } @@ -438,12 +434,12 @@ const ZA = ({ } ) ] }); -}, kA = Object.assign(GA, { - Exit: Q +}, zA = Object.assign(mA, { + Exit: T }); export { - SA as Header, - kA as Sidebar, - YA as getActiveSidebarItem, - B as isSidebarPathActive + WA as Header, + zA as Sidebar, + MA as getActiveSidebarItem, + E as isSidebarPathActive }; diff --git a/src/layout/Sidebar.jsx b/src/layout/Sidebar.jsx index cd6359d..86dfc62 100644 --- a/src/layout/Sidebar.jsx +++ b/src/layout/Sidebar.jsx @@ -19,7 +19,7 @@ import { VStack, useDisclosure, } from "@chakra-ui/react"; -import { Children, forwardRef, isValidElement, useEffect, useRef } from "react"; +import { Children, forwardRef, isValidElement, useRef } from "react"; import { FiMoreHorizontal } from "react-icons/fi/index.js"; import { IoExit } from "react-icons/io5/index.js"; import { logoutKeycloak } from "../core/keycloak.jsx"; @@ -181,7 +181,7 @@ const SidebarRoot = ({ }) => { const { isOpen, onOpen, onClose } = useDisclosure(); const moreButtonRef = useRef(); - const { cannot, can, isLoading } = usePermission(); + const { cannot } = usePermission(); const exitElement = Children.toArray(children).find( (child) => isValidElement(child) && child.type === SidebarExit, @@ -190,13 +190,6 @@ const SidebarRoot = ({ const logoutTitle = exitElement?.props?.title || "خروج"; const logoutIcon = exitElement?.props?.icon || IoExit; - useEffect(() => { - if (isLoading) return; - - if (!can("panel_access")) { - logoutKeycloak(); - } - }, [can, isLoading]); const resolvedCurrentPath = currentPath ??