@ramses1er/cbk-toolkit 2.1.1 → 2.3.0
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/dist/packages/lib/src/auth-guard.d.ts +10 -0
- package/dist/packages/lib/src/auth-guard.d.ts.map +1 -0
- package/dist/packages/lib/src/auth-guard.js +60 -0
- package/dist/packages/lib/src/auth-guard.js.map +1 -0
- package/dist/packages/lib/src/handle-server-error.d.ts +9 -0
- package/dist/packages/lib/src/handle-server-error.d.ts.map +1 -0
- package/dist/packages/lib/src/handle-server-error.js +43 -0
- package/dist/packages/lib/src/handle-server-error.js.map +1 -0
- package/dist/packages/lib/src/http-error.d.ts +6 -0
- package/dist/packages/lib/src/http-error.d.ts.map +1 -0
- package/dist/packages/lib/src/http-error.js +12 -0
- package/dist/packages/lib/src/http-error.js.map +1 -0
- package/dist/packages/lib/src/index.d.ts +5 -0
- package/dist/packages/lib/src/index.d.ts.map +1 -0
- package/dist/packages/lib/src/index.js +9 -0
- package/dist/packages/lib/src/index.js.map +1 -0
- package/dist/packages/lib/src/with-auth.d.ts +8 -0
- package/dist/packages/lib/src/with-auth.d.ts.map +1 -0
- package/dist/packages/lib/src/with-auth.js +32 -0
- package/dist/packages/lib/src/with-auth.js.map +1 -0
- package/dist/packages/ui/src/config/create-side-nav.d.ts +6 -0
- package/dist/packages/ui/src/config/create-side-nav.d.ts.map +1 -0
- package/dist/packages/ui/src/config/create-side-nav.js +9 -0
- package/dist/packages/ui/src/config/create-side-nav.js.map +1 -0
- package/dist/packages/ui/src/feedback/confirmation.d.ts +16 -0
- package/dist/packages/ui/src/feedback/confirmation.d.ts.map +1 -0
- package/dist/packages/ui/src/feedback/confirmation.js +82 -0
- package/dist/packages/ui/src/feedback/confirmation.js.map +1 -0
- package/dist/packages/ui/src/feedback/error-display.d.ts +7 -0
- package/dist/packages/ui/src/feedback/error-display.d.ts.map +1 -0
- package/dist/packages/ui/src/feedback/error-display.js +11 -0
- package/dist/packages/ui/src/feedback/error-display.js.map +1 -0
- package/dist/packages/ui/src/forms/date-picker.d.ts +4 -0
- package/dist/packages/ui/src/forms/date-picker.d.ts.map +1 -0
- package/dist/packages/ui/src/forms/date-picker.js +9 -0
- package/dist/packages/ui/src/forms/date-picker.js.map +1 -0
- package/dist/packages/ui/src/forms/field-container.d.ts +8 -0
- package/dist/packages/ui/src/forms/field-container.d.ts.map +1 -0
- package/dist/packages/ui/src/forms/field-container.js +6 -0
- package/dist/packages/ui/src/forms/field-container.js.map +1 -0
- package/dist/packages/ui/src/forms/form.d.ts +9 -0
- package/dist/packages/ui/src/forms/form.d.ts.map +1 -0
- package/dist/packages/ui/src/forms/form.js +63 -0
- package/dist/packages/ui/src/forms/form.js.map +1 -0
- package/dist/packages/ui/src/forms/input.d.ts +4 -0
- package/dist/packages/ui/src/forms/input.d.ts.map +1 -0
- package/dist/packages/ui/src/forms/input.js +13 -0
- package/dist/packages/ui/src/forms/input.js.map +1 -0
- package/dist/packages/ui/src/forms/label.d.ts +7 -0
- package/dist/packages/ui/src/forms/label.d.ts.map +1 -0
- package/dist/packages/ui/src/forms/label.js +9 -0
- package/dist/packages/ui/src/forms/label.js.map +1 -0
- package/dist/packages/ui/src/forms/select.d.ts +6 -0
- package/dist/packages/ui/src/forms/select.d.ts.map +1 -0
- package/dist/packages/ui/src/forms/select.js +19 -0
- package/dist/packages/ui/src/forms/select.js.map +1 -0
- package/dist/packages/ui/src/forms/textarea.d.ts +4 -0
- package/dist/packages/ui/src/forms/textarea.d.ts.map +1 -0
- package/dist/packages/ui/src/forms/textarea.js +9 -0
- package/dist/packages/ui/src/forms/textarea.js.map +1 -0
- package/dist/packages/ui/src/headers/header-content.d.ts +11 -0
- package/dist/packages/ui/src/headers/header-content.d.ts.map +1 -0
- package/dist/packages/ui/src/headers/header-content.js +6 -0
- package/dist/packages/ui/src/headers/header-content.js.map +1 -0
- package/dist/packages/ui/src/illustrations/topic-illustration.d.ts +1 -0
- package/dist/packages/ui/src/illustrations/topic-illustration.d.ts.map +1 -0
- package/dist/packages/ui/src/illustrations/topic-illustration.js +69 -0
- package/dist/packages/ui/src/illustrations/topic-illustration.js.map +1 -0
- package/dist/packages/ui/src/index.d.ts +28 -0
- package/dist/packages/ui/src/index.d.ts.map +1 -0
- package/dist/packages/ui/src/index.js +38 -0
- package/dist/packages/ui/src/index.js.map +1 -0
- package/dist/packages/ui/src/layouts/side-nav.d.ts +45 -0
- package/dist/packages/ui/src/layouts/side-nav.d.ts.map +1 -0
- package/dist/packages/ui/src/layouts/side-nav.js +127 -0
- package/dist/packages/ui/src/layouts/side-nav.js.map +1 -0
- package/dist/packages/ui/src/loaders/loader-submit.d.ts +8 -0
- package/dist/packages/ui/src/loaders/loader-submit.d.ts.map +1 -0
- package/dist/packages/ui/src/loaders/loader-submit.js +7 -0
- package/dist/packages/ui/src/loaders/loader-submit.js.map +1 -0
- package/dist/packages/ui/src/loaders/loading.d.ts +6 -0
- package/dist/packages/ui/src/loaders/loading.d.ts.map +1 -0
- package/dist/packages/ui/src/loaders/loading.js +7 -0
- package/dist/packages/ui/src/loaders/loading.js.map +1 -0
- package/dist/packages/ui/src/modals/modal.d.ts +10 -0
- package/dist/packages/ui/src/modals/modal.d.ts.map +1 -0
- package/dist/packages/ui/src/modals/modal.js +36 -0
- package/dist/packages/ui/src/modals/modal.js.map +1 -0
- package/dist/packages/ui/src/pages/access-denied.d.ts +8 -0
- package/dist/packages/ui/src/pages/access-denied.d.ts.map +1 -0
- package/dist/packages/ui/src/pages/access-denied.js +8 -0
- package/dist/packages/ui/src/pages/access-denied.js.map +1 -0
- package/dist/packages/ui/src/pages/session-expired.d.ts +6 -0
- package/dist/packages/ui/src/pages/session-expired.d.ts.map +1 -0
- package/dist/packages/ui/src/pages/session-expired.js +21 -0
- package/dist/packages/ui/src/pages/session-expired.js.map +1 -0
- package/dist/packages/ui/src/pwa/InstallPrompt.d.ts +7 -0
- package/dist/packages/ui/src/pwa/InstallPrompt.d.ts.map +1 -0
- package/dist/packages/ui/src/pwa/InstallPrompt.js +71 -0
- package/dist/packages/ui/src/pwa/InstallPrompt.js.map +1 -0
- package/dist/packages/ui/src/pwa/SwRegistration.d.ts +5 -0
- package/dist/packages/ui/src/pwa/SwRegistration.d.ts.map +1 -0
- package/dist/packages/ui/src/pwa/SwRegistration.js +13 -0
- package/dist/packages/ui/src/pwa/SwRegistration.js.map +1 -0
- package/dist/packages/ui/src/route-guard/route-guard.d.ts +31 -0
- package/dist/packages/ui/src/route-guard/route-guard.d.ts.map +1 -0
- package/dist/packages/ui/src/route-guard/route-guard.js +75 -0
- package/dist/packages/ui/src/route-guard/route-guard.js.map +1 -0
- package/dist/packages/ui/src/search/input-search.d.ts +1 -0
- package/dist/packages/ui/src/search/input-search.d.ts.map +1 -0
- package/dist/packages/ui/src/search/input-search.js +47 -0
- package/dist/packages/ui/src/search/input-search.js.map +1 -0
- package/dist/packages/ui/src/search/select-search.d.ts +1 -0
- package/dist/packages/ui/src/search/select-search.d.ts.map +1 -0
- package/dist/packages/ui/src/search/select-search.js +100 -0
- package/dist/packages/ui/src/search/select-search.js.map +1 -0
- package/dist/packages/ui/src/table/actions-menu.d.ts +14 -0
- package/dist/packages/ui/src/table/actions-menu.d.ts.map +1 -0
- package/dist/packages/ui/src/table/actions-menu.js +53 -0
- package/dist/packages/ui/src/table/actions-menu.js.map +1 -0
- package/dist/packages/ui/src/table/table.d.ts +24 -0
- package/dist/packages/ui/src/table/table.d.ts.map +1 -0
- package/dist/packages/ui/src/table/table.js +99 -0
- package/dist/packages/ui/src/table/table.js.map +1 -0
- package/dist/packages/utils/src/fetcher.d.ts +16 -0
- package/dist/packages/utils/src/fetcher.d.ts.map +1 -0
- package/dist/packages/utils/src/fetcher.js +38 -0
- package/dist/packages/utils/src/fetcher.js.map +1 -0
- package/dist/packages/utils/src/formatCurrency.d.ts +1 -0
- package/dist/packages/utils/src/formatCurrency.d.ts.map +1 -0
- package/dist/packages/utils/src/formatCurrency.js +2 -0
- package/dist/packages/utils/src/formatCurrency.js.map +1 -0
- package/dist/packages/utils/src/formatDate.d.ts +1 -0
- package/dist/packages/utils/src/formatDate.d.ts.map +1 -0
- package/dist/packages/utils/src/formatDate.js +2 -0
- package/dist/packages/utils/src/formatDate.js.map +1 -0
- package/dist/packages/utils/src/index.d.ts +3 -0
- package/dist/packages/utils/src/index.d.ts.map +1 -0
- package/dist/packages/utils/src/index.js +2 -0
- package/dist/packages/utils/src/index.js.map +1 -0
- package/dist/src/client.d.ts +3 -0
- package/dist/src/client.d.ts.map +1 -0
- package/dist/src/client.js +5 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/server.d.ts +2 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +3 -0
- package/dist/src/server.js.map +1 -0
- package/package.json +8 -8
- package/dist/client.d.ts +0 -210
- package/dist/client.js +0 -1407
- package/dist/client.js.map +0 -1
- package/dist/server.d.ts +0 -33
- package/dist/server.js +0 -161
- package/dist/server.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-denied.js","sourceRoot":"","sources":["../../../../../packages/ui/src/pages/access-denied.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAqB;IACnF,OAAO,CACL,eAAM,SAAS,EAAC,gHAAgH,YAC9H,eAAK,SAAS,EAAC,8BAA8B,aAC3C,cAAK,SAAS,EAAC,0BAA0B,YACvC,KAAC,KAAK,IACJ,GAAG,EAAC,MAAM,EACV,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,GAAG,EACV,GAAG,EAAE,IAAI,GACT,GACE,EAEN,aAAI,SAAS,EAAC,sCAAsC,uCAE/C,EAEL,YAAG,SAAS,EAAC,oBAAoB,sGAE7B,EAEJ,KAAC,IAAI,IACH,IAAI,EAAE,UAAU,EAChB,SAAS,EAAC,4GAA4G,YAErH,eAAe,GACX,IACH,GACD,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-expired.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/pages/session-expired.tsx"],"names":[],"mappings":"AAKA,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,EAAE,WAAiB,EAAE,EAAE,mBAAmB,+BA0DxE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useRouter } from "next/navigation";
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
5
|
+
export function SessionExpired({ redirectUrl = "/" }) {
|
|
6
|
+
const router = useRouter();
|
|
7
|
+
const [countdown, setCountdown] = useState(10);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
if (countdown <= 0) {
|
|
10
|
+
router.push(redirectUrl);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const timer = setTimeout(() => setCountdown((c) => c - 1), 1000);
|
|
14
|
+
return () => clearTimeout(timer);
|
|
15
|
+
}, [countdown, router, redirectUrl]);
|
|
16
|
+
const handleConnect = () => {
|
|
17
|
+
router.push(redirectUrl);
|
|
18
|
+
};
|
|
19
|
+
return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-gray-50", children: _jsxs("div", { className: "max-w-md w-full text-center space-y-8 p-8", children: [_jsxs("div", { className: "space-y-3", children: [_jsx("div", { className: "flex justify-center", children: _jsx("svg", { className: "w-16 h-16 text-gray-300", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" }) }) }), _jsx("h1", { className: "text-2xl font-semibold text-gray-900", children: "Session expir\u00E9e" }), _jsx("p", { className: "text-gray-500", children: "Votre session a expir\u00E9 ou vous n'\u00EAtes pas connect\u00E9. Veuillez vous reconnecter pour acc\u00E9der \u00E0 cette page." })] }), _jsx("button", { onClick: handleConnect, className: "bg-gray-900 text-white px-6 py-2.5 rounded-md text-sm font-semibold hover:bg-gray-700 transition-colors", children: "Me connecter" }), _jsxs("p", { className: "text-sm text-gray-400", children: ["Redirection automatique dans ", countdown, "s..."] })] }) }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=session-expired.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-expired.js","sourceRoot":"","sources":["../../../../../packages/ui/src/pages/session-expired.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAM5C,MAAM,UAAU,cAAc,CAAC,EAAE,WAAW,GAAG,GAAG,EAAuB;IACvE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE/C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACjE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAErC,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,0DAA0D,YACvE,eAAK,SAAS,EAAC,2CAA2C,aACxD,eAAK,SAAS,EAAC,WAAW,aACxB,cAAK,SAAS,EAAC,qBAAqB,YAClC,cACE,SAAS,EAAC,yBAAyB,EACnC,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,WAAW,EACnB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,GAAG,YAEhB,eACE,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,CAAC,EAAC,0KAA0K,GAC5K,GACE,GACF,EACN,aAAI,SAAS,EAAC,sCAAsC,qCAE/C,EACL,YAAG,SAAS,EAAC,eAAe,kJAGxB,IACA,EAEN,iBACE,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,yGAAyG,6BAG5G,EAET,aAAG,SAAS,EAAC,uBAAuB,8CACJ,SAAS,YACrC,IACA,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type InstallPromptProps = {
|
|
2
|
+
appName: string;
|
|
3
|
+
storageKey?: string;
|
|
4
|
+
installText?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function InstallPrompt({ appName, storageKey, installText, }: InstallPromptProps): import("react").JSX.Element | null;
|
|
7
|
+
//# sourceMappingURL=InstallPrompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstallPrompt.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/pwa/InstallPrompt.tsx"],"names":[],"mappings":"AA6BA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,UAAgC,EAChC,WAAyB,GAC1B,EAAE,kBAAkB,sCAuIpB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
function isBeforeInstallPromptEvent(e) {
|
|
5
|
+
return "prompt" in e;
|
|
6
|
+
}
|
|
7
|
+
const DEFAULT_STORAGE_KEY = "cbk_install_prompt_dismissed";
|
|
8
|
+
function isChromiumDesktop() {
|
|
9
|
+
const ua = navigator.userAgent;
|
|
10
|
+
const isChrome = /Chrome\/\d/.test(ua) && !/Edg\/\d/.test(ua) && !/OPR\/\d/.test(ua) && !/CriOS/.test(ua);
|
|
11
|
+
const isEdge = /Edg\/\d/.test(ua);
|
|
12
|
+
const isOpera = /OPR\/\d/.test(ua);
|
|
13
|
+
const isChromium = isChrome || isEdge || isOpera;
|
|
14
|
+
const isMobile = /Mobi|Android/.test(ua);
|
|
15
|
+
return isChromium && !isMobile;
|
|
16
|
+
}
|
|
17
|
+
export function InstallPrompt({ appName, storageKey = DEFAULT_STORAGE_KEY, installText = "Installer", }) {
|
|
18
|
+
const [deferredPrompt, setDeferredPrompt] = useState(null);
|
|
19
|
+
const [state, setState] = useState(null);
|
|
20
|
+
const [dismissed, setDismissed] = useState(true);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (localStorage.getItem(storageKey) === "true")
|
|
23
|
+
return;
|
|
24
|
+
setDismissed(false);
|
|
25
|
+
const standalone = window.matchMedia("(display-mode: standalone)").matches;
|
|
26
|
+
if (standalone)
|
|
27
|
+
return;
|
|
28
|
+
const ios = /iPad|iPhone|iPod/.test(navigator.userAgent);
|
|
29
|
+
if (ios) {
|
|
30
|
+
setState("ios");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (!("serviceWorker" in navigator))
|
|
34
|
+
return;
|
|
35
|
+
if (isChromiumDesktop()) {
|
|
36
|
+
setState("chromium");
|
|
37
|
+
}
|
|
38
|
+
const handler = (e) => {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
if (isBeforeInstallPromptEvent(e)) {
|
|
41
|
+
setDeferredPrompt(e);
|
|
42
|
+
setState("native");
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
window.addEventListener("beforeinstallprompt", handler);
|
|
46
|
+
return () => {
|
|
47
|
+
window.removeEventListener("beforeinstallprompt", handler);
|
|
48
|
+
};
|
|
49
|
+
}, [storageKey]);
|
|
50
|
+
const handleInstall = async () => {
|
|
51
|
+
if (!deferredPrompt)
|
|
52
|
+
return;
|
|
53
|
+
deferredPrompt.prompt();
|
|
54
|
+
const { outcome } = await deferredPrompt.userChoice;
|
|
55
|
+
if (outcome === "accepted") {
|
|
56
|
+
setDeferredPrompt(null);
|
|
57
|
+
setState(null);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const handleDismiss = () => {
|
|
61
|
+
setDismissed(true);
|
|
62
|
+
localStorage.setItem(storageKey, "true");
|
|
63
|
+
};
|
|
64
|
+
if (dismissed || !state)
|
|
65
|
+
return null;
|
|
66
|
+
return (_jsx("div", { className: "fixed bottom-4 left-4 right-4 z-30 mx-auto max-w-md", children: _jsxs("div", { className: "relative rounded-xl border border-gray-200 bg-white p-5 shadow-lg dark:border-gray-700 dark:bg-gray-800", children: [_jsx("button", { onClick: handleDismiss, className: "absolute right-2 top-2 flex h-6 w-6 cursor-pointer items-center justify-center rounded-full text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300", "aria-label": "Fermer", children: _jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", strokeWidth: 2, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) }) }), _jsxs("div", { className: "mb-3 flex items-start gap-3", children: [_jsx("div", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-gray-100 dark:bg-gray-700", children: _jsx("svg", { className: "h-5 w-5 text-gray-700 dark:text-gray-300", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z" }) }) }), _jsxs("div", { className: "flex-1", children: [_jsxs("h3", { className: "font-semibold text-gray-900 dark:text-gray-100", children: ["Installer ", appName] }), _jsxs("p", { className: "mt-1 text-sm text-gray-500 dark:text-gray-400", children: [state === "native" &&
|
|
67
|
+
`Installez ${appName} pour un accès rapide depuis votre écran d'accueil.`, state === "chromium" &&
|
|
68
|
+
"Utilisez le menu du navigateur (⋮) → Installer l'application.", state === "ios" &&
|
|
69
|
+
"Sur iOS, utilisez le bouton Partager puis 'Ajouter à l'écran d'accueil'."] })] })] }), state === "native" && (_jsx("button", { onClick: handleInstall, className: "w-full cursor-pointer rounded-lg bg-gray-900 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-gray-700", children: installText })), state === "chromium" && (_jsx("div", { className: "rounded-lg bg-gray-100 p-3 text-xs text-gray-600 dark:bg-gray-800 dark:text-gray-300", children: _jsxs("ol", { className: "ml-4 list-decimal space-y-1", children: [_jsx("li", { children: "Cliquez sur l'ic\u00F4ne \u22EE (menu) dans la barre d'adresse" }), _jsxs("li", { children: ["S\u00E9lectionnez \"Installer ", appName, "\" ou \"Installer l'application\""] })] }) })), state === "ios" && (_jsx("div", { className: "rounded-lg bg-gray-100 p-3 text-xs text-gray-600 dark:bg-gray-800 dark:text-gray-300", children: _jsxs("ol", { className: "ml-4 list-decimal space-y-1", children: [_jsx("li", { children: "Appuyez sur le bouton Partager" }), _jsx("li", { children: "S\u00E9lectionnez \"Ajouter \u00E0 l'\u00E9cran d'accueil\"" }), _jsx("li", { children: "Appuyez sur \"Ajouter\"" })] }) }))] }) }));
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=InstallPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstallPrompt.js","sourceRoot":"","sources":["../../../../../packages/ui/src/pwa/InstallPrompt.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwRegistration.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/pwa/SwRegistration.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAAE,KAAa,EAAE,EAAE,mBAAmB,QAYpE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
export function SwRegistration({ swUrl = "/sw" }) {
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
if ("serviceWorker" in navigator) {
|
|
6
|
+
navigator.serviceWorker
|
|
7
|
+
.register(swUrl)
|
|
8
|
+
.catch((err) => console.error("SW registration failed:", err));
|
|
9
|
+
}
|
|
10
|
+
}, [swUrl]);
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=SwRegistration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwRegistration.js","sourceRoot":"","sources":["../../../../../packages/ui/src/pwa/SwRegistration.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMlC,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,GAAG,KAAK,EAAuB;IACnE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,eAAe,IAAI,SAAS,EAAE,CAAC;YACjC,SAAS,CAAC,aAAa;iBACpB,QAAQ,CAAC,KAAK,CAAC;iBACf,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAC9C,CAAC;QACN,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ComponentType, type ReactNode } from "react";
|
|
2
|
+
export type UseCurrentUser = () => {
|
|
3
|
+
data?: {
|
|
4
|
+
role: {
|
|
5
|
+
name: string;
|
|
6
|
+
};
|
|
7
|
+
} | null;
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
};
|
|
10
|
+
export interface RouteGuardInputConfig {
|
|
11
|
+
useCurrentUser: UseCurrentUser;
|
|
12
|
+
pagePermissions: Record<string, string[]>;
|
|
13
|
+
deniedPath?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface RouteGuardConfig {
|
|
16
|
+
useCurrentUser: UseCurrentUser;
|
|
17
|
+
pagePermissions: Record<string, string[]>;
|
|
18
|
+
deniedPath: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function createRouteGuardConfig(input: RouteGuardInputConfig): RouteGuardConfig;
|
|
21
|
+
interface RouteGuardProviderProps {
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
config?: RouteGuardConfig;
|
|
24
|
+
useCurrentUser?: UseCurrentUser;
|
|
25
|
+
pagePermissions?: Record<string, string[]>;
|
|
26
|
+
deniedPath?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function RouteGuardProvider({ children, config, useCurrentUser, pagePermissions, deniedPath, }: RouteGuardProviderProps): import("react").JSX.Element;
|
|
29
|
+
export declare function routeGuard(page: string, Component: ComponentType): (props: Record<string, unknown>) => import("react").JSX.Element;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=route-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-guard.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/route-guard/route-guard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,MAAM,cAAc,GAAG,MAAM;IACjC,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IACzC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,qBAAqB,GAC3B,gBAAgB,CAMlB;AAID,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,MAAM,EACN,cAAc,EACd,eAAe,EACf,UAAU,GACX,EAAE,uBAAuB,+BAsBzB;AAoCD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,IACnC,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,iCA+B3D"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext, useMemo, } from "react";
|
|
4
|
+
import { redirect, usePathname } from "next/navigation";
|
|
5
|
+
export function createRouteGuardConfig(input) {
|
|
6
|
+
return {
|
|
7
|
+
useCurrentUser: input.useCurrentUser,
|
|
8
|
+
pagePermissions: input.pagePermissions,
|
|
9
|
+
deniedPath: input.deniedPath ?? "/access-denied",
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const RouteGuardContext = createContext(null);
|
|
13
|
+
export function RouteGuardProvider({ children, config, useCurrentUser, pagePermissions, deniedPath, }) {
|
|
14
|
+
const resolved = useMemo(() => {
|
|
15
|
+
if (config)
|
|
16
|
+
return config;
|
|
17
|
+
return {
|
|
18
|
+
useCurrentUser: useCurrentUser,
|
|
19
|
+
pagePermissions: pagePermissions,
|
|
20
|
+
deniedPath: deniedPath ?? "/access-denied",
|
|
21
|
+
};
|
|
22
|
+
}, [config, useCurrentUser, pagePermissions, deniedPath]);
|
|
23
|
+
if (!resolved.useCurrentUser || !resolved.pagePermissions) {
|
|
24
|
+
throw new Error("RouteGuardProvider requires either a `config` prop (from createRouteGuardConfig) " +
|
|
25
|
+
"or `useCurrentUser` + `pagePermissions` directly.");
|
|
26
|
+
}
|
|
27
|
+
return (_jsx(RouteGuardContext.Provider, { value: resolved, children: _jsx(AutoRouteGuard, { config: resolved, children: children }) }));
|
|
28
|
+
}
|
|
29
|
+
function AutoRouteGuard({ config, children, }) {
|
|
30
|
+
const pathname = usePathname();
|
|
31
|
+
const { data: user, isLoading } = config.useCurrentUser();
|
|
32
|
+
const allowedRoles = useMemo(() => findAllowedRoles(pathname, config.pagePermissions), [pathname, config.pagePermissions]);
|
|
33
|
+
if (!allowedRoles) {
|
|
34
|
+
return _jsx(_Fragment, { children: children });
|
|
35
|
+
}
|
|
36
|
+
if (isLoading) {
|
|
37
|
+
return (_jsx("div", { className: "flex items-center justify-center min-h-screen", children: _jsx("p", { className: "text-gray-500", children: "Chargement..." }) }));
|
|
38
|
+
}
|
|
39
|
+
if (!user || !allowedRoles.includes(user.role.name)) {
|
|
40
|
+
redirect(config.deniedPath);
|
|
41
|
+
}
|
|
42
|
+
return _jsx(_Fragment, { children: children });
|
|
43
|
+
}
|
|
44
|
+
export function routeGuard(page, Component) {
|
|
45
|
+
return function GuardedPage(props) {
|
|
46
|
+
const config = useContext(RouteGuardContext);
|
|
47
|
+
if (!config) {
|
|
48
|
+
throw new Error("routeGuard requires a RouteGuardProvider ancestor. " +
|
|
49
|
+
"Wrap your layout with <RouteGuardProvider>.");
|
|
50
|
+
}
|
|
51
|
+
const { data: user, isLoading } = config.useCurrentUser();
|
|
52
|
+
const allowedRoles = findAllowedRoles(page, config.pagePermissions);
|
|
53
|
+
if (!allowedRoles) {
|
|
54
|
+
return _jsx(Component, { ...props });
|
|
55
|
+
}
|
|
56
|
+
if (isLoading) {
|
|
57
|
+
return (_jsx("div", { className: "flex items-center justify-center min-h-screen", children: _jsx("p", { className: "text-gray-500", children: "Chargement..." }) }));
|
|
58
|
+
}
|
|
59
|
+
if (!user || !allowedRoles.includes(user.role.name)) {
|
|
60
|
+
redirect(config.deniedPath);
|
|
61
|
+
}
|
|
62
|
+
return _jsx(Component, { ...props });
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function findAllowedRoles(page, pagePermissions) {
|
|
66
|
+
const segments = page.split("/").filter(Boolean);
|
|
67
|
+
for (let i = 0; i <= segments.length; i++) {
|
|
68
|
+
const candidate = "/" + segments.slice(0, i).join("/");
|
|
69
|
+
const roles = pagePermissions[candidate];
|
|
70
|
+
if (roles)
|
|
71
|
+
return roles;
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=route-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-guard.js","sourceRoot":"","sources":["../../../../../packages/ui/src/route-guard/route-guard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=input-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-search.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/search/input-search.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
"use client";
|
|
4
|
+
|
|
5
|
+
import { InputHTMLAttributes, useState, Dispatch, SetStateAction } from "react";
|
|
6
|
+
import { X } from "lucide-react";
|
|
7
|
+
|
|
8
|
+
type InputSearchProps = Omit<InputHTMLAttributes<HTMLInputElement>, "onChange" | "value"> & {
|
|
9
|
+
value: string;
|
|
10
|
+
onChange: Dispatch<SetStateAction<string>> | ((value: string) => void);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export function InputSearch({ value, onChange, ...props }: InputSearchProps) {
|
|
14
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<div className="relative">
|
|
18
|
+
<input
|
|
19
|
+
{...props}
|
|
20
|
+
type="text"
|
|
21
|
+
value={value}
|
|
22
|
+
onChange={(e) => {
|
|
23
|
+
const newValue = e.target.value;
|
|
24
|
+
if (typeof onChange === "function") {
|
|
25
|
+
(onChange as (value: string) => void)(newValue);
|
|
26
|
+
}
|
|
27
|
+
}}
|
|
28
|
+
onFocus={() => setIsFocused(true)}
|
|
29
|
+
onBlur={() => setIsFocused(false)}
|
|
30
|
+
className={`w-full px-4 py-2 pr-10 border rounded-lg text-sm text-gray-700 bg-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:border-transparent ${
|
|
31
|
+
props.className || ""
|
|
32
|
+
}`}
|
|
33
|
+
/>
|
|
34
|
+
{value && (
|
|
35
|
+
<button
|
|
36
|
+
type="button"
|
|
37
|
+
onClick={() => onChange("")}
|
|
38
|
+
className="absolute right-2 top-1/2 -translate-y-1/2 p-1 text-gray-400 hover:text-gray-600 transition-colors"
|
|
39
|
+
>
|
|
40
|
+
<X className="w-4 h-4" />
|
|
41
|
+
</button>
|
|
42
|
+
)}
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
*/
|
|
47
|
+
//# sourceMappingURL=input-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-search.js","sourceRoot":"","sources":["../../../../../packages/ui/src/search/input-search.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=select-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-search.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/search/select-search.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
"use client";
|
|
4
|
+
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
import { X, ChevronDown } from "lucide-react";
|
|
7
|
+
|
|
8
|
+
export type SelectSearchOption = {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type SelectSearchProps = {
|
|
14
|
+
label: string;
|
|
15
|
+
placeholder?: string;
|
|
16
|
+
options: SelectSearchOption[];
|
|
17
|
+
onSelect: (option: SelectSearchOption | null) => void;
|
|
18
|
+
selectedOption?: SelectSearchOption | null;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export function SelectSearch({
|
|
22
|
+
label,
|
|
23
|
+
placeholder,
|
|
24
|
+
options,
|
|
25
|
+
onSelect,
|
|
26
|
+
selectedOption,
|
|
27
|
+
}: SelectSearchProps) {
|
|
28
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
29
|
+
|
|
30
|
+
const handleSelect = (option: SelectSearchOption) => {
|
|
31
|
+
const isSameOption = selectedOption?.id === option.id;
|
|
32
|
+
onSelect(isSameOption ? null : option);
|
|
33
|
+
setIsOpen(false);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const handleClear = (e: React.MouseEvent) => {
|
|
37
|
+
e.stopPropagation();
|
|
38
|
+
onSelect(null);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<div className="relative">
|
|
43
|
+
<button
|
|
44
|
+
type="button"
|
|
45
|
+
onClick={() => setIsOpen(!isOpen)}
|
|
46
|
+
className="flex items-center justify-between w-full px-4 py-2 border rounded-lg text-sm text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-500"
|
|
47
|
+
>
|
|
48
|
+
<span className="truncate">
|
|
49
|
+
{selectedOption
|
|
50
|
+
? selectedOption.name
|
|
51
|
+
: placeholder || `Filtrer par ${label}`}
|
|
52
|
+
</span>
|
|
53
|
+
<ChevronDown
|
|
54
|
+
className={`w-4 h-4 text-gray-400 transition-transform ${isOpen ? "rotate-180" : ""}`}
|
|
55
|
+
/>
|
|
56
|
+
</button>
|
|
57
|
+
|
|
58
|
+
{isOpen && (
|
|
59
|
+
<div className="absolute z-10 w-full mt-1 bg-white border rounded-lg shadow-lg max-h-60 overflow-y-auto">
|
|
60
|
+
<button
|
|
61
|
+
type="button"
|
|
62
|
+
onClick={() => {
|
|
63
|
+
onSelect(null);
|
|
64
|
+
setIsOpen(false);
|
|
65
|
+
}}
|
|
66
|
+
className="w-full px-4 py-2 text-left text-sm text-gray-500 hover:bg-gray-100 border-b"
|
|
67
|
+
>
|
|
68
|
+
Toutes les {label}s
|
|
69
|
+
</button>
|
|
70
|
+
{options.map((option) => (
|
|
71
|
+
<button
|
|
72
|
+
key={option.id}
|
|
73
|
+
type="button"
|
|
74
|
+
onClick={() => handleSelect(option)}
|
|
75
|
+
className={`w-full px-4 py-2 text-left text-sm hover:bg-gray-100 ${
|
|
76
|
+
selectedOption?.id === option.id
|
|
77
|
+
? "bg-gray-200 text-gray-900"
|
|
78
|
+
: ""
|
|
79
|
+
}`}
|
|
80
|
+
>
|
|
81
|
+
{option.name}
|
|
82
|
+
</button>
|
|
83
|
+
))}
|
|
84
|
+
</div>
|
|
85
|
+
)}
|
|
86
|
+
|
|
87
|
+
{selectedOption && (
|
|
88
|
+
<button
|
|
89
|
+
type="button"
|
|
90
|
+
onClick={handleClear}
|
|
91
|
+
className="absolute right-8 top-1/2 -translate-y-1/2 p-1 text-gray-400 hover:text-gray-600"
|
|
92
|
+
>
|
|
93
|
+
<X className="w-4 h-4" />
|
|
94
|
+
</button>
|
|
95
|
+
)}
|
|
96
|
+
</div>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
*/
|
|
100
|
+
//# sourceMappingURL=select-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-search.js","sourceRoot":"","sources":["../../../../../packages/ui/src/search/select-search.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiGE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export type TableAction<T> = {
|
|
3
|
+
label: string;
|
|
4
|
+
icon: React.ReactNode;
|
|
5
|
+
callback: (row: T) => void;
|
|
6
|
+
color?: string;
|
|
7
|
+
};
|
|
8
|
+
type ActionsMenuProps<T> = {
|
|
9
|
+
row: T;
|
|
10
|
+
actions: TableAction<T>[];
|
|
11
|
+
};
|
|
12
|
+
export declare function ActionsMenu<T>({ row, actions }: ActionsMenuProps<T>): React.JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=actions-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions-menu.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/table/actions-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAG3D,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,gBAAgB,CAAC,CAAC,IAAI;IACzB,GAAG,EAAE,CAAC,CAAC;IACP,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,qBAyFnE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useRef, useEffect } from "react";
|
|
4
|
+
import { Ellipsis } from "lucide-react";
|
|
5
|
+
export function ActionsMenu({ row, actions }) {
|
|
6
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
7
|
+
const [coords, setCoords] = useState({ top: 0, left: 0 });
|
|
8
|
+
const buttonRef = useRef(null);
|
|
9
|
+
const menuRef = useRef(null);
|
|
10
|
+
// Fermer le menu si clic en dehors
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
function handleClickOutside(event) {
|
|
13
|
+
if (menuRef.current &&
|
|
14
|
+
buttonRef.current &&
|
|
15
|
+
!menuRef.current.contains(event.target) &&
|
|
16
|
+
!buttonRef.current.contains(event.target)) {
|
|
17
|
+
setIsOpen(false);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
21
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
22
|
+
}, []);
|
|
23
|
+
const toggleMenu = () => {
|
|
24
|
+
if (buttonRef.current) {
|
|
25
|
+
const rect = buttonRef.current.getBoundingClientRect();
|
|
26
|
+
const menuWidth = 180;
|
|
27
|
+
const menuHeight = actions.length * 40;
|
|
28
|
+
const spaceBelow = window.innerHeight - rect.bottom;
|
|
29
|
+
const spaceRight = window.innerWidth - rect.left;
|
|
30
|
+
let top = rect.bottom;
|
|
31
|
+
let left = rect.left;
|
|
32
|
+
// If not enough space below, show above
|
|
33
|
+
if (spaceBelow < menuHeight + 20) {
|
|
34
|
+
top = rect.top - menuHeight;
|
|
35
|
+
}
|
|
36
|
+
// If not enough space on the right, align to the left
|
|
37
|
+
if (spaceRight < menuWidth + 20) {
|
|
38
|
+
left = rect.left - menuWidth + 30;
|
|
39
|
+
}
|
|
40
|
+
setCoords({ top, left });
|
|
41
|
+
}
|
|
42
|
+
setIsOpen(!isOpen);
|
|
43
|
+
};
|
|
44
|
+
return (_jsxs(_Fragment, { children: [_jsx("button", { ref: buttonRef, onClick: toggleMenu, className: "p-1 hover:bg-gray-100 rounded-full", children: _jsx(Ellipsis, { className: "w-5 h-5" }) }), isOpen && (_jsx("div", { ref: menuRef, className: "fixed bg-white border border-gray-200 rounded shadow-lg z-20", style: {
|
|
45
|
+
top: coords.top,
|
|
46
|
+
left: coords.left,
|
|
47
|
+
minWidth: 180,
|
|
48
|
+
}, children: actions.map((action, idx) => (_jsxs("button", { className: `flex items-center gap-2 px-4 py-2 w-full text-sm hover:bg-gray-100 ${action.color || "text-gray-700"}`, onClick: () => {
|
|
49
|
+
action.callback(row);
|
|
50
|
+
setIsOpen(false);
|
|
51
|
+
}, children: [action.icon, action.label] }, idx))) }))] }));
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=actions-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions-menu.js","sourceRoot":"","sources":["../../../../../packages/ui/src/table/actions-menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ApiError } from "../../../utils/src/fetcher";
|
|
2
|
+
export type ColumnPriority = "high" | "medium" | "low";
|
|
3
|
+
export type Column<T> = {
|
|
4
|
+
header: string;
|
|
5
|
+
accessor?: keyof T;
|
|
6
|
+
render?: (row: T) => React.ReactNode;
|
|
7
|
+
excludeFromPrint?: boolean;
|
|
8
|
+
priority?: ColumnPriority;
|
|
9
|
+
breakWords?: boolean;
|
|
10
|
+
};
|
|
11
|
+
type TableProps<T> = {
|
|
12
|
+
data: T[];
|
|
13
|
+
columns: Column<T>[];
|
|
14
|
+
loading?: boolean;
|
|
15
|
+
error?: ApiError | null;
|
|
16
|
+
label?: string;
|
|
17
|
+
printable?: boolean;
|
|
18
|
+
pageSize?: number;
|
|
19
|
+
pageSizeOptions?: number[];
|
|
20
|
+
showPagination?: boolean;
|
|
21
|
+
};
|
|
22
|
+
export declare function Table<T>({ data, columns, loading, error, label, printable, pageSize, pageSizeOptions, showPagination, }: TableProps<T>): import("react").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/table/table.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEvD,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;IACrC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAeF,KAAK,UAAU,CAAC,CAAC,IAAI;IACnB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,wBAAgB,KAAK,CAAC,CAAC,EAAE,EACvB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,KAAK,EACL,KAAK,EACL,SAAS,EACT,QAAY,EACZ,eAA6B,EAC7B,cAAqB,GACtB,EAAE,UAAU,CAAC,CAAC,CAAC,+BA2Sf"}
|