flysoft-react-ui 0.4.0 → 0.5.2
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 +20 -4
- package/dist/components/form-controls/AutocompleteInput.d.ts +11 -3
- package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
- package/dist/components/form-controls/AutocompleteInput.js +410 -31
- package/dist/components/form-controls/Button.js +1 -1
- package/dist/components/form-controls/Checkbox.d.ts +14 -0
- package/dist/components/form-controls/Checkbox.d.ts.map +1 -0
- package/dist/components/form-controls/Checkbox.js +77 -0
- package/dist/components/form-controls/DateInput.d.ts +20 -4
- package/dist/components/form-controls/DateInput.d.ts.map +1 -1
- package/dist/components/form-controls/DateInput.js +425 -70
- package/dist/components/form-controls/DatePicker.d.ts +4 -3
- package/dist/components/form-controls/DatePicker.d.ts.map +1 -1
- package/dist/components/form-controls/DatePicker.js +26 -30
- package/dist/components/form-controls/Input.d.ts +10 -1
- package/dist/components/form-controls/Input.d.ts.map +1 -1
- package/dist/components/form-controls/Input.js +16 -10
- package/dist/components/form-controls/Pagination.d.ts +1 -0
- package/dist/components/form-controls/Pagination.d.ts.map +1 -1
- package/dist/components/form-controls/Pagination.js +3 -40
- package/dist/components/form-controls/RadioButtonGroup.d.ts +62 -0
- package/dist/components/form-controls/RadioButtonGroup.d.ts.map +1 -0
- package/dist/components/form-controls/RadioButtonGroup.js +220 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.d.ts +68 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.js +962 -0
- package/dist/components/form-controls/SearchSelectInput.d.ts +70 -0
- package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -0
- package/dist/components/form-controls/SearchSelectInput.js +335 -0
- package/dist/components/form-controls/index.d.ts +7 -1
- package/dist/components/form-controls/index.d.ts.map +1 -1
- package/dist/components/form-controls/index.js +3 -0
- package/dist/components/layout/AppLayout.d.ts +3 -2
- package/dist/components/layout/AppLayout.d.ts.map +1 -1
- package/dist/components/layout/AppLayout.js +104 -31
- package/dist/components/layout/Card.d.ts +4 -1
- package/dist/components/layout/Card.d.ts.map +1 -1
- package/dist/components/layout/Card.js +30 -1
- package/dist/components/layout/Collection.js +1 -1
- package/dist/components/layout/DataTable.d.ts +29 -0
- package/dist/components/layout/DataTable.d.ts.map +1 -0
- package/dist/components/layout/DataTable.js +165 -0
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +1 -0
- package/dist/components/utils/Avatar.d.ts +49 -0
- package/dist/components/utils/Avatar.d.ts.map +1 -0
- package/dist/components/utils/Avatar.js +93 -0
- package/dist/components/utils/Badge.d.ts +3 -0
- package/dist/components/utils/Badge.d.ts.map +1 -1
- package/dist/components/utils/Badge.js +130 -26
- package/dist/components/utils/Dialog.d.ts.map +1 -1
- package/dist/components/utils/Dialog.js +5 -1
- package/dist/components/utils/DropdownMenu.d.ts +25 -0
- package/dist/components/utils/DropdownMenu.d.ts.map +1 -0
- package/dist/components/utils/DropdownMenu.js +145 -0
- package/dist/components/utils/Filter.d.ts +57 -0
- package/dist/components/utils/Filter.d.ts.map +1 -0
- package/dist/components/utils/Filter.js +580 -0
- package/dist/components/utils/FiltersDialog.d.ts +21 -0
- package/dist/components/utils/FiltersDialog.d.ts.map +1 -0
- package/dist/components/utils/FiltersDialog.js +104 -0
- package/dist/components/utils/Loader.js +1 -1
- package/dist/components/utils/RoadMap.d.ts +59 -0
- package/dist/components/utils/RoadMap.d.ts.map +1 -0
- package/dist/components/utils/RoadMap.js +138 -0
- package/dist/components/utils/Snackbar.d.ts +13 -0
- package/dist/components/utils/Snackbar.d.ts.map +1 -0
- package/dist/components/utils/Snackbar.js +121 -0
- package/dist/components/utils/SnackbarContainer.d.ts +7 -0
- package/dist/components/utils/SnackbarContainer.d.ts.map +1 -0
- package/dist/components/utils/SnackbarContainer.js +25 -0
- package/dist/components/utils/index.d.ts +12 -0
- package/dist/components/utils/index.d.ts.map +1 -1
- package/dist/components/utils/index.js +6 -0
- package/dist/contexts/AppLayoutContext.d.ts +40 -0
- package/dist/contexts/AppLayoutContext.d.ts.map +1 -0
- package/dist/contexts/AppLayoutContext.js +98 -0
- package/dist/contexts/ListCrudContext.d.ts +29 -0
- package/dist/contexts/ListCrudContext.d.ts.map +1 -0
- package/dist/contexts/ListCrudContext.js +209 -0
- package/dist/contexts/SnackbarContext.d.ts +26 -0
- package/dist/contexts/SnackbarContext.d.ts.map +1 -0
- package/dist/contexts/SnackbarContext.js +34 -0
- package/dist/contexts/index.d.ts +6 -0
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/contexts/index.js +6 -0
- package/dist/contexts/presets.js +6 -6
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -1
- package/dist/docs/AvatarDocs.d.ts +4 -0
- package/dist/docs/AvatarDocs.d.ts.map +1 -0
- package/dist/docs/AvatarDocs.js +7 -0
- package/dist/docs/BadgeDocs.d.ts.map +1 -1
- package/dist/docs/BadgeDocs.js +4 -2
- package/dist/docs/CardDocs.d.ts.map +1 -1
- package/dist/docs/CardDocs.js +7 -1
- package/dist/docs/CheckboxDocs.d.ts +4 -0
- package/dist/docs/CheckboxDocs.d.ts.map +1 -0
- package/dist/docs/CheckboxDocs.js +7 -0
- package/dist/docs/DataTableDocs.d.ts +4 -0
- package/dist/docs/DataTableDocs.d.ts.map +1 -0
- package/dist/docs/DataTableDocs.js +244 -0
- package/dist/docs/DateInputDocs.d.ts +1 -0
- package/dist/docs/DateInputDocs.d.ts.map +1 -1
- package/dist/docs/DateInputDocs.js +7 -9
- package/dist/docs/DatePickerDocs.d.ts +1 -0
- package/dist/docs/DatePickerDocs.d.ts.map +1 -1
- package/dist/docs/DatePickerDocs.js +6 -8
- package/dist/docs/DocAdmin.d.ts +4 -0
- package/dist/docs/DocAdmin.d.ts.map +1 -0
- package/dist/docs/DocAdmin.js +68 -0
- package/dist/docs/DocsMenu.d.ts.map +1 -1
- package/dist/docs/DocsMenu.js +1 -1
- package/dist/docs/DocsRouter.d.ts.map +1 -1
- package/dist/docs/DocsRouter.js +13 -1
- package/dist/docs/DropdownMenuDocs.d.ts +4 -0
- package/dist/docs/DropdownMenuDocs.d.ts.map +1 -0
- package/dist/docs/DropdownMenuDocs.js +66 -0
- package/dist/docs/ExampleFormDocs.d.ts +4 -0
- package/dist/docs/ExampleFormDocs.d.ts.map +1 -0
- package/dist/docs/ExampleFormDocs.js +148 -0
- package/dist/docs/FilterDocs.d.ts +4 -0
- package/dist/docs/FilterDocs.d.ts.map +1 -0
- package/dist/docs/FilterDocs.js +112 -0
- package/dist/docs/InputDocs.d.ts.map +1 -1
- package/dist/docs/InputDocs.js +11 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +11 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +25 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +51 -0
- package/dist/docs/PaginationDocs.js +6 -6
- package/dist/docs/RadioButtonGroupDocs.d.ts +4 -0
- package/dist/docs/RadioButtonGroupDocs.d.ts.map +1 -0
- package/dist/docs/RadioButtonGroupDocs.js +46 -0
- package/dist/docs/RoadMapDocs.d.ts +4 -0
- package/dist/docs/RoadMapDocs.d.ts.map +1 -0
- package/dist/docs/RoadMapDocs.js +171 -0
- package/dist/docs/SearchSelectInputDocs.d.ts +4 -0
- package/dist/docs/SearchSelectInputDocs.d.ts.map +1 -0
- package/dist/docs/SearchSelectInputDocs.js +168 -0
- package/dist/docs/SnackbarDocs.d.ts +4 -0
- package/dist/docs/SnackbarDocs.d.ts.map +1 -0
- package/dist/docs/SnackbarDocs.js +50 -0
- package/dist/docs/TabsGroupDocs.d.ts.map +1 -1
- package/dist/docs/TabsGroupDocs.js +12 -1
- package/dist/docs/docMockServices/empresaService.d.ts +38 -0
- package/dist/docs/docMockServices/empresaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/empresaService.js +116 -0
- package/dist/docs/docMockServices/index.d.ts +9 -0
- package/dist/docs/docMockServices/index.d.ts.map +1 -0
- package/dist/docs/docMockServices/index.js +8 -0
- package/dist/docs/docMockServices/initialData.d.ts +6 -0
- package/dist/docs/docMockServices/initialData.d.ts.map +1 -0
- package/dist/docs/docMockServices/initialData.js +132 -0
- package/dist/docs/docMockServices/interfaces.d.ts +26 -0
- package/dist/docs/docMockServices/interfaces.d.ts.map +1 -0
- package/dist/docs/docMockServices/interfaces.js +1 -0
- package/dist/docs/docMockServices/personaEmpresaService.d.ts +43 -0
- package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/personaEmpresaService.js +113 -0
- package/dist/docs/docMockServices/personaService.d.ts +39 -0
- package/dist/docs/docMockServices/personaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/personaService.js +180 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useAsyncRequest.d.ts +17 -0
- package/dist/hooks/useAsyncRequest.d.ts.map +1 -0
- package/dist/hooks/useAsyncRequest.js +70 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
const STORAGE_KEY = "docMockServices_personaEmpresas";
|
|
2
|
+
/**
|
|
3
|
+
* Simula un delay de red para hacer más realista el mock
|
|
4
|
+
*/
|
|
5
|
+
const simulateNetworkDelay = (ms = 500) => {
|
|
6
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Obtiene todas las relaciones del almacenamiento (método interno)
|
|
10
|
+
*/
|
|
11
|
+
const _obtenerTodas = () => {
|
|
12
|
+
const data = localStorage.getItem(STORAGE_KEY);
|
|
13
|
+
return data ? JSON.parse(data) : [];
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Servicio mock para gestionar relaciones Persona-Empresa en localStorage
|
|
17
|
+
*/
|
|
18
|
+
export const personaEmpresaService = {
|
|
19
|
+
/**
|
|
20
|
+
* Obtiene todas las relaciones
|
|
21
|
+
*/
|
|
22
|
+
async listar() {
|
|
23
|
+
await simulateNetworkDelay();
|
|
24
|
+
return _obtenerTodas();
|
|
25
|
+
},
|
|
26
|
+
/**
|
|
27
|
+
* Busca relaciones por ID de persona
|
|
28
|
+
*/
|
|
29
|
+
async buscarPorPersona(idPersona) {
|
|
30
|
+
await simulateNetworkDelay();
|
|
31
|
+
const relaciones = _obtenerTodas();
|
|
32
|
+
return relaciones.filter((rel) => rel.idPersona === idPersona);
|
|
33
|
+
},
|
|
34
|
+
/**
|
|
35
|
+
* Busca relaciones por ID de empresa
|
|
36
|
+
*/
|
|
37
|
+
async buscarPorEmpresa(idEmpresa) {
|
|
38
|
+
await simulateNetworkDelay();
|
|
39
|
+
const relaciones = _obtenerTodas();
|
|
40
|
+
return relaciones.filter((rel) => rel.idEmpresa === idEmpresa);
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Busca una relación específica por persona y empresa
|
|
44
|
+
*/
|
|
45
|
+
async buscarPorPersonaYEmpresa(idPersona, idEmpresa) {
|
|
46
|
+
await simulateNetworkDelay();
|
|
47
|
+
const relaciones = _obtenerTodas();
|
|
48
|
+
return relaciones.find((rel) => rel.idPersona === idPersona && rel.idEmpresa === idEmpresa);
|
|
49
|
+
},
|
|
50
|
+
/**
|
|
51
|
+
* Agrega una nueva relación
|
|
52
|
+
*/
|
|
53
|
+
async agregar(relacion) {
|
|
54
|
+
await simulateNetworkDelay();
|
|
55
|
+
const relaciones = _obtenerTodas();
|
|
56
|
+
// Verificar que no exista ya la relación
|
|
57
|
+
const existe = relaciones.some((rel) => rel.idPersona === relacion.idPersona &&
|
|
58
|
+
rel.idEmpresa === relacion.idEmpresa);
|
|
59
|
+
if (!existe) {
|
|
60
|
+
relaciones.push(relacion);
|
|
61
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(relaciones));
|
|
62
|
+
}
|
|
63
|
+
return relacion;
|
|
64
|
+
},
|
|
65
|
+
/**
|
|
66
|
+
* Edita una relación existente
|
|
67
|
+
*/
|
|
68
|
+
async editar(idPersona, idEmpresa, datos) {
|
|
69
|
+
await simulateNetworkDelay();
|
|
70
|
+
const relaciones = _obtenerTodas();
|
|
71
|
+
const index = relaciones.findIndex((rel) => rel.idPersona === idPersona && rel.idEmpresa === idEmpresa);
|
|
72
|
+
if (index === -1)
|
|
73
|
+
return null;
|
|
74
|
+
relaciones[index] = { ...relaciones[index], ...datos };
|
|
75
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(relaciones));
|
|
76
|
+
return relaciones[index];
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* Elimina una relación por persona y empresa
|
|
80
|
+
*/
|
|
81
|
+
async eliminar(idPersona, idEmpresa) {
|
|
82
|
+
await simulateNetworkDelay();
|
|
83
|
+
const relaciones = _obtenerTodas();
|
|
84
|
+
const index = relaciones.findIndex((rel) => rel.idPersona === idPersona && rel.idEmpresa === idEmpresa);
|
|
85
|
+
if (index === -1)
|
|
86
|
+
return false;
|
|
87
|
+
relaciones.splice(index, 1);
|
|
88
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(relaciones));
|
|
89
|
+
return true;
|
|
90
|
+
},
|
|
91
|
+
/**
|
|
92
|
+
* Elimina todas las relaciones de una persona
|
|
93
|
+
*/
|
|
94
|
+
async eliminarPorPersona(idPersona) {
|
|
95
|
+
await simulateNetworkDelay();
|
|
96
|
+
const relaciones = _obtenerTodas();
|
|
97
|
+
const inicialLength = relaciones.length;
|
|
98
|
+
const nuevasRelaciones = relaciones.filter((rel) => rel.idPersona !== idPersona);
|
|
99
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(nuevasRelaciones));
|
|
100
|
+
return inicialLength - nuevasRelaciones.length;
|
|
101
|
+
},
|
|
102
|
+
/**
|
|
103
|
+
* Elimina todas las relaciones de una empresa
|
|
104
|
+
*/
|
|
105
|
+
async eliminarPorEmpresa(idEmpresa) {
|
|
106
|
+
await simulateNetworkDelay();
|
|
107
|
+
const relaciones = _obtenerTodas();
|
|
108
|
+
const inicialLength = relaciones.length;
|
|
109
|
+
const nuevasRelaciones = relaciones.filter((rel) => rel.idEmpresa !== idEmpresa);
|
|
110
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(nuevasRelaciones));
|
|
111
|
+
return inicialLength - nuevasRelaciones.length;
|
|
112
|
+
},
|
|
113
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Persona, PersonaConEmpresas } from "./interfaces";
|
|
2
|
+
import type { PaginationInterface } from "../../components/form-controls/Pagination";
|
|
3
|
+
/**
|
|
4
|
+
* Servicio mock para gestionar Personas en localStorage
|
|
5
|
+
*/
|
|
6
|
+
export declare const personaService: {
|
|
7
|
+
/**
|
|
8
|
+
* Obtiene personas opcionalmente filtradas por nombre, con sus empresas relacionadas
|
|
9
|
+
*/
|
|
10
|
+
listar(params?: {
|
|
11
|
+
filtro?: string;
|
|
12
|
+
}): Promise<PersonaConEmpresas[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Obtiene personas paginadas opcionalmente filtradas por nombre y/o idEmpresa, con sus empresas relacionadas
|
|
15
|
+
*/
|
|
16
|
+
listarPaginados(params?: {
|
|
17
|
+
filtro?: string;
|
|
18
|
+
pagina?: string;
|
|
19
|
+
limit?: string;
|
|
20
|
+
idEmpresa?: string;
|
|
21
|
+
}): Promise<PaginationInterface<PersonaConEmpresas>>;
|
|
22
|
+
/**
|
|
23
|
+
* Busca una persona por ID
|
|
24
|
+
*/
|
|
25
|
+
buscarPorId(id: number): Promise<Persona | undefined>;
|
|
26
|
+
/**
|
|
27
|
+
* Agrega una nueva persona
|
|
28
|
+
*/
|
|
29
|
+
agregar(persona: Omit<Persona, "id">): Promise<Persona>;
|
|
30
|
+
/**
|
|
31
|
+
* Edita una persona existente
|
|
32
|
+
*/
|
|
33
|
+
editar(id: number, datos: Partial<Omit<Persona, "id">>): Promise<Persona | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Elimina una persona por ID
|
|
36
|
+
*/
|
|
37
|
+
eliminar(persona: Persona): Promise<void>;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=personaService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personaService.d.ts","sourceRoot":"","sources":["../../../src/docs/docMockServices/personaService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAW,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AA6DrF;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB;;OAEG;oBACmB;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAuBzE;;OAEG;6BAC4B;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IAoEpD;;OAEG;oBACmB,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAM3D;;OAEG;qBACoB,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB7D;;OAEG;eAEG,MAAM,SACH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAClC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAgB1B;;OAEG;sBACqB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAQhD,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
import { personaEmpresaService } from "./personaEmpresaService";
|
|
3
|
+
import { empresaService } from "./empresaService";
|
|
4
|
+
const STORAGE_KEY = "docMockServices_personas";
|
|
5
|
+
/**
|
|
6
|
+
* Simula un delay de red para hacer más realista el mock
|
|
7
|
+
*/
|
|
8
|
+
const simulateNetworkDelay = (ms = 500) => {
|
|
9
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Obtiene todas las personas del almacenamiento (función helper interna)
|
|
13
|
+
* Convierte las fechas de string ISO a dayjs
|
|
14
|
+
*/
|
|
15
|
+
const _obtenerTodas = () => {
|
|
16
|
+
const data = localStorage.getItem(STORAGE_KEY);
|
|
17
|
+
if (!data)
|
|
18
|
+
return [];
|
|
19
|
+
const personas = JSON.parse(data);
|
|
20
|
+
// Convertir fechaNacimiento de string ISO a dayjs
|
|
21
|
+
return personas.map((persona) => ({
|
|
22
|
+
...persona,
|
|
23
|
+
fechaNacimiento: dayjs(persona.fechaNacimiento),
|
|
24
|
+
}));
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Enriquece una persona con sus empresas relacionadas
|
|
28
|
+
* Optimizado para obtener todas las empresas de una vez
|
|
29
|
+
*/
|
|
30
|
+
const _enriquecerConEmpresas = async (persona, todasLasEmpresas) => {
|
|
31
|
+
const relaciones = await personaEmpresaService.buscarPorPersona(persona.id);
|
|
32
|
+
const empresasIds = relaciones.map((rel) => rel.idEmpresa);
|
|
33
|
+
let empresas = [];
|
|
34
|
+
if (todasLasEmpresas) {
|
|
35
|
+
// Si ya tenemos todas las empresas, filtrar por IDs
|
|
36
|
+
empresas = todasLasEmpresas.filter((emp) => empresasIds.includes(emp.id));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Si no, obtener cada empresa individualmente
|
|
40
|
+
for (const idEmpresa of empresasIds) {
|
|
41
|
+
const empresa = await empresaService.buscarPorId(idEmpresa);
|
|
42
|
+
if (empresa) {
|
|
43
|
+
empresas.push(empresa);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
...persona,
|
|
49
|
+
empresas,
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Servicio mock para gestionar Personas en localStorage
|
|
54
|
+
*/
|
|
55
|
+
export const personaService = {
|
|
56
|
+
/**
|
|
57
|
+
* Obtiene personas opcionalmente filtradas por nombre, con sus empresas relacionadas
|
|
58
|
+
*/
|
|
59
|
+
async listar(params) {
|
|
60
|
+
await simulateNetworkDelay();
|
|
61
|
+
const todas = _obtenerTodas();
|
|
62
|
+
let personasFiltradas = todas;
|
|
63
|
+
if (params?.filtro) {
|
|
64
|
+
const filtroLower = params.filtro.toLowerCase();
|
|
65
|
+
personasFiltradas = todas.filter((per) => per.nombre.toLowerCase().includes(filtroLower));
|
|
66
|
+
}
|
|
67
|
+
// Obtener todas las empresas de una vez para optimizar
|
|
68
|
+
const todasLasEmpresas = await empresaService.listar();
|
|
69
|
+
// Enriquecer cada persona con sus empresas
|
|
70
|
+
const personasConEmpresas = await Promise.all(personasFiltradas.map((p) => _enriquecerConEmpresas(p, todasLasEmpresas)));
|
|
71
|
+
return personasConEmpresas;
|
|
72
|
+
},
|
|
73
|
+
/**
|
|
74
|
+
* Obtiene personas paginadas opcionalmente filtradas por nombre y/o idEmpresa, con sus empresas relacionadas
|
|
75
|
+
*/
|
|
76
|
+
async listarPaginados(params) {
|
|
77
|
+
await simulateNetworkDelay();
|
|
78
|
+
const pagina = params?.pagina ?? 1;
|
|
79
|
+
const limit = params?.limit ?? 20;
|
|
80
|
+
const todas = _obtenerTodas();
|
|
81
|
+
let todasFiltradas = todas;
|
|
82
|
+
// Filtro por nombre
|
|
83
|
+
if (params?.filtro) {
|
|
84
|
+
const filtroLower = params.filtro.toLowerCase();
|
|
85
|
+
todasFiltradas = todasFiltradas.filter((per) => per.nombre.toLowerCase().includes(filtroLower));
|
|
86
|
+
}
|
|
87
|
+
// Filtro por idEmpresa: obtener todas las relaciones de esa empresa
|
|
88
|
+
// y filtrar las personas que tienen esa relación
|
|
89
|
+
if (params?.idEmpresa !== undefined) {
|
|
90
|
+
const relaciones = await personaEmpresaService.buscarPorEmpresa(Number(params.idEmpresa));
|
|
91
|
+
const personasIdsConEmpresa = new Set(relaciones.map((rel) => rel.idPersona));
|
|
92
|
+
todasFiltradas = todasFiltradas.filter((per) => personasIdsConEmpresa.has(per.id));
|
|
93
|
+
}
|
|
94
|
+
const total = todasFiltradas.length;
|
|
95
|
+
// Obtener todas las empresas de una vez para optimizar
|
|
96
|
+
const todasLasEmpresas = await empresaService.listar();
|
|
97
|
+
// Enriquecer cada persona con sus empresas antes de paginar
|
|
98
|
+
const personasConEmpresas = await Promise.all(todasFiltradas.map((p) => _enriquecerConEmpresas(p, todasLasEmpresas)));
|
|
99
|
+
const limitNumber = parseInt(limit.toString(), 10);
|
|
100
|
+
const paginaNumber = parseInt(pagina.toString(), 10);
|
|
101
|
+
const totalNumber = parseInt(total.toString(), 10);
|
|
102
|
+
// Si limit es 0, devolver todos los elementos sin paginar
|
|
103
|
+
if (limitNumber === 0) {
|
|
104
|
+
return {
|
|
105
|
+
list: personasConEmpresas,
|
|
106
|
+
limit: 0,
|
|
107
|
+
page: 1,
|
|
108
|
+
pages: 1,
|
|
109
|
+
total,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const pages = Math.ceil(totalNumber / limitNumber);
|
|
113
|
+
const inicio = (paginaNumber - 1) * limitNumber;
|
|
114
|
+
const fin = inicio + limitNumber;
|
|
115
|
+
const list = personasConEmpresas.slice(inicio, fin);
|
|
116
|
+
return {
|
|
117
|
+
list,
|
|
118
|
+
limit: limitNumber,
|
|
119
|
+
page: paginaNumber,
|
|
120
|
+
pages,
|
|
121
|
+
total,
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
/**
|
|
125
|
+
* Busca una persona por ID
|
|
126
|
+
*/
|
|
127
|
+
async buscarPorId(id) {
|
|
128
|
+
await simulateNetworkDelay();
|
|
129
|
+
const personas = _obtenerTodas();
|
|
130
|
+
return personas.find((per) => per.id === id);
|
|
131
|
+
},
|
|
132
|
+
/**
|
|
133
|
+
* Agrega una nueva persona
|
|
134
|
+
*/
|
|
135
|
+
async agregar(persona) {
|
|
136
|
+
await simulateNetworkDelay();
|
|
137
|
+
const personas = _obtenerTodas();
|
|
138
|
+
const nuevoId = personas.length > 0 ? Math.max(...personas.map((p) => p.id)) + 1 : 1;
|
|
139
|
+
const nuevaPersona = {
|
|
140
|
+
id: nuevoId,
|
|
141
|
+
...persona,
|
|
142
|
+
};
|
|
143
|
+
personas.push(nuevaPersona);
|
|
144
|
+
// Guardar convirtiendo fechaNacimiento a string ISO
|
|
145
|
+
const personasParaGuardar = personas.map((p) => ({
|
|
146
|
+
...p,
|
|
147
|
+
fechaNacimiento: p.fechaNacimiento.toISOString(),
|
|
148
|
+
}));
|
|
149
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(personasParaGuardar));
|
|
150
|
+
return nuevaPersona;
|
|
151
|
+
},
|
|
152
|
+
/**
|
|
153
|
+
* Edita una persona existente
|
|
154
|
+
*/
|
|
155
|
+
async editar(id, datos) {
|
|
156
|
+
await simulateNetworkDelay();
|
|
157
|
+
const personas = _obtenerTodas();
|
|
158
|
+
const index = personas.findIndex((per) => per.id === id);
|
|
159
|
+
if (index === -1)
|
|
160
|
+
return null;
|
|
161
|
+
personas[index] = { ...personas[index], ...datos };
|
|
162
|
+
// Guardar convirtiendo fechaNacimiento a string ISO
|
|
163
|
+
const personasParaGuardar = personas.map((p) => ({
|
|
164
|
+
...p,
|
|
165
|
+
fechaNacimiento: p.fechaNacimiento.toISOString(),
|
|
166
|
+
}));
|
|
167
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(personasParaGuardar));
|
|
168
|
+
return personas[index];
|
|
169
|
+
},
|
|
170
|
+
/**
|
|
171
|
+
* Elimina una persona por ID
|
|
172
|
+
*/
|
|
173
|
+
async eliminar(persona) {
|
|
174
|
+
await simulateNetworkDelay();
|
|
175
|
+
const personas = _obtenerTodas();
|
|
176
|
+
const index = personas.findIndex((per) => per.id === persona.id);
|
|
177
|
+
personas.splice(index, 1);
|
|
178
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(personas));
|
|
179
|
+
},
|
|
180
|
+
};
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -2,5 +2,7 @@ export { useThemeOverride, useTemporaryOverride } from "./useThemeOverride";
|
|
|
2
2
|
export { useGlobalThemeStyles } from "./useGlobalThemeStyles";
|
|
3
3
|
export { useBreakpoint } from "./useBreakpoint";
|
|
4
4
|
export { useElementScroll } from "./useElementScroll";
|
|
5
|
+
export { useAsyncRequest } from "./useAsyncRequest";
|
|
5
6
|
export type { Breakpoint, WindowSize, BreakpointInfo } from "./useBreakpoint";
|
|
7
|
+
export type { AsyncRequestOptions, UseAsyncRequestReturn } from "./useAsyncRequest";
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9E,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -2,3 +2,4 @@ export { useThemeOverride, useTemporaryOverride } from "./useThemeOverride";
|
|
|
2
2
|
export { useGlobalThemeStyles } from "./useGlobalThemeStyles";
|
|
3
3
|
export { useBreakpoint } from "./useBreakpoint";
|
|
4
4
|
export { useElementScroll } from "./useElementScroll";
|
|
5
|
+
export { useAsyncRequest } from "./useAsyncRequest";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SnackbarVariant } from "../contexts/SnackbarContext";
|
|
2
|
+
export interface AsyncRequestOptions {
|
|
3
|
+
successMessage?: string;
|
|
4
|
+
errorMessage?: string;
|
|
5
|
+
successVariant?: SnackbarVariant;
|
|
6
|
+
errorVariant?: SnackbarVariant;
|
|
7
|
+
onSuccess?: (data: any) => void;
|
|
8
|
+
onError?: (error: any) => void;
|
|
9
|
+
onFinally?: () => void;
|
|
10
|
+
}
|
|
11
|
+
export interface UseAsyncRequestReturn {
|
|
12
|
+
isLoading: boolean;
|
|
13
|
+
execute: <T>(requestFn: () => Promise<T>) => Promise<T | undefined>;
|
|
14
|
+
setLoading: (loading: boolean) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function useAsyncRequest(options?: AsyncRequestOptions): UseAsyncRequestReturn;
|
|
17
|
+
//# sourceMappingURL=useAsyncRequest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAsyncRequest.d.ts","sourceRoot":"","sources":["../../src/hooks/useAsyncRequest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACpE,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,eAAe,CAC7B,OAAO,GAAE,mBAAwB,GAChC,qBAAqB,CAqFvB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useState, useCallback } from "react";
|
|
2
|
+
import { useSnackbar } from "../contexts/SnackbarContext";
|
|
3
|
+
export function useAsyncRequest(options = {}) {
|
|
4
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
5
|
+
const { showSnackbar } = useSnackbar();
|
|
6
|
+
const { successMessage, errorMessage, successVariant = "success", errorVariant = "danger", onSuccess, onError, onFinally, } = options;
|
|
7
|
+
const execute = useCallback(async (requestFn) => {
|
|
8
|
+
setIsLoading(true);
|
|
9
|
+
try {
|
|
10
|
+
const result = await requestFn();
|
|
11
|
+
// Mostrar snackbar de éxito solo si existe successMessage
|
|
12
|
+
if (successMessage) {
|
|
13
|
+
console.log("TIENE SUCCESS MESSAGE", successMessage);
|
|
14
|
+
showSnackbar(successMessage, successVariant);
|
|
15
|
+
}
|
|
16
|
+
onSuccess?.(result);
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
console.error("Error en async request:", error);
|
|
21
|
+
// Determinar el mensaje de error:
|
|
22
|
+
// 1. Si existe errorMessage en las opciones, usarlo
|
|
23
|
+
// 2. Si no, intentar usar error.message
|
|
24
|
+
// 3. Si tampoco existe, usar un mensaje genérico
|
|
25
|
+
let finalErrorMessage;
|
|
26
|
+
if (errorMessage) {
|
|
27
|
+
finalErrorMessage = errorMessage;
|
|
28
|
+
}
|
|
29
|
+
else if (error instanceof Error && error.message) {
|
|
30
|
+
finalErrorMessage = error.message;
|
|
31
|
+
}
|
|
32
|
+
else if (error &&
|
|
33
|
+
typeof error === "object" &&
|
|
34
|
+
"message" in error &&
|
|
35
|
+
typeof error.message === "string") {
|
|
36
|
+
finalErrorMessage = error.message;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
finalErrorMessage = "Ha ocurrido un error";
|
|
40
|
+
}
|
|
41
|
+
// Mostrar snackbar de error solo si existe un mensaje de error
|
|
42
|
+
if (finalErrorMessage) {
|
|
43
|
+
showSnackbar(finalErrorMessage, errorVariant);
|
|
44
|
+
}
|
|
45
|
+
onError?.(error);
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
setIsLoading(false);
|
|
50
|
+
onFinally?.();
|
|
51
|
+
}
|
|
52
|
+
}, [
|
|
53
|
+
showSnackbar,
|
|
54
|
+
successMessage,
|
|
55
|
+
errorMessage,
|
|
56
|
+
successVariant,
|
|
57
|
+
errorVariant,
|
|
58
|
+
onSuccess,
|
|
59
|
+
onError,
|
|
60
|
+
onFinally,
|
|
61
|
+
]);
|
|
62
|
+
const setLoading = useCallback((loading) => {
|
|
63
|
+
setIsLoading(loading);
|
|
64
|
+
}, []);
|
|
65
|
+
return {
|
|
66
|
+
isLoading,
|
|
67
|
+
execute,
|
|
68
|
+
setLoading,
|
|
69
|
+
};
|
|
70
|
+
}
|