diff --git a/README.md b/README.md
index a828584..f422837 100644
--- a/README.md
+++ b/README.md
@@ -814,3 +814,26 @@ function UsersTable({ data, columns }) {
);
}
```
+
+
+## Sidebar.Exit
+
+`Sidebar` بهصورت پیشفرض گزینه خروج را نمایش نمیدهد. برای فعالکردن خروج Keycloak داخلی UI Kit، آن را بهصورت compound component اضافه کنید:
+
+```jsx
+
+
+
+```
+
+عنوان و آیکون خروج قابل تغییر هستند:
+
+```jsx
+
+```
+
+`Sidebar.Exit` از `logoutKeycloak` داخلی UI Kit استفاده میکند و callback خروج از سامانه مقصد نیاز ندارد.
diff --git a/dist/layout.d.ts b/dist/layout.d.ts
index fc44a0f..deefbf8 100644
--- a/dist/layout.d.ts
+++ b/dist/layout.d.ts
@@ -13,8 +13,7 @@ export type SidebarProps = {
currentPath?: string;
linkComponent?: any;
onNavigate?: (item: SidebarItem) => void;
- logoutTitle?: string;
- logoutIcon?: any;
+ children?: any;
primaryMobileCount?: number;
moreTitle?: string;
moreDrawerTitle?: string;
@@ -22,7 +21,14 @@ export type SidebarProps = {
mobileProps?: Record;
};
-export function Sidebar(props: SidebarProps): any;
+export type SidebarExitProps = {
+ title?: string;
+ icon?: any;
+};
+
+export const Sidebar: ((props: SidebarProps) => any) & {
+ Exit: (props: SidebarExitProps) => any;
+};
export function isSidebarPathActive(
currentPath: string | undefined,
item: SidebarItem,
diff --git a/dist/layout.js b/dist/layout.js
index 2ff8b22..78381b6 100644
--- a/dist/layout.js
+++ b/dist/layout.js
@@ -1,13 +1,13 @@
-import { jsx as A, jsxs as l, Fragment as L } from "react/jsx-runtime";
-import { Box as a, HStack as b, VStack as C, Image as M, Text as c, useDisclosure as V, Stack as U, Tooltip as z, IconButton as S, Icon as d, Drawer as X, DrawerOverlay as H, DrawerContent as F, DrawerCloseButton as J, DrawerHeader as K, DrawerBody as q, SimpleGrid as _, Link as $ } from "@chakra-ui/react";
-import { useRef as AA, useEffect as eA, forwardRef as oA } from "react";
-import { FiMoreHorizontal as nA } from "react-icons/fi";
-import { IoExit as tA } from "react-icons/io5";
-import { u as rA, l as W } from "./chunks/permission-DL7ciWwc.js";
-const gA = "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 lA({ children: e, ...n }) {
+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 }) {
return /* @__PURE__ */ A(
- a,
+ c,
{
as: "header",
w: "100%",
@@ -20,38 +20,38 @@ function lA({ children: e, ...n }) {
position: "fixed",
color: "white",
...n,
- children: /* @__PURE__ */ A(b, { h: "100%", alignItems: "center", justifyContent: "space-between", children: e })
+ children: /* @__PURE__ */ A(p, { h: "100%", alignItems: "center", justifyContent: "space-between", children: o })
}
);
}
-function iA({ children: e, ...n }) {
- return /* @__PURE__ */ A(b, { alignItems: "center", h: "100%", py: "10px", ...n, children: e });
+function hA({ children: o, ...n }) {
+ return /* @__PURE__ */ A(p, { alignItems: "center", h: "100%", py: "10px", ...n, children: o });
}
-function IA(e) {
- return /* @__PURE__ */ A(M, { loading: "lazy", alt: "logo", maxW: "80px", maxH: "80px", ...e });
+function uA(o) {
+ return /* @__PURE__ */ A(N, { loading: "lazy", alt: "logo", maxW: "80px", maxH: "80px", ...o });
}
-function aA({ children: e, ...n }) {
+function xA({ children: o, ...n }) {
return /* @__PURE__ */ A(
- C,
+ s,
{
alignItems: "start",
justifyContent: "center",
h: "100%",
spacing: 1,
...n,
- children: e
+ children: o
}
);
}
-function cA({ children: e, ...n }) {
- return /* @__PURE__ */ A(c, { fontWeight: "bold", fontSize: "20px", ...n, children: e });
+function RA({ children: o, ...n }) {
+ return /* @__PURE__ */ A(d, { fontWeight: "bold", fontSize: "20px", ...n, children: o });
}
-function dA({ children: e, ...n }) {
- return /* @__PURE__ */ A(c, { ...n, children: e });
+function DA({ children: o, ...n }) {
+ return /* @__PURE__ */ A(d, { ...n, children: o });
}
-function CA({ logoSrc: e = gA, ...n }) {
- return /* @__PURE__ */ l(
- C,
+function mA({ logoSrc: o = bA, ...n }) {
+ return /* @__PURE__ */ g(
+ s,
{
w: "fit-content",
alignItems: "center",
@@ -59,53 +59,53 @@ function CA({ logoSrc: e = gA, ...n }) {
py: "10px",
...n,
children: [
- /* @__PURE__ */ A(M, { src: e, loading: "lazy", maxW: "90px" }),
- /* @__PURE__ */ A(c, { fontSize: "xs", fontWeight: "bold", textAlign: "center", children: "مؤسسه تولید سیستمهای خبره و هوشمند اسلامی باقرالعلوم(ع)" })
+ /* @__PURE__ */ A(N, { src: o, loading: "lazy", maxW: "90px" }),
+ /* @__PURE__ */ A(d, { fontSize: "xs", fontWeight: "bold", textAlign: "center", children: "مؤسسه تولید سیستمهای خبره و هوشمند اسلامی باقرالعلوم(ع)" })
]
}
);
}
-const mA = Object.assign(lA, {
- BrandSection: iA,
- Logo: IA,
- Brand: aA,
- Title: cA,
- Description: dA,
- Bi: CA
-}), Y = (e, n) => {
- const t = (e == null ? void 0 : e.split("?")[0]) || "";
+const SA = Object.assign(pA, {
+ BrandSection: hA,
+ Logo: uA,
+ Brand: xA,
+ Title: RA,
+ Description: DA,
+ Bi: mA
+}), B = (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(
- (g) => t === g || t.startsWith(`${g}/`)
+ (l) => t === l || t.startsWith(`${l}/`)
);
-}, ZA = (e = [], n) => e.find((t) => Y(n, t)), p = oA(
- ({ linkComponent: e, href: n, children: t, ...r }, g) => /* @__PURE__ */ A($, { ref: g, href: n, ...e ? { as: e } : {}, ...r, children: t })
+}, 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 })
);
-p.displayName = "SidebarLink";
-const sA = ({
- item: e,
+h.displayName = "SidebarLink";
+const ZA = ({
+ item: o,
isActive: n,
isDisabled: t,
linkComponent: r,
- onNavigate: g
+ onNavigate: l
}) => {
const i = /* @__PURE__ */ A(
- S,
+ j,
{
variant: "ghost",
- icon: /* @__PURE__ */ A(d, { as: e.icon }),
+ icon: /* @__PURE__ */ A(C, { as: o.icon }),
fontSize: "xl",
size: { base: "sm", lg: "lg" },
isDisabled: t,
isActive: n,
- "aria-label": e.title,
+ "aria-label": o.title,
"aria-current": n ? "page" : void 0,
- onClick: t ? void 0 : g
+ onClick: t ? void 0 : l
}
);
return /* @__PURE__ */ A(
- z,
+ T,
{
- label: t ? "عدم دسترسی" : e.title,
+ label: t ? "عدم دسترسی" : o.title,
placement: "left-start",
hasArrow: !0,
rounded: "md",
@@ -113,26 +113,26 @@ const sA = ({
px: 4,
fontWeight: "bold",
closeDelay: 150,
- children: t ? /* @__PURE__ */ A(a, { as: "span", children: i }) : /* @__PURE__ */ A(
- p,
+ children: t ? /* @__PURE__ */ A(c, { as: "span", children: i }) : /* @__PURE__ */ A(
+ h,
{
linkComponent: r,
- href: e.path,
+ href: o.path,
_hover: { textDecoration: "none" },
children: i
}
)
}
);
-}, bA = ({
- item: e,
+}, yA = ({
+ item: o,
isActive: n,
isDisabled: t,
linkComponent: r,
- onNavigate: g
+ onNavigate: l
}) => {
- const i = /* @__PURE__ */ l(
- C,
+ const i = /* @__PURE__ */ g(
+ s,
{
as: "span",
spacing: 0.5,
@@ -146,9 +146,9 @@ const sA = ({
opacity: t ? 0.4 : 1,
transition: "background-color 150ms ease, color 150ms ease",
children: [
- /* @__PURE__ */ A(d, { as: e.icon, boxSize: 5 }),
+ /* @__PURE__ */ A(C, { as: o.icon, boxSize: 5 }),
/* @__PURE__ */ A(
- c,
+ d,
{
as: "span",
w: "full",
@@ -157,14 +157,14 @@ const sA = ({
lineHeight: "short",
textAlign: "center",
noOfLines: 1,
- children: e.mobileTitle || e.title
+ children: o.mobileTitle || o.title
}
)
]
}
);
return t ? /* @__PURE__ */ A(
- a,
+ c,
{
flex: "1",
minW: 0,
@@ -174,45 +174,47 @@ const sA = ({
children: i
}
) : /* @__PURE__ */ A(
- p,
+ h,
{
linkComponent: r,
- href: e.path,
+ href: o.path,
flex: "1",
minW: 0,
display: "flex",
alignItems: "center",
_hover: { textDecoration: "none" },
- onClick: g,
+ onClick: l,
"aria-current": n ? "page" : void 0,
children: i
}
);
-}, GA = ({
- items: e = [],
+}, Q = () => null, GA = ({
+ items: o = [],
currentPath: n,
linkComponent: t,
onNavigate: r,
- logoutTitle: g = "خروج",
- logoutIcon: i = tA,
- primaryMobileCount: D = 4,
- moreTitle: k = "بیشتر",
- moreDrawerTitle: N = "سایر بخشهای سامانه",
- desktopProps: E,
- mobileProps: j
+ children: l,
+ primaryMobileCount: i = 4,
+ moreTitle: O = "بیشتر",
+ moreDrawerTitle: P = "سایر بخشهای سامانه",
+ desktopProps: L,
+ mobileProps: V
}) => {
- const { isOpen: T, onOpen: B, onClose: h } = V(), m = AA(), { cannot: Q, can: Z, isLoading: G } = rA();
- eA(() => {
- G || Z("panel_access") || W();
- }, [Z, G]);
- const P = n ?? (typeof window < "u" ? `${window.location.pathname}${window.location.search}` : ""), O = e.slice(0, D), w = e.slice(D), u = (o) => (Array.isArray(o == null ? void 0 : o.perm) ? o.perm : [o == null ? void 0 : o.perm]).filter(Boolean).some((I) => Q(I)), s = (o) => Y(P, o), x = w.some(s), f = (o) => {
- r == null || r(o), h();
- }, y = () => {
- h(), W();
+ 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) => {
+ r == null || r(e), u();
+ }, z = () => {
+ u(), E();
};
- return /* @__PURE__ */ l(L, { children: [
+ return /* @__PURE__ */ g(K, { children: [
/* @__PURE__ */ A(
- U,
+ _,
{
py: 6,
as: "nav",
@@ -228,23 +230,23 @@ const sA = ({
msOverflowStyle: "none"
},
display: { base: "none", lg: "flex" },
- ...E,
- children: /* @__PURE__ */ l(C, { spacing: 2, children: [
- e.map((o) => /* @__PURE__ */ A(
- sA,
+ ...L,
+ children: /* @__PURE__ */ g(s, { spacing: 2, children: [
+ o.map((e) => /* @__PURE__ */ A(
+ ZA,
{
- item: o,
- isDisabled: u(o),
- isActive: s(o),
+ item: e,
+ isDisabled: m(e),
+ isActive: b(e),
linkComponent: t,
- onNavigate: () => r == null ? void 0 : r(o)
+ onNavigate: () => r == null ? void 0 : r(e)
},
- o.path
+ e.path
)),
- /* @__PURE__ */ A(
- z,
+ x && /* @__PURE__ */ A(
+ T,
{
- label: g,
+ label: R,
placement: "left-start",
hasArrow: !0,
rounded: "md",
@@ -253,14 +255,14 @@ const sA = ({
fontWeight: "bold",
closeDelay: 150,
children: /* @__PURE__ */ A(
- S,
+ j,
{
variant: "ghost",
- icon: /* @__PURE__ */ A(d, { as: i }),
+ icon: /* @__PURE__ */ A(C, { as: v }),
fontSize: "xl",
size: { base: "sm", lg: "lg" },
- "aria-label": g,
- onClick: y
+ "aria-label": R,
+ onClick: z
}
)
}
@@ -269,7 +271,7 @@ const sA = ({
}
),
/* @__PURE__ */ A(
- a,
+ c,
{
as: "nav",
"aria-label": "ناوبری اصلی موبایل",
@@ -283,24 +285,24 @@ const sA = ({
borderColor: "gray.200",
boxShadow: "0 -6px 18px rgba(0, 0, 0, 0.08)",
pb: "env(safe-area-inset-bottom)",
- ...j,
- children: /* @__PURE__ */ l(b, { h: "56px", px: 1.5, spacing: 1, align: "stretch", children: [
- O.map((o) => /* @__PURE__ */ A(
- bA,
+ ...V,
+ children: /* @__PURE__ */ g(p, { h: "56px", px: 1.5, spacing: 1, align: "stretch", children: [
+ J.map((e) => /* @__PURE__ */ A(
+ yA,
{
- item: o,
- isDisabled: u(o),
- isActive: s(o),
+ item: e,
+ isDisabled: m(e),
+ isActive: b(e),
linkComponent: t,
- onNavigate: () => f(o)
+ onNavigate: () => M(e)
},
- o.path
+ e.path
)),
- /* @__PURE__ */ A(
- a,
+ W && /* @__PURE__ */ A(
+ c,
{
as: "button",
- ref: m,
+ ref: G,
type: "button",
flex: "1",
minW: 0,
@@ -313,27 +315,27 @@ const sA = ({
alignItems: "center",
justifyContent: "center",
cursor: "pointer",
- onClick: B,
+ onClick: X,
"aria-label": "نمایش سایر بخشها",
- children: /* @__PURE__ */ l(
- C,
+ children: /* @__PURE__ */ g(
+ s,
{
spacing: 0.5,
w: "full",
py: 1,
px: 1,
borderRadius: "xl",
- color: x ? "blue.600" : "gray.600",
- bg: x ? "blue.50" : "transparent",
+ color: Z ? "blue.600" : "gray.600",
+ bg: Z ? "blue.50" : "transparent",
children: [
- /* @__PURE__ */ A(d, { as: nA, boxSize: 5 }),
+ /* @__PURE__ */ A(C, { as: dA, boxSize: 5 }),
/* @__PURE__ */ A(
- c,
+ d,
{
fontSize: "10px",
- fontWeight: x ? "bold" : "medium",
+ fontWeight: Z ? "bold" : "medium",
lineHeight: "short",
- children: k
+ children: O
}
)
]
@@ -344,28 +346,28 @@ const sA = ({
] })
}
),
- /* @__PURE__ */ l(
- X,
+ W && /* @__PURE__ */ g(
+ $,
{
- isOpen: T,
+ isOpen: U,
placement: "bottom",
- onClose: h,
- finalFocusRef: m,
+ onClose: u,
+ finalFocusRef: G,
children: [
- /* @__PURE__ */ A(H, {}),
- /* @__PURE__ */ l(
- F,
+ /* @__PURE__ */ A(AA, {}),
+ /* @__PURE__ */ g(
+ oA,
{
borderTopRadius: "2xl",
maxH: "min(78dvh, 620px)",
pb: "env(safe-area-inset-bottom)",
children: [
- /* @__PURE__ */ A(J, { insetInlineEnd: 3, insetInlineStart: "auto" }),
- /* @__PURE__ */ A(K, { borderBottomWidth: "1px", fontSize: "md", children: N }),
- /* @__PURE__ */ l(q, { py: 4, overflowY: "auto", children: [
- /* @__PURE__ */ A(_, { columns: 4, spacing: 2, children: w.map((o) => {
- const R = u(o), I = s(o), v = /* @__PURE__ */ l(
- C,
+ /* @__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(
+ s,
{
h: "70px",
minW: 0,
@@ -373,43 +375,43 @@ const sA = ({
spacing: 1,
px: 1,
borderWidth: "1px",
- borderColor: I ? "blue.300" : "gray.200",
+ borderColor: a ? "blue.300" : "gray.200",
borderRadius: "lg",
- bg: I ? "blue.50" : "white",
- color: I ? "blue.700" : "gray.700",
- opacity: R ? 0.4 : 1,
+ bg: a ? "blue.50" : "white",
+ color: a ? "blue.700" : "gray.700",
+ opacity: y ? 0.4 : 1,
children: [
- /* @__PURE__ */ A(d, { as: o.icon, boxSize: 5, flexShrink: 0 }),
+ /* @__PURE__ */ A(C, { as: e.icon, boxSize: 5, flexShrink: 0 }),
/* @__PURE__ */ A(
- c,
+ d,
{
w: "full",
fontSize: "10px",
lineHeight: "shorter",
- fontWeight: I ? "bold" : "medium",
+ fontWeight: a ? "bold" : "medium",
textAlign: "center",
noOfLines: 2,
- children: o.mobileTitle || o.title
+ children: e.mobileTitle || e.title
}
)
]
}
);
- return R ? /* @__PURE__ */ A(a, { children: v }, o.path) : /* @__PURE__ */ A(
- p,
+ return y ? /* @__PURE__ */ A(c, { children: k }, e.path) : /* @__PURE__ */ A(
+ h,
{
linkComponent: t,
- href: o.path,
+ href: e.path,
_hover: { textDecoration: "none" },
- onClick: () => f(o),
- "aria-current": I ? "page" : void 0,
- children: v
+ onClick: () => M(e),
+ "aria-current": a ? "page" : void 0,
+ children: k
},
- o.path
+ e.path
);
}) }),
- /* @__PURE__ */ A(a, { mt: 4, pt: 4, borderTopWidth: "1px", borderColor: "gray.200", children: /* @__PURE__ */ l(
- b,
+ x && /* @__PURE__ */ A(c, { mt: 4, pt: 4, borderTopWidth: "1px", borderColor: "gray.200", children: /* @__PURE__ */ g(
+ p,
{
as: "button",
type: "button",
@@ -421,10 +423,10 @@ const sA = ({
color: "red.600",
bg: "red.50",
cursor: "pointer",
- onClick: y,
+ onClick: z,
children: [
- /* @__PURE__ */ A(d, { as: i, boxSize: 5 }),
- /* @__PURE__ */ A(c, { fontWeight: "bold", children: "خروج از سامانه" })
+ /* @__PURE__ */ A(C, { as: v, boxSize: 5 }),
+ /* @__PURE__ */ A(d, { fontWeight: "bold", children: R })
]
}
) })
@@ -436,10 +438,12 @@ const sA = ({
}
)
] });
-};
+}, kA = Object.assign(GA, {
+ Exit: Q
+});
export {
- mA as Header,
- GA as Sidebar,
- ZA as getActiveSidebarItem,
- Y as isSidebarPathActive
+ SA as Header,
+ kA as Sidebar,
+ YA as getActiveSidebarItem,
+ B as isSidebarPathActive
};
diff --git a/src/layout/Sidebar.jsx b/src/layout/Sidebar.jsx
index 356e7cd..cd6359d 100644
--- a/src/layout/Sidebar.jsx
+++ b/src/layout/Sidebar.jsx
@@ -19,9 +19,9 @@ import {
VStack,
useDisclosure,
} from "@chakra-ui/react";
-import { forwardRef, useEffect, useRef } from "react";
-import { FiMoreHorizontal } from "react-icons/fi";
-import { IoExit } from "react-icons/io5";
+import { Children, forwardRef, isValidElement, useEffect, 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";
import { usePermission } from "../core/permission.jsx";
@@ -165,13 +165,14 @@ const MobileNavigationButton = ({
);
};
-export const Sidebar = ({
+const SidebarExit = () => null;
+
+const SidebarRoot = ({
items = [],
currentPath,
linkComponent,
onNavigate,
- logoutTitle = "خروج",
- logoutIcon = IoExit,
+ children,
primaryMobileCount = 4,
moreTitle = "بیشتر",
moreDrawerTitle = "سایر بخشهای سامانه",
@@ -182,6 +183,13 @@ export const Sidebar = ({
const moreButtonRef = useRef();
const { cannot, can, isLoading } = usePermission();
+ const exitElement = Children.toArray(children).find(
+ (child) => isValidElement(child) && child.type === SidebarExit,
+ );
+ const hasExit = Boolean(exitElement);
+ const logoutTitle = exitElement?.props?.title || "خروج";
+ const logoutIcon = exitElement?.props?.icon || IoExit;
+
useEffect(() => {
if (isLoading) return;
@@ -209,7 +217,7 @@ export const Sidebar = ({
const active = (item) => isSidebarPathActive(resolvedCurrentPath, item);
const isSecondaryItemActive = secondaryItems.some(active);
- const hasMoreContent = true;
+ const hasMoreContent = secondaryItems.length > 0 || hasExit;
const handleNavigate = (item) => {
onNavigate?.(item);
@@ -252,25 +260,27 @@ export const Sidebar = ({
/>
))}
-
- }
- fontSize="xl"
- size={{ base: "sm", lg: "lg" }}
- aria-label={logoutTitle}
- onClick={handleLogout}
- />
-
+ {hasExit && (
+
+ }
+ fontSize="xl"
+ size={{ base: "sm", lg: "lg" }}
+ aria-label={logoutTitle}
+ onClick={handleLogout}
+ />
+
+ )}
@@ -414,24 +424,26 @@ export const Sidebar = ({
})}
-
-
-
- خروج از سامانه
-
-
+ {hasExit && (
+
+
+
+ {logoutTitle}
+
+
+ )}
@@ -439,3 +451,7 @@ export const Sidebar = ({
>
);
};
+
+export const Sidebar = Object.assign(SidebarRoot, {
+ Exit: SidebarExit,
+});
diff --git a/src/layout/index.d.ts b/src/layout/index.d.ts
index fc44a0f..deefbf8 100644
--- a/src/layout/index.d.ts
+++ b/src/layout/index.d.ts
@@ -13,8 +13,7 @@ export type SidebarProps = {
currentPath?: string;
linkComponent?: any;
onNavigate?: (item: SidebarItem) => void;
- logoutTitle?: string;
- logoutIcon?: any;
+ children?: any;
primaryMobileCount?: number;
moreTitle?: string;
moreDrawerTitle?: string;
@@ -22,7 +21,14 @@ export type SidebarProps = {
mobileProps?: Record;
};
-export function Sidebar(props: SidebarProps): any;
+export type SidebarExitProps = {
+ title?: string;
+ icon?: any;
+};
+
+export const Sidebar: ((props: SidebarProps) => any) & {
+ Exit: (props: SidebarExitProps) => any;
+};
export function isSidebarPathActive(
currentPath: string | undefined,
item: SidebarItem,