@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.
Files changed (155) hide show
  1. package/dist/packages/lib/src/auth-guard.d.ts +10 -0
  2. package/dist/packages/lib/src/auth-guard.d.ts.map +1 -0
  3. package/dist/packages/lib/src/auth-guard.js +60 -0
  4. package/dist/packages/lib/src/auth-guard.js.map +1 -0
  5. package/dist/packages/lib/src/handle-server-error.d.ts +9 -0
  6. package/dist/packages/lib/src/handle-server-error.d.ts.map +1 -0
  7. package/dist/packages/lib/src/handle-server-error.js +43 -0
  8. package/dist/packages/lib/src/handle-server-error.js.map +1 -0
  9. package/dist/packages/lib/src/http-error.d.ts +6 -0
  10. package/dist/packages/lib/src/http-error.d.ts.map +1 -0
  11. package/dist/packages/lib/src/http-error.js +12 -0
  12. package/dist/packages/lib/src/http-error.js.map +1 -0
  13. package/dist/packages/lib/src/index.d.ts +5 -0
  14. package/dist/packages/lib/src/index.d.ts.map +1 -0
  15. package/dist/packages/lib/src/index.js +9 -0
  16. package/dist/packages/lib/src/index.js.map +1 -0
  17. package/dist/packages/lib/src/with-auth.d.ts +8 -0
  18. package/dist/packages/lib/src/with-auth.d.ts.map +1 -0
  19. package/dist/packages/lib/src/with-auth.js +32 -0
  20. package/dist/packages/lib/src/with-auth.js.map +1 -0
  21. package/dist/packages/ui/src/config/create-side-nav.d.ts +6 -0
  22. package/dist/packages/ui/src/config/create-side-nav.d.ts.map +1 -0
  23. package/dist/packages/ui/src/config/create-side-nav.js +9 -0
  24. package/dist/packages/ui/src/config/create-side-nav.js.map +1 -0
  25. package/dist/packages/ui/src/feedback/confirmation.d.ts +16 -0
  26. package/dist/packages/ui/src/feedback/confirmation.d.ts.map +1 -0
  27. package/dist/packages/ui/src/feedback/confirmation.js +82 -0
  28. package/dist/packages/ui/src/feedback/confirmation.js.map +1 -0
  29. package/dist/packages/ui/src/feedback/error-display.d.ts +7 -0
  30. package/dist/packages/ui/src/feedback/error-display.d.ts.map +1 -0
  31. package/dist/packages/ui/src/feedback/error-display.js +11 -0
  32. package/dist/packages/ui/src/feedback/error-display.js.map +1 -0
  33. package/dist/packages/ui/src/forms/date-picker.d.ts +4 -0
  34. package/dist/packages/ui/src/forms/date-picker.d.ts.map +1 -0
  35. package/dist/packages/ui/src/forms/date-picker.js +9 -0
  36. package/dist/packages/ui/src/forms/date-picker.js.map +1 -0
  37. package/dist/packages/ui/src/forms/field-container.d.ts +8 -0
  38. package/dist/packages/ui/src/forms/field-container.d.ts.map +1 -0
  39. package/dist/packages/ui/src/forms/field-container.js +6 -0
  40. package/dist/packages/ui/src/forms/field-container.js.map +1 -0
  41. package/dist/packages/ui/src/forms/form.d.ts +9 -0
  42. package/dist/packages/ui/src/forms/form.d.ts.map +1 -0
  43. package/dist/packages/ui/src/forms/form.js +63 -0
  44. package/dist/packages/ui/src/forms/form.js.map +1 -0
  45. package/dist/packages/ui/src/forms/input.d.ts +4 -0
  46. package/dist/packages/ui/src/forms/input.d.ts.map +1 -0
  47. package/dist/packages/ui/src/forms/input.js +13 -0
  48. package/dist/packages/ui/src/forms/input.js.map +1 -0
  49. package/dist/packages/ui/src/forms/label.d.ts +7 -0
  50. package/dist/packages/ui/src/forms/label.d.ts.map +1 -0
  51. package/dist/packages/ui/src/forms/label.js +9 -0
  52. package/dist/packages/ui/src/forms/label.js.map +1 -0
  53. package/dist/packages/ui/src/forms/select.d.ts +6 -0
  54. package/dist/packages/ui/src/forms/select.d.ts.map +1 -0
  55. package/dist/packages/ui/src/forms/select.js +19 -0
  56. package/dist/packages/ui/src/forms/select.js.map +1 -0
  57. package/dist/packages/ui/src/forms/textarea.d.ts +4 -0
  58. package/dist/packages/ui/src/forms/textarea.d.ts.map +1 -0
  59. package/dist/packages/ui/src/forms/textarea.js +9 -0
  60. package/dist/packages/ui/src/forms/textarea.js.map +1 -0
  61. package/dist/packages/ui/src/headers/header-content.d.ts +11 -0
  62. package/dist/packages/ui/src/headers/header-content.d.ts.map +1 -0
  63. package/dist/packages/ui/src/headers/header-content.js +6 -0
  64. package/dist/packages/ui/src/headers/header-content.js.map +1 -0
  65. package/dist/packages/ui/src/illustrations/topic-illustration.d.ts +1 -0
  66. package/dist/packages/ui/src/illustrations/topic-illustration.d.ts.map +1 -0
  67. package/dist/packages/ui/src/illustrations/topic-illustration.js +69 -0
  68. package/dist/packages/ui/src/illustrations/topic-illustration.js.map +1 -0
  69. package/dist/packages/ui/src/index.d.ts +28 -0
  70. package/dist/packages/ui/src/index.d.ts.map +1 -0
  71. package/dist/packages/ui/src/index.js +38 -0
  72. package/dist/packages/ui/src/index.js.map +1 -0
  73. package/dist/packages/ui/src/layouts/side-nav.d.ts +45 -0
  74. package/dist/packages/ui/src/layouts/side-nav.d.ts.map +1 -0
  75. package/dist/packages/ui/src/layouts/side-nav.js +127 -0
  76. package/dist/packages/ui/src/layouts/side-nav.js.map +1 -0
  77. package/dist/packages/ui/src/loaders/loader-submit.d.ts +8 -0
  78. package/dist/packages/ui/src/loaders/loader-submit.d.ts.map +1 -0
  79. package/dist/packages/ui/src/loaders/loader-submit.js +7 -0
  80. package/dist/packages/ui/src/loaders/loader-submit.js.map +1 -0
  81. package/dist/packages/ui/src/loaders/loading.d.ts +6 -0
  82. package/dist/packages/ui/src/loaders/loading.d.ts.map +1 -0
  83. package/dist/packages/ui/src/loaders/loading.js +7 -0
  84. package/dist/packages/ui/src/loaders/loading.js.map +1 -0
  85. package/dist/packages/ui/src/modals/modal.d.ts +10 -0
  86. package/dist/packages/ui/src/modals/modal.d.ts.map +1 -0
  87. package/dist/packages/ui/src/modals/modal.js +36 -0
  88. package/dist/packages/ui/src/modals/modal.js.map +1 -0
  89. package/dist/packages/ui/src/pages/access-denied.d.ts +8 -0
  90. package/dist/packages/ui/src/pages/access-denied.d.ts.map +1 -0
  91. package/dist/packages/ui/src/pages/access-denied.js +8 -0
  92. package/dist/packages/ui/src/pages/access-denied.js.map +1 -0
  93. package/dist/packages/ui/src/pages/session-expired.d.ts +6 -0
  94. package/dist/packages/ui/src/pages/session-expired.d.ts.map +1 -0
  95. package/dist/packages/ui/src/pages/session-expired.js +21 -0
  96. package/dist/packages/ui/src/pages/session-expired.js.map +1 -0
  97. package/dist/packages/ui/src/pwa/InstallPrompt.d.ts +7 -0
  98. package/dist/packages/ui/src/pwa/InstallPrompt.d.ts.map +1 -0
  99. package/dist/packages/ui/src/pwa/InstallPrompt.js +71 -0
  100. package/dist/packages/ui/src/pwa/InstallPrompt.js.map +1 -0
  101. package/dist/packages/ui/src/pwa/SwRegistration.d.ts +5 -0
  102. package/dist/packages/ui/src/pwa/SwRegistration.d.ts.map +1 -0
  103. package/dist/packages/ui/src/pwa/SwRegistration.js +13 -0
  104. package/dist/packages/ui/src/pwa/SwRegistration.js.map +1 -0
  105. package/dist/packages/ui/src/route-guard/route-guard.d.ts +31 -0
  106. package/dist/packages/ui/src/route-guard/route-guard.d.ts.map +1 -0
  107. package/dist/packages/ui/src/route-guard/route-guard.js +75 -0
  108. package/dist/packages/ui/src/route-guard/route-guard.js.map +1 -0
  109. package/dist/packages/ui/src/search/input-search.d.ts +1 -0
  110. package/dist/packages/ui/src/search/input-search.d.ts.map +1 -0
  111. package/dist/packages/ui/src/search/input-search.js +47 -0
  112. package/dist/packages/ui/src/search/input-search.js.map +1 -0
  113. package/dist/packages/ui/src/search/select-search.d.ts +1 -0
  114. package/dist/packages/ui/src/search/select-search.d.ts.map +1 -0
  115. package/dist/packages/ui/src/search/select-search.js +100 -0
  116. package/dist/packages/ui/src/search/select-search.js.map +1 -0
  117. package/dist/packages/ui/src/table/actions-menu.d.ts +14 -0
  118. package/dist/packages/ui/src/table/actions-menu.d.ts.map +1 -0
  119. package/dist/packages/ui/src/table/actions-menu.js +53 -0
  120. package/dist/packages/ui/src/table/actions-menu.js.map +1 -0
  121. package/dist/packages/ui/src/table/table.d.ts +24 -0
  122. package/dist/packages/ui/src/table/table.d.ts.map +1 -0
  123. package/dist/packages/ui/src/table/table.js +99 -0
  124. package/dist/packages/ui/src/table/table.js.map +1 -0
  125. package/dist/packages/utils/src/fetcher.d.ts +16 -0
  126. package/dist/packages/utils/src/fetcher.d.ts.map +1 -0
  127. package/dist/packages/utils/src/fetcher.js +38 -0
  128. package/dist/packages/utils/src/fetcher.js.map +1 -0
  129. package/dist/packages/utils/src/formatCurrency.d.ts +1 -0
  130. package/dist/packages/utils/src/formatCurrency.d.ts.map +1 -0
  131. package/dist/packages/utils/src/formatCurrency.js +2 -0
  132. package/dist/packages/utils/src/formatCurrency.js.map +1 -0
  133. package/dist/packages/utils/src/formatDate.d.ts +1 -0
  134. package/dist/packages/utils/src/formatDate.d.ts.map +1 -0
  135. package/dist/packages/utils/src/formatDate.js +2 -0
  136. package/dist/packages/utils/src/formatDate.js.map +1 -0
  137. package/dist/packages/utils/src/index.d.ts +3 -0
  138. package/dist/packages/utils/src/index.d.ts.map +1 -0
  139. package/dist/packages/utils/src/index.js +2 -0
  140. package/dist/packages/utils/src/index.js.map +1 -0
  141. package/dist/src/client.d.ts +3 -0
  142. package/dist/src/client.d.ts.map +1 -0
  143. package/dist/src/client.js +5 -0
  144. package/dist/src/client.js.map +1 -0
  145. package/dist/src/server.d.ts +2 -0
  146. package/dist/src/server.d.ts.map +1 -0
  147. package/dist/src/server.js +3 -0
  148. package/dist/src/server.js.map +1 -0
  149. package/package.json +8 -8
  150. package/dist/client.d.ts +0 -210
  151. package/dist/client.js +0 -1407
  152. package/dist/client.js.map +0 -1
  153. package/dist/server.d.ts +0 -33
  154. package/dist/server.js +0 -161
  155. 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,6 @@
1
+ interface SessionExpiredProps {
2
+ redirectUrl?: string;
3
+ }
4
+ export declare function SessionExpired({ redirectUrl }: SessionExpiredProps): import("react").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=session-expired.d.ts.map
@@ -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,5 @@
1
+ export type SwRegistrationProps = {
2
+ swUrl?: string;
3
+ };
4
+ export declare function SwRegistration({ swUrl }: SwRegistrationProps): null;
5
+ //# sourceMappingURL=SwRegistration.d.ts.map
@@ -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"}