@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,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|