flysoft-react-ui 0.5.2 → 1.0.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/App.d.ts.map +1 -1
- package/dist/App.js +5 -6
- package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
- package/dist/components/form-controls/AutocompleteInput.js +177 -131
- package/dist/components/form-controls/Button.d.ts +3 -0
- package/dist/components/form-controls/Button.d.ts.map +1 -1
- package/dist/components/form-controls/Button.js +160 -19
- package/dist/components/form-controls/Checkbox.d.ts.map +1 -1
- package/dist/components/form-controls/Checkbox.js +3 -1
- package/dist/components/form-controls/DateInput.d.ts +5 -1
- package/dist/components/form-controls/DateInput.d.ts.map +1 -1
- package/dist/components/form-controls/DateInput.js +94 -27
- package/dist/components/form-controls/Input.d.ts.map +1 -1
- package/dist/components/form-controls/Input.js +2 -1
- package/dist/components/form-controls/LinkButton.d.ts +15 -0
- package/dist/components/form-controls/LinkButton.d.ts.map +1 -0
- package/dist/components/form-controls/LinkButton.js +248 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -1
- package/dist/components/form-controls/SearchSelectInput-OLD.js +5 -4
- package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -1
- package/dist/components/form-controls/SearchSelectInput.js +3 -2
- package/dist/components/form-controls/index.d.ts +2 -0
- package/dist/components/form-controls/index.d.ts.map +1 -1
- package/dist/components/form-controls/index.js +1 -0
- package/dist/components/layout/Accordion.d.ts +13 -0
- package/dist/components/layout/Accordion.d.ts.map +1 -0
- package/dist/components/layout/Accordion.js +67 -0
- package/dist/components/layout/AppLayout.d.ts.map +1 -1
- package/dist/components/layout/AppLayout.js +7 -7
- package/dist/components/layout/Card.d.ts +8 -3
- package/dist/components/layout/Card.d.ts.map +1 -1
- package/dist/components/layout/Card.js +21 -22
- package/dist/components/layout/DataTable.js +1 -1
- package/dist/components/layout/DropdownMenu.d.ts.map +1 -0
- package/dist/components/{utils → layout}/DropdownMenu.js +12 -6
- package/dist/components/layout/DropdownPanel.d.ts +7 -0
- package/dist/components/layout/DropdownPanel.d.ts.map +1 -0
- package/dist/components/layout/DropdownPanel.js +137 -0
- package/dist/components/{utils → layout}/Filter.d.ts +5 -0
- package/dist/components/layout/Filter.d.ts.map +1 -0
- package/dist/components/{utils → layout}/Filter.js +18 -9
- package/dist/components/layout/Menu.d.ts +31 -0
- package/dist/components/layout/Menu.d.ts.map +1 -0
- package/dist/components/layout/Menu.js +21 -0
- package/dist/components/layout/index.d.ts +10 -0
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +5 -0
- package/dist/components/utils/Badge.d.ts.map +1 -1
- package/dist/components/utils/Badge.js +3 -2
- package/dist/components/utils/Dialog.d.ts +2 -2
- package/dist/components/utils/Dialog.d.ts.map +1 -1
- package/dist/components/utils/Dialog.js +4 -3
- package/dist/components/utils/FiltersDialog.d.ts +1 -1
- package/dist/components/utils/FiltersDialog.d.ts.map +1 -1
- package/dist/components/utils/FiltersDialog.js +2 -2
- package/dist/components/utils/Loader.js +1 -1
- package/dist/components/utils/RoadMap.d.ts.map +1 -1
- package/dist/components/utils/RoadMap.js +2 -1
- package/dist/components/utils/Snackbar.d.ts.map +1 -1
- package/dist/components/utils/Snackbar.js +2 -1
- package/dist/components/utils/iconUtils.d.ts +16 -0
- package/dist/components/utils/iconUtils.d.ts.map +1 -0
- package/dist/components/utils/iconUtils.js +40 -0
- package/dist/components/utils/index.d.ts +0 -2
- package/dist/components/utils/index.d.ts.map +1 -1
- package/dist/components/utils/index.js +0 -1
- package/dist/contexts/CrudContext.d.ts +62 -0
- package/dist/contexts/CrudContext.d.ts.map +1 -0
- package/dist/contexts/CrudContext.js +333 -0
- package/dist/contexts/index.d.ts +2 -2
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/contexts/index.js +2 -2
- package/dist/docs/AccordionDocs.d.ts +4 -0
- package/dist/docs/AccordionDocs.d.ts.map +1 -0
- package/dist/docs/AccordionDocs.js +21 -0
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -5
- package/dist/docs/AutocompleteInputDocs.js +1 -1
- package/dist/docs/ButtonDocs.d.ts.map +1 -1
- package/dist/docs/ButtonDocs.js +1 -1
- package/dist/docs/CardDocs.d.ts.map +1 -1
- package/dist/docs/CardDocs.js +17 -8
- package/dist/docs/DataTableDocs.js +3 -3
- package/dist/docs/DialogDocs.d.ts.map +1 -1
- package/dist/docs/DialogDocs.js +1 -1
- package/dist/docs/DocAdmin.js +1 -1
- package/dist/docs/DocsMenu.d.ts.map +1 -1
- package/dist/docs/DocsMenu.js +3 -3
- package/dist/docs/DocsRouter.d.ts.map +1 -1
- package/dist/docs/DocsRouter.js +5 -1
- package/dist/docs/DropdownMenuDocs.js +1 -1
- package/dist/docs/DropdownPanelDocs.d.ts +4 -0
- package/dist/docs/DropdownPanelDocs.d.ts.map +1 -0
- package/dist/docs/DropdownPanelDocs.js +7 -0
- package/dist/docs/FilterDocs.d.ts.map +1 -1
- package/dist/docs/FilterDocs.js +19 -1
- package/dist/docs/LinkButtonDocs.d.ts +4 -0
- package/dist/docs/LinkButtonDocs.d.ts.map +1 -0
- package/dist/docs/LinkButtonDocs.js +7 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +0 -9
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +32 -16
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.js +34 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.js +66 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +7 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts +10 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.js +39 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +33 -27
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +9 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +30 -0
- package/dist/docs/MenuDocs.d.ts +4 -0
- package/dist/docs/MenuDocs.d.ts.map +1 -0
- package/dist/docs/MenuDocs.js +26 -0
- package/dist/docs/SearchSelectInputDocs.js +1 -1
- package/dist/docs/docMockServices/empresaService.d.ts +5 -5
- package/dist/docs/docMockServices/empresaService.d.ts.map +1 -1
- package/dist/docs/docMockServices/empresaService.js +20 -11
- package/dist/docs/docMockServices/interfaces.d.ts +12 -0
- package/dist/docs/docMockServices/interfaces.d.ts.map +1 -1
- package/dist/docs/docMockServices/personaEmpresaService.d.ts +6 -6
- package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -1
- package/dist/docs/docMockServices/personaEmpresaService.js +52 -14
- package/dist/docs/docMockServices/personaService.d.ts +2 -2
- package/dist/docs/docMockServices/personaService.d.ts.map +1 -1
- package/dist/docs/docMockServices/personaService.js +17 -7
- package/dist/index.css +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/templates/forms/ContactForm.js +2 -2
- package/dist/templates/forms/LoginForm.js +1 -1
- package/dist/templates/forms/RegistrationForm.js +1 -1
- package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
- package/dist/templates/layouts/SidebarLayout.js +3 -2
- package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
- package/dist/templates/patterns/FormPattern.js +4 -3
- package/package.json +4 -3
- package/dist/components/utils/DropdownMenu.d.ts.map +0 -1
- package/dist/components/utils/Filter.d.ts.map +0 -1
- package/dist/contexts/ListCrudContext.d.ts +0 -29
- package/dist/contexts/ListCrudContext.d.ts.map +0 -1
- package/dist/contexts/ListCrudContext.js +0 -209
- /package/dist/components/{utils → layout}/DropdownMenu.d.ts +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React from "react";
|
|
3
|
+
import { normalizeIconClass } from "./iconUtils";
|
|
3
4
|
/**
|
|
4
5
|
* Helper function to convert color names to CSS values
|
|
5
6
|
*/
|
|
@@ -127,7 +128,7 @@ export const RoadMap = ({ stages, className = "", }) => {
|
|
|
127
128
|
`, style: {
|
|
128
129
|
backgroundColor: bgColor,
|
|
129
130
|
color: "#ffffff",
|
|
130
|
-
}, children: stage.icon ? (_jsx("i", { className:
|
|
131
|
+
}, children: stage.icon ? (_jsx("i", { className: `${normalizeIconClass(stage.icon)} text-xs` })) : null }), !isLast && (_jsx("div", { className: "w-0.5 h-4 flex-shrink-0", style: {
|
|
131
132
|
background: connectorGradient || undefined,
|
|
132
133
|
} }))] }), _jsxs("div", { className: `
|
|
133
134
|
flex-1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Snackbar.d.ts","sourceRoot":"","sources":["../../../src/components/utils/Snackbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"Snackbar.d.ts","sourceRoot":"","sources":["../../../src/components/utils/Snackbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGtE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAqM5C,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useEffect, useState, useRef, useCallback } from "react";
|
|
3
|
+
import { normalizeIconClass } from "./iconUtils";
|
|
3
4
|
export const Snackbar = ({ id, message, variant, duration = 3000, icon, iconLabel, onClose, }) => {
|
|
4
5
|
const [progress, setProgress] = useState(100);
|
|
5
6
|
const [isClosing, setIsClosing] = useState(false);
|
|
@@ -117,5 +118,5 @@ export const Snackbar = ({ id, message, variant, duration = 3000, icon, iconLabe
|
|
|
117
118
|
`, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, role: "alert", "aria-live": "polite", children: _jsxs("div", { className: `${config.bg} ${config.text} p-4 flex items-start gap-3 relative`, children: [duration > 0 && (_jsx("div", { className: "absolute bottom-0 left-0 right-0 h-[3px] overflow-hidden", children: _jsx("div", { className: "h-full transition-all duration-50 ease-linear", style: {
|
|
118
119
|
width: `${progress}%`,
|
|
119
120
|
backgroundColor: "#00000050",
|
|
120
|
-
} }) })), displayIcon && (_jsx("div", { className: "flex-shrink-0 -mt-0.5", children: _jsx("i", { className:
|
|
121
|
+
} }) })), displayIcon && (_jsx("div", { className: "flex-shrink-0 -mt-0.5", children: _jsx("i", { className: `${normalizeIconClass(displayIcon)} text-base`, "aria-hidden": !iconLabel, "aria-label": iconLabel }) })), _jsx("div", { className: "flex-1 min-w-0", children: _jsx("p", { className: "text-sm font-medium break-words max-w-full", children: message }) }), _jsx("button", { onClick: handleClose, className: "flex-shrink-0 ml-2 text-gray-600 hover:text-gray-800 transition-colors cursor-pointer", "aria-label": "Cerrar notificaci\u00F3n", type: "button", children: _jsx("i", { className: `${normalizeIconClass("fa-times")} text-sm` }) })] }) }));
|
|
121
122
|
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normaliza las clases de iconos de FontAwesome para usar el estilo light (fal) por defecto
|
|
3
|
+
*
|
|
4
|
+
* Convierte:
|
|
5
|
+
* - "fa fa-user" -> "fal fa-user"
|
|
6
|
+
* - "fas fa-user" -> "fal fa-user"
|
|
7
|
+
* - "far fa-user" -> "fal fa-user"
|
|
8
|
+
* - "fal fa-user" -> "fal fa-user" (ya es light, se mantiene)
|
|
9
|
+
* - "fa-user" -> "fal fa-user"
|
|
10
|
+
* - "fa-spinner fa-spin" -> "fal fa-spinner fa-spin" (preserva clases adicionales)
|
|
11
|
+
*
|
|
12
|
+
* @param iconClass - La clase del icono a normalizar
|
|
13
|
+
* @returns La clase del icono normalizada con el estilo light (fal)
|
|
14
|
+
*/
|
|
15
|
+
export declare function normalizeIconClass(iconClass: string | undefined): string;
|
|
16
|
+
//# sourceMappingURL=iconUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iconUtils.d.ts","sourceRoot":"","sources":["../../../src/components/utils/iconUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CA6BxE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normaliza las clases de iconos de FontAwesome para usar el estilo light (fal) por defecto
|
|
3
|
+
*
|
|
4
|
+
* Convierte:
|
|
5
|
+
* - "fa fa-user" -> "fal fa-user"
|
|
6
|
+
* - "fas fa-user" -> "fal fa-user"
|
|
7
|
+
* - "far fa-user" -> "fal fa-user"
|
|
8
|
+
* - "fal fa-user" -> "fal fa-user" (ya es light, se mantiene)
|
|
9
|
+
* - "fa-user" -> "fal fa-user"
|
|
10
|
+
* - "fa-spinner fa-spin" -> "fal fa-spinner fa-spin" (preserva clases adicionales)
|
|
11
|
+
*
|
|
12
|
+
* @param iconClass - La clase del icono a normalizar
|
|
13
|
+
* @returns La clase del icono normalizada con el estilo light (fal)
|
|
14
|
+
*/
|
|
15
|
+
export function normalizeIconClass(iconClass) {
|
|
16
|
+
if (!iconClass)
|
|
17
|
+
return "";
|
|
18
|
+
// Dividir las clases por espacios
|
|
19
|
+
const classes = iconClass.trim().split(/\s+/);
|
|
20
|
+
// Buscar y reemplazar el prefijo de estilo
|
|
21
|
+
const stylePrefixes = ["fas", "far", "fal", "fab"];
|
|
22
|
+
let hasStylePrefix = false;
|
|
23
|
+
const normalizedClasses = classes.map((cls) => {
|
|
24
|
+
// Si es un prefijo de estilo, reemplazarlo por "fal"
|
|
25
|
+
if (stylePrefixes.includes(cls)) {
|
|
26
|
+
hasStylePrefix = true;
|
|
27
|
+
return "fal";
|
|
28
|
+
}
|
|
29
|
+
return cls;
|
|
30
|
+
});
|
|
31
|
+
// Si no tenía prefijo de estilo y la primera clase empieza con "fa-", agregar "fal" al inicio
|
|
32
|
+
if (!hasStylePrefix && classes[0]?.startsWith("fa-")) {
|
|
33
|
+
normalizedClasses.unshift("fal");
|
|
34
|
+
}
|
|
35
|
+
// Si no tenía prefijo de estilo y ninguna clase es un prefijo, agregar "fal" al inicio
|
|
36
|
+
else if (!hasStylePrefix && !classes.some(cls => stylePrefixes.includes(cls))) {
|
|
37
|
+
normalizedClasses.unshift("fal");
|
|
38
|
+
}
|
|
39
|
+
return normalizedClasses.join(" ");
|
|
40
|
+
}
|
|
@@ -8,8 +8,6 @@ export { Dialog } from "./Dialog";
|
|
|
8
8
|
export type { DialogProps } from "./Dialog";
|
|
9
9
|
export { Loader } from "./Loader";
|
|
10
10
|
export type { LoaderProps } from "./Loader";
|
|
11
|
-
export { Filter } from "./Filter";
|
|
12
|
-
export type { FilterProps } from "./Filter";
|
|
13
11
|
export { FiltersDialog } from "./FiltersDialog";
|
|
14
12
|
export type { FiltersDialogProps, FilterConfig } from "./FiltersDialog";
|
|
15
13
|
export { Snackbar } from "./Snackbar";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -3,7 +3,6 @@ export { Avatar } from "./Avatar";
|
|
|
3
3
|
export { RoadMap } from "./RoadMap";
|
|
4
4
|
export { Dialog } from "./Dialog";
|
|
5
5
|
export { Loader } from "./Loader";
|
|
6
|
-
export { Filter } from "./Filter";
|
|
7
6
|
export { FiltersDialog } from "./FiltersDialog";
|
|
8
7
|
export { Snackbar } from "./Snackbar";
|
|
9
8
|
export { SnackbarContainer } from "./SnackbarContainer";
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type ReactNode, type Dispatch, type SetStateAction } from "react";
|
|
2
|
+
import { type PaginationInterface } from "../components/form-controls/Pagination";
|
|
3
|
+
export interface CrudContextType<T> {
|
|
4
|
+
list: Array<T> | undefined;
|
|
5
|
+
item: T | undefined;
|
|
6
|
+
page: number;
|
|
7
|
+
pages: number;
|
|
8
|
+
total: number;
|
|
9
|
+
limit: number;
|
|
10
|
+
isLoading: boolean;
|
|
11
|
+
pagination: ReactNode;
|
|
12
|
+
params: Record<string, any>;
|
|
13
|
+
extraData?: Record<string, any>;
|
|
14
|
+
setExtraData: Dispatch<SetStateAction<Record<string, any> | undefined>>;
|
|
15
|
+
fetchItems: {
|
|
16
|
+
execute: (params?: Record<string, any>) => Promise<void>;
|
|
17
|
+
isLoading: boolean;
|
|
18
|
+
};
|
|
19
|
+
fetchItem: {
|
|
20
|
+
execute: (params?: Record<string, any> | string | number) => Promise<T | undefined>;
|
|
21
|
+
isLoading: boolean;
|
|
22
|
+
};
|
|
23
|
+
createItem: {
|
|
24
|
+
execute: (item: T) => Promise<T | undefined | null>;
|
|
25
|
+
isLoading: boolean;
|
|
26
|
+
};
|
|
27
|
+
updateItem: {
|
|
28
|
+
execute: (item: T) => Promise<T | undefined | null>;
|
|
29
|
+
isLoading: boolean;
|
|
30
|
+
};
|
|
31
|
+
deleteItem: {
|
|
32
|
+
execute: (item: T) => Promise<void>;
|
|
33
|
+
isLoading: boolean;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export declare const CrudContext: import("react").Context<CrudContextType<any> | undefined>;
|
|
37
|
+
export interface PromiseWithOptions<TResult, TParams extends any[] = []> {
|
|
38
|
+
execute: (...params: TParams) => Promise<TResult>;
|
|
39
|
+
successMessage?: string;
|
|
40
|
+
errorMessage?: string;
|
|
41
|
+
}
|
|
42
|
+
interface CrudProviderProps<T> {
|
|
43
|
+
children: ReactNode;
|
|
44
|
+
getPromise?: ((params?: Record<string, any>) => Promise<Array<T> | PaginationInterface<T> | undefined>) | PromiseWithOptions<Array<T> | PaginationInterface<T> | undefined, [
|
|
45
|
+
params?: Record<string, any>
|
|
46
|
+
]>;
|
|
47
|
+
getItemPromise?: ((params?: Record<string, any> | string | number) => Promise<T | undefined>) | PromiseWithOptions<T | undefined, [
|
|
48
|
+
params?: Record<string, any> | string | number
|
|
49
|
+
]>;
|
|
50
|
+
postPromise?: ((item: T) => Promise<T | undefined | null>) | PromiseWithOptions<T | undefined | null, [item: T]>;
|
|
51
|
+
putPromise?: ((item: T) => Promise<T | undefined | null>) | PromiseWithOptions<T | undefined | null, [item: T]>;
|
|
52
|
+
deletePromise?: ((item: T) => Promise<void>) | PromiseWithOptions<void, [item: T]>;
|
|
53
|
+
urlParams?: Array<string>;
|
|
54
|
+
limit?: number;
|
|
55
|
+
pageParam?: string;
|
|
56
|
+
singleItemId?: string | number;
|
|
57
|
+
extraData?: Record<string, any>;
|
|
58
|
+
}
|
|
59
|
+
export declare function CrudProvider<T>({ children, getPromise, getItemPromise, postPromise, putPromise, deletePromise, limit, pageParam, urlParams, singleItemId, extraData: extraDataProp, }: CrudProviderProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
60
|
+
export declare function useCrud<T>(): CrudContextType<T>;
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=CrudContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrudContext.d.ts","sourceRoot":"","sources":["../../src/contexts/CrudContext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useEffect, useMemo, useRef, useState, useCallback, } from "react";
|
|
3
|
+
import { useSearchParams } from "react-router-dom";
|
|
4
|
+
import { Pagination, } from "../components/form-controls/Pagination";
|
|
5
|
+
import { useAsyncRequest } from "../hooks/useAsyncRequest";
|
|
6
|
+
const createCrudContext = () => {
|
|
7
|
+
return createContext(undefined);
|
|
8
|
+
};
|
|
9
|
+
// Crear el contexto con un tipo genérico por defecto
|
|
10
|
+
// Los usuarios pueden crear su propio contexto con su tipo específico
|
|
11
|
+
export const CrudContext = createCrudContext();
|
|
12
|
+
export function CrudProvider({ children, getPromise, getItemPromise, postPromise, putPromise, deletePromise, limit = 15, pageParam = "pagina", urlParams = [], singleItemId, extraData: extraDataProp, }) {
|
|
13
|
+
const [extraData, setExtraData] = useState(extraDataProp);
|
|
14
|
+
const [list, setList] = useState(undefined);
|
|
15
|
+
const [item, setItem] = useState(undefined);
|
|
16
|
+
const [page, setPage] = useState(1);
|
|
17
|
+
const [pages, setPages] = useState(1);
|
|
18
|
+
const [total, setTotal] = useState(0);
|
|
19
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
20
|
+
// Extraer funciones execute y opciones de las promises
|
|
21
|
+
const getPromiseExecute = getPromise
|
|
22
|
+
? typeof getPromise === "function"
|
|
23
|
+
? getPromise
|
|
24
|
+
: getPromise.execute
|
|
25
|
+
: undefined;
|
|
26
|
+
const getPromiseSuccessMessage = getPromise && typeof getPromise === "object"
|
|
27
|
+
? getPromise.successMessage
|
|
28
|
+
: undefined;
|
|
29
|
+
const getPromiseErrorMessage = getPromise && typeof getPromise === "object"
|
|
30
|
+
? getPromise.errorMessage
|
|
31
|
+
: undefined;
|
|
32
|
+
const postPromiseExecute = postPromise
|
|
33
|
+
? typeof postPromise === "function"
|
|
34
|
+
? postPromise
|
|
35
|
+
: postPromise.execute
|
|
36
|
+
: undefined;
|
|
37
|
+
const postPromiseSuccessMessage = postPromise && typeof postPromise === "object"
|
|
38
|
+
? postPromise.successMessage
|
|
39
|
+
: undefined;
|
|
40
|
+
const postPromiseErrorMessage = postPromise && typeof postPromise === "object"
|
|
41
|
+
? postPromise.errorMessage
|
|
42
|
+
: undefined;
|
|
43
|
+
const putPromiseExecute = putPromise
|
|
44
|
+
? typeof putPromise === "function"
|
|
45
|
+
? putPromise
|
|
46
|
+
: putPromise.execute
|
|
47
|
+
: undefined;
|
|
48
|
+
const putPromiseSuccessMessage = putPromise && typeof putPromise === "object"
|
|
49
|
+
? putPromise.successMessage
|
|
50
|
+
: undefined;
|
|
51
|
+
const putPromiseErrorMessage = putPromise && typeof putPromise === "object"
|
|
52
|
+
? putPromise.errorMessage
|
|
53
|
+
: undefined;
|
|
54
|
+
const deletePromiseExecute = deletePromise
|
|
55
|
+
? typeof deletePromise === "function"
|
|
56
|
+
? deletePromise
|
|
57
|
+
: deletePromise.execute
|
|
58
|
+
: undefined;
|
|
59
|
+
const deletePromiseSuccessMessage = deletePromise && typeof deletePromise === "object"
|
|
60
|
+
? deletePromise.successMessage
|
|
61
|
+
: undefined;
|
|
62
|
+
const deletePromiseErrorMessage = deletePromise && typeof deletePromise === "object"
|
|
63
|
+
? deletePromise.errorMessage
|
|
64
|
+
: undefined;
|
|
65
|
+
const getItemPromiseExecute = getItemPromise
|
|
66
|
+
? typeof getItemPromise === "function"
|
|
67
|
+
? getItemPromise
|
|
68
|
+
: getItemPromise.execute
|
|
69
|
+
: undefined;
|
|
70
|
+
const getItemPromiseSuccessMessage = getItemPromise && typeof getItemPromise === "object"
|
|
71
|
+
? getItemPromise.successMessage
|
|
72
|
+
: undefined;
|
|
73
|
+
const getItemPromiseErrorMessage = getItemPromise && typeof getItemPromise === "object"
|
|
74
|
+
? getItemPromise.errorMessage
|
|
75
|
+
: undefined;
|
|
76
|
+
const getPromiseRef = useRef(getPromiseExecute);
|
|
77
|
+
// Hooks para manejar las peticiones asíncronas con mensajes opcionales
|
|
78
|
+
const fetchDataAsync = useAsyncRequest({
|
|
79
|
+
successMessage: getPromiseSuccessMessage,
|
|
80
|
+
errorMessage: getPromiseErrorMessage,
|
|
81
|
+
});
|
|
82
|
+
const createItemAsync = useAsyncRequest({
|
|
83
|
+
successMessage: postPromiseSuccessMessage,
|
|
84
|
+
errorMessage: postPromiseErrorMessage,
|
|
85
|
+
});
|
|
86
|
+
const updateItemAsync = useAsyncRequest({
|
|
87
|
+
successMessage: putPromiseSuccessMessage,
|
|
88
|
+
errorMessage: putPromiseErrorMessage,
|
|
89
|
+
});
|
|
90
|
+
const deleteItemAsync = useAsyncRequest({
|
|
91
|
+
successMessage: deletePromiseSuccessMessage,
|
|
92
|
+
errorMessage: deletePromiseErrorMessage,
|
|
93
|
+
});
|
|
94
|
+
const fetchItemAsync = useAsyncRequest({
|
|
95
|
+
successMessage: getItemPromiseSuccessMessage,
|
|
96
|
+
errorMessage: getItemPromiseErrorMessage,
|
|
97
|
+
});
|
|
98
|
+
// El isLoading del contexto usa el hook de fetchData
|
|
99
|
+
const isLoading = fetchDataAsync.isLoading;
|
|
100
|
+
// Actualizar la referencia cuando cambie getPromise
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
getPromiseRef.current = getPromiseExecute;
|
|
103
|
+
}, [getPromiseExecute]);
|
|
104
|
+
// Función para obtener los parámetros de la URL
|
|
105
|
+
const getUrlParams = useCallback(() => {
|
|
106
|
+
const params = { limit };
|
|
107
|
+
// Agregar pageParam si existe en la URL
|
|
108
|
+
const pageValue = searchParams.get(pageParam);
|
|
109
|
+
if (pageValue) {
|
|
110
|
+
const parsedPage = parseInt(pageValue, 10);
|
|
111
|
+
if (!isNaN(parsedPage)) {
|
|
112
|
+
params[pageParam] = parsedPage;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Agregar urlParams si existen en la URL
|
|
116
|
+
urlParams.forEach((paramName) => {
|
|
117
|
+
const paramValue = searchParams.get(paramName);
|
|
118
|
+
if (paramValue !== null) {
|
|
119
|
+
params[paramName] = paramValue;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
return params;
|
|
123
|
+
}, [searchParams, pageParam, urlParams, limit]);
|
|
124
|
+
// Función para obtener los datos
|
|
125
|
+
const fetchData = useCallback(async (params) => {
|
|
126
|
+
if (!getPromiseExecute) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// Obtener los parámetros que se van a usar
|
|
130
|
+
const requestParams = params || getUrlParams();
|
|
131
|
+
const result = await fetchDataAsync.execute(async () => {
|
|
132
|
+
return await getPromiseRef.current(requestParams);
|
|
133
|
+
});
|
|
134
|
+
// Solo procesar el resultado si no es undefined (undefined significa error)
|
|
135
|
+
if (result !== undefined) {
|
|
136
|
+
if (result && typeof result === "object" && "list" in result) {
|
|
137
|
+
// Es un PaginationInterface
|
|
138
|
+
const { list, page, pages, total } = result;
|
|
139
|
+
setList(list);
|
|
140
|
+
setPage(page);
|
|
141
|
+
setPages(pages);
|
|
142
|
+
setTotal(total);
|
|
143
|
+
}
|
|
144
|
+
else if (Array.isArray(result)) {
|
|
145
|
+
// Es un array simple
|
|
146
|
+
setList(result);
|
|
147
|
+
setPage(1);
|
|
148
|
+
setTotal(result.length);
|
|
149
|
+
setPages(Math.ceil(result.length / limit));
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// Resultado null
|
|
153
|
+
setList(undefined);
|
|
154
|
+
setPage(1);
|
|
155
|
+
setPages(1);
|
|
156
|
+
setTotal(0);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}, [getUrlParams, limit, fetchDataAsync, getPromiseExecute]);
|
|
160
|
+
// Ref para almacenar los valores anteriores de urlParams
|
|
161
|
+
const prevUrlParamsValuesRef = useRef({});
|
|
162
|
+
// Memoizar los valores actuales de los urlParams
|
|
163
|
+
const urlParamsValues = useMemo(() => {
|
|
164
|
+
const values = {};
|
|
165
|
+
urlParams.forEach((paramName) => {
|
|
166
|
+
values[paramName] = searchParams.get(paramName);
|
|
167
|
+
});
|
|
168
|
+
return values;
|
|
169
|
+
}, [searchParams, urlParams]);
|
|
170
|
+
// Memoizar los parámetros de URL para evitar re-renders innecesarios
|
|
171
|
+
const urlParamsKey = useMemo(() => urlParams.join(","), [urlParams]);
|
|
172
|
+
// Memoizar solo los parámetros relevantes de la URL (urlParams + pageParam)
|
|
173
|
+
// para que el useEffect solo se ejecute cuando cambien estos parámetros
|
|
174
|
+
const relevantParamsKey = useMemo(() => {
|
|
175
|
+
const relevantParams = {};
|
|
176
|
+
// Agregar pageParam si existe
|
|
177
|
+
const pageValue = searchParams.get(pageParam);
|
|
178
|
+
if (pageValue) {
|
|
179
|
+
relevantParams[pageParam] = pageValue;
|
|
180
|
+
}
|
|
181
|
+
// Agregar urlParams si existen
|
|
182
|
+
urlParams.forEach((paramName) => {
|
|
183
|
+
const paramValue = searchParams.get(paramName);
|
|
184
|
+
if (paramValue !== null) {
|
|
185
|
+
relevantParams[paramName] = paramValue;
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
return JSON.stringify(relevantParams);
|
|
189
|
+
}, [searchParams, pageParam, urlParams]);
|
|
190
|
+
// Memoizar los parámetros actuales para exponerlos
|
|
191
|
+
const currentParams = useMemo(() => getUrlParams(),
|
|
192
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
193
|
+
[searchParams, pageParam, urlParamsKey, limit, urlParams]);
|
|
194
|
+
// Función para recargar los datos
|
|
195
|
+
const fetchItemsExecute = useCallback(async (params) => {
|
|
196
|
+
await fetchData(params);
|
|
197
|
+
}, [fetchData]);
|
|
198
|
+
// Función para obtener un item individual
|
|
199
|
+
const fetchItemExecute = useCallback(async (params) => {
|
|
200
|
+
if (!getItemPromiseExecute) {
|
|
201
|
+
throw new Error("getItemPromise is not defined. Please provide getItemPromise to CrudProvider.");
|
|
202
|
+
}
|
|
203
|
+
// Si no se pasan parámetros, usar singleItemId si está disponible
|
|
204
|
+
const finalParams = params !== undefined ? params : singleItemId;
|
|
205
|
+
if (finalParams === undefined) {
|
|
206
|
+
throw new Error("No parameters provided and singleItemId is not defined. Please provide parameters or set singleItemId in CrudProvider.");
|
|
207
|
+
}
|
|
208
|
+
const result = await fetchItemAsync.execute(async () => {
|
|
209
|
+
return await getItemPromiseExecute(finalParams);
|
|
210
|
+
});
|
|
211
|
+
if (result !== undefined) {
|
|
212
|
+
setItem(result);
|
|
213
|
+
}
|
|
214
|
+
return result;
|
|
215
|
+
}, [getItemPromiseExecute, fetchItemAsync, singleItemId]);
|
|
216
|
+
// Función para crear un item
|
|
217
|
+
const createItemExecute = useCallback(async (item) => {
|
|
218
|
+
if (!postPromiseExecute) {
|
|
219
|
+
throw new Error("postPromise is not defined. Please provide postPromise to CrudProvider.");
|
|
220
|
+
}
|
|
221
|
+
return await createItemAsync.execute(async () => {
|
|
222
|
+
return await postPromiseExecute(item);
|
|
223
|
+
});
|
|
224
|
+
}, [postPromiseExecute, createItemAsync]);
|
|
225
|
+
// Función para actualizar un item
|
|
226
|
+
const updateItemExecute = useCallback(async (item) => {
|
|
227
|
+
if (!putPromiseExecute) {
|
|
228
|
+
throw new Error("putPromise is not defined. Please provide putPromise to CrudProvider.");
|
|
229
|
+
}
|
|
230
|
+
return await updateItemAsync.execute(async () => {
|
|
231
|
+
return await putPromiseExecute(item);
|
|
232
|
+
});
|
|
233
|
+
}, [putPromiseExecute, updateItemAsync]);
|
|
234
|
+
// Función para eliminar un item
|
|
235
|
+
const deleteItemExecute = useCallback(async (item) => {
|
|
236
|
+
if (!deletePromiseExecute) {
|
|
237
|
+
throw new Error("deletePromise is not defined. Please provide deletePromise to CrudProvider.");
|
|
238
|
+
}
|
|
239
|
+
await deleteItemAsync.execute(async () => {
|
|
240
|
+
await deletePromiseExecute(item);
|
|
241
|
+
});
|
|
242
|
+
}, [deletePromiseExecute, deleteItemAsync]);
|
|
243
|
+
// useEffect para resetear pageParam a 1 cuando cambien los urlParams
|
|
244
|
+
useEffect(() => {
|
|
245
|
+
// Verificar si hay algún urlParam definido
|
|
246
|
+
if (urlParams.length === 0) {
|
|
247
|
+
prevUrlParamsValuesRef.current = {};
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
// Comparar valores actuales con los anteriores
|
|
251
|
+
const prevValues = prevUrlParamsValuesRef.current;
|
|
252
|
+
const hasChanged = urlParams.some((paramName) => prevValues[paramName] !== urlParamsValues[paramName]);
|
|
253
|
+
// Si los urlParams cambiaron, resetear pageParam a 1
|
|
254
|
+
if (hasChanged) {
|
|
255
|
+
const currentPage = searchParams.get(pageParam);
|
|
256
|
+
if (currentPage && currentPage !== "1") {
|
|
257
|
+
const newSearchParams = new URLSearchParams(searchParams);
|
|
258
|
+
newSearchParams.set(pageParam, "1");
|
|
259
|
+
setSearchParams(newSearchParams, { replace: true });
|
|
260
|
+
// No hacer fetchData aquí, se hará cuando cambien los searchParams
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Actualizar los valores anteriores
|
|
265
|
+
prevUrlParamsValuesRef.current = { ...urlParamsValues };
|
|
266
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
267
|
+
}, [JSON.stringify(urlParamsValues), pageParam, urlParamsKey]);
|
|
268
|
+
// useEffect para ejecutar fetchData cuando cambian los parámetros relevantes o getPromise
|
|
269
|
+
useEffect(() => {
|
|
270
|
+
if (!getPromiseExecute) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const timeoutId = setTimeout(() => {
|
|
274
|
+
fetchData();
|
|
275
|
+
}, 0);
|
|
276
|
+
return () => clearTimeout(timeoutId);
|
|
277
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
278
|
+
}, [relevantParamsKey, getPromiseExecute]);
|
|
279
|
+
// useEffect para obtener el item individual cuando cambie singleItemId
|
|
280
|
+
useEffect(() => {
|
|
281
|
+
if (singleItemId !== undefined && getItemPromiseExecute) {
|
|
282
|
+
fetchItemExecute(singleItemId);
|
|
283
|
+
}
|
|
284
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
285
|
+
}, [singleItemId]);
|
|
286
|
+
// Sincronizar extraDataProp con el estado local
|
|
287
|
+
useEffect(() => {
|
|
288
|
+
setExtraData(extraDataProp);
|
|
289
|
+
}, [extraDataProp]);
|
|
290
|
+
const value = {
|
|
291
|
+
list,
|
|
292
|
+
item,
|
|
293
|
+
page,
|
|
294
|
+
pages,
|
|
295
|
+
total,
|
|
296
|
+
limit,
|
|
297
|
+
isLoading,
|
|
298
|
+
params: currentParams,
|
|
299
|
+
fetchItems: {
|
|
300
|
+
execute: fetchItemsExecute,
|
|
301
|
+
isLoading: fetchDataAsync.isLoading,
|
|
302
|
+
},
|
|
303
|
+
fetchItem: {
|
|
304
|
+
execute: fetchItemExecute,
|
|
305
|
+
isLoading: fetchItemAsync.isLoading,
|
|
306
|
+
},
|
|
307
|
+
createItem: {
|
|
308
|
+
execute: createItemExecute,
|
|
309
|
+
isLoading: createItemAsync.isLoading,
|
|
310
|
+
},
|
|
311
|
+
updateItem: {
|
|
312
|
+
execute: updateItemExecute,
|
|
313
|
+
isLoading: updateItemAsync.isLoading,
|
|
314
|
+
},
|
|
315
|
+
deleteItem: {
|
|
316
|
+
execute: deleteItemExecute,
|
|
317
|
+
isLoading: deleteItemAsync.isLoading,
|
|
318
|
+
},
|
|
319
|
+
pagination: (_jsx(Pagination, { page: page, pages: pages, total: total, fieldName: pageParam, isLoading: isLoading })),
|
|
320
|
+
extraData,
|
|
321
|
+
setExtraData,
|
|
322
|
+
};
|
|
323
|
+
return _jsx(CrudContext.Provider, { value: value, children: children });
|
|
324
|
+
}
|
|
325
|
+
// Hook to use Crud context
|
|
326
|
+
// eslint-disable-next-line react-refresh/only-export-components
|
|
327
|
+
export function useCrud() {
|
|
328
|
+
const context = useContext(CrudContext);
|
|
329
|
+
if (context === undefined) {
|
|
330
|
+
throw new Error("useCrud must be used within a CrudProvider");
|
|
331
|
+
}
|
|
332
|
+
return context;
|
|
333
|
+
}
|
package/dist/contexts/index.d.ts
CHANGED
|
@@ -4,8 +4,8 @@ export type { Theme, ThemeContextType, ThemeOverride } from "./types";
|
|
|
4
4
|
export { lightTheme, darkTheme, blueTheme, greenTheme, defaultTheme, themes, } from "./presets";
|
|
5
5
|
export { AuthProvider, AuthContext } from "./AuthContext";
|
|
6
6
|
export type { AuthContextType, AuthContextUserInterface, AuthTokenInterface, } from "./AuthContext";
|
|
7
|
-
export {
|
|
8
|
-
export type {
|
|
7
|
+
export { CrudProvider, CrudContext, useCrud } from "./CrudContext";
|
|
8
|
+
export type { CrudContextType } from "./CrudContext";
|
|
9
9
|
export { AppLayoutProvider, useAppLayout, useAppLayoutContext } from "./AppLayoutContext";
|
|
10
10
|
export type { AppLayoutContextType, NavbarInterface, LeftDrawerInterface, } from "./AppLayoutContext";
|
|
11
11
|
export { SnackbarProvider, useSnackbar } from "./SnackbarContext";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contexts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtE,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,MAAM,GACP,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contexts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtE,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,MAAM,GACP,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
|
package/dist/contexts/index.js
CHANGED
|
@@ -5,8 +5,8 @@ export { useThemeOverride, useTemporaryOverride, } from "../hooks/useThemeOverri
|
|
|
5
5
|
export { lightTheme, darkTheme, blueTheme, greenTheme, defaultTheme, themes, } from "./presets";
|
|
6
6
|
// Auth system exports
|
|
7
7
|
export { AuthProvider, AuthContext } from "./AuthContext";
|
|
8
|
-
//
|
|
9
|
-
export {
|
|
8
|
+
// Crud system exports
|
|
9
|
+
export { CrudProvider, CrudContext, useCrud } from "./CrudContext";
|
|
10
10
|
// AppLayout system exports
|
|
11
11
|
export { AppLayoutProvider, useAppLayout, useAppLayoutContext } from "./AppLayoutContext";
|
|
12
12
|
// Snackbar system exports
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccordionDocs.d.ts","sourceRoot":"","sources":["../../src/docs/AccordionDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC,EAwuB1B,CAAC;AAEF,eAAe,aAAa,CAAC"}
|