uikit/dist/index.js
2026-06-13 11:01:16 +03:30

594 lines
17 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { jsxs as k, jsx as c } from "react/jsx-runtime";
import { useState as B, useRef as T, useEffect as g, useCallback as D, createContext as W, useMemo as I, useContext as G } from "react";
import { HStack as S, IconButton as M, Button as _, Input as F, Text as A } from "@chakra-ui/react";
import { IoChevronForwardOutline as V, IoChevronBackOutline as j } from "react-icons/io5";
import J from "keycloak-js";
import { useQuery as Q } from "@tanstack/react-query";
const fe = (e) => new Intl.NumberFormat("fa-IR").format(Number(e)), d = (e) => String(e).replace(/\d/g, (n) => "۰۱۲۳۴۵۶۷۸۹"[Number(n)]), N = (e) => String(e).replace(/[۰-۹]/g, (r) => String("۰۱۲۳۴۵۶۷۸۹".indexOf(r))), de = ({
currentPage: e,
totalPages: n,
totalCount: r,
onPageChange: s
}) => {
const [l, i] = B(d(e)), [w, p] = B(!1), [m, o] = B(null), h = T(null), x = [.../* @__PURE__ */ new Set([1, e, n])].filter(
(t) => t >= 1 && t <= n
);
g(() => {
if (m !== null) {
e === m && (o(null), p(!1), i(d(e)));
return;
}
w || i(d(e));
}, [e, w, m]), g(() => {
if (!w || !l || m !== null) return;
const t = parseInt(N(l), 10);
if (isNaN(t)) return;
const a = setTimeout(() => {
var b;
const f = Math.min(Math.max(t, 1), n);
f !== e ? (o(f), i(d(f)), s(f)) : (p(!1), i(d(e))), (b = h.current) == null || b.blur();
}, 1e3);
return () => clearTimeout(a);
}, [
l,
w,
m,
n,
e,
s
]);
const v = () => {
var f, b;
const t = parseInt(N(l), 10);
if (isNaN(t)) {
i(d(e)), p(!1), o(null), (f = h.current) == null || f.blur();
return;
}
const a = Math.min(Math.max(t, 1), n);
a !== e ? (o(a), i(d(a)), s(a)) : (i(d(e)), p(!1), o(null)), (b = h.current) == null || b.blur();
};
return n === 0 || !r ? null : /* @__PURE__ */ k(
S,
{
justifyContent: "space-around",
backgroundColor: "white",
py: "10px",
px: "16px",
rounded: "lg",
border: "1px",
borderColor: "blue.200",
w: "100%",
children: [
/* @__PURE__ */ k(S, { spacing: 2, alignItems: "center", justifyContent: "center", children: [
/* @__PURE__ */ c(
M,
{
size: "md",
bg: "#e6e6f1",
color: "#4B49AC",
_hover: { bg: "#cbcbe8" },
onClick: () => s(e - 1),
isDisabled: e === 1,
icon: /* @__PURE__ */ c(V, {}),
"aria-label": "صفحه قبلی"
}
),
x.map((t) => /* @__PURE__ */ c(
_,
{
size: "md",
px: 2,
bg: e === t ? "#4B49AC" : "#e6e6f1",
color: e === t ? "#e6e6f1" : "#4B49AC",
_hover: { bg: e === t ? "#4B49AC" : "#cbcbe8" },
onClick: () => s(t),
variant: "soft",
children: d(t)
},
t
)),
/* @__PURE__ */ c(
M,
{
size: "md",
bg: "#e6e6f1",
color: "#4B49AC",
_hover: { bg: "#cbcbe8" },
onClick: () => s(e + 1),
isDisabled: e === n,
icon: /* @__PURE__ */ c(j, {}),
"aria-label": "صفحه بعدی"
}
),
/* @__PURE__ */ c(
F,
{
ref: h,
type: "text",
inputMode: "numeric",
placeholder: "صفحه",
w: "56px",
value: l,
onFocus: () => {
p(!0), o(null), i("");
},
onChange: (t) => {
const a = t.target.value, f = N(a).replace(/\D/g, "");
i(d(f));
},
onBlur: () => {
l || (i(d(e)), p(!1), o(null));
},
onKeyDown: (t) => {
t.key === "Enter" && v();
},
textAlign: "center",
color: "#1D2939",
px: 1,
minW: 0,
dir: "ltr"
}
)
] }),
/* @__PURE__ */ k(S, { spacing: 2, children: [
/* @__PURE__ */ c(A, { w: "auto", fontWeight: "bold", whiteSpace: "nowrap", children: "تعداد کل:" }),
/* @__PURE__ */ c(A, { children: d(r) })
] })
]
}
);
}, pe = ({
currentPage: e,
totalPages: n,
totalCount: r,
onPageChange: s
}) => {
const [l, i] = B(d(e)), [w, p] = B(!1), [m, o] = B(null), h = T(null), x = Array.from(
/* @__PURE__ */ new Set([1, e, e + 1, n])
).filter((t) => t >= 1 && t <= n).sort((t, a) => t - a);
g(() => {
if (m !== null) {
e === m && (o(null), p(!1), i(d(e)));
return;
}
w || i(d(e));
}, [e, w, m]), g(() => {
if (!w || !l || m !== null) return;
const t = parseInt(N(l), 10);
if (isNaN(t)) return;
const a = setTimeout(() => {
var b;
const f = Math.min(Math.max(t, 1), n);
f !== e ? (o(f), i(d(f)), s(f)) : (p(!1), i(d(e))), (b = h.current) == null || b.blur();
}, 1e3);
return () => clearTimeout(a);
}, [
l,
w,
m,
n,
e,
s
]);
const v = () => {
var f, b;
const t = parseInt(N(l), 10);
if (isNaN(t)) {
i(d(e)), p(!1), o(null), (f = h.current) == null || f.blur();
return;
}
const a = Math.min(Math.max(t, 1), n);
a !== e ? (o(a), i(d(a)), s(a)) : (i(d(e)), p(!1), o(null)), (b = h.current) == null || b.blur();
};
return n === 0 || !r ? null : /* @__PURE__ */ k(
S,
{
justifyContent: "space-around",
backgroundColor: "white",
py: "10px",
px: "16px",
rounded: "lg",
border: "1px",
borderColor: "blue.200",
w: "100%",
children: [
/* @__PURE__ */ k(S, { spacing: 2, whiteSpace: "nowrap", children: [
/* @__PURE__ */ c(A, { fontWeight: "bold", children: "صفحه" }),
/* @__PURE__ */ c(A, { children: d(e) }),
/* @__PURE__ */ c(A, { fontWeight: "bold", children: "از" }),
/* @__PURE__ */ c(A, { children: d(n) })
] }),
/* @__PURE__ */ k(S, { spacing: 2, alignItems: "center", justifyContent: "center", children: [
/* @__PURE__ */ c(
M,
{
size: "md",
bg: "#e6e6f1",
color: "#4B49AC",
_hover: { bg: "#cbcbe8" },
onClick: () => s(e - 1),
isDisabled: e === 1,
icon: /* @__PURE__ */ c(V, {}),
"aria-label": "صفحه قبلی"
}
),
x.map((t) => /* @__PURE__ */ c(
_,
{
size: "md",
bg: e === t ? "#4B49AC" : "#e6e6f1",
color: e === t ? "#e6e6f1" : "#4B49AC",
_hover: { bg: e === t ? "#4B49AC" : "#cbcbe8" },
onClick: () => s(t),
variant: "soft",
children: d(t)
},
t
)),
/* @__PURE__ */ c(
M,
{
size: "md",
bg: "#e6e6f1",
color: "#4B49AC",
_hover: { bg: "#cbcbe8" },
onClick: () => s(e + 1),
isDisabled: e === n,
icon: /* @__PURE__ */ c(j, {}),
"aria-label": "صفحه بعدی"
}
),
/* @__PURE__ */ c(
F,
{
ref: h,
type: "text",
inputMode: "numeric",
placeholder: "صفحه",
w: "100px",
value: l,
onFocus: () => {
p(!0), o(null), i("");
},
onChange: (t) => {
const a = t.target.value, f = N(a).replace(/\D/g, "");
i(d(f));
},
onBlur: () => {
l || (i(d(e)), p(!1), o(null));
},
onKeyDown: (t) => {
t.key === "Enter" && v();
},
textAlign: "center",
color: "#1D2939",
px: 1,
minW: 0,
dir: "ltr"
}
)
] }),
/* @__PURE__ */ k(S, { spacing: 2, whiteSpace: "nowrap", children: [
/* @__PURE__ */ c(A, { fontWeight: "bold", children: "تعداد کل:" }),
/* @__PURE__ */ c(A, { children: d(r) })
] })
]
}
);
}, me = ({
currentPage: e,
totalPages: n,
totalCount: r,
onPageChange: s
}) => {
const [l, i] = B(""), [w, p] = B(!1), [m, o] = B(null), h = T(null), x = m ?? e, v = D(
(y) => {
const C = Math.min(Math.max(y, 1), n);
p(!1), i(""), o(null), C !== e && s(C);
},
[e, n, s]
), t = D(() => {
if (!l) {
p(!1), i(""), o(null);
return;
}
const y = parseInt(N(l), 10);
if (isNaN(y)) {
p(!1), i(""), o(null);
return;
}
const C = Math.min(Math.max(y, 1), n);
p(!1), i(""), C !== e ? (o(C), s(C)) : o(null);
}, [l, e, n, s]);
g(() => {
var y;
w && ((y = h.current) == null || y.focus());
}, [w]), g(() => {
m !== null && e === m && o(null);
}, [e, m]), g(() => {
if (!w || !l) return;
const y = setTimeout(() => {
t();
}, 1e3);
return () => clearTimeout(y);
}, [l, w, t]);
const a = () => {
o(null), i(""), p(!0);
}, f = (y, C = !1) => /* @__PURE__ */ c(
_,
{
size: "md",
bg: C ? "#4B49AC" : "#e6e6f1",
color: C ? "#e6e6f1" : "#4B49AC",
_hover: { bg: C ? "#4B49AC" : "#cbcbe8" },
onClick: C ? a : () => v(y),
variant: "soft",
children: d(y)
},
y
);
if (n === 0 || !r) return null;
const b = n > 1 && x !== 1, E = n > 1 && x !== n;
return /* @__PURE__ */ c(
S,
{
justifyContent: "center",
backgroundColor: "white",
py: "10px",
px: "16px",
rounded: "lg",
border: "1px",
borderColor: "blue.200",
w: "100%",
children: /* @__PURE__ */ k(S, { spacing: 2, alignItems: "center", justifyContent: "center", children: [
/* @__PURE__ */ c(
M,
{
size: "md",
bg: "#e6e6f1",
color: "#4B49AC",
_hover: { bg: "#cbcbe8" },
onClick: () => v(x - 1),
isDisabled: x === 1,
icon: /* @__PURE__ */ c(V, {}),
"aria-label": "صفحه قبلی"
}
),
b && f(1),
w ? /* @__PURE__ */ c(
F,
{
ref: h,
type: "text",
inputMode: "numeric",
placeholder: "صفحه",
w: "48px",
value: l,
onChange: (y) => {
const C = y.target.value, q = N(C).replace(/\D/g, "");
i(d(q));
},
onBlur: () => {
l ? t() : (i(""), p(!1), o(null));
},
onKeyDown: (y) => {
y.key === "Enter" && t(), y.key === "Escape" && (i(""), p(!1), o(null));
},
textAlign: "center",
color: "#1D2939",
px: 1,
minW: 0,
dir: "ltr"
}
) : f(x, !0),
E && f(n),
/* @__PURE__ */ c(
M,
{
size: "md",
bg: "#e6e6f1",
color: "#4B49AC",
_hover: { bg: "#cbcbe8" },
onClick: () => v(x + 1),
isDisabled: x === n,
icon: /* @__PURE__ */ c(j, {}),
"aria-label": "صفحه بعدی"
}
)
] })
}
);
};
let u = null, z = null, K = !1;
const $ = W(null), H = ({ url: e, realm: n, clientId: r }) => (u || (u = new J({
url: e,
realm: n,
clientId: r
})), u), Y = ({ config: e, initOptions: n = {} }) => {
const r = H(e);
return z || (z = r.init({
onLoad: "login-required",
checkLoginIframe: !1,
flow: "implicit",
...n
}).then((s) => (K = !0, s)).catch((s) => {
throw K = !0, s;
})), z;
}, he = () => K, U = () => !!(u != null && u.authenticated), X = () => (u == null ? void 0 : u.token) ?? null, be = async (e = 30) => u ? u.updateToken(e) : !1, Z = (e) => u == null ? void 0 : u.logout(e), we = (e) => u == null ? void 0 : u.login(e), xe = ({
children: e,
config: n,
initOptions: r,
loading: s = null
}) => {
const [l, i] = B(!1), [w, p] = B(!1), [m, o] = B(null), h = T(!1), x = D(() => {
u && (p(!!u.authenticated), o(u.token ?? null));
}, []);
g(() => (h.current = !0, Y({ config: n, initOptions: r }).then((b) => {
h.current && (p(!!b), o((u == null ? void 0 : u.token) ?? null), i(!0));
}).catch(() => {
h.current && (p(!1), o(null), i(!0));
}), () => {
h.current = !1;
}), [n, r]);
const v = D(() => u == null ? void 0 : u.login(), []), t = D((b) => u == null ? void 0 : u.logout(b), []), a = D(
async (b = 30) => {
if (!u) return !1;
const E = await u.updateToken(b);
return x(), E;
},
[x]
), f = I(
() => ({
initialized: l,
authenticated: w,
token: m,
login: v,
logout: t,
updateToken: a
}),
[l, w, m, v, t, a]
);
return l ? /* @__PURE__ */ c($.Provider, { value: f, children: e }) : s;
}, R = W({
user: null,
can: () => !1,
cannot: () => !0,
permissions: void 0,
isLoading: !1,
error: null
}), ye = ({
user: e = null,
children: n,
clientId: r,
permissionsUrl: s,
storageKey: l = "permissions",
loading: i = /* @__PURE__ */ c("div", { children: "Loading permissions..." }),
errorFallback: w = /* @__PURE__ */ c("div", { children: "Error loading permissions" })
}) => {
const [p, m] = B(
() => P(l)
), { data: o, isLoading: h, error: x } = oe({
clientId: r,
permissionsUrl: s
}), v = o ?? p;
g(() => {
o && (ee(l, o), m(o));
}, [o, l]);
const t = I(
() => ne(v),
[v]
), a = D(
(E = "") => te(t, E),
[t]
), f = D((E = "") => !a(E), [a]), b = I(
() => ({
user: e,
can: a,
cannot: f,
permissions: v,
isLoading: h,
error: x
}),
[e, a, f, v, h, x]
);
return x && !v ? w : h && !v ? i : /* @__PURE__ */ c(R.Provider, { value: b, children: n });
}, P = (e = "permissions") => {
if (!(typeof window > "u"))
try {
const n = localStorage.getItem(e);
return n ? JSON.parse(n) : void 0;
} catch {
return;
}
}, ee = (e = "permissions", n) => {
if (!(typeof window > "u"))
try {
localStorage.setItem(e, JSON.stringify(n));
} catch {
}
}, ve = (e = "permissions") => {
if (!(typeof window > "u"))
try {
localStorage.removeItem(e);
} catch {
}
}, ne = (e) => e ? new Set(e.map((n) => n.name)) : /* @__PURE__ */ new Set(), te = (e, n = "") => {
if (!n) return !1;
if (e.has(n) || [...e].some((s) => s.startsWith(n))) return !0;
let r = n;
for (; r.includes(":"); )
if (r = r.slice(0, r.lastIndexOf(":")), e.has(`${r}:*`)) return !0;
return !1;
}, O = {
all: ["permissions"],
list: (e) => [...O.all, e]
}, ie = async ({ permissionsUrl: e, clientId: n }) => {
const r = X(), s = new URL(e);
s.searchParams.set("client_id", n);
const l = await fetch(s.toString(), {
method: "GET",
headers: {
...r ? { Authorization: `Bearer ${r}` } : {}
}
});
if (!l.ok)
throw new Error("Failed to load permissions");
return l.json();
}, L = () => {
const e = G(R);
if (!e)
throw new Error("usePermission must be used within PermissionProvider");
return e;
}, oe = ({ clientId: e, permissionsUrl: n }) => Q({
queryKey: O.list(e),
queryFn: () => ie({ clientId: e, permissionsUrl: n }),
enabled: !!e && !!n && U(),
staleTime: 1 / 0,
refetchOnWindowFocus: !1,
refetchOnReconnect: !1
}), Ce = ({
perm: e,
children: n,
fallback: r = /* @__PURE__ */ c("div", { children: "You are not allowed to do this" })
}) => {
const { can: s } = L();
return s(e) ? n : r;
}, Be = ({ children: e }) => {
const { can: n, permissions: r } = L();
return r && n("admin") ? e : null;
}, ge = ({ children: e }) => {
const { can: n, isLoading: r } = L();
return g(() => {
r || n("panel_access") || Z();
}, [r, n]), e;
};
export {
Be as AdminGuard,
Ce as Can,
xe as KeycloakProvider,
de as LightPagination,
pe as Pagination,
ge as PanelAccessGuard,
ye as PermissionProvider,
me as SimplePagination,
te as checkPermission,
ve as clearCachedPermissions,
ne as createPermissionSet,
P as getCachedPermissions,
X as getKeycloakToken,
ie as getPermissions,
Y as initKeycloak,
U as isKeycloakAuthenticated,
he as isKeycloakInitialized,
we as loginKeycloak,
Z as logoutKeycloak,
O as permissionKeys,
ee as setCachedPermissions,
N as toEnDigits,
d as toFaDigits,
fe as toFaNumber,
be as updateKeycloakToken,
L as usePermission,
oe as usePermissionsQuery
};