@nocios/crudify-ui 4.4.26 → 4.4.30
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/{CrudiaAutoGenerate-BMWqk_Nx.d.ts → CrudiaFileField-CXyBfgOd.d.ts} +98 -1
- package/dist/{CrudiaAutoGenerate-CORiNekq.d.mts → CrudiaFileField-D5zDp_Y1.d.mts} +98 -1
- package/dist/chunk-IZD5WNI4.mjs +1 -0
- package/dist/{chunk-ZWSHZHIH.js → chunk-M2BIAQ3V.js} +1 -1
- package/dist/chunk-MMFYNCPI.js +1 -0
- package/dist/{chunk-6PXLM74L.mjs → chunk-P4SZ3U4U.mjs} +1 -1
- package/dist/chunk-PSZ2DSVH.js +1 -0
- package/dist/chunk-ZSP7TBON.mjs +1 -0
- package/dist/components.d.mts +1 -1
- package/dist/components.d.ts +1 -1
- package/dist/components.js +1 -1
- package/dist/components.mjs +1 -1
- package/dist/hooks.d.mts +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +1 -1
- package/dist/hooks.mjs +1 -1
- package/dist/{index-BbvxA2Se.d.ts → index-BicpdTC_.d.ts} +147 -1
- package/dist/{index-Bjn8TCuc.d.mts → index-wi46iw-x.d.mts} +147 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +2 -2
- package/dist/chunk-35AID65H.mjs +0 -1
- package/dist/chunk-OLTLD4XB.js +0 -1
- package/dist/chunk-TZKAMU3P.mjs +0 -1
- package/dist/chunk-WUOGD7AZ.js +0 -1
package/dist/components.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkPSZ2DSVHjs = require('./chunk-PSZ2DSVH.js');var _chunkMMFYNCPIjs = require('./chunk-MMFYNCPI.js');require('./chunk-YIIUEOXC.js');require('./chunk-FC7HOMNQ.js');var _react = require('react');var _jsxruntime = require('react/jsx-runtime');function B({showBelowMinutes:f=5,position:c="bottom-right",colorNormal:m="#ed6c02",colorCritical:x="#d32f2f",style:u,className:g}={}){let{isAuthenticated:o,tokens:t}=_chunkMMFYNCPIjs.f.call(void 0, ),[i,y]=_react.useState.call(void 0, 0),[h,S]=_react.useState.call(void 0, 100);if(_react.useEffect.call(void 0, ()=>{if(!o||!t)return;let v=setInterval(()=>{let P=Date.now(),p=t.expiresAt-P,w=900*1e3;y(Math.max(0,p)),S(Math.max(0,p/w*100))},1e3);return()=>clearInterval(v)},[o,t]),!o||i<=0)return null;let e=Math.floor(i/6e4),b=Math.floor(i%6e4/1e3);if(e>=f)return null;let s=e<2,a=s?x:m,C={"top-left":{top:"16px",left:"16px"},"top-right":{top:"16px",right:"16px"},"bottom-left":{bottom:"16px",left:"16px"},"bottom-right":{bottom:"16px",right:"16px"}}[c];return _jsxruntime.jsxs.call(void 0, "div",{className:g,style:{position:"fixed",...C,padding:"12px 16px",backgroundColor:"white",borderRadius:"8px",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",minWidth:"200px",zIndex:9999,fontFamily:"system-ui, -apple-system, sans-serif",...u},children:[_jsxruntime.jsxs.call(void 0, "div",{style:{marginBottom:"8px"},children:[_jsxruntime.jsx.call(void 0, "div",{style:{fontSize:"12px",fontWeight:600,color:a,marginBottom:"4px"},children:s?"\u26A0\uFE0F Sesi\xF3n expirando":"\u23F0 Sesi\xF3n por expirar"}),_jsxruntime.jsxs.call(void 0, "div",{style:{fontSize:"14px",color:"#333",fontWeight:500},children:[e,":",b.toString().padStart(2,"0")]})]}),_jsxruntime.jsx.call(void 0, "div",{style:{width:"100%",height:"6px",backgroundColor:"#e0e0e0",borderRadius:"3px",overflow:"hidden"},children:_jsxruntime.jsx.call(void 0, "div",{style:{width:`${h}%`,height:"100%",backgroundColor:a,transition:"width 1s linear"}})})]})}exports.CrudiaAutoGenerate = _chunkPSZ2DSVHjs.o; exports.CrudiaFileField = _chunkPSZ2DSVHjs.p; exports.CrudifyLogin = _chunkPSZ2DSVHjs.h; exports.GlobalNotificationProvider = _chunkMMFYNCPIjs.g; exports.LoginComponent = _chunkPSZ2DSVHjs.m; exports.Policies = _chunkPSZ2DSVHjs.l; exports.SessionStatus = _chunkPSZ2DSVHjs.n; exports.SessionTimeIndicator = B; exports.UserProfileDisplay = _chunkPSZ2DSVHjs.i; exports.useGlobalNotification = _chunkMMFYNCPIjs.h;
|
package/dist/components.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as T,i as
|
|
1
|
+
import{h as T,i as F,l as G,m as L,n as A,o as M,p as R}from"./chunk-IZD5WNI4.mjs";import{f as l,g as I,h as N}from"./chunk-ZSP7TBON.mjs";import"./chunk-BJ6PIVZR.mjs";import"./chunk-6GPSBDW6.mjs";import{useEffect as k,useState as d}from"react";import{jsx as r,jsxs as n}from"react/jsx-runtime";function B({showBelowMinutes:f=5,position:c="bottom-right",colorNormal:m="#ed6c02",colorCritical:x="#d32f2f",style:u,className:g}={}){let{isAuthenticated:o,tokens:t}=l(),[i,y]=d(0),[h,S]=d(100);if(k(()=>{if(!o||!t)return;let v=setInterval(()=>{let P=Date.now(),p=t.expiresAt-P,w=900*1e3;y(Math.max(0,p)),S(Math.max(0,p/w*100))},1e3);return()=>clearInterval(v)},[o,t]),!o||i<=0)return null;let e=Math.floor(i/6e4),b=Math.floor(i%6e4/1e3);if(e>=f)return null;let s=e<2,a=s?x:m,C={"top-left":{top:"16px",left:"16px"},"top-right":{top:"16px",right:"16px"},"bottom-left":{bottom:"16px",left:"16px"},"bottom-right":{bottom:"16px",right:"16px"}}[c];return n("div",{className:g,style:{position:"fixed",...C,padding:"12px 16px",backgroundColor:"white",borderRadius:"8px",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",minWidth:"200px",zIndex:9999,fontFamily:"system-ui, -apple-system, sans-serif",...u},children:[n("div",{style:{marginBottom:"8px"},children:[r("div",{style:{fontSize:"12px",fontWeight:600,color:a,marginBottom:"4px"},children:s?"\u26A0\uFE0F Sesi\xF3n expirando":"\u23F0 Sesi\xF3n por expirar"}),n("div",{style:{fontSize:"14px",color:"#333",fontWeight:500},children:[e,":",b.toString().padStart(2,"0")]})]}),r("div",{style:{width:"100%",height:"6px",backgroundColor:"#e0e0e0",borderRadius:"3px",overflow:"hidden"},children:r("div",{style:{width:`${h}%`,height:"100%",backgroundColor:a,transition:"width 1s linear"}})})]})}export{M as CrudiaAutoGenerate,R as CrudiaFileField,T as CrudifyLogin,I as GlobalNotificationProvider,L as LoginComponent,G as Policies,A as SessionStatus,B as SessionTimeIndicator,F as UserProfileDisplay,N as useGlobalNotification};
|
package/dist/hooks.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { d as SessionState, j as UseAuthReturn, l as UseDataReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth,
|
|
1
|
+
export { F as FileItem, q as FileStatus, d as SessionState, j as UseAuthReturn, l as UseDataReturn, o as UseFileUploadOptions, p as UseFileUploadReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, r as useCrudifyWithNotifications, k as useData, n as useFileUpload, u as useSession, e as useUserData, m as useUserProfile } from './index-wi46iw-x.mjs';
|
|
2
2
|
export { A as AutoGenerateConfig, d as UseAutoGenerateOptions, U as UseAutoGenerateReturn, c as useAutoGenerate } from './GlobalNotificationProvider-Zq18OkpI.mjs';
|
|
3
3
|
import './api-Djqihi4n.mjs';
|
|
4
4
|
import '@nocios/crudify-browser';
|
package/dist/hooks.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { d as SessionState, j as UseAuthReturn, l as UseDataReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth,
|
|
1
|
+
export { F as FileItem, q as FileStatus, d as SessionState, j as UseAuthReturn, l as UseDataReturn, o as UseFileUploadOptions, p as UseFileUploadReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, r as useCrudifyWithNotifications, k as useData, n as useFileUpload, u as useSession, e as useUserData, m as useUserProfile } from './index-BicpdTC_.js';
|
|
2
2
|
export { A as AutoGenerateConfig, d as UseAutoGenerateOptions, U as UseAutoGenerateReturn, c as useAutoGenerate } from './GlobalNotificationProvider-Zq18OkpI.js';
|
|
3
3
|
import './api-Djqihi4n.js';
|
|
4
4
|
import '@nocios/crudify-browser';
|
package/dist/hooks.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkM2BIAQ3Vjs = require('./chunk-M2BIAQ3V.js');var _chunkMMFYNCPIjs = require('./chunk-MMFYNCPI.js');require('./chunk-FC7HOMNQ.js');exports.useAuth = _chunkM2BIAQ3Vjs.b; exports.useAutoGenerate = _chunkMMFYNCPIjs.m; exports.useCrudifyWithNotifications = _chunkM2BIAQ3Vjs.d; exports.useData = _chunkM2BIAQ3Vjs.c; exports.useFileUpload = _chunkMMFYNCPIjs.p; exports.useSession = _chunkMMFYNCPIjs.f; exports.useUserData = _chunkM2BIAQ3Vjs.a; exports.useUserProfile = _chunkMMFYNCPIjs.l;
|
package/dist/hooks.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{a as s,b as u,c as a,d as p}from"./chunk-P4SZ3U4U.mjs";import{f as e,l as t,m as o,p as r}from"./chunk-ZSP7TBON.mjs";import"./chunk-6GPSBDW6.mjs";export{u as useAuth,o as useAutoGenerate,p as useCrudifyWithNotifications,a as useData,r as useFileUpload,e as useSession,s as useUserData,t as useUserProfile};
|
|
@@ -462,6 +462,152 @@ interface UseUserProfileReturn {
|
|
|
462
462
|
}
|
|
463
463
|
declare const useUserProfile: (options?: UseUserProfileOptions) => UseUserProfileReturn;
|
|
464
464
|
|
|
465
|
+
/**
|
|
466
|
+
* Estado de un archivo individual
|
|
467
|
+
*/
|
|
468
|
+
type FileStatus = "pending" | "uploading" | "completed" | "error" | "removing";
|
|
469
|
+
/**
|
|
470
|
+
* Representa un archivo en el sistema
|
|
471
|
+
*/
|
|
472
|
+
interface FileItem {
|
|
473
|
+
/** ID único del archivo (generado o desde servidor) */
|
|
474
|
+
id: string;
|
|
475
|
+
/** Nombre original del archivo */
|
|
476
|
+
name: string;
|
|
477
|
+
/** Tamaño en bytes */
|
|
478
|
+
size: number;
|
|
479
|
+
/** Content type MIME */
|
|
480
|
+
contentType: string;
|
|
481
|
+
/** Estado actual del archivo */
|
|
482
|
+
status: FileStatus;
|
|
483
|
+
/** Progreso de upload (0-100) */
|
|
484
|
+
progress: number;
|
|
485
|
+
/**
|
|
486
|
+
* Ruta relativa del archivo (incluye visibility)
|
|
487
|
+
* Formato: "public/path/file.ext" o "private/path/file.ext"
|
|
488
|
+
*/
|
|
489
|
+
filePath?: string;
|
|
490
|
+
/**
|
|
491
|
+
* Visibilidad del archivo
|
|
492
|
+
* Extraída del filePath para conveniencia
|
|
493
|
+
*/
|
|
494
|
+
visibility?: "public" | "private";
|
|
495
|
+
/** URL pública para archivos públicos */
|
|
496
|
+
publicUrl?: string;
|
|
497
|
+
/** URL de preview (para imágenes) */
|
|
498
|
+
previewUrl?: string;
|
|
499
|
+
/** Mensaje de error si falló */
|
|
500
|
+
errorMessage?: string;
|
|
501
|
+
/** Timestamp de creación */
|
|
502
|
+
createdAt: number;
|
|
503
|
+
/** Archivo original (solo durante upload) */
|
|
504
|
+
file?: File;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Configuración del hook
|
|
508
|
+
*/
|
|
509
|
+
interface UseFileUploadOptions {
|
|
510
|
+
/** Tipos MIME permitidos (ej: ["image/png", "image/jpeg", "application/pdf"]) */
|
|
511
|
+
acceptedTypes?: string[];
|
|
512
|
+
/** Tamaño máximo por archivo en bytes (default: 10MB) */
|
|
513
|
+
maxFileSize?: number;
|
|
514
|
+
/** Número máximo de archivos (undefined = sin límite) */
|
|
515
|
+
maxFiles?: number;
|
|
516
|
+
/** Número mínimo de archivos requeridos (default: 0) */
|
|
517
|
+
minFiles?: number;
|
|
518
|
+
/**
|
|
519
|
+
* Visibilidad de los archivos subidos
|
|
520
|
+
* @default "private"
|
|
521
|
+
*/
|
|
522
|
+
visibility?: "public" | "private";
|
|
523
|
+
/** Callback cuando se completa un upload exitoso */
|
|
524
|
+
onUploadComplete?: (file: FileItem) => void;
|
|
525
|
+
/** Callback cuando falla un upload */
|
|
526
|
+
onUploadError?: (file: FileItem, error: string) => void;
|
|
527
|
+
/** Callback cuando se elimina un archivo */
|
|
528
|
+
onFileRemoved?: (file: FileItem) => void;
|
|
529
|
+
/** Callback cuando cambia la lista de archivos */
|
|
530
|
+
onFilesChange?: (files: FileItem[]) => void;
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Resultado del hook
|
|
534
|
+
*/
|
|
535
|
+
interface UseFileUploadReturn {
|
|
536
|
+
/** Lista de archivos actuales */
|
|
537
|
+
files: FileItem[];
|
|
538
|
+
/** Si hay uploads en progreso */
|
|
539
|
+
isUploading: boolean;
|
|
540
|
+
/** Número de uploads pendientes */
|
|
541
|
+
pendingCount: number;
|
|
542
|
+
/** Agregar archivos (dispara upload automático) */
|
|
543
|
+
addFiles: (files: FileList | File[]) => Promise<void>;
|
|
544
|
+
/** Eliminar un archivo (soft delete en S3) */
|
|
545
|
+
removeFile: (fileId: string) => Promise<boolean>;
|
|
546
|
+
/** Limpiar todos los archivos */
|
|
547
|
+
clearFiles: () => void;
|
|
548
|
+
/** Reintentar upload de un archivo fallido */
|
|
549
|
+
retryUpload: (fileId: string) => Promise<void>;
|
|
550
|
+
/** Validar si cumple requisitos mínimos */
|
|
551
|
+
isValid: boolean;
|
|
552
|
+
/** Mensaje de error de validación */
|
|
553
|
+
validationError: string | null;
|
|
554
|
+
/** Esperar a que todos los uploads terminen */
|
|
555
|
+
waitForUploads: () => Promise<void>;
|
|
556
|
+
/**
|
|
557
|
+
* Rutas de archivos completados (para guardar en formulario)
|
|
558
|
+
* Son rutas relativas con visibility - el subscriberKey se agrega en backend
|
|
559
|
+
*/
|
|
560
|
+
completedFilePaths: string[];
|
|
561
|
+
/** Inicializar con archivos existentes (para edición) */
|
|
562
|
+
initializeFiles: (existingFiles: Array<{
|
|
563
|
+
filePath: string;
|
|
564
|
+
name: string;
|
|
565
|
+
size?: number;
|
|
566
|
+
contentType?: string;
|
|
567
|
+
}>) => void;
|
|
568
|
+
/** Si el usuario ha interactuado con el campo */
|
|
569
|
+
isTouched: boolean;
|
|
570
|
+
/** Marcar el campo como tocado (para mostrar errores de validación) */
|
|
571
|
+
markAsTouched: () => void;
|
|
572
|
+
/**
|
|
573
|
+
* Obtener URL para preview de archivo
|
|
574
|
+
* - Públicos: retorna publicUrl directamente
|
|
575
|
+
* - Privados: solicita signed URL al backend
|
|
576
|
+
*/
|
|
577
|
+
getPreviewUrl: (fileId: string) => Promise<string | null>;
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Hook para manejo completo de archivos con upload a S3
|
|
581
|
+
*
|
|
582
|
+
* @example
|
|
583
|
+
* ```tsx
|
|
584
|
+
* const {
|
|
585
|
+
* files,
|
|
586
|
+
* addFiles,
|
|
587
|
+
* removeFile,
|
|
588
|
+
* isUploading,
|
|
589
|
+
* isValid,
|
|
590
|
+
* completedS3Keys
|
|
591
|
+
* } = useFileUpload({
|
|
592
|
+
* acceptedTypes: ["image/png", "image/jpeg", "application/pdf"],
|
|
593
|
+
* maxFileSize: 5 * 1024 * 1024, // 5MB
|
|
594
|
+
* maxFiles: 3,
|
|
595
|
+
* minFiles: 1
|
|
596
|
+
* });
|
|
597
|
+
*
|
|
598
|
+
* // En el submit del formulario
|
|
599
|
+
* const handleSubmit = async () => {
|
|
600
|
+
* await waitForUploads(); // Esperar uploads pendientes
|
|
601
|
+
* if (!isValid) return;
|
|
602
|
+
*
|
|
603
|
+
* await crudify.createItem("documents", {
|
|
604
|
+
* files: completedS3Keys
|
|
605
|
+
* });
|
|
606
|
+
* };
|
|
607
|
+
* ```
|
|
608
|
+
*/
|
|
609
|
+
declare const useFileUpload: (options?: UseFileUploadOptions) => UseFileUploadReturn;
|
|
610
|
+
|
|
465
611
|
interface CrudifyWithNotificationsOptions {
|
|
466
612
|
showSuccessNotifications?: boolean;
|
|
467
613
|
showErrorNotifications?: boolean;
|
|
@@ -484,4 +630,4 @@ declare const useCrudifyWithNotifications: (options?: CrudifyWithNotificationsOp
|
|
|
484
630
|
shouldShowNotification: (response: CrudifyResponse) => boolean;
|
|
485
631
|
};
|
|
486
632
|
|
|
487
|
-
export { type LoginResult as L, SessionManager as S, type TokenData as T, type UseSessionOptions as U, type SessionConfig as a, TokenStorage as b, type StorageType as c, type SessionState as d, useUserData as e, type UseUserDataReturn as f, type UseUserDataOptions as g, type UserData as h, useAuth as i, type UseAuthReturn as j, useData as k, type UseDataReturn as l, useUserProfile as m,
|
|
633
|
+
export { type FileItem as F, type LoginResult as L, SessionManager as S, type TokenData as T, type UseSessionOptions as U, type SessionConfig as a, TokenStorage as b, type StorageType as c, type SessionState as d, useUserData as e, type UseUserDataReturn as f, type UseUserDataOptions as g, type UserData as h, useAuth as i, type UseAuthReturn as j, useData as k, type UseDataReturn as l, useUserProfile as m, useFileUpload as n, type UseFileUploadOptions as o, type UseFileUploadReturn as p, type FileStatus as q, useCrudifyWithNotifications as r, useSession as u };
|
|
@@ -462,6 +462,152 @@ interface UseUserProfileReturn {
|
|
|
462
462
|
}
|
|
463
463
|
declare const useUserProfile: (options?: UseUserProfileOptions) => UseUserProfileReturn;
|
|
464
464
|
|
|
465
|
+
/**
|
|
466
|
+
* Estado de un archivo individual
|
|
467
|
+
*/
|
|
468
|
+
type FileStatus = "pending" | "uploading" | "completed" | "error" | "removing";
|
|
469
|
+
/**
|
|
470
|
+
* Representa un archivo en el sistema
|
|
471
|
+
*/
|
|
472
|
+
interface FileItem {
|
|
473
|
+
/** ID único del archivo (generado o desde servidor) */
|
|
474
|
+
id: string;
|
|
475
|
+
/** Nombre original del archivo */
|
|
476
|
+
name: string;
|
|
477
|
+
/** Tamaño en bytes */
|
|
478
|
+
size: number;
|
|
479
|
+
/** Content type MIME */
|
|
480
|
+
contentType: string;
|
|
481
|
+
/** Estado actual del archivo */
|
|
482
|
+
status: FileStatus;
|
|
483
|
+
/** Progreso de upload (0-100) */
|
|
484
|
+
progress: number;
|
|
485
|
+
/**
|
|
486
|
+
* Ruta relativa del archivo (incluye visibility)
|
|
487
|
+
* Formato: "public/path/file.ext" o "private/path/file.ext"
|
|
488
|
+
*/
|
|
489
|
+
filePath?: string;
|
|
490
|
+
/**
|
|
491
|
+
* Visibilidad del archivo
|
|
492
|
+
* Extraída del filePath para conveniencia
|
|
493
|
+
*/
|
|
494
|
+
visibility?: "public" | "private";
|
|
495
|
+
/** URL pública para archivos públicos */
|
|
496
|
+
publicUrl?: string;
|
|
497
|
+
/** URL de preview (para imágenes) */
|
|
498
|
+
previewUrl?: string;
|
|
499
|
+
/** Mensaje de error si falló */
|
|
500
|
+
errorMessage?: string;
|
|
501
|
+
/** Timestamp de creación */
|
|
502
|
+
createdAt: number;
|
|
503
|
+
/** Archivo original (solo durante upload) */
|
|
504
|
+
file?: File;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Configuración del hook
|
|
508
|
+
*/
|
|
509
|
+
interface UseFileUploadOptions {
|
|
510
|
+
/** Tipos MIME permitidos (ej: ["image/png", "image/jpeg", "application/pdf"]) */
|
|
511
|
+
acceptedTypes?: string[];
|
|
512
|
+
/** Tamaño máximo por archivo en bytes (default: 10MB) */
|
|
513
|
+
maxFileSize?: number;
|
|
514
|
+
/** Número máximo de archivos (undefined = sin límite) */
|
|
515
|
+
maxFiles?: number;
|
|
516
|
+
/** Número mínimo de archivos requeridos (default: 0) */
|
|
517
|
+
minFiles?: number;
|
|
518
|
+
/**
|
|
519
|
+
* Visibilidad de los archivos subidos
|
|
520
|
+
* @default "private"
|
|
521
|
+
*/
|
|
522
|
+
visibility?: "public" | "private";
|
|
523
|
+
/** Callback cuando se completa un upload exitoso */
|
|
524
|
+
onUploadComplete?: (file: FileItem) => void;
|
|
525
|
+
/** Callback cuando falla un upload */
|
|
526
|
+
onUploadError?: (file: FileItem, error: string) => void;
|
|
527
|
+
/** Callback cuando se elimina un archivo */
|
|
528
|
+
onFileRemoved?: (file: FileItem) => void;
|
|
529
|
+
/** Callback cuando cambia la lista de archivos */
|
|
530
|
+
onFilesChange?: (files: FileItem[]) => void;
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Resultado del hook
|
|
534
|
+
*/
|
|
535
|
+
interface UseFileUploadReturn {
|
|
536
|
+
/** Lista de archivos actuales */
|
|
537
|
+
files: FileItem[];
|
|
538
|
+
/** Si hay uploads en progreso */
|
|
539
|
+
isUploading: boolean;
|
|
540
|
+
/** Número de uploads pendientes */
|
|
541
|
+
pendingCount: number;
|
|
542
|
+
/** Agregar archivos (dispara upload automático) */
|
|
543
|
+
addFiles: (files: FileList | File[]) => Promise<void>;
|
|
544
|
+
/** Eliminar un archivo (soft delete en S3) */
|
|
545
|
+
removeFile: (fileId: string) => Promise<boolean>;
|
|
546
|
+
/** Limpiar todos los archivos */
|
|
547
|
+
clearFiles: () => void;
|
|
548
|
+
/** Reintentar upload de un archivo fallido */
|
|
549
|
+
retryUpload: (fileId: string) => Promise<void>;
|
|
550
|
+
/** Validar si cumple requisitos mínimos */
|
|
551
|
+
isValid: boolean;
|
|
552
|
+
/** Mensaje de error de validación */
|
|
553
|
+
validationError: string | null;
|
|
554
|
+
/** Esperar a que todos los uploads terminen */
|
|
555
|
+
waitForUploads: () => Promise<void>;
|
|
556
|
+
/**
|
|
557
|
+
* Rutas de archivos completados (para guardar en formulario)
|
|
558
|
+
* Son rutas relativas con visibility - el subscriberKey se agrega en backend
|
|
559
|
+
*/
|
|
560
|
+
completedFilePaths: string[];
|
|
561
|
+
/** Inicializar con archivos existentes (para edición) */
|
|
562
|
+
initializeFiles: (existingFiles: Array<{
|
|
563
|
+
filePath: string;
|
|
564
|
+
name: string;
|
|
565
|
+
size?: number;
|
|
566
|
+
contentType?: string;
|
|
567
|
+
}>) => void;
|
|
568
|
+
/** Si el usuario ha interactuado con el campo */
|
|
569
|
+
isTouched: boolean;
|
|
570
|
+
/** Marcar el campo como tocado (para mostrar errores de validación) */
|
|
571
|
+
markAsTouched: () => void;
|
|
572
|
+
/**
|
|
573
|
+
* Obtener URL para preview de archivo
|
|
574
|
+
* - Públicos: retorna publicUrl directamente
|
|
575
|
+
* - Privados: solicita signed URL al backend
|
|
576
|
+
*/
|
|
577
|
+
getPreviewUrl: (fileId: string) => Promise<string | null>;
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Hook para manejo completo de archivos con upload a S3
|
|
581
|
+
*
|
|
582
|
+
* @example
|
|
583
|
+
* ```tsx
|
|
584
|
+
* const {
|
|
585
|
+
* files,
|
|
586
|
+
* addFiles,
|
|
587
|
+
* removeFile,
|
|
588
|
+
* isUploading,
|
|
589
|
+
* isValid,
|
|
590
|
+
* completedS3Keys
|
|
591
|
+
* } = useFileUpload({
|
|
592
|
+
* acceptedTypes: ["image/png", "image/jpeg", "application/pdf"],
|
|
593
|
+
* maxFileSize: 5 * 1024 * 1024, // 5MB
|
|
594
|
+
* maxFiles: 3,
|
|
595
|
+
* minFiles: 1
|
|
596
|
+
* });
|
|
597
|
+
*
|
|
598
|
+
* // En el submit del formulario
|
|
599
|
+
* const handleSubmit = async () => {
|
|
600
|
+
* await waitForUploads(); // Esperar uploads pendientes
|
|
601
|
+
* if (!isValid) return;
|
|
602
|
+
*
|
|
603
|
+
* await crudify.createItem("documents", {
|
|
604
|
+
* files: completedS3Keys
|
|
605
|
+
* });
|
|
606
|
+
* };
|
|
607
|
+
* ```
|
|
608
|
+
*/
|
|
609
|
+
declare const useFileUpload: (options?: UseFileUploadOptions) => UseFileUploadReturn;
|
|
610
|
+
|
|
465
611
|
interface CrudifyWithNotificationsOptions {
|
|
466
612
|
showSuccessNotifications?: boolean;
|
|
467
613
|
showErrorNotifications?: boolean;
|
|
@@ -484,4 +630,4 @@ declare const useCrudifyWithNotifications: (options?: CrudifyWithNotificationsOp
|
|
|
484
630
|
shouldShowNotification: (response: CrudifyResponse) => boolean;
|
|
485
631
|
};
|
|
486
632
|
|
|
487
|
-
export { type LoginResult as L, SessionManager as S, type TokenData as T, type UseSessionOptions as U, type SessionConfig as a, TokenStorage as b, type StorageType as c, type SessionState as d, useUserData as e, type UseUserDataReturn as f, type UseUserDataOptions as g, type UserData as h, useAuth as i, type UseAuthReturn as j, useData as k, type UseDataReturn as l, useUserProfile as m,
|
|
633
|
+
export { type FileItem as F, type LoginResult as L, SessionManager as S, type TokenData as T, type UseSessionOptions as U, type SessionConfig as a, TokenStorage as b, type StorageType as c, type SessionState as d, useUserData as e, type UseUserDataReturn as f, type UseUserDataOptions as g, type UserData as h, useAuth as i, type UseAuthReturn as j, useData as k, type UseDataReturn as l, useUserProfile as m, useFileUpload as n, type UseFileUploadOptions as o, type UseFileUploadReturn as p, type FileStatus as q, useCrudifyWithNotifications as r, useSession as u };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import crudify__default from '@nocios/crudify-browser';
|
|
2
2
|
export * from '@nocios/crudify-browser';
|
|
3
3
|
export { default as crudify } from '@nocios/crudify-browser';
|
|
4
|
-
import {
|
|
5
|
-
export { B as BoxScreenType, a as CrudiaAutoGenerate,
|
|
4
|
+
import { c as CrudifyLoginConfig } from './CrudiaFileField-D5zDp_Y1.mjs';
|
|
5
|
+
export { B as BoxScreenType, a as CrudiaAutoGenerate, h as CrudiaAutoGenerateProps, b as CrudiaFileField, i as CrudiaFileFieldProps, C as CrudifyLogin, d as CrudifyLoginProps, e as CrudifyLoginTranslations, L as LoginComponent, j as POLICY_ACTIONS, k as PREFERRED_POLICY_ORDER, P as Policies, g as PolicyAction, S as SessionStatus, f as UserLoginData, U as UserProfileDisplay } from './CrudiaFileField-D5zDp_Y1.mjs';
|
|
6
6
|
import React, { ReactNode } from 'react';
|
|
7
7
|
export { A as ApiError, C as CrudifyApiResponse, a as CrudifyTransactionResponse, F as ForgotPasswordRequest, J as JwtPayload, b as LoginRequest, L as LoginResponse, R as ResetPasswordRequest, T as TransactionResponseData, U as UserProfile, V as ValidateCodeRequest, c as ValidationError } from './api-Djqihi4n.mjs';
|
|
8
|
-
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-
|
|
9
|
-
export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth,
|
|
8
|
+
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-wi46iw-x.mjs';
|
|
9
|
+
export { F as FileItem, q as FileStatus, a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, o as UseFileUploadOptions, p as UseFileUploadReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, r as useCrudifyWithNotifications, k as useData, n as useFileUpload, u as useSession, e as useUserData, m as useUserProfile } from './index-wi46iw-x.mjs';
|
|
10
10
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
11
11
|
import { ThemeOptions } from '@mui/material';
|
|
12
12
|
export { A as AutoGenerateConfig, G as GlobalNotificationProvider, a as GlobalNotificationProviderProps, N as Notification, b as NotificationSeverity, d as UseAutoGenerateOptions, U as UseAutoGenerateReturn, c as useAutoGenerate, u as useGlobalNotification } from './GlobalNotificationProvider-Zq18OkpI.mjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import crudify__default from '@nocios/crudify-browser';
|
|
2
2
|
export * from '@nocios/crudify-browser';
|
|
3
3
|
export { default as crudify } from '@nocios/crudify-browser';
|
|
4
|
-
import {
|
|
5
|
-
export { B as BoxScreenType, a as CrudiaAutoGenerate,
|
|
4
|
+
import { c as CrudifyLoginConfig } from './CrudiaFileField-CXyBfgOd.js';
|
|
5
|
+
export { B as BoxScreenType, a as CrudiaAutoGenerate, h as CrudiaAutoGenerateProps, b as CrudiaFileField, i as CrudiaFileFieldProps, C as CrudifyLogin, d as CrudifyLoginProps, e as CrudifyLoginTranslations, L as LoginComponent, j as POLICY_ACTIONS, k as PREFERRED_POLICY_ORDER, P as Policies, g as PolicyAction, S as SessionStatus, f as UserLoginData, U as UserProfileDisplay } from './CrudiaFileField-CXyBfgOd.js';
|
|
6
6
|
import React, { ReactNode } from 'react';
|
|
7
7
|
export { A as ApiError, C as CrudifyApiResponse, a as CrudifyTransactionResponse, F as ForgotPasswordRequest, J as JwtPayload, b as LoginRequest, L as LoginResponse, R as ResetPasswordRequest, T as TransactionResponseData, U as UserProfile, V as ValidateCodeRequest, c as ValidationError } from './api-Djqihi4n.js';
|
|
8
|
-
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-
|
|
9
|
-
export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth,
|
|
8
|
+
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-BicpdTC_.js';
|
|
9
|
+
export { F as FileItem, q as FileStatus, a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, o as UseFileUploadOptions, p as UseFileUploadReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, r as useCrudifyWithNotifications, k as useData, n as useFileUpload, u as useSession, e as useUserData, m as useUserProfile } from './index-BicpdTC_.js';
|
|
10
10
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
11
11
|
import { ThemeOptions } from '@mui/material';
|
|
12
12
|
export { A as AutoGenerateConfig, G as GlobalNotificationProvider, a as GlobalNotificationProviderProps, N as Notification, b as NotificationSeverity, d as UseAutoGenerateOptions, U as UseAutoGenerateReturn, c as useAutoGenerate, u as useGlobalNotification } from './GlobalNotificationProvider-Zq18OkpI.js';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkPSZ2DSVHjs = require('./chunk-PSZ2DSVH.js');var _chunkM2BIAQ3Vjs = require('./chunk-M2BIAQ3V.js');var _chunkMMFYNCPIjs = require('./chunk-MMFYNCPI.js');var _chunkNNY4A73Vjs = require('./chunk-NNY4A73V.js');var _chunkYIIUEOXCjs = require('./chunk-YIIUEOXC.js');var _chunkFC7HOMNQjs = require('./chunk-FC7HOMNQ.js');var _crudifybrowser = require('@nocios/crudify-browser'); var _crudifybrowser2 = _interopRequireDefault(_crudifybrowser); _createStarExport(_crudifybrowser);var _react = require('react');var _material = require('@mui/material');var _jsxruntime = require('react/jsx-runtime');var De=(e={})=>{try{let r=_chunkFC7HOMNQjs.a.call(void 0, "theme");if(r){let o=JSON.parse(decodeURIComponent(r));return{...e,...o}}}catch(r){console.warn("Error parsing theme from cookie:",r)}return e};function Ge({children:e,defaultTheme:r={},disableCssBaseline:o=!1}){let t=_react.useMemo.call(void 0, ()=>{let s=De(r);return _material.createTheme.call(void 0, s)},[r]);return _jsxruntime.jsxs.call(void 0, _material.ThemeProvider,{theme:t,children:[!o&&_jsxruntime.jsx.call(void 0, _material.CssBaseline,{}),e]})}var _reactrouterdom = require('react-router-dom');var _e={border:"5px solid rgba(0, 0, 0, 0.1)",borderTopColor:"#3B82F6",borderRadius:"50%",width:"50px",height:"50px",animation:"spin 1s linear infinite"},Be=()=>_jsxruntime.jsx.call(void 0, "style",{children:`
|
|
2
2
|
@keyframes spin {
|
|
3
3
|
0% { transform: rotate(0deg); }
|
|
4
4
|
100% { transform: rotate(360deg); }
|
|
5
5
|
}
|
|
6
|
-
`});function v({stage:e="loading",message:i}){let r=i||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, $e,{}),_jsxruntime.jsxs.call(void 0, "div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh",width:"100vw",backgroundColor:"#f0f2f5",fontFamily:'"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',color:"#333",textAlign:"center",boxSizing:"border-box",padding:"20px",background:"#fff"},children:[_jsxruntime.jsx.call(void 0, "div",{style:Fe}),_jsxruntime.jsx.call(void 0, "p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:r})]})]})}var _e=/^[a-zA-Z0-9\-_./\?=&%#]+$/,Ze=[/^https?:\/\//i,/^ftp:\/\//i,/^\/\//,/javascript:/i,/data:/i,/vbscript:/i,/about:/i,/\.\.\//,/\.\.\\/,/%2e%2e%2f/i,/%2e%2e%5c/i,/%2f%2f/i,/%5c%5c/i,/[\x00-\x1f\x7f-\x9f]/,/\\/],P= exports.validateInternalRedirect =(e,i="/")=>{if(!e||typeof e!="string")return i;let t=e.trim();if(!t)return i;if(!t.startsWith("/"))return console.warn("\u{1F6A8} Open redirect blocked (relative path):",e),i;if(!_e.test(t))return console.warn("\u{1F6A8} Open redirect blocked (invalid characters):",e),i;let r=t.toLowerCase();for(let o of Ze)if(o.test(r))return console.warn("\u{1F6A8} Open redirect blocked (dangerous pattern):",e),i;let n=t.split("?")[0].split("/").filter(Boolean);if(n.length===0)return t;for(let o of n)if(o===".."||o.includes(":")||o.length>100)return console.warn("\u{1F6A8} Open redirect blocked (suspicious path part):",o),i;return t},T= exports.extractSafeRedirectFromUrl =(e,i="/")=>{try{let r=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!r)return i;let n=decodeURIComponent(r);return P(n,i)}catch(t){return console.warn("\u{1F6A8} Error parsing redirect parameter:",t),i}};function k({children:e,loadingComponent:i,loginPath:t="/login"}){let{isAuthenticated:r,isLoading:n,isInitialized:o,tokens:s,error:c}=_chunkWUOGD7AZjs.j.call(void 0, ),u=_reactrouterdom.useLocation.call(void 0, );if(!o||n)return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:i||_jsxruntime.jsx.call(void 0, v,{stage:"validating-session"})});let d=r&&_optionalChain([s, 'optionalAccess', _2 => _2.accessToken])&&s.accessToken.length>0;if(c||!r||!d){s&&(!s.accessToken||s.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let m=u.pathname+u.search,I=P(m),h=encodeURIComponent(I);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:`${t}?redirect=${h}`,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}function O({children:e,redirectTo:i="/"}){let{isAuthenticated:t}=_chunkWUOGD7AZjs.j.call(void 0, ),r=_reactrouterdom.useLocation.call(void 0, );if(t){let n=new URLSearchParams(r.search),o=T(n,i);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:o,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}var C=class e{constructor(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null};this.initializationPromise=null;this.highPriorityInitializerPresent=!1;this.waitingForHighPriority=new Set;this.HIGH_PRIORITY_WAIT_TIMEOUT=100}static getInstance(){return e.instance||(e.instance=new e),e.instance}registerHighPriorityInitializer(){this.highPriorityInitializerPresent=!0}isHighPriorityInitializerPresent(){return this.highPriorityInitializerPresent}getState(){return{...this.state}}async initialize(i){let{priority:t,publicApiKey:r,env:n,enableLogging:o,requestedBy:s}=i;if(this.state.status==="INITIALIZED"){this.state.publicApiKey!==r&&console.warn(`[CrudifyInitialization] ${s} attempted to initialize with different key. Already initialized with key: ${_optionalChain([this, 'access', _3 => _3.state, 'access', _4 => _4.publicApiKey, 'optionalAccess', _5 => _5.slice, 'call', _6 => _6(0,10)])}... by ${this.state.initializedBy}`);return}if(this.initializationPromise)return o&&console.log(`[CrudifyInitialization] ${s} waiting for ongoing initialization...`),this.initializationPromise;if(t==="LOW"&&this.highPriorityInitializerPresent&&this.state.status==="UNINITIALIZED"){if(o&&console.log(`[CrudifyInitialization] ${s} (LOW priority) waiting for HIGH priority initializer...`),this.waitingForHighPriority.add(s),await this.waitForHighPriorityOrTimeout(o),this.waitingForHighPriority.delete(s),this.getState().status==="INITIALIZED"){o&&console.log(`[CrudifyInitialization] ${s} found initialization completed by HIGH priority`);return}o&&console.warn(`[CrudifyInitialization] ${s} timeout waiting for HIGH priority, initializing with LOW priority`)}t==="HIGH"&&this.state.status==="INITIALIZING"&&this.state.priority==="LOW"&&(console.warn(`[CrudifyInitialization] HIGH priority request from ${s} interrupting LOW priority initialization by ${this.state.initializedBy}`),this.state.status="UNINITIALIZED",this.initializationPromise=null),o&&console.log(`[CrudifyInitialization] ${s} starting initialization (${t} priority)...`),this.state.status="INITIALIZING",this.state.priority=t,this.state.initializedBy=s,this.initializationPromise=this.performInitialization(r,n,o);try{await this.initializationPromise,this.state.status="INITIALIZED",this.state.publicApiKey=r,this.state.env=n,this.state.error=null,o&&console.log(`[CrudifyInitialization] \u2705 Successfully initialized by ${s} (${t} priority)`)}catch(c){throw this.state.status="ERROR",this.state.error=c instanceof Error?c:new Error(String(c)),this.initializationPromise=null,console.error(`[CrudifyInitialization] \u274C Initialization failed for ${s}:`,c),c}}async waitForHighPriorityOrTimeout(i){return new Promise(t=>{let n=0,o=setInterval(()=>{if(n+=10,this.state.status==="INITIALIZED"&&this.state.priority==="HIGH"){clearInterval(o),t();return}if(this.state.status==="INITIALIZING"&&this.state.priority==="HIGH"){n=0;return}n>=this.HIGH_PRIORITY_WAIT_TIMEOUT&&(clearInterval(o),i&&console.log(`[CrudifyInitialization] Timeout waiting for HIGH priority (${this.HIGH_PRIORITY_WAIT_TIMEOUT}ms)`),t())},10)})}async performInitialization(i,t,r){let n=_crudifybrowser2.default.getTokenData();if(n&&n.endpoint){r&&console.log("[CrudifyInitialization] SDK already initialized externally");return}_crudifybrowser2.default.config(t);let o=r?"debug":"none",s=await _crudifybrowser2.default.init(i,o);if(s.success===!1)throw new Error(`Crudify initialization failed: ${JSON.stringify(s.errors||"Unknown error")}`)}reset(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null},this.initializationPromise=null,this.highPriorityInitializerPresent=!1,this.waitingForHighPriority.clear()}isInitialized(){return this.state.status==="INITIALIZED"}getDiagnostics(){return{...this.state,waitingCount:this.waitingForHighPriority.size,waitingComponents:Array.from(this.waitingForHighPriority),hasActivePromise:this.initializationPromise!==null}}},x= exports.crudifyInitManager =C.getInstance();var G=_react.createContext.call(void 0, void 0),ei= exports.CrudifyInitializer =({config:e,children:i,fallback:t=null,onInitialized:r,onError:n})=>{let[o,s]=_react.useState.call(void 0, !1),[c,u]=_react.useState.call(void 0, !1),[d,m]=_react.useState.call(void 0, null),I=_react.useRef.call(void 0, !1),h=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{I.current||(x.registerHighPriorityInitializer(),I.current=!0),h.current||(h.current=!0,(async()=>{u(!0),m(null);try{let p=_chunkFC7HOMNQjs.b.call(void 0, {publicApiKey:_optionalChain([e, 'optionalAccess', _7 => _7.publicApiKey]),env:_optionalChain([e, 'optionalAccess', _8 => _8.env]),enableDebug:_optionalChain([e, 'optionalAccess', _9 => _9.enableLogging])});if(!p.publicApiKey)throw new Error("Crudify configuration missing. Please provide publicApiKey via props or ensure cookies are set by Lambda.");await x.initialize({priority:"HIGH",publicApiKey:p.publicApiKey,env:p.env||"prod",enableLogging:_optionalChain([e, 'optionalAccess', _10 => _10.enableLogging]),requestedBy:"CrudifyInitializer"}),s(!0),u(!1),r&&r()}catch(p){let E=p instanceof Error?p:new Error(String(p));m(E),u(!1),n&&n(E)}})())},[_optionalChain([e, 'optionalAccess', _11 => _11.publicApiKey]),_optionalChain([e, 'optionalAccess', _12 => _12.env]),_optionalChain([e, 'optionalAccess', _13 => _13.enableLogging]),r,n]);let F={isInitialized:o,isInitializing:c,error:d};return c&&t?_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:t}):(d&&console.error("[CrudifyInitializer] Initialization failed:",d),_jsxruntime.jsx.call(void 0, G.Provider,{value:F,children:i}))},ii= exports.useCrudifyInitializer =()=>{let e=_react.useContext.call(void 0, G);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};var _crudifyadmin = require('@nocios/crudify-admin'); var _crudifyadmin2 = _interopRequireDefault(_crudifyadmin);var K=!1,g=null;async function ri(){let i=_chunkWUOGD7AZjs.e.getInstance().getTokenInfo(),t=_optionalChain([i, 'optionalAccess', _14 => _14.apiEndpointAdmin]),r=_optionalChain([i, 'optionalAccess', _15 => _15.apiKeyEndpointAdmin]);return t&&r?{apiUrl:t,apiKey:r}:_chunkWUOGD7AZjs.a.waitForCredentials()}async function oi(){if(!K)return g||(g=(async()=>{try{let e=_chunkWUOGD7AZjs.e.getInstance(),{apiUrl:i,apiKey:t}=await ri();_crudifyadmin2.default.init({url:i,apiKey:t,getAdditionalHeaders:()=>{let r=e.getTokenInfo();return _optionalChain([r, 'optionalAccess', _16 => _16.crudifyTokens, 'optionalAccess', _17 => _17.accessToken])?{Authorization:`Bearer ${r.crudifyTokens.accessToken}`}:{}}}),K=!0}catch(e){throw g=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),g)}async function l(e){try{await oi();let i=await e();return!i.success&&_optionalChain([i, 'access', _18 => _18.errors, 'optionalAccess', _19 => _19.includes, 'call', _20 => _20("401")])?await _chunkWUOGD7AZjs.e.getInstance().refreshTokens()?await e():(console.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),i):i}catch(i){return console.error("[crudifyAdmin] Operation error:",i),{success:!1,errors:i instanceof Error?i.message:"Unknown error"}}}var ni={listModules:()=>l(()=>_crudifyadmin2.default.listModules()),getModule:e=>l(()=>_crudifyadmin2.default.getModule(e)),createModule:e=>l(()=>_crudifyadmin2.default.createModule(e)),editModule:(e,i)=>l(()=>_crudifyadmin2.default.editModule(e,i)),deleteModule:e=>l(()=>_crudifyadmin2.default.deleteModule(e)),activateModule:e=>l(()=>_crudifyadmin2.default.activateModule(e)),deactivateModule:e=>l(()=>_crudifyadmin2.default.deactivateModule(e)),getModuleVersions:e=>l(()=>_crudifyadmin2.default.getModuleVersions(e)),listActions:e=>l(()=>_crudifyadmin2.default.listActions(e)),getAction:e=>l(()=>_crudifyadmin2.default.getAction(e)),createAction:e=>l(()=>_crudifyadmin2.default.createAction(e)),editAction:(e,i)=>l(()=>_crudifyadmin2.default.editAction(e,i)),deleteAction:e=>l(()=>_crudifyadmin2.default.deleteAction(e)),activateAction:e=>l(()=>_crudifyadmin2.default.activateAction(e)),deactivateAction:e=>l(()=>_crudifyadmin2.default.deactivateAction(e)),getActionVersions:e=>l(()=>_crudifyadmin2.default.getActionVersions(e)),getActionsByProfile:e=>l(()=>_crudifyadmin2.default.getActionsByProfile(e)),updateActionsProfiles:e=>l(()=>_crudifyadmin2.default.updateActionsProfiles(e))};exports.AuthRoute = O; exports.CRITICAL_TRANSLATIONS = _chunkOLTLD4XBjs.a; exports.CrudiaAutoGenerate = _chunkOLTLD4XBjs.o; exports.CrudifyInitializationManager = C; exports.CrudifyInitializer = ei; exports.CrudifyLogin = _chunkOLTLD4XBjs.h; exports.CrudifyProvider = _chunkWUOGD7AZjs.b; exports.CrudifyThemeProvider = De; exports.ERROR_CODES = _chunkYIIUEOXCjs.a; exports.ERROR_SEVERITY_MAP = _chunkYIIUEOXCjs.b; exports.GlobalNotificationProvider = _chunkWUOGD7AZjs.g; exports.LoginComponent = _chunkOLTLD4XBjs.m; exports.POLICY_ACTIONS = _chunkOLTLD4XBjs.j; exports.PREFERRED_POLICY_ORDER = _chunkOLTLD4XBjs.k; exports.Policies = _chunkOLTLD4XBjs.l; exports.ProtectedRoute = k; exports.SessionDebugInfo = _chunkWUOGD7AZjs.k; exports.SessionLoadingScreen = v; exports.SessionManager = _chunkWUOGD7AZjs.e; exports.SessionProvider = _chunkWUOGD7AZjs.i; exports.SessionStatus = _chunkOLTLD4XBjs.n; exports.TokenStorage = _chunkWUOGD7AZjs.d; exports.TranslationService = _chunkOLTLD4XBjs.d; exports.TranslationsProvider = _chunkOLTLD4XBjs.f; exports.UserProfileDisplay = _chunkOLTLD4XBjs.i; exports.createErrorTranslator = _chunkFC7HOMNQjs.g; exports.crudify = _crudifybrowser2.default; exports.crudifyAdmin = ni; exports.crudifyInitManager = x; exports.decodeJwtSafely = _chunkFC7HOMNQjs.j; exports.extractSafeRedirectFromUrl = T; exports.getCookie = _chunkFC7HOMNQjs.a; exports.getCriticalLanguages = _chunkOLTLD4XBjs.b; exports.getCriticalTranslations = _chunkOLTLD4XBjs.c; exports.getCurrentUserEmail = _chunkFC7HOMNQjs.k; exports.getErrorMessage = _chunkYIIUEOXCjs.e; exports.handleCrudifyError = _chunkYIIUEOXCjs.g; exports.isTokenExpired = _chunkFC7HOMNQjs.l; exports.parseApiError = _chunkYIIUEOXCjs.c; exports.parseJavaScriptError = _chunkYIIUEOXCjs.f; exports.parseTransactionError = _chunkYIIUEOXCjs.d; exports.secureLocalStorage = _chunkNNY4A73Vjs.b; exports.secureSessionStorage = _chunkNNY4A73Vjs.a; exports.translateError = _chunkFC7HOMNQjs.f; exports.translateErrorCode = _chunkFC7HOMNQjs.d; exports.translateErrorCodes = _chunkFC7HOMNQjs.e; exports.translationService = _chunkOLTLD4XBjs.e; exports.useAuth = _chunkZWSHZHIHjs.b; exports.useAutoGenerate = _chunkWUOGD7AZjs.m; exports.useCrudify = _chunkWUOGD7AZjs.c; exports.useCrudifyInitializer = ii; exports.useCrudifyWithNotifications = _chunkZWSHZHIHjs.d; exports.useData = _chunkZWSHZHIHjs.c; exports.useGlobalNotification = _chunkWUOGD7AZjs.h; exports.useSession = _chunkWUOGD7AZjs.f; exports.useSessionContext = _chunkWUOGD7AZjs.j; exports.useTranslations = _chunkOLTLD4XBjs.g; exports.useUserData = _chunkZWSHZHIHjs.a; exports.useUserProfile = _chunkWUOGD7AZjs.l; exports.validateInternalRedirect = P;
|
|
6
|
+
`});function S({stage:e="loading",message:r}){let t=r||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, Be,{}),_jsxruntime.jsxs.call(void 0, "div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh",width:"100vw",backgroundColor:"#f0f2f5",fontFamily:'"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',color:"#333",textAlign:"center",boxSizing:"border-box",padding:"20px",background:"#fff"},children:[_jsxruntime.jsx.call(void 0, "div",{style:_e}),_jsxruntime.jsx.call(void 0, "p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:t})]})]})}var qe=/^[a-zA-Z0-9\-_./\?=&%#]+$/,We=[/^https?:\/\//i,/^ftp:\/\//i,/^\/\//,/javascript:/i,/data:/i,/vbscript:/i,/about:/i,/\.\.\//,/\.\.\\/,/%2e%2e%2f/i,/%2e%2e%5c/i,/%2f%2f/i,/%5c%5c/i,/[\x00-\x1f\x7f-\x9f]/,/\\/],C= exports.validateInternalRedirect =(e,r="/")=>{if(!e||typeof e!="string")return r;let o=e.trim();if(!o)return r;if(!o.startsWith("/"))return console.warn("\u{1F6A8} Open redirect blocked (relative path):",e),r;if(!qe.test(o))return console.warn("\u{1F6A8} Open redirect blocked (invalid characters):",e),r;let t=o.toLowerCase();for(let a of We)if(a.test(t))return console.warn("\u{1F6A8} Open redirect blocked (dangerous pattern):",e),r;let s=o.split("?")[0].split("/").filter(Boolean);if(s.length===0)return o;for(let a of s)if(a===".."||a.includes(":")||a.length>100)return console.warn("\u{1F6A8} Open redirect blocked (suspicious path part):",a),r;return o},v= exports.extractSafeRedirectFromUrl =(e,r="/")=>{try{let t=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!t)return r;let s=decodeURIComponent(t);return C(s,r)}catch(o){return console.warn("\u{1F6A8} Error parsing redirect parameter:",o),r}};function U({children:e,loadingComponent:r,loginPath:o="/login"}){let{isAuthenticated:t,isLoading:s,isInitialized:a,tokens:p,error:g}=_chunkMMFYNCPIjs.j.call(void 0, ),l=_reactrouterdom.useLocation.call(void 0, );if(!a||s)return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:r||_jsxruntime.jsx.call(void 0, S,{stage:"validating-session"})});let d=t&&_optionalChain([p, 'optionalAccess', _2 => _2.accessToken])&&p.accessToken.length>0;if(g||!t||!d){p&&(!p.accessToken||p.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let y=l.pathname+l.search,A=C(y),x=encodeURIComponent(A);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:`${o}?redirect=${x}`,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}function w({children:e,redirectTo:r="/"}){let{isAuthenticated:o}=_chunkMMFYNCPIjs.j.call(void 0, ),t=_reactrouterdom.useLocation.call(void 0, );if(o){let s=new URLSearchParams(t.search),a=v(s,r);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:a,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}var N=_react.createContext.call(void 0, void 0),rr= exports.CrudifyInitializer =({config:e,children:r,fallback:o=null,onInitialized:t,onError:s})=>{let[a,p]=_react.useState.call(void 0, !1),[g,l]=_react.useState.call(void 0, !1),[d,y]=_react.useState.call(void 0, null),A=_react.useRef.call(void 0, !1),x=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{A.current||(_chunkMMFYNCPIjs.o.registerHighPriorityInitializer(),A.current=!0),x.current||(x.current=!0,(async()=>{l(!0),y(null);try{let c=_chunkFC7HOMNQjs.b.call(void 0, {publicApiKey:_optionalChain([e, 'optionalAccess', _3 => _3.publicApiKey]),env:_optionalChain([e, 'optionalAccess', _4 => _4.env]),enableDebug:_optionalChain([e, 'optionalAccess', _5 => _5.enableLogging])});if(!c.publicApiKey)throw new Error("Crudify configuration missing. Please provide publicApiKey via props or ensure cookies are set by Lambda.");await _chunkMMFYNCPIjs.o.initialize({priority:"HIGH",publicApiKey:c.publicApiKey,env:c.env||"prod",enableLogging:_optionalChain([e, 'optionalAccess', _6 => _6.enableLogging]),requestedBy:"CrudifyInitializer"}),p(!0),l(!1),t&&t()}catch(c){let z=c instanceof Error?c:new Error(String(c));y(z),l(!1),s&&s(z)}})())},[_optionalChain([e, 'optionalAccess', _7 => _7.publicApiKey]),_optionalChain([e, 'optionalAccess', _8 => _8.env]),_optionalChain([e, 'optionalAccess', _9 => _9.enableLogging]),t,s]);let G={isInitialized:a,isInitializing:g,error:d};return g&&o?_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:o}):(d&&console.error("[CrudifyInitializer] Initialization failed:",d),_jsxruntime.jsx.call(void 0, N.Provider,{value:G,children:r}))},or= exports.useCrudifyInitializer =()=>{let e=_react.useContext.call(void 0, N);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};var _crudifyadmin = require('@nocios/crudify-admin'); var _crudifyadmin2 = _interopRequireDefault(_crudifyadmin);var D=!1,m=null;async function ir(){let r=_chunkMMFYNCPIjs.e.getInstance().getTokenInfo(),o=_optionalChain([r, 'optionalAccess', _10 => _10.apiEndpointAdmin]),t=_optionalChain([r, 'optionalAccess', _11 => _11.apiKeyEndpointAdmin]);return o&&t?{apiUrl:o,apiKey:t}:_chunkMMFYNCPIjs.a.waitForCredentials()}async function nr(){if(!D)return m||(m=(async()=>{try{let e=_chunkMMFYNCPIjs.e.getInstance(),{apiUrl:r,apiKey:o}=await ir();_crudifyadmin2.default.init({url:r,apiKey:o,getAdditionalHeaders:()=>{let t=e.getTokenInfo();return _optionalChain([t, 'optionalAccess', _12 => _12.crudifyTokens, 'optionalAccess', _13 => _13.accessToken])?{Authorization:`Bearer ${t.crudifyTokens.accessToken}`}:{}}}),D=!0}catch(e){throw m=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),m)}async function n(e){try{await nr();let r=await e();return!r.success&&_optionalChain([r, 'access', _14 => _14.errors, 'optionalAccess', _15 => _15.includes, 'call', _16 => _16("401")])?await _chunkMMFYNCPIjs.e.getInstance().refreshTokens()?await e():(console.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),r):r}catch(r){return console.error("[crudifyAdmin] Operation error:",r),{success:!1,errors:r instanceof Error?r.message:"Unknown error"}}}var sr={listModules:()=>n(()=>_crudifyadmin2.default.listModules()),getModule:e=>n(()=>_crudifyadmin2.default.getModule(e)),createModule:e=>n(()=>_crudifyadmin2.default.createModule(e)),editModule:(e,r)=>n(()=>_crudifyadmin2.default.editModule(e,r)),deleteModule:e=>n(()=>_crudifyadmin2.default.deleteModule(e)),activateModule:e=>n(()=>_crudifyadmin2.default.activateModule(e)),deactivateModule:e=>n(()=>_crudifyadmin2.default.deactivateModule(e)),getModuleVersions:e=>n(()=>_crudifyadmin2.default.getModuleVersions(e)),listActions:e=>n(()=>_crudifyadmin2.default.listActions(e)),getAction:e=>n(()=>_crudifyadmin2.default.getAction(e)),createAction:e=>n(()=>_crudifyadmin2.default.createAction(e)),editAction:(e,r)=>n(()=>_crudifyadmin2.default.editAction(e,r)),deleteAction:e=>n(()=>_crudifyadmin2.default.deleteAction(e)),activateAction:e=>n(()=>_crudifyadmin2.default.activateAction(e)),deactivateAction:e=>n(()=>_crudifyadmin2.default.deactivateAction(e)),getActionVersions:e=>n(()=>_crudifyadmin2.default.getActionVersions(e)),getActionsByProfile:e=>n(()=>_crudifyadmin2.default.getActionsByProfile(e)),updateActionsProfiles:e=>n(()=>_crudifyadmin2.default.updateActionsProfiles(e))};exports.AuthRoute = w; exports.CRITICAL_TRANSLATIONS = _chunkPSZ2DSVHjs.a; exports.CrudiaAutoGenerate = _chunkPSZ2DSVHjs.o; exports.CrudiaFileField = _chunkPSZ2DSVHjs.p; exports.CrudifyInitializationManager = _chunkMMFYNCPIjs.n; exports.CrudifyInitializer = rr; exports.CrudifyLogin = _chunkPSZ2DSVHjs.h; exports.CrudifyProvider = _chunkMMFYNCPIjs.b; exports.CrudifyThemeProvider = Ge; exports.ERROR_CODES = _chunkYIIUEOXCjs.a; exports.ERROR_SEVERITY_MAP = _chunkYIIUEOXCjs.b; exports.GlobalNotificationProvider = _chunkMMFYNCPIjs.g; exports.LoginComponent = _chunkPSZ2DSVHjs.m; exports.POLICY_ACTIONS = _chunkPSZ2DSVHjs.j; exports.PREFERRED_POLICY_ORDER = _chunkPSZ2DSVHjs.k; exports.Policies = _chunkPSZ2DSVHjs.l; exports.ProtectedRoute = U; exports.SessionDebugInfo = _chunkMMFYNCPIjs.k; exports.SessionLoadingScreen = S; exports.SessionManager = _chunkMMFYNCPIjs.e; exports.SessionProvider = _chunkMMFYNCPIjs.i; exports.SessionStatus = _chunkPSZ2DSVHjs.n; exports.TokenStorage = _chunkMMFYNCPIjs.d; exports.TranslationService = _chunkPSZ2DSVHjs.d; exports.TranslationsProvider = _chunkPSZ2DSVHjs.f; exports.UserProfileDisplay = _chunkPSZ2DSVHjs.i; exports.createErrorTranslator = _chunkFC7HOMNQjs.g; exports.crudify = _crudifybrowser2.default; exports.crudifyAdmin = sr; exports.crudifyInitManager = _chunkMMFYNCPIjs.o; exports.decodeJwtSafely = _chunkFC7HOMNQjs.j; exports.extractSafeRedirectFromUrl = v; exports.getCookie = _chunkFC7HOMNQjs.a; exports.getCriticalLanguages = _chunkPSZ2DSVHjs.b; exports.getCriticalTranslations = _chunkPSZ2DSVHjs.c; exports.getCurrentUserEmail = _chunkFC7HOMNQjs.k; exports.getErrorMessage = _chunkYIIUEOXCjs.e; exports.handleCrudifyError = _chunkYIIUEOXCjs.g; exports.isTokenExpired = _chunkFC7HOMNQjs.l; exports.parseApiError = _chunkYIIUEOXCjs.c; exports.parseJavaScriptError = _chunkYIIUEOXCjs.f; exports.parseTransactionError = _chunkYIIUEOXCjs.d; exports.secureLocalStorage = _chunkNNY4A73Vjs.b; exports.secureSessionStorage = _chunkNNY4A73Vjs.a; exports.translateError = _chunkFC7HOMNQjs.f; exports.translateErrorCode = _chunkFC7HOMNQjs.d; exports.translateErrorCodes = _chunkFC7HOMNQjs.e; exports.translationService = _chunkPSZ2DSVHjs.e; exports.useAuth = _chunkM2BIAQ3Vjs.b; exports.useAutoGenerate = _chunkMMFYNCPIjs.m; exports.useCrudify = _chunkMMFYNCPIjs.c; exports.useCrudifyInitializer = or; exports.useCrudifyWithNotifications = _chunkM2BIAQ3Vjs.d; exports.useData = _chunkM2BIAQ3Vjs.c; exports.useFileUpload = _chunkMMFYNCPIjs.p; exports.useGlobalNotification = _chunkMMFYNCPIjs.h; exports.useSession = _chunkMMFYNCPIjs.f; exports.useSessionContext = _chunkMMFYNCPIjs.j; exports.useTranslations = _chunkPSZ2DSVHjs.g; exports.useUserData = _chunkM2BIAQ3Vjs.a; exports.useUserProfile = _chunkMMFYNCPIjs.l; exports.validateInternalRedirect = C;
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{a as K,b as V,c as _,d as B,e as H,f as q,g as W,h as ge,i as Ae,j as xe,k as Re,l as Pe,m as Ce,n as Ie,o as Se,p as ze}from"./chunk-IZD5WNI4.mjs";import{a as Ee,b as Me,c as be,d as ke}from"./chunk-P4SZ3U4U.mjs";import{a as M,b as J,c as $,d as Y,e as u,f as ee,g as ie,h as ne,i as se,j as f,k as ae,l as ye,m as he,n as ve,o as R,p as Te}from"./chunk-ZSP7TBON.mjs";import{a as Le,b as Ue}from"./chunk-T2CPA46I.mjs";import{a as pe,b as ce,c as le,d as de,e as ue,f as fe,g as me}from"./chunk-BJ6PIVZR.mjs";import{a as h,b as E,d as Z,e as Q,f as X,g as j,j as re,k as oe,l as te}from"./chunk-6GPSBDW6.mjs";import{default as qr}from"@nocios/crudify-browser";export*from"@nocios/crudify-browser";import{useMemo as we}from"react";import{ThemeProvider as Oe,createTheme as Fe,CssBaseline as Ne}from"@mui/material";import{jsx as Ke,jsxs as Ve}from"react/jsx-runtime";var De=(e={})=>{try{let r=h("theme");if(r){let o=JSON.parse(decodeURIComponent(r));return{...e,...o}}}catch(r){console.warn("Error parsing theme from cookie:",r)}return e};function Ge({children:e,defaultTheme:r={},disableCssBaseline:o=!1}){let t=we(()=>{let s=De(r);return Fe(s)},[r]);return Ve(Oe,{theme:t,children:[!o&&Ke(Ne,{}),e]})}import{Navigate as Je,useLocation as $e}from"react-router-dom";import{Fragment as He,jsx as P,jsxs as b}from"react/jsx-runtime";var _e={border:"5px solid rgba(0, 0, 0, 0.1)",borderTopColor:"#3B82F6",borderRadius:"50%",width:"50px",height:"50px",animation:"spin 1s linear infinite"},Be=()=>P("style",{children:`
|
|
2
2
|
@keyframes spin {
|
|
3
3
|
0% { transform: rotate(0deg); }
|
|
4
4
|
100% { transform: rotate(360deg); }
|
|
5
5
|
}
|
|
6
|
-
`});function v({stage:e="loading",message:i}){let r=i||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return M(Be,{children:[A($e,{}),M("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh",width:"100vw",backgroundColor:"#f0f2f5",fontFamily:'"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',color:"#333",textAlign:"center",boxSizing:"border-box",padding:"20px",background:"#fff"},children:[A("div",{style:Fe}),A("p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:r})]})]})}var _e=/^[a-zA-Z0-9\-_./\?=&%#]+$/,Ze=[/^https?:\/\//i,/^ftp:\/\//i,/^\/\//,/javascript:/i,/data:/i,/vbscript:/i,/about:/i,/\.\.\//,/\.\.\\/,/%2e%2e%2f/i,/%2e%2e%5c/i,/%2f%2f/i,/%5c%5c/i,/[\x00-\x1f\x7f-\x9f]/,/\\/],P=(e,i="/")=>{if(!e||typeof e!="string")return i;let t=e.trim();if(!t)return i;if(!t.startsWith("/"))return console.warn("\u{1F6A8} Open redirect blocked (relative path):",e),i;if(!_e.test(t))return console.warn("\u{1F6A8} Open redirect blocked (invalid characters):",e),i;let r=t.toLowerCase();for(let o of Ze)if(o.test(r))return console.warn("\u{1F6A8} Open redirect blocked (dangerous pattern):",e),i;let n=t.split("?")[0].split("/").filter(Boolean);if(n.length===0)return t;for(let o of n)if(o===".."||o.includes(":")||o.length>100)return console.warn("\u{1F6A8} Open redirect blocked (suspicious path part):",o),i;return t},T=(e,i="/")=>{try{let r=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!r)return i;let n=decodeURIComponent(r);return P(n,i)}catch(t){return console.warn("\u{1F6A8} Error parsing redirect parameter:",t),i}};import{Fragment as N,jsx as R}from"react/jsx-runtime";function k({children:e,loadingComponent:i,loginPath:t="/login"}){let{isAuthenticated:r,isLoading:n,isInitialized:o,tokens:s,error:c}=y(),u=We();if(!o||n)return R(N,{children:i||R(v,{stage:"validating-session"})});let d=r&&s?.accessToken&&s.accessToken.length>0;if(c||!r||!d){s&&(!s.accessToken||s.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let m=u.pathname+u.search,I=P(m),h=encodeURIComponent(I);return R(Ve,{to:`${t}?redirect=${h}`,replace:!0})}return R(N,{children:e})}import{Navigate as qe,useLocation as Ye}from"react-router-dom";import{Fragment as Je,jsx as U}from"react/jsx-runtime";function O({children:e,redirectTo:i="/"}){let{isAuthenticated:t}=y(),r=Ye();if(t){let n=new URLSearchParams(r.search),o=T(n,i);return U(qe,{to:o,replace:!0})}return U(Je,{children:e})}import S from"@nocios/crudify-browser";var C=class e{constructor(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null};this.initializationPromise=null;this.highPriorityInitializerPresent=!1;this.waitingForHighPriority=new Set;this.HIGH_PRIORITY_WAIT_TIMEOUT=100}static getInstance(){return e.instance||(e.instance=new e),e.instance}registerHighPriorityInitializer(){this.highPriorityInitializerPresent=!0}isHighPriorityInitializerPresent(){return this.highPriorityInitializerPresent}getState(){return{...this.state}}async initialize(i){let{priority:t,publicApiKey:r,env:n,enableLogging:o,requestedBy:s}=i;if(this.state.status==="INITIALIZED"){this.state.publicApiKey!==r&&console.warn(`[CrudifyInitialization] ${s} attempted to initialize with different key. Already initialized with key: ${this.state.publicApiKey?.slice(0,10)}... by ${this.state.initializedBy}`);return}if(this.initializationPromise)return o&&console.log(`[CrudifyInitialization] ${s} waiting for ongoing initialization...`),this.initializationPromise;if(t==="LOW"&&this.highPriorityInitializerPresent&&this.state.status==="UNINITIALIZED"){if(o&&console.log(`[CrudifyInitialization] ${s} (LOW priority) waiting for HIGH priority initializer...`),this.waitingForHighPriority.add(s),await this.waitForHighPriorityOrTimeout(o),this.waitingForHighPriority.delete(s),this.getState().status==="INITIALIZED"){o&&console.log(`[CrudifyInitialization] ${s} found initialization completed by HIGH priority`);return}o&&console.warn(`[CrudifyInitialization] ${s} timeout waiting for HIGH priority, initializing with LOW priority`)}t==="HIGH"&&this.state.status==="INITIALIZING"&&this.state.priority==="LOW"&&(console.warn(`[CrudifyInitialization] HIGH priority request from ${s} interrupting LOW priority initialization by ${this.state.initializedBy}`),this.state.status="UNINITIALIZED",this.initializationPromise=null),o&&console.log(`[CrudifyInitialization] ${s} starting initialization (${t} priority)...`),this.state.status="INITIALIZING",this.state.priority=t,this.state.initializedBy=s,this.initializationPromise=this.performInitialization(r,n,o);try{await this.initializationPromise,this.state.status="INITIALIZED",this.state.publicApiKey=r,this.state.env=n,this.state.error=null,o&&console.log(`[CrudifyInitialization] \u2705 Successfully initialized by ${s} (${t} priority)`)}catch(c){throw this.state.status="ERROR",this.state.error=c instanceof Error?c:new Error(String(c)),this.initializationPromise=null,console.error(`[CrudifyInitialization] \u274C Initialization failed for ${s}:`,c),c}}async waitForHighPriorityOrTimeout(i){return new Promise(t=>{let n=0,o=setInterval(()=>{if(n+=10,this.state.status==="INITIALIZED"&&this.state.priority==="HIGH"){clearInterval(o),t();return}if(this.state.status==="INITIALIZING"&&this.state.priority==="HIGH"){n=0;return}n>=this.HIGH_PRIORITY_WAIT_TIMEOUT&&(clearInterval(o),i&&console.log(`[CrudifyInitialization] Timeout waiting for HIGH priority (${this.HIGH_PRIORITY_WAIT_TIMEOUT}ms)`),t())},10)})}async performInitialization(i,t,r){let n=S.getTokenData();if(n&&n.endpoint){r&&console.log("[CrudifyInitialization] SDK already initialized externally");return}S.config(t);let o=r?"debug":"none",s=await S.init(i,o);if(s.success===!1)throw new Error(`Crudify initialization failed: ${JSON.stringify(s.errors||"Unknown error")}`)}reset(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null},this.initializationPromise=null,this.highPriorityInitializerPresent=!1,this.waitingForHighPriority.clear()}isInitialized(){return this.state.status==="INITIALIZED"}getDiagnostics(){return{...this.state,waitingCount:this.waitingForHighPriority.size,waitingComponents:Array.from(this.waitingForHighPriority),hasActivePromise:this.initializationPromise!==null}}},x=C.getInstance();import{createContext as Qe,useContext as Xe,useEffect as je,useRef as H,useState as b}from"react";import{Fragment as ti,jsx as D}from"react/jsx-runtime";var G=Qe(void 0),ei=({config:e,children:i,fallback:t=null,onInitialized:r,onError:n})=>{let[o,s]=b(!1),[c,u]=b(!1),[d,m]=b(null),I=H(!1),h=H(!1);je(()=>{I.current||(x.registerHighPriorityInitializer(),I.current=!0),h.current||(h.current=!0,(async()=>{u(!0),m(null);try{let p=w({publicApiKey:e?.publicApiKey,env:e?.env,enableDebug:e?.enableLogging});if(!p.publicApiKey)throw new Error("Crudify configuration missing. Please provide publicApiKey via props or ensure cookies are set by Lambda.");await x.initialize({priority:"HIGH",publicApiKey:p.publicApiKey,env:p.env||"prod",enableLogging:e?.enableLogging,requestedBy:"CrudifyInitializer"}),s(!0),u(!1),r&&r()}catch(p){let E=p instanceof Error?p:new Error(String(p));m(E),u(!1),n&&n(E)}})())},[e?.publicApiKey,e?.env,e?.enableLogging,r,n]);let F={isInitialized:o,isInitializing:c,error:d};return c&&t?D(ti,{children:t}):(d&&console.error("[CrudifyInitializer] Initialization failed:",d),D(G.Provider,{value:F,children:i}))},ii=()=>{let e=Xe(G);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};import a from"@nocios/crudify-admin";var K=!1,g=null;async function ri(){let i=f.getInstance().getTokenInfo(),t=i?.apiEndpointAdmin,r=i?.apiKeyEndpointAdmin;return t&&r?{apiUrl:t,apiKey:r}:L.waitForCredentials()}async function oi(){if(!K)return g||(g=(async()=>{try{let e=f.getInstance(),{apiUrl:i,apiKey:t}=await ri();a.init({url:i,apiKey:t,getAdditionalHeaders:()=>{let r=e.getTokenInfo();return r?.crudifyTokens?.accessToken?{Authorization:`Bearer ${r.crudifyTokens.accessToken}`}:{}}}),K=!0}catch(e){throw g=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),g)}async function l(e){try{await oi();let i=await e();return!i.success&&i.errors?.includes("401")?await f.getInstance().refreshTokens()?await e():(console.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),i):i}catch(i){return console.error("[crudifyAdmin] Operation error:",i),{success:!1,errors:i instanceof Error?i.message:"Unknown error"}}}var ni={listModules:()=>l(()=>a.listModules()),getModule:e=>l(()=>a.getModule(e)),createModule:e=>l(()=>a.createModule(e)),editModule:(e,i)=>l(()=>a.editModule(e,i)),deleteModule:e=>l(()=>a.deleteModule(e)),activateModule:e=>l(()=>a.activateModule(e)),deactivateModule:e=>l(()=>a.deactivateModule(e)),getModuleVersions:e=>l(()=>a.getModuleVersions(e)),listActions:e=>l(()=>a.listActions(e)),getAction:e=>l(()=>a.getAction(e)),createAction:e=>l(()=>a.createAction(e)),editAction:(e,i)=>l(()=>a.editAction(e,i)),deleteAction:e=>l(()=>a.deleteAction(e)),activateAction:e=>l(()=>a.activateAction(e)),deactivateAction:e=>l(()=>a.deactivateAction(e)),getActionVersions:e=>l(()=>a.getActionVersions(e)),getActionsByProfile:e=>l(()=>a.getActionsByProfile(e)),updateActionsProfiles:e=>l(()=>a.updateActionsProfiles(e))};export{O as AuthRoute,$ as CRITICAL_TRANSLATIONS,Te as CrudiaAutoGenerate,C as CrudifyInitializationManager,ei as CrudifyInitializer,Ie as CrudifyLogin,Y as CrudifyProvider,De as CrudifyThemeProvider,pe as ERROR_CODES,ue as ERROR_SEVERITY_MAP,se as GlobalNotificationProvider,xe as LoginComponent,Pe as POLICY_ACTIONS,Re as PREFERRED_POLICY_ORDER,Ce as Policies,k as ProtectedRoute,ce as SessionDebugInfo,v as SessionLoadingScreen,f as SessionManager,le as SessionProvider,ze as SessionStatus,Q as TokenStorage,Z as TranslationService,W as TranslationsProvider,Ae as UserProfileDisplay,ie as createErrorTranslator,Vi as crudify,ni as crudifyAdmin,x as crudifyInitManager,re as decodeJwtSafely,T as extractSafeRedirectFromUrl,z as getCookie,B as getCriticalLanguages,_ as getCriticalTranslations,oe as getCurrentUserEmail,ye as getErrorMessage,me as handleCrudifyError,ne as isTokenExpired,de as parseApiError,ge as parseJavaScriptError,fe as parseTransactionError,Le as secureLocalStorage,we as secureSessionStorage,ee as translateError,X as translateErrorCode,j as translateErrorCodes,V as translationService,be as useAuth,ve as useAutoGenerate,J as useCrudify,ii as useCrudifyInitializer,Me as useCrudifyWithNotifications,Ee as useData,ae as useGlobalNotification,te as useSession,y as useSessionContext,q as useTranslations,Se as useUserData,he as useUserProfile,P as validateInternalRedirect};
|
|
6
|
+
`});function S({stage:e="loading",message:r}){let t=r||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return b(He,{children:[P(Be,{}),b("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh",width:"100vw",backgroundColor:"#f0f2f5",fontFamily:'"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',color:"#333",textAlign:"center",boxSizing:"border-box",padding:"20px",background:"#fff"},children:[P("div",{style:_e}),P("p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:t})]})]})}var qe=/^[a-zA-Z0-9\-_./\?=&%#]+$/,We=[/^https?:\/\//i,/^ftp:\/\//i,/^\/\//,/javascript:/i,/data:/i,/vbscript:/i,/about:/i,/\.\.\//,/\.\.\\/,/%2e%2e%2f/i,/%2e%2e%5c/i,/%2f%2f/i,/%5c%5c/i,/[\x00-\x1f\x7f-\x9f]/,/\\/],C=(e,r="/")=>{if(!e||typeof e!="string")return r;let o=e.trim();if(!o)return r;if(!o.startsWith("/"))return console.warn("\u{1F6A8} Open redirect blocked (relative path):",e),r;if(!qe.test(o))return console.warn("\u{1F6A8} Open redirect blocked (invalid characters):",e),r;let t=o.toLowerCase();for(let a of We)if(a.test(t))return console.warn("\u{1F6A8} Open redirect blocked (dangerous pattern):",e),r;let s=o.split("?")[0].split("/").filter(Boolean);if(s.length===0)return o;for(let a of s)if(a===".."||a.includes(":")||a.length>100)return console.warn("\u{1F6A8} Open redirect blocked (suspicious path part):",a),r;return o},v=(e,r="/")=>{try{let t=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!t)return r;let s=decodeURIComponent(t);return C(s,r)}catch(o){return console.warn("\u{1F6A8} Error parsing redirect parameter:",o),r}};import{Fragment as L,jsx as I}from"react/jsx-runtime";function U({children:e,loadingComponent:r,loginPath:o="/login"}){let{isAuthenticated:t,isLoading:s,isInitialized:a,tokens:p,error:g}=f(),l=$e();if(!a||s)return I(L,{children:r||I(S,{stage:"validating-session"})});let d=t&&p?.accessToken&&p.accessToken.length>0;if(g||!t||!d){p&&(!p.accessToken||p.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let y=l.pathname+l.search,A=C(y),x=encodeURIComponent(A);return I(Je,{to:`${o}?redirect=${x}`,replace:!0})}return I(L,{children:e})}import{Navigate as Ye,useLocation as Ze}from"react-router-dom";import{Fragment as Qe,jsx as k}from"react/jsx-runtime";function w({children:e,redirectTo:r="/"}){let{isAuthenticated:o}=f(),t=Ze();if(o){let s=new URLSearchParams(t.search),a=v(s,r);return k(Ye,{to:a,replace:!0})}return k(Qe,{children:e})}import{createContext as Xe,useContext as je,useEffect as er,useRef as O,useState as T}from"react";import{Fragment as tr,jsx as F}from"react/jsx-runtime";var N=Xe(void 0),rr=({config:e,children:r,fallback:o=null,onInitialized:t,onError:s})=>{let[a,p]=T(!1),[g,l]=T(!1),[d,y]=T(null),A=O(!1),x=O(!1);er(()=>{A.current||(R.registerHighPriorityInitializer(),A.current=!0),x.current||(x.current=!0,(async()=>{l(!0),y(null);try{let c=E({publicApiKey:e?.publicApiKey,env:e?.env,enableDebug:e?.enableLogging});if(!c.publicApiKey)throw new Error("Crudify configuration missing. Please provide publicApiKey via props or ensure cookies are set by Lambda.");await R.initialize({priority:"HIGH",publicApiKey:c.publicApiKey,env:c.env||"prod",enableLogging:e?.enableLogging,requestedBy:"CrudifyInitializer"}),p(!0),l(!1),t&&t()}catch(c){let z=c instanceof Error?c:new Error(String(c));y(z),l(!1),s&&s(z)}})())},[e?.publicApiKey,e?.env,e?.enableLogging,t,s]);let G={isInitialized:a,isInitializing:g,error:d};return g&&o?F(tr,{children:o}):(d&&console.error("[CrudifyInitializer] Initialization failed:",d),F(N.Provider,{value:G,children:r}))},or=()=>{let e=je(N);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};import i from"@nocios/crudify-admin";var D=!1,m=null;async function ir(){let r=u.getInstance().getTokenInfo(),o=r?.apiEndpointAdmin,t=r?.apiKeyEndpointAdmin;return o&&t?{apiUrl:o,apiKey:t}:M.waitForCredentials()}async function nr(){if(!D)return m||(m=(async()=>{try{let e=u.getInstance(),{apiUrl:r,apiKey:o}=await ir();i.init({url:r,apiKey:o,getAdditionalHeaders:()=>{let t=e.getTokenInfo();return t?.crudifyTokens?.accessToken?{Authorization:`Bearer ${t.crudifyTokens.accessToken}`}:{}}}),D=!0}catch(e){throw m=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),m)}async function n(e){try{await nr();let r=await e();return!r.success&&r.errors?.includes("401")?await u.getInstance().refreshTokens()?await e():(console.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),r):r}catch(r){return console.error("[crudifyAdmin] Operation error:",r),{success:!1,errors:r instanceof Error?r.message:"Unknown error"}}}var sr={listModules:()=>n(()=>i.listModules()),getModule:e=>n(()=>i.getModule(e)),createModule:e=>n(()=>i.createModule(e)),editModule:(e,r)=>n(()=>i.editModule(e,r)),deleteModule:e=>n(()=>i.deleteModule(e)),activateModule:e=>n(()=>i.activateModule(e)),deactivateModule:e=>n(()=>i.deactivateModule(e)),getModuleVersions:e=>n(()=>i.getModuleVersions(e)),listActions:e=>n(()=>i.listActions(e)),getAction:e=>n(()=>i.getAction(e)),createAction:e=>n(()=>i.createAction(e)),editAction:(e,r)=>n(()=>i.editAction(e,r)),deleteAction:e=>n(()=>i.deleteAction(e)),activateAction:e=>n(()=>i.activateAction(e)),deactivateAction:e=>n(()=>i.deactivateAction(e)),getActionVersions:e=>n(()=>i.getActionVersions(e)),getActionsByProfile:e=>n(()=>i.getActionsByProfile(e)),updateActionsProfiles:e=>n(()=>i.updateActionsProfiles(e))};export{w as AuthRoute,K as CRITICAL_TRANSLATIONS,Se as CrudiaAutoGenerate,ze as CrudiaFileField,ve as CrudifyInitializationManager,rr as CrudifyInitializer,ge as CrudifyLogin,J as CrudifyProvider,Ge as CrudifyThemeProvider,pe as ERROR_CODES,ce as ERROR_SEVERITY_MAP,ie as GlobalNotificationProvider,Ce as LoginComponent,xe as POLICY_ACTIONS,Re as PREFERRED_POLICY_ORDER,Pe as Policies,U as ProtectedRoute,ae as SessionDebugInfo,S as SessionLoadingScreen,u as SessionManager,se as SessionProvider,Ie as SessionStatus,Y as TokenStorage,B as TranslationService,q as TranslationsProvider,Ae as UserProfileDisplay,j as createErrorTranslator,qr as crudify,sr as crudifyAdmin,R as crudifyInitManager,re as decodeJwtSafely,v as extractSafeRedirectFromUrl,h as getCookie,V as getCriticalLanguages,_ as getCriticalTranslations,oe as getCurrentUserEmail,ue as getErrorMessage,me as handleCrudifyError,te as isTokenExpired,le as parseApiError,fe as parseJavaScriptError,de as parseTransactionError,Ue as secureLocalStorage,Le as secureSessionStorage,X as translateError,Z as translateErrorCode,Q as translateErrorCodes,H as translationService,Me as useAuth,he as useAutoGenerate,$ as useCrudify,or as useCrudifyInitializer,ke as useCrudifyWithNotifications,be as useData,Te as useFileUpload,ne as useGlobalNotification,ee as useSession,f as useSessionContext,W as useTranslations,Ee as useUserData,ye as useUserProfile,C as validateInternalRedirect};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocios/crudify-ui",
|
|
3
|
-
"version": "4.4.
|
|
3
|
+
"version": "4.4.30",
|
|
4
4
|
"description": "Biblioteca de componentes UI para Crudify",
|
|
5
5
|
"author": "Nocios",
|
|
6
6
|
"license": "MIT",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@nocios/crudify-admin": "^2.2.0",
|
|
43
|
-
"@nocios/crudify-browser": "^4.1.
|
|
43
|
+
"@nocios/crudify-browser": "^4.1.12",
|
|
44
44
|
"crypto-js": "^4.2.0",
|
|
45
45
|
"dompurify": "^3.2.7",
|
|
46
46
|
"uuid": "^13.0.0"
|