@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,10 @@
1
+ import { NextResponse } from "next/server";
2
+ import type { NextRequest } from "next/server";
3
+ interface AuthGuardOptions {
4
+ publicRoutes: string[];
5
+ loginUrl: string;
6
+ jwtSecret: string;
7
+ }
8
+ export declare function authGuard(request: NextRequest, options: AuthGuardOptions): Promise<NextResponse<unknown>>;
9
+ export {};
10
+ //# sourceMappingURL=auth-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../../../../packages/lib/src/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C,UAAU,gBAAgB;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,gBAAgB,kCAqE1B"}
@@ -0,0 +1,60 @@
1
+ import { NextResponse } from "next/server";
2
+ import { jwtVerify } from "jose";
3
+ export async function authGuard(request, options) {
4
+ const { publicRoutes, loginUrl, jwtSecret } = options;
5
+ if (!jwtSecret) {
6
+ console.error("auth-guard: JWT_SECRET is not defined");
7
+ const loginUrlObj = new URL(loginUrl, request.url);
8
+ loginUrlObj.searchParams.set("error", "authentification_requise");
9
+ return NextResponse.redirect(loginUrlObj);
10
+ }
11
+ const { pathname } = request.nextUrl;
12
+ const isPublicRoute = publicRoutes.some((route) => {
13
+ if (route.endsWith("/*")) {
14
+ return pathname.startsWith(route.slice(0, -2));
15
+ }
16
+ return pathname === route;
17
+ });
18
+ if (isPublicRoute) {
19
+ return NextResponse.next();
20
+ }
21
+ const token = request.cookies.get("auth")?.value;
22
+ if (!token) {
23
+ const loginUrlObj = new URL(loginUrl, request.url);
24
+ loginUrlObj.searchParams.set("error", "authentification_requise");
25
+ return NextResponse.redirect(loginUrlObj);
26
+ }
27
+ let payload;
28
+ try {
29
+ const secret = new TextEncoder().encode(jwtSecret);
30
+ const result = await jwtVerify(token, secret, {
31
+ algorithms: ["HS256"],
32
+ });
33
+ const rawPermissions = result.payload.permissions;
34
+ payload = {
35
+ id: String(result.payload.id || ""),
36
+ role: String(result.payload.role || ""),
37
+ permissions: Array.isArray(rawPermissions)
38
+ ? rawPermissions
39
+ : [],
40
+ };
41
+ if (!payload.id || !payload.role) {
42
+ const loginUrlObj = new URL(loginUrl, request.url);
43
+ loginUrlObj.searchParams.set("error", "token_invalide");
44
+ return NextResponse.redirect(loginUrlObj);
45
+ }
46
+ }
47
+ catch {
48
+ const loginUrlObj = new URL(loginUrl, request.url);
49
+ loginUrlObj.searchParams.set("error", "token_invalide");
50
+ return NextResponse.redirect(loginUrlObj);
51
+ }
52
+ const requestHeaders = new Headers(request.headers);
53
+ requestHeaders.set("x-user-id", payload.id);
54
+ requestHeaders.set("x-user-role", payload.role);
55
+ requestHeaders.set("x-user-permissions", (payload.permissions ?? []).join(","));
56
+ return NextResponse.next({
57
+ request: { headers: requestHeaders },
58
+ });
59
+ }
60
+ //# sourceMappingURL=auth-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../../../../packages/lib/src/auth-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Transforme n'importe quelle erreur en réponse JSON standardisée
3
+ * @param error L'erreur levée
4
+ * @param defaultStatus Statut HTTP par défaut si non défini
5
+ * @param showDetails Force l'affichage des détails (true) ou le mode sécurisé (false). Par défaut : automatique selon NODE_ENV
6
+ * @returns Response JSON
7
+ */
8
+ export declare function handleServerError(error: unknown, defaultStatus?: number, showDetails?: boolean): Response;
9
+ //# sourceMappingURL=handle-server-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-server-error.d.ts","sourceRoot":"","sources":["../../../../packages/lib/src/handle-server-error.ts"],"names":[],"mappings":"AAwBA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,aAAa,SAAM,EACnB,WAAW,CAAC,EAAE,OAAO,YA8CtB"}
@@ -0,0 +1,43 @@
1
+ import { HttpError } from "./http-error";
2
+ const GENERIC_MESSAGE = "Erreur serveur";
3
+ function shouldShowDetails(showDetails) {
4
+ return showDetails ?? process.env.NODE_ENV !== "production";
5
+ }
6
+ function sanitizedResponse(message, code, status, showDetails) {
7
+ return Response.json({
8
+ message: showDetails ? message : GENERIC_MESSAGE,
9
+ code: showDetails ? code : "INTERNAL_ERROR",
10
+ status,
11
+ }, { status });
12
+ }
13
+ /**
14
+ * Transforme n'importe quelle erreur en réponse JSON standardisée
15
+ * @param error L'erreur levée
16
+ * @param defaultStatus Statut HTTP par défaut si non défini
17
+ * @param showDetails Force l'affichage des détails (true) ou le mode sécurisé (false). Par défaut : automatique selon NODE_ENV
18
+ * @returns Response JSON
19
+ */
20
+ export function handleServerError(error, defaultStatus = 500, showDetails) {
21
+ const details = shouldShowDetails(showDetails);
22
+ console.error("Erreur capturée :", error);
23
+ // Cas HttpError personnalisé — toujours visible (erreur intentionnelle)
24
+ if (error instanceof HttpError) {
25
+ const status = error.status ?? defaultStatus;
26
+ return Response.json({
27
+ message: error.message,
28
+ code: error.code ?? "INTERNAL_ERROR",
29
+ status,
30
+ }, { status });
31
+ }
32
+ // Cas classique : objet Error
33
+ if (error instanceof Error) {
34
+ return sanitizedResponse(error.message, "INTERNAL_ERROR", defaultStatus, details);
35
+ }
36
+ // Cas objet brut ou autre type
37
+ if (typeof error === "object" && error !== null) {
38
+ return sanitizedResponse(JSON.stringify(error), "INTERNAL_ERROR", defaultStatus, details);
39
+ }
40
+ // Cas fallback : string ou autre
41
+ return sanitizedResponse(String(error), "INTERNAL_ERROR", defaultStatus, details);
42
+ }
43
+ //# sourceMappingURL=handle-server-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-server-error.js","sourceRoot":"","sources":["../../../../packages/lib/src/handle-server-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC,SAAS,iBAAiB,CAAC,WAAqB;IAC9C,OAAO,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAC9D,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAe,EACf,IAAY,EACZ,MAAc,EACd,WAAqB;IAErB,OAAO,QAAQ,CAAC,IAAI,CAClB;QACE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;QAChD,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB;QAC3C,MAAM;KACP,EACD,EAAE,MAAM,EAAE,CACX,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,aAAa,GAAG,GAAG,EACnB,WAAqB;IAErB,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAE/C,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IAE1C,wEAAwE;IACxE,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,aAAa,CAAC;QAC7C,OAAO,QAAQ,CAAC,IAAI,CAClB;YACE,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,gBAAgB;YACpC,MAAM;SACP,EACD,EAAE,MAAM,EAAE,CACX,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CACtB,KAAK,CAAC,OAAO,EACb,gBAAgB,EAChB,aAAa,EACb,OAAO,CACR,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,iBAAiB,CACtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EACrB,gBAAgB,EAChB,aAAa,EACb,OAAO,CACR,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,OAAO,iBAAiB,CACtB,MAAM,CAAC,KAAK,CAAC,EACb,gBAAgB,EAChB,aAAa,EACb,OAAO,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare class HttpError extends Error {
2
+ status: number;
3
+ code?: string;
4
+ constructor(message: string, status?: number, code?: string);
5
+ }
6
+ //# sourceMappingURL=http-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-error.d.ts","sourceRoot":"","sources":["../../../../packages/lib/src/http-error.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CASzD"}
@@ -0,0 +1,12 @@
1
+ export class HttpError extends Error {
2
+ status;
3
+ code;
4
+ constructor(message, status = 400, code) {
5
+ super(message);
6
+ this.name = "HttpError";
7
+ this.status = status;
8
+ this.code = code;
9
+ Object.setPrototypeOf(this, HttpError.prototype);
10
+ }
11
+ }
12
+ //# sourceMappingURL=http-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-error.js","sourceRoot":"","sources":["../../../../packages/lib/src/http-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,MAAM,CAAS;IACf,IAAI,CAAU;IAEd,YAAY,OAAe,EAAE,MAAM,GAAG,GAAG,EAAE,IAAa;QACtD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export * from "./http-error";
2
+ export * from "./handle-server-error";
3
+ export * from "./auth-guard";
4
+ export * from "./with-auth";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/lib/src/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAG7B,cAAc,uBAAuB,CAAC;AAGtC,cAAc,cAAc,CAAC;AAG7B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ // export of http-error
2
+ export * from "./http-error";
3
+ // export of handle-server-error
4
+ export * from "./handle-server-error";
5
+ // export of auth-guard
6
+ export * from "./auth-guard";
7
+ // export of with-auth
8
+ export * from "./with-auth";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/lib/src/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,cAAc,cAAc,CAAC;AAE7B,gCAAgC;AAChC,cAAc,uBAAuB,CAAC;AAEtC,uBAAuB;AACvB,cAAc,cAAc,CAAC;AAE7B,sBAAsB;AACtB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface AuthInfo {
2
+ userId: string;
3
+ userRole: string;
4
+ permissions: string[];
5
+ }
6
+ export declare function withAuth(handler: (req: Request, auth: AuthInfo) => Promise<Response>): (req: Request) => Promise<Response>;
7
+ export declare function withHandler(handler: (req: Request) => Promise<Response>): (req: Request) => Promise<Response>;
8
+ //# sourceMappingURL=with-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-auth.d.ts","sourceRoot":"","sources":["../../../../packages/lib/src/with-auth.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,IAE9C,KAAK,OAAO,uBAkB3B;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,IACxD,KAAK,OAAO,uBAO3B"}
@@ -0,0 +1,32 @@
1
+ import { HttpError } from "./http-error";
2
+ import { handleServerError } from "./handle-server-error";
3
+ export function withAuth(handler) {
4
+ return async (req) => {
5
+ try {
6
+ const userId = req.headers.get("x-user-id");
7
+ const userRole = req.headers.get("x-user-role");
8
+ const permissionsHeader = req.headers.get("x-user-permissions");
9
+ const permissions = permissionsHeader
10
+ ? permissionsHeader.split(",").filter(Boolean)
11
+ : [];
12
+ if (!userId || !userRole) {
13
+ throw new HttpError("Non authentifié", 401, "UNAUTHENTICATED");
14
+ }
15
+ return await handler(req, { userId, userRole, permissions });
16
+ }
17
+ catch (error) {
18
+ return handleServerError(error);
19
+ }
20
+ };
21
+ }
22
+ export function withHandler(handler) {
23
+ return async (req) => {
24
+ try {
25
+ return await handler(req);
26
+ }
27
+ catch (error) {
28
+ return handleServerError(error);
29
+ }
30
+ };
31
+ }
32
+ //# sourceMappingURL=with-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-auth.js","sourceRoot":"","sources":["../../../../packages/lib/src/with-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAQ1D,MAAM,UAAU,QAAQ,CACtB,OAA4D;IAE5D,OAAO,KAAK,EAAE,GAAY,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAChD,MAAM,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAChE,MAAM,WAAW,GAAG,iBAAiB;gBACnC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC9C,CAAC,CAAC,EAAE,CAAC;YAEP,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACzB,MAAM,IAAI,SAAS,CAAC,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;YACjE,CAAC;YAED,OAAO,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAA4C;IACtE,OAAO,KAAK,EAAE,GAAY,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type SideNavStaticConfig } from "../layouts/side-nav";
2
+ export declare function createSideNav(config: SideNavStaticConfig): ({ children, currentPath, }: {
3
+ children: React.ReactNode;
4
+ currentPath: string;
5
+ }) => import("react").JSX.Element;
6
+ //# sourceMappingURL=create-side-nav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-side-nav.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/config/create-side-nav.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAExE,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,IACrB,4BAG/B;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB,iCAOF"}
@@ -0,0 +1,9 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { SideNav } from "../layouts/side-nav";
4
+ export function createSideNav(config) {
5
+ return function ConfiguredSideNav({ children, currentPath, }) {
6
+ return (_jsx(SideNav, { ...config, currentPath: currentPath, children: children }));
7
+ };
8
+ }
9
+ //# sourceMappingURL=create-side-nav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-side-nav.js","sourceRoot":"","sources":["../../../../../packages/ui/src/config/create-side-nav.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAA4B,MAAM,qBAAqB,CAAC;AAExE,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,OAAO,SAAS,iBAAiB,CAAC,EAChC,QAAQ,EACR,WAAW,GAIZ;QACC,OAAO,CACL,KAAC,OAAO,OAAK,MAAM,EAAE,WAAW,EAAE,WAAW,YAC1C,QAAQ,GACD,CACX,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { ApiError } from "../../../utils/src/fetcher";
2
+ interface ConfirmationProps {
3
+ question: string;
4
+ messageYes: string;
5
+ messageNo: string;
6
+ requestClose: () => void;
7
+ onAction: () => void | Promise<void> | Promise<boolean> | Promise<{
8
+ success: true;
9
+ }>;
10
+ isProcessing: boolean;
11
+ error: ApiError | null;
12
+ resetRequest: () => void;
13
+ }
14
+ export declare function Confirmation({ question, messageYes, messageNo, requestClose, onAction, isProcessing, error, resetRequest, }: ConfirmationProps): import("react").JSX.Element | null;
15
+ export {};
16
+ //# sourceMappingURL=confirmation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/feedback/confirmation.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAKtD,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,QAAQ,EAAE,MACN,IAAI,GACJ,OAAO,CAAC,IAAI,CAAC,GACb,OAAO,CAAC,OAAO,CAAC,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,UAAU,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,YAAY,GACb,EAAE,iBAAiB,sCA6InB"}
@@ -0,0 +1,82 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useRef, useState } from "react";
4
+ import { CircleQuestionMark } from "lucide-react";
5
+ const ERROR_COUNTDOWN = 10;
6
+ export function Confirmation({ question, messageYes, messageNo, requestClose, onAction, isProcessing, error, resetRequest, }) {
7
+ const [countdown, setCountdown] = useState(0);
8
+ const countdownRef = useRef(null);
9
+ const resetRequestRef = useRef(resetRequest);
10
+ useEffect(() => {
11
+ resetRequestRef.current = resetRequest;
12
+ }, [resetRequest]);
13
+ const clearCountdown = useCallback(() => {
14
+ if (countdownRef.current !== null) {
15
+ window.clearInterval(countdownRef.current);
16
+ countdownRef.current = null;
17
+ }
18
+ }, []);
19
+ const resetConfirmationState = useCallback(() => {
20
+ clearCountdown();
21
+ setCountdown(0);
22
+ }, [clearCountdown]);
23
+ const handleResetRequest = useCallback(() => {
24
+ resetConfirmationState();
25
+ resetRequest();
26
+ }, [resetConfirmationState, resetRequest]);
27
+ const handleRequestClose = useCallback(() => {
28
+ resetConfirmationState();
29
+ resetRequest();
30
+ requestClose();
31
+ }, [requestClose, resetConfirmationState, resetRequest]);
32
+ const handleAction = useCallback(async () => {
33
+ try {
34
+ await onAction();
35
+ handleRequestClose();
36
+ }
37
+ catch {
38
+ // L'erreur est propagée par le parent via la prop `error`.
39
+ }
40
+ }, [handleRequestClose, onAction]);
41
+ useEffect(() => {
42
+ clearCountdown();
43
+ if (!error) {
44
+ const resetTimeoutId = window.setTimeout(() => {
45
+ setCountdown(0);
46
+ }, 0);
47
+ return () => {
48
+ window.clearTimeout(resetTimeoutId);
49
+ };
50
+ }
51
+ const startCountdownTimeoutId = window.setTimeout(() => {
52
+ setCountdown(ERROR_COUNTDOWN);
53
+ countdownRef.current = window.setInterval(() => {
54
+ setCountdown((previousCountdown) => {
55
+ if (previousCountdown <= 1) {
56
+ clearCountdown();
57
+ window.setTimeout(() => {
58
+ resetRequestRef.current();
59
+ }, 0);
60
+ return 0;
61
+ }
62
+ return previousCountdown - 1;
63
+ });
64
+ }, 1000);
65
+ }, 0);
66
+ return () => {
67
+ window.clearTimeout(startCountdownTimeoutId);
68
+ clearCountdown();
69
+ };
70
+ }, [clearCountdown, error]);
71
+ useEffect(() => {
72
+ return () => {
73
+ clearCountdown();
74
+ resetRequestRef.current();
75
+ };
76
+ }, [clearCountdown]);
77
+ const isErrorVisible = Boolean(error) && countdown > 0;
78
+ if (!question)
79
+ return null;
80
+ return (_jsxs("div", { className: "flex flex-col items-center gap-3 z-40", children: [_jsx(CircleQuestionMark, { className: "text-red-500 text-5xl" }), _jsx("h2", { className: "text-xl font-bold text-red-500", children: "Confirmation requise" }), _jsx("p", { className: "mt-4 text-md leading-relaxed text-gray-700", children: question }), _jsxs("div", { className: "mt-6 flex w-full gap-3", children: [_jsx("button", { type: "button", onClick: handleRequestClose, disabled: isProcessing, className: "w-full rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-semibold text-gray-700 transition hover:cursor-pointer hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-white", children: messageNo }), _jsx("button", { type: "button", onClick: handleAction, disabled: isProcessing, className: "w-full rounded-lg bg-red-400 px-4 py-2 text-sm font-semibold text-white transition hover:cursor-pointer hover:bg-red-500 active:scale-95 disabled:opacity-50 disabled:hover:bg-red-500", children: isProcessing ? "operation en cours" : messageYes })] }), error && isErrorVisible && (_jsxs("div", { className: "mt-4 w-full rounded-lg border border-red-200 bg-red-50 p-4 text-left text-sm text-red-700", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("p", { className: "font-semibold", children: "Erreur" }), _jsx("p", { className: "mt-1 text-sm", children: error.message })] }), _jsx("button", { type: "button", onClick: handleResetRequest, className: "rounded-full bg-red-100 px-2 py-1 text-xs font-semibold text-red-700 hover:bg-red-200", children: "Fermer" })] }), _jsxs("p", { className: "mt-3 text-xs text-red-600", children: ["Ce message disparait dans ", countdown, "s..."] })] }))] }));
81
+ }
82
+ //# sourceMappingURL=confirmation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../../../../packages/ui/src/feedback/confirmation.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ApiError } from "../../../utils/src";
2
+ interface ErrorDisplayProps {
3
+ error: ApiError | null;
4
+ }
5
+ export declare function ErrorDisplay({ error }: ErrorDisplayProps): import("react").JSX.Element | null;
6
+ export {};
7
+ //# sourceMappingURL=error-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-display.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/feedback/error-display.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,UAAU,iBAAiB;IACzB,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,iBAAiB,sCAuBxD"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { X } from "lucide-react";
4
+ import { useState } from "react";
5
+ export function ErrorDisplay({ error }) {
6
+ const [dismissed, setDismissed] = useState(false);
7
+ if (!error || dismissed)
8
+ return null;
9
+ return (_jsx("div", { className: "w-full overflow-x-auto", children: _jsx("div", { className: "rounded-lg shadow-md border border-red-200 bg-red-50", children: _jsxs("div", { className: "flex items-start justify-between gap-4 px-4 py-4", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("p", { className: "text-red-700 font-medium", children: "Erreur" }), _jsx("p", { className: "text-red-600 text-sm", children: error.message })] }), _jsx("button", { onClick: () => setDismissed(true), className: "text-red-400 hover:text-red-600 shrink-0 cursor-pointer", children: _jsx(X, { className: "w-5 h-5" }) })] }) }) }));
10
+ }
11
+ //# sourceMappingURL=error-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-display.js","sourceRoot":"","sources":["../../../../../packages/ui/src/feedback/error-display.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAMjC,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAqB;IACvD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,IAAI,CAAC,KAAK,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,CACL,cAAK,SAAS,EAAC,wBAAwB,YACrC,cAAK,SAAS,EAAC,sDAAsD,YACnE,eAAK,SAAS,EAAC,kDAAkD,aAC/D,eAAK,SAAS,EAAC,qBAAqB,aAClC,YAAG,SAAS,EAAC,0BAA0B,uBAAW,EAClD,YAAG,SAAS,EAAC,sBAAsB,YAAE,KAAK,CAAC,OAAO,GAAK,IACnD,EACN,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EACjC,SAAS,EAAC,yDAAyD,YAEnE,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,GAAG,GAClB,IACL,GACF,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const DatePicker: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & React.RefAttributes<HTMLInputElement>>;
3
+ export { DatePicker };
4
+ //# sourceMappingURL=date-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/forms/date-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,QAAA,MAAM,UAAU,sHAkBd,CAAC;AAIH,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React from "react";
4
+ const DatePicker = React.forwardRef(({ className, placeholder, required, ...props }, ref) => {
5
+ return (_jsxs("div", { className: "relative", children: [_jsx("input", { ref: ref, type: "date", required: required ?? true, className: `peer w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-gray-500 focus:border-transparent transition duration-200 ${className ?? ""}`, ...props }), _jsx("span", { className: "absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 pointer-events-none peer-valid:hidden md:hidden", children: placeholder ?? "jj/mm/aaaa" })] }));
6
+ });
7
+ DatePicker.displayName = "DatePicker";
8
+ export { DatePicker };
9
+ //# sourceMappingURL=date-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker.js","sourceRoot":"","sources":["../../../../../packages/ui/src/forms/date-picker.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAGjC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACxD,OAAO,CACL,eAAK,SAAS,EAAC,UAAU,aACvB,gBACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,MAAM,EACX,QAAQ,EAAE,QAAQ,IAAI,IAAI,EAC1B,SAAS,EAAE,gKAAgK,SAAS,IAAI,EAAE,EAAE,KACxL,KAAK,GACT,EACF,eAAM,SAAS,EAAC,wGAAwG,YACrH,WAAW,IAAI,YAAY,GACvB,IACH,CACP,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ interface FieldContainerProps {
3
+ children: React.ReactNode;
4
+ className?: string;
5
+ }
6
+ export declare function FieldContainer({ children, className }: FieldContainerProps): React.JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=field-container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-container.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/forms/field-container.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,mBAAmB,qBAM1E"}
@@ -0,0 +1,6 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ export function FieldContainer({ children, className }) {
4
+ return (_jsx("div", { className: `flex flex-col gap-2 mb-3 relative ${className ?? ""}`, children: _jsx("div", { className: "flex flex-col gap-1", children: children }) }));
5
+ }
6
+ //# sourceMappingURL=field-container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-container.js","sourceRoot":"","sources":["../../../../../packages/ui/src/forms/field-container.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AASb,MAAM,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAuB;IACzE,OAAO,CACL,cAAK,SAAS,EAAE,qCAAqC,SAAS,IAAI,EAAE,EAAE,YACpE,cAAK,SAAS,EAAC,qBAAqB,YAAE,QAAQ,GAAO,GACjD,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import { ApiError } from "../../../utils/src/fetcher";
3
+ interface FormProps extends React.FormHTMLAttributes<HTMLFormElement> {
4
+ erreurs?: ApiError | null;
5
+ onErrorClose?: () => void;
6
+ }
7
+ declare const Form: React.FC<FormProps>;
8
+ export { Form };
9
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/forms/form.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAGtD,UAAU,SAAU,SAAQ,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC;IACnE,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,QAAA,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CA+F7B,CAAC;AAEF,OAAO,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState, useEffect, useRef, useCallback } from "react";
4
+ import { X } from "lucide-react";
5
+ const Form = ({ erreurs, onErrorClose, children, className, ...props }) => {
6
+ const formClassName = ["flex flex-col gap-3", className]
7
+ .filter(Boolean)
8
+ .join(" ");
9
+ const errorMessage = erreurs?.message || null;
10
+ const [showError, setShowError] = useState(!!erreurs);
11
+ const [countdown, setCountdown] = useState(erreurs ? 10 : 0);
12
+ const [animating, setAnimating] = useState(!!erreurs);
13
+ const intervalRef = useRef(null);
14
+ const hasClosedRef = useRef(false);
15
+ const closeError = useCallback((triggerCallback = true) => {
16
+ if (intervalRef.current !== null) {
17
+ window.clearInterval(intervalRef.current);
18
+ intervalRef.current = null;
19
+ }
20
+ setShowError(false);
21
+ setAnimating(false);
22
+ setCountdown(0);
23
+ if (triggerCallback && onErrorClose && !hasClosedRef.current) {
24
+ hasClosedRef.current = true;
25
+ onErrorClose();
26
+ }
27
+ }, [onErrorClose]);
28
+ useEffect(() => {
29
+ hasClosedRef.current = false;
30
+ if (!erreurs) {
31
+ const closeTimeout = window.setTimeout(() => closeError(false), 0);
32
+ return () => {
33
+ window.clearTimeout(closeTimeout);
34
+ };
35
+ }
36
+ const initTimeout = window.setTimeout(() => {
37
+ setShowError(true);
38
+ setAnimating(true);
39
+ setCountdown(10);
40
+ }, 0);
41
+ intervalRef.current = window.setInterval(() => {
42
+ setCountdown((prev) => {
43
+ if (prev <= 1) {
44
+ closeError(true);
45
+ return 0;
46
+ }
47
+ return prev - 1;
48
+ });
49
+ }, 1000);
50
+ return () => {
51
+ window.clearTimeout(initTimeout);
52
+ if (intervalRef.current !== null) {
53
+ window.clearInterval(intervalRef.current);
54
+ intervalRef.current = null;
55
+ }
56
+ };
57
+ }, [erreurs, closeError]);
58
+ return (_jsxs(_Fragment, { children: [_jsx("form", { className: formClassName, ...props, children: children }), showError && errorMessage && (_jsxs("div", { className: `fixed top-0 left-0 right-0 z-[9999] bg-red-500 text-white p-4 rounded-b-md shadow-lg flex justify-between items-center transition-transform duration-300 ${animating
59
+ ? "transform translate-y-0"
60
+ : "transform -translate-y-full"}`, children: [_jsx("span", { children: errorMessage }), _jsxs("div", { className: "flex items-center", children: [_jsxs("span", { className: "mr-2", children: [countdown, "s"] }), _jsx("button", { onClick: () => closeError(true), children: _jsx(X, { size: 20 }) })] })] }))] }));
61
+ };
62
+ export { Form };
63
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../../../../packages/ui/src/forms/form.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const Input: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & React.RefAttributes<HTMLInputElement>>;
3
+ export { Input };
4
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/forms/input.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,KAAK,sHA4BT,CAAC;AAIH,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React, { useState } from "react";
4
+ import { Eye, EyeOff } from "lucide-react";
5
+ const Input = React.forwardRef(({ type, className, ...props }, ref) => {
6
+ const [showPassword, setShowPassword] = useState(false);
7
+ const isPassword = type === "password";
8
+ const inputType = isPassword ? (showPassword ? "text" : "password") : type;
9
+ return (_jsxs("div", { className: "relative", children: [_jsx("input", { ref: ref, type: inputType, className: `w-full px-3 py-2 pr-10 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-gray-500 focus:border-transparent transition duration-200 ${className || ""}`, ...props }), isPassword && (_jsx("button", { type: "button", onClick: () => setShowPassword(!showPassword), className: "absolute inset-y-0 right-0 pr-3 flex items-center text-gray-500 hover:text-gray-700", children: showPassword ? _jsx(EyeOff, { size: 20 }) : _jsx(Eye, { size: 20 }) }))] }));
10
+ });
11
+ Input.displayName = "Input";
12
+ export { Input };
13
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../../../../packages/ui/src/forms/input.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAG5B,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACvC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD,MAAM,UAAU,GAAG,IAAI,KAAK,UAAU,CAAC;IACvC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3E,OAAO,CACL,eAAK,SAAS,EAAC,UAAU,aACvB,gBACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,iKAAiK,SAAS,IAAI,EAAE,EAAE,KACzL,KAAK,GACT,EACD,UAAU,IAAI,CACb,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,EAC7C,SAAS,EAAC,qFAAqF,YAE9F,YAAY,CAAC,CAAC,CAAC,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,IAAI,EAAE,EAAE,GAAI,GACjD,CACV,IACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;AAE5B,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ interface LabelProps extends Omit<React.LabelHTMLAttributes<HTMLLabelElement>, "required"> {
3
+ required?: boolean;
4
+ }
5
+ declare const Label: React.ForwardRefExoticComponent<LabelProps & React.RefAttributes<HTMLLabelElement>>;
6
+ export { Label };
7
+ //# sourceMappingURL=label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/forms/label.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,UAAW,SAAQ,IAAI,CAC/B,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAC3C,UAAU,CACX;IACC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,KAAK,qFAaV,CAAC;AAIF,OAAO,EAAE,KAAK,EAAE,CAAC"}