flysoft-react-ui 0.5.3 → 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.
Files changed (92) hide show
  1. package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
  2. package/dist/components/form-controls/AutocompleteInput.js +175 -130
  3. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -1
  4. package/dist/components/form-controls/SearchSelectInput-OLD.js +2 -2
  5. package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -1
  6. package/dist/components/form-controls/SearchSelectInput.js +1 -1
  7. package/dist/components/layout/AppLayout.d.ts.map +1 -1
  8. package/dist/components/layout/AppLayout.js +7 -7
  9. package/dist/components/layout/Card.d.ts.map +1 -1
  10. package/dist/components/layout/Card.js +4 -4
  11. package/dist/components/layout/DataTable.js +1 -1
  12. package/dist/components/layout/DropdownMenu.d.ts.map +1 -0
  13. package/dist/components/{utils → layout}/DropdownMenu.js +12 -6
  14. package/dist/components/layout/DropdownPanel.d.ts +7 -0
  15. package/dist/components/layout/DropdownPanel.d.ts.map +1 -0
  16. package/dist/components/layout/DropdownPanel.js +137 -0
  17. package/dist/components/{utils → layout}/Filter.d.ts +5 -0
  18. package/dist/components/layout/Filter.d.ts.map +1 -0
  19. package/dist/components/{utils → layout}/Filter.js +17 -9
  20. package/dist/components/layout/Menu.d.ts +31 -0
  21. package/dist/components/layout/Menu.d.ts.map +1 -0
  22. package/dist/components/layout/Menu.js +21 -0
  23. package/dist/components/layout/index.d.ts +8 -0
  24. package/dist/components/layout/index.d.ts.map +1 -1
  25. package/dist/components/layout/index.js +4 -0
  26. package/dist/components/utils/Dialog.d.ts +2 -2
  27. package/dist/components/utils/Dialog.d.ts.map +1 -1
  28. package/dist/components/utils/Dialog.js +2 -2
  29. package/dist/components/utils/FiltersDialog.d.ts +1 -1
  30. package/dist/components/utils/FiltersDialog.d.ts.map +1 -1
  31. package/dist/components/utils/FiltersDialog.js +2 -2
  32. package/dist/components/utils/index.d.ts +0 -2
  33. package/dist/components/utils/index.d.ts.map +1 -1
  34. package/dist/components/utils/index.js +0 -1
  35. package/dist/contexts/{ListCrudContext.d.ts → CrudContext.d.ts} +20 -8
  36. package/dist/contexts/CrudContext.d.ts.map +1 -0
  37. package/dist/contexts/{ListCrudContext.js → CrudContext.js} +102 -22
  38. package/dist/contexts/index.d.ts +2 -2
  39. package/dist/contexts/index.d.ts.map +1 -1
  40. package/dist/contexts/index.js +2 -2
  41. package/dist/docs/DialogDocs.d.ts.map +1 -1
  42. package/dist/docs/DialogDocs.js +1 -1
  43. package/dist/docs/DocsMenu.d.ts.map +1 -1
  44. package/dist/docs/DocsMenu.js +1 -1
  45. package/dist/docs/DocsRouter.d.ts.map +1 -1
  46. package/dist/docs/DocsRouter.js +3 -1
  47. package/dist/docs/DropdownPanelDocs.d.ts +4 -0
  48. package/dist/docs/DropdownPanelDocs.d.ts.map +1 -0
  49. package/dist/docs/DropdownPanelDocs.js +7 -0
  50. package/dist/docs/FilterDocs.d.ts.map +1 -1
  51. package/dist/docs/FilterDocs.js +19 -1
  52. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -1
  53. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +26 -14
  54. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts +2 -0
  55. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts.map +1 -0
  56. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.js +34 -0
  57. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts +2 -0
  58. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts.map +1 -0
  59. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.js +66 -0
  60. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -1
  61. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +5 -5
  62. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts +10 -0
  63. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map +1 -0
  64. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.js +39 -0
  65. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -1
  66. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +3 -3
  67. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -1
  68. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +4 -4
  69. package/dist/docs/MenuDocs.d.ts +4 -0
  70. package/dist/docs/MenuDocs.d.ts.map +1 -0
  71. package/dist/docs/MenuDocs.js +26 -0
  72. package/dist/docs/docMockServices/empresaService.d.ts +5 -5
  73. package/dist/docs/docMockServices/empresaService.d.ts.map +1 -1
  74. package/dist/docs/docMockServices/empresaService.js +18 -10
  75. package/dist/docs/docMockServices/interfaces.d.ts +12 -0
  76. package/dist/docs/docMockServices/interfaces.d.ts.map +1 -1
  77. package/dist/docs/docMockServices/personaEmpresaService.d.ts +6 -6
  78. package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -1
  79. package/dist/docs/docMockServices/personaEmpresaService.js +52 -14
  80. package/dist/docs/docMockServices/personaService.d.ts +1 -1
  81. package/dist/docs/docMockServices/personaService.d.ts.map +1 -1
  82. package/dist/docs/docMockServices/personaService.js +14 -5
  83. package/dist/index.css +1 -1
  84. package/dist/index.d.ts +8 -4
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +4 -2
  87. package/dist/index.js.map +1 -1
  88. package/package.json +4 -3
  89. package/dist/components/utils/DropdownMenu.d.ts.map +0 -1
  90. package/dist/components/utils/Filter.d.ts.map +0 -1
  91. package/dist/contexts/ListCrudContext.d.ts.map +0 -1
  92. /package/dist/components/{utils → layout}/DropdownMenu.d.ts +0 -0
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { personaEmpresaService } from "../docMockServices";
3
+ import { CrudProvider, useCrud } from "../../contexts";
4
+ import { Button, Card, Collection, Dialog, Input, Loader } from "../../components";
5
+ import { useNavigate } from "react-router-dom";
6
+ import { ListCrudDocsContentEmpresaPersonas } from "./ListCrudDocsContentEmpresaPersonas";
7
+ import { useEffect, useState, useCallback } from "react";
8
+ import { DropdownMenu } from "../../components/layout/DropdownMenu";
9
+ import { FormProvider, useForm } from "react-hook-form";
10
+ export const ListCrudDocsContentEmpresaSingle = () => {
11
+ const { item, fetchItem, fetchItems, updateItem, deleteItem } = useCrud();
12
+ const methods = useForm({
13
+ defaultValues: item,
14
+ });
15
+ const { buscarPorEmpresa, agregar, editar, eliminar } = personaEmpresaService;
16
+ const navigate = useNavigate();
17
+ const [isEditing, setIsEditing] = useState(false);
18
+ const [isOpenEliminarDialog, setIsOpenEliminarDialog] = useState(false);
19
+ const buscarPersonasPorEmpresa = useCallback(async () => {
20
+ if (!item?.id) {
21
+ return [];
22
+ }
23
+ const personas = await buscarPorEmpresa(item.id);
24
+ return personas;
25
+ }, [item?.id, buscarPorEmpresa]);
26
+ useEffect(() => {
27
+ if (item) {
28
+ methods.reset(item);
29
+ }
30
+ // eslint-disable-next-line react-hooks/exhaustive-deps
31
+ }, [item]);
32
+ const onSubmitEdit = async (empresa) => {
33
+ await updateItem.execute(empresa);
34
+ setIsEditing(false);
35
+ fetchItem.execute();
36
+ fetchItems.execute();
37
+ };
38
+ const onDeleteEmpresaSubmit = async () => {
39
+ await deleteItem.execute(item);
40
+ setIsOpenEliminarDialog(false);
41
+ navigate(-1);
42
+ fetchItems.execute();
43
+ };
44
+ return (_jsxs(_Fragment, { children: [_jsx(Card, { title: fetchItem.isLoading ? "" : item?.nombre, headerActions: !isEditing ? (_jsxs(Collection, { direction: "row", children: [_jsx(DropdownMenu, { options: [
45
+ { label: "Editar", icon: "fa-edit" },
46
+ { label: "Eliminar", icon: "fa-trash" },
47
+ ], onOptionSelected: (item) => {
48
+ if (item.label === "Editar") {
49
+ setIsEditing(true);
50
+ }
51
+ if (item.label === "Eliminar") {
52
+ setIsOpenEliminarDialog(true);
53
+ }
54
+ } }), _jsx(Button, { icon: "fa-undo", variant: "ghost", size: "sm", onClick: () => navigate(-1) })] })) : null, alwaysDisplayHeaderActions: true, footer: isEditing ? (_jsx("div", { className: "flex justify-end", children: _jsxs(Collection, { direction: "row", children: [_jsx(Button, { variant: "outline", onClick: () => setIsEditing(false), disabled: updateItem.isLoading, children: "Cancelar" }), _jsx(Button, { icon: "fa-save", onClick: methods.handleSubmit(onSubmitEdit), disabled: updateItem.isLoading, children: "Guardar" })] }) })) : null, children: !isEditing ? (_jsx(CrudProvider, { getPromise: buscarPersonasPorEmpresa, postPromise: {
55
+ execute: (persona) => agregar(persona),
56
+ successMessage: "Persona agregada correctamente",
57
+ }, putPromise: {
58
+ execute: (personaEmpresa) => editar(personaEmpresa.idPersona, personaEmpresa.idEmpresa, personaEmpresa),
59
+ successMessage: "Cambios guardados",
60
+ }, deletePromise: {
61
+ execute: (persona) => eliminar(persona),
62
+ successMessage: "Persona eliminada correctamente",
63
+ }, extraData: { idEmpresa: item?.id }, children: _jsx(ListCrudDocsContentEmpresaPersonas, {}) })) : (_jsx(FormProvider, { ...methods, children: _jsx("form", { onSubmit: methods.handleSubmit(onSubmitEdit), children: _jsx(Collection, { children: _jsx("div", { className: "w-[300px]", children: _jsx(Input, { label: "Nombre", ...methods.register("nombre", {
64
+ required: "Campo obligatorio",
65
+ }) }) }) }) }) })) }), isOpenEliminarDialog && (_jsxs(Dialog, { isOpen: isOpenEliminarDialog, title: "Eliminar Empresa", onClose: () => setIsOpenEliminarDialog(false), footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenEliminarDialog(false), disabled: deleteItem.isLoading, children: "Cancelar" }), _jsx(Button, { onClick: onDeleteEmpresaSubmit, disabled: deleteItem.isLoading, children: "Eliminar" })] }), children: [_jsx("p", { children: "\u00BFEst\u00E1s seguro de querer eliminar esta empresa?" }), _jsx(Loader, { isLoading: deleteItem.isLoading })] }))] }));
66
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"ListCrudDocsContentEmpresas.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,2BAA2B,+CAgBvC,CAAC"}
1
+ {"version":3,"file":"ListCrudDocsContentEmpresas.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,2BAA2B,+CAsCvC,CAAC"}
@@ -1,7 +1,7 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Card, Collection } from "../../components";
3
- import { useListCrud } from "../../contexts";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Card, Collection, Filter, LinkButton, Loader } from "../../components";
3
+ import { useCrud } from "../../contexts";
4
4
  export const ListCrudDocsContentEmpresas = () => {
5
- const { list } = useListCrud();
6
- return (_jsx(Card, { className: "bg-gray-50", title: "Empresas", children: _jsx(Collection, { direction: "row", wrap: true, children: list?.map((empresa) => (_jsx(Card, { className: "bg-white w-[100%] md:w-[45%] lg:w-[30%] xl:w-[18%]", title: empresa.nombre }, empresa.id))) }) }));
5
+ const { list, pagination, fetchItems } = useCrud();
6
+ return (_jsxs(Card, { className: "bg-gray-50", title: "Empresas", children: [_jsxs("div", { className: "flex justify-between items-center my-2", children: [_jsx(Collection, { direction: "row", wrap: true, children: _jsx(Filter, { paramName: "filtroEmpresa", label: "Buscar", filterType: "search" }) }), _jsx(Collection, { direction: "row", wrap: true, children: pagination })] }), _jsx(Loader, { isLoading: fetchItems.isLoading, children: _jsx(Collection, { direction: "row", wrap: true, children: list?.map((empresa) => (_jsx(Card, { className: "bg-white w-[100%] md:w-[45%] lg:w-[30%] xl:w-[18%]", title: empresa.nombre, headerActions: _jsx(LinkButton, { to: `/docs/listcrud/empresa/${empresa.id}`, icon: "fa-search", variant: "ghost", size: "sm" }) }, empresa.id))) }) })] }));
7
7
  };
@@ -0,0 +1,10 @@
1
+ import { type PersonaEmpresaConPersona } from "../docMockServices";
2
+ interface ListCrudDocsContentEmpresasPersonasEditDialogProps {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ personaEmpresa: PersonaEmpresaConPersona | undefined;
6
+ personasEnEmpresa: PersonaEmpresaConPersona[];
7
+ }
8
+ export declare const ListCrudDocsContentEmpresasPersonasEditDialog: ({ isOpen, onClose, personaEmpresa, personasEnEmpresa, }: ListCrudDocsContentEmpresasPersonasEditDialogProps) => import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListCrudDocsContentEmpresasPersonasEditDialog.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.tsx"],"names":[],"mappings":"AASA,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,oBAAoB,CAAC;AAK5B,UAAU,kDAAkD;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACrD,iBAAiB,EAAE,wBAAwB,EAAE,CAAC;CAC/C;AAED,eAAO,MAAM,6CAA6C,GAAI,yDAK3D,kDAAkD,4CAyEpD,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { FormProvider, useForm } from "react-hook-form";
3
+ import { AutocompleteInput, Button, Collection, Dialog, Input, Loader, } from "../../components";
4
+ import { personaService, } from "../docMockServices";
5
+ import { useEffect, useState } from "react";
6
+ import { useCrud } from "../../contexts";
7
+ import { useAsyncRequest } from "../../hooks";
8
+ export const ListCrudDocsContentEmpresasPersonasEditDialog = ({ isOpen, onClose, personaEmpresa, personasEnEmpresa, }) => {
9
+ const { listar } = personaService;
10
+ const { updateItem, createItem, extraData, fetchItems } = useCrud();
11
+ const [personas, setPersonas] = useState([]);
12
+ const listarPersonas = useAsyncRequest();
13
+ useEffect(() => {
14
+ listarPersonas.execute(listar).then((personas) => {
15
+ setPersonas((personas || []).filter((persona) => !personasEnEmpresa.some((personaEnEmpresa) => personaEnEmpresa.idPersona === persona.id)));
16
+ });
17
+ }, [listar, personasEnEmpresa]);
18
+ const methods = useForm({
19
+ defaultValues: personaEmpresa,
20
+ });
21
+ const onSubmit = async (personaEmpresa) => {
22
+ if (personaEmpresa.idEmpresa) {
23
+ await updateItem.execute(personaEmpresa);
24
+ }
25
+ else {
26
+ if (!extraData?.idEmpresa) {
27
+ throw new Error("No se encontro el id de la empresa");
28
+ }
29
+ await createItem.execute({ ...personaEmpresa, idEmpresa: extraData.idEmpresa });
30
+ }
31
+ onClose();
32
+ await fetchItems.execute();
33
+ };
34
+ return (_jsx(FormProvider, { ...methods, children: _jsx(Dialog, { isOpen: isOpen, onClose: onClose, title: "Editar Persona Empresa", footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: onClose, children: "Cancelar" }), _jsx(Button, { onClick: methods.handleSubmit(onSubmit), children: "Guardar" })] }), children: _jsx("form", { onSubmit: methods.handleSubmit(onSubmit), children: _jsxs(Collection, { children: [_jsx(AutocompleteInput, { label: "Persona", options: personas, getOptionLabel: (option) => option.nombre, getOptionValue: (option) => option.id.toString(), ...methods.register("idPersona", {
35
+ required: "Campo obligatorio",
36
+ }), error: methods.formState.errors.idPersona?.message, disabled: listarPersonas.isLoading || updateItem.isLoading || createItem.isLoading }), _jsx(Input, { label: "Cargo", ...methods.register("cargo", {
37
+ required: "Campo obligatorio",
38
+ }), error: methods.formState.errors.cargo?.message, disabled: listarPersonas.isLoading || updateItem.isLoading || createItem.isLoading }), _jsx(Loader, { isLoading: listarPersonas.isLoading || updateItem.isLoading || createItem.isLoading })] }) }) }) }));
39
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"ListCrudDocsContentPersonas.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.tsx"],"names":[],"mappings":"AAgBA,eAAO,MAAM,2BAA2B,+CAqJvC,CAAC"}
1
+ {"version":3,"file":"ListCrudDocsContentPersonas.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.tsx"],"names":[],"mappings":"AAgBA,eAAO,MAAM,2BAA2B,+CAkJvC,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useListCrud } from "../../contexts";
2
+ import { useCrud } from "../../contexts";
3
3
  import { Button, Card, Collection, DataTable, Dialog, Filter, Loader, } from "../../components";
4
4
  import { useEffect } from "react";
5
5
  import { useState } from "react";
6
6
  import { empresaService } from "../docMockServices";
7
7
  import { ListCrudDocsEditDialog } from "./ListCrudDocsEditDialog";
8
8
  export const ListCrudDocsContentPersonas = () => {
9
- const { list, pagination, isLoading, fetchItems, deleteItem } = useListCrud();
9
+ const { list, pagination, isLoading, fetchItems, deleteItem } = useCrud();
10
10
  const { listar } = empresaService;
11
11
  const [empresas, setEmpresas] = useState([]);
12
12
  const [isOpenDeleteDialog, setIsOpenDeleteDialog] = useState(false);
@@ -53,5 +53,5 @@ export const ListCrudDocsContentPersonas = () => {
53
53
  _jsx(Button, { size: "sm", variant: "ghost", icon: "fa-trash", onClick: () => onDeletePersona(row), children: "Eliminar" }, "delete"),
54
54
  ],
55
55
  },
56
- ], rows: list || [], maxRows: 10, isLoading: isLoading, loadingRows: 10 })] }), isOpenDeleteDialog && (_jsx(Dialog, { isOpen: isOpenDeleteDialog, title: "Eliminar Persona", onClose: () => setIsOpenDeleteDialog(false), dialogBody: _jsxs(_Fragment, { children: [_jsx("p", { children: "\u00BFEst\u00E1s seguro de querer eliminar esta persona?" }), _jsx(Loader, { isLoading: deleteItem.isLoading })] }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenDeleteDialog(false), disabled: deleteItem.isLoading, children: "Cancelar" }), _jsx(Button, { onClick: onDeletePersonaSubmit, disabled: deleteItem.isLoading, children: "Eliminar" })] }) })), isOpenEditDialog && (_jsx(ListCrudDocsEditDialog, { isOpen: isOpenEditDialog, onClose: () => setIsOpenEditDialog(false), persona: selectedPersona }))] }));
56
+ ], rows: list || [], maxRows: 10, isLoading: isLoading, loadingRows: 10 })] }), isOpenDeleteDialog && (_jsxs(Dialog, { isOpen: isOpenDeleteDialog, title: "Eliminar Persona", onClose: () => setIsOpenDeleteDialog(false), footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenDeleteDialog(false), disabled: deleteItem.isLoading, children: "Cancelar" }), _jsx(Button, { onClick: onDeletePersonaSubmit, disabled: deleteItem.isLoading, children: "Eliminar" })] }), children: [_jsx("p", { children: "\u00BFEst\u00E1s seguro de querer eliminar esta persona?" }), _jsx(Loader, { isLoading: deleteItem.isLoading })] })), isOpenEditDialog && (_jsx(ListCrudDocsEditDialog, { isOpen: isOpenEditDialog, onClose: () => setIsOpenEditDialog(false), persona: selectedPersona }))] }));
57
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ListCrudDocsEditDialog.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAsB,MAAM,oBAAoB,CAAC;AAGtE,UAAU,2BAA2B;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,eAAO,MAAM,sBAAsB,GAAI,+BAIpC,2BAA2B,4CA4E7B,CAAC"}
1
+ {"version":3,"file":"ListCrudDocsEditDialog.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAsB,MAAM,oBAAoB,CAAC;AAGtE,UAAU,2BAA2B;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,eAAO,MAAM,sBAAsB,GAAI,+BAIpC,2BAA2B,4CA2E7B,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useForm, FormProvider } from "react-hook-form";
3
3
  import { Button, Collection, DateInput, Dialog, Input, Loader, } from "../../components";
4
- import { useListCrud } from "../../contexts";
4
+ import { useCrud } from "../../contexts";
5
5
  export const ListCrudDocsEditDialog = ({ isOpen, onClose, persona, }) => {
6
6
  const methods = useForm({
7
7
  defaultValues: persona,
8
8
  });
9
- const { createItem, updateItem, fetchItems } = useListCrud();
9
+ const { createItem, updateItem, fetchItems } = useCrud();
10
10
  const { register, handleSubmit, formState: { errors }, } = methods;
11
11
  const onSubmit = async (persona) => {
12
12
  if (persona.id) {
@@ -19,12 +19,12 @@ export const ListCrudDocsEditDialog = ({ isOpen, onClose, persona, }) => {
19
19
  fetchItems.execute();
20
20
  };
21
21
  const isLoading = createItem.isLoading || updateItem.isLoading;
22
- return (_jsx(FormProvider, { ...methods, children: _jsx(Dialog, { isOpen: isOpen, onClose: onClose, title: "Editar Persona", dialogBody: _jsx("form", { onSubmit: handleSubmit(onSubmit), onKeyDown: (e) => {
22
+ return (_jsx(FormProvider, { ...methods, children: _jsx(Dialog, { isOpen: isOpen, onClose: onClose, title: "Editar Persona", footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: onClose, children: "Cancelar" }), _jsx(Button, { onClick: handleSubmit(onSubmit), children: "Guardar" })] }), children: _jsx("form", { onSubmit: handleSubmit(onSubmit), onKeyDown: (e) => {
23
23
  if (e.key === "Enter") {
24
24
  e.preventDefault();
25
25
  handleSubmit(onSubmit)();
26
26
  }
27
27
  }, children: _jsxs(Collection, { children: [_jsx(Input, { label: "Nombre", ...register("nombre", { required: "Campo obligatorio" }), error: errors.nombre?.message }), _jsx(Input, { label: "Email", ...register("email", { required: "Campo obligatorio" }), error: errors.email?.message }), _jsx(DateInput, { label: "Fecha de Nacimiento", placeholder: "dd/mm/yyyy", icon: "fa-calendar-alt", ...register("fechaNacimiento", {
28
28
  required: "Campo obligatorio",
29
- }), error: errors.fechaNacimiento?.message }), _jsx(Loader, { isLoading: isLoading })] }) }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: onClose, children: "Cancelar" }), _jsx(Button, { onClick: handleSubmit(onSubmit), children: "Guardar" })] }) }) }));
29
+ }), error: errors.fechaNacimiento?.message }), _jsx(Loader, { isLoading: isLoading })] }) }) }) }));
30
30
  };
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const MenuDocs: React.FC;
3
+ export default MenuDocs;
4
+ //# sourceMappingURL=MenuDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenuDocs.d.ts","sourceRoot":"","sources":["../../src/docs/MenuDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAqBxC,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EA2KrB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState } from "react";
3
+ import { Card, Menu, Badge } from "../index";
4
+ const MenuDocs = () => {
5
+ const [selectedItem, setSelectedItem] = useState(null);
6
+ // Opciones básicas
7
+ const basicOptions = [
8
+ { label: "Dashboard", id: "dashboard" },
9
+ { label: "Configuración", id: "settings" },
10
+ { label: "Perfil", id: "profile" },
11
+ { label: "Ayuda", id: "help" },
12
+ ];
13
+ // Opciones con iconos
14
+ const optionsWithIcons = [
15
+ { label: "Editar", icon: "fa-edit", action: "edit" },
16
+ { label: "Eliminar", icon: "fa-trash", action: "delete" },
17
+ { label: "Compartir", icon: "fa-share", action: "share" },
18
+ ];
19
+ // Opciones complejas
20
+ const userOptions = [
21
+ { id: 1, name: "Juan Pérez", email: "juan@ejemplo.com", role: "Admin" },
22
+ { id: 2, name: "María García", email: "maria@ejemplo.com", role: "User" },
23
+ ];
24
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Menu - Lista de Opciones", children: _jsxs("div", { className: "space-y-10", children: [_jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso b\u00E1sico" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "El componente Menu muestra una lista vertical de opciones. Es la versi\u00F3n est\u00E1tica y siempre visible del contenido de un DropdownMenu." }), _jsx("div", { className: "space-y-4", children: _jsxs("div", { className: "flex items-start gap-8", children: [_jsx(Menu, { options: basicOptions, onOptionSelected: (item) => setSelectedItem(item) }), selectedItem && (_jsxs("div", { className: "p-4 border rounded bg-[var(--color-bg-secondary)]", children: [_jsx("p", { className: "text-sm font-semibold", children: "Seleccionado:" }), _jsxs("p", { className: "text-sm", children: [selectedItem.label, " (", selectedItem.id, ")"] })] }))] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Personalizaci\u00F3n con renderOption" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Puedes personalizar completamente c\u00F3mo se renderiza cada opci\u00F3n." }), _jsx("div", { className: "space-y-4", children: _jsx(Menu, { options: optionsWithIcons, onOptionSelected: (item) => console.log(item), renderOption: (item) => (_jsxs("div", { className: "flex items-center", children: [_jsx("i", { className: `fa ${item.icon} w-6` }), _jsx("span", { children: item.label })] })) }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso de getOptionLabel" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Si tus objetos no tienen una propiedad `label`, puedes usar `getOptionLabel`." }), _jsx("div", { className: "space-y-4", children: _jsx(Menu, { options: userOptions, onOptionSelected: (item) => console.log(item), getOptionLabel: (item) => item.name, renderOption: (item) => (_jsxs("div", { className: "flex justify-between items-center w-full min-w-[200px]", children: [_jsxs("div", { children: [_jsx("div", { className: "font-medium", children: item.name }), _jsx("div", { className: "text-xs text-[var(--flysoft-text-secondary)]", children: item.email })] }), _jsx(Badge, { variant: item.role === 'Admin' ? 'primary' : 'secondary', size: "sm", children: item.role })] })) }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Personalizaci\u00F3n de Estilos" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Puedes usar la propiedad `className` para sobreescribir los estilos por defecto usando clases de Tailwind. Por ejemplo, puedes cambiar el color de fondo, quitar el borde o sombra, etc." }), _jsx("div", { className: "space-y-4", children: _jsxs("div", { className: "flex gap-8 flex-wrap", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-sm font-medium mb-2", children: "Fondo Oscuro" }), _jsx(Menu, { options: basicOptions, onOptionSelected: (item) => setSelectedItem(item), className: "bg-gray-800 border-gray-700 text-white", itemClassName: "text-gray-200 hover:bg-gray-700 hover:text-white", renderOption: (item) => (_jsx("span", { children: item.label })) })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-sm font-medium mb-2", children: "Sin Borde ni Sombra" }), _jsx(Menu, { options: basicOptions, onOptionSelected: (item) => setSelectedItem(item), className: "border-0 shadow-none bg-blue-50" })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-sm font-medium mb-2", children: "Estilo Destacado" }), _jsx(Menu, { options: basicOptions, onOptionSelected: (item) => setSelectedItem(item), className: "bg-indigo-50 border-indigo-200 shadow-md", renderOption: (item) => (_jsx("span", { className: "text-indigo-800 font-medium", children: item.label })) })] })] }) })] })] }) }) }));
25
+ };
26
+ export default MenuDocs;
@@ -14,14 +14,14 @@ export declare const empresaService: {
14
14
  * Obtiene empresas paginadas opcionalmente filtradas por nombre
15
15
  */
16
16
  listarPaginados(params?: {
17
- filtro?: string;
18
- pagina?: number;
17
+ filtroEmpresa?: string;
18
+ paginaEmpresa?: number;
19
19
  limit?: number;
20
20
  }): Promise<PaginationInterface<Empresa>>;
21
21
  /**
22
22
  * Busca una empresa por ID
23
23
  */
24
- buscarPorId(id: number): Promise<Empresa | undefined>;
24
+ buscarPorId(id: string): Promise<Empresa>;
25
25
  /**
26
26
  * Agrega una nueva empresa
27
27
  */
@@ -31,8 +31,8 @@ export declare const empresaService: {
31
31
  */
32
32
  editar(id: number, datos: Partial<Omit<Empresa, "id">>): Promise<Empresa | null>;
33
33
  /**
34
- * Elimina una empresa por ID
34
+ * Elimina una empresa por ID y todas sus relaciones con personas
35
35
  */
36
- eliminar(id: number): Promise<boolean>;
36
+ eliminar(empresa: Empresa): Promise<void>;
37
37
  };
38
38
  //# sourceMappingURL=empresaService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"empresaService.d.ts","sourceRoot":"","sources":["../../../src/docs/docMockServices/empresaService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAmBrF;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB;;OAEG;oBACmB;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAY9D;;OAEG;6BAC4B;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAyCzC;;OAEG;oBACmB,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAM3D;;OAEG;qBACoB,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAe7D;;OAEG;eAEG,MAAM,SACH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAClC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAW1B;;OAEG;iBACgB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAU7C,CAAC"}
1
+ {"version":3,"file":"empresaService.d.ts","sourceRoot":"","sources":["../../../src/docs/docMockServices/empresaService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAoBrF;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB;;OAEG;oBACmB;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAY9D;;OAEG;6BAC4B;QAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IA2CzC;;OAEG;oBACmB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW/C;;OAEG;qBACoB,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAe7D;;OAEG;eAEG,MAAM,SACH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAClC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAW1B;;OAEG;sBACqB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAYhD,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { personaEmpresaService } from "./personaEmpresaService";
1
2
  const STORAGE_KEY = "docMockServices_empresas";
2
3
  /**
3
4
  * Simula un delay de red para hacer más realista el mock
@@ -32,14 +33,15 @@ export const empresaService = {
32
33
  * Obtiene empresas paginadas opcionalmente filtradas por nombre
33
34
  */
34
35
  async listarPaginados(params) {
36
+ console.log("Lista empresas paginadas", params);
35
37
  await simulateNetworkDelay();
36
- const pagina = params?.pagina ?? 1;
38
+ const pagina = params?.paginaEmpresa ?? 1;
37
39
  const limit = params?.limit ?? 20;
38
40
  const todas = _obtenerTodas();
39
41
  let todasFiltradas = todas;
40
- if (params?.filtro) {
41
- const filtroLower = params.filtro.toLowerCase();
42
- todasFiltradas = todas.filter((emp) => emp.nombre.toLowerCase().includes(filtroLower));
42
+ if (params?.filtroEmpresa) {
43
+ const filtroLower = params.filtroEmpresa.toLowerCase();
44
+ todasFiltradas = todasFiltradas.filter((emp) => emp.nombre.toLowerCase().includes(filtroLower));
43
45
  }
44
46
  const total = todasFiltradas.length;
45
47
  // Si limit es 0, devolver todos los elementos sin paginar
@@ -68,9 +70,14 @@ export const empresaService = {
68
70
  * Busca una empresa por ID
69
71
  */
70
72
  async buscarPorId(id) {
73
+ console.log("Busca empresa por id", id);
71
74
  await simulateNetworkDelay();
72
75
  const empresas = _obtenerTodas();
73
- return empresas.find((emp) => emp.id === id);
76
+ const empresa = empresas.find((emp) => emp.id.toString() === id.toString());
77
+ if (!empresa) {
78
+ throw new Error("Empresa no encontrada");
79
+ }
80
+ return empresa;
74
81
  },
75
82
  /**
76
83
  * Agrega una nueva empresa
@@ -102,16 +109,17 @@ export const empresaService = {
102
109
  return empresas[index];
103
110
  },
104
111
  /**
105
- * Elimina una empresa por ID
112
+ * Elimina una empresa por ID y todas sus relaciones con personas
106
113
  */
107
- async eliminar(id) {
114
+ async eliminar(empresa) {
108
115
  await simulateNetworkDelay();
109
116
  const empresas = _obtenerTodas();
110
- const index = empresas.findIndex((emp) => emp.id === id);
117
+ const index = empresas.findIndex((emp) => emp.id === empresa.id);
111
118
  if (index === -1)
112
- return false;
119
+ return;
120
+ // Eliminar todas las relaciones de esta empresa
121
+ await personaEmpresaService.eliminarPorEmpresa(empresa.id);
113
122
  empresas.splice(index, 1);
114
123
  localStorage.setItem(STORAGE_KEY, JSON.stringify(empresas));
115
- return true;
116
124
  },
117
125
  };
@@ -23,4 +23,16 @@ export interface PersonaEmpresa {
23
23
  idEmpresa: number;
24
24
  cargo: string;
25
25
  }
26
+ /**
27
+ * Relación Persona-Empresa con la información completa de la Persona
28
+ */
29
+ export interface PersonaEmpresaConPersona extends PersonaEmpresa {
30
+ persona: Persona;
31
+ }
32
+ /**
33
+ * Relación Persona-Empresa con la información completa de la Empresa
34
+ */
35
+ export interface PersonaEmpresaConEmpresa extends PersonaEmpresa {
36
+ empresa: Empresa;
37
+ }
26
38
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/docs/docMockServices/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC;;GAEG;AAEH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,KAAK,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,OAAO;IACjD,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/docs/docMockServices/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC;;GAEG;AAEH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,KAAK,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,OAAO;IACjD,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,OAAO,EAAE,OAAO,CAAC;CAClB"}
@@ -1,4 +1,4 @@
1
- import type { PersonaEmpresa } from "./interfaces";
1
+ import type { PersonaEmpresa, PersonaEmpresaConPersona, PersonaEmpresaConEmpresa } from "./interfaces";
2
2
  /**
3
3
  * Servicio mock para gestionar relaciones Persona-Empresa en localStorage
4
4
  */
@@ -8,13 +8,13 @@ export declare const personaEmpresaService: {
8
8
  */
9
9
  listar(): Promise<PersonaEmpresa[]>;
10
10
  /**
11
- * Busca relaciones por ID de persona
11
+ * Busca relaciones por ID de persona, incluyendo la información completa de la empresa
12
12
  */
13
- buscarPorPersona(idPersona: number): Promise<PersonaEmpresa[]>;
13
+ buscarPorPersona(idPersona: number): Promise<PersonaEmpresaConEmpresa[]>;
14
14
  /**
15
- * Busca relaciones por ID de empresa
15
+ * Busca relaciones por ID de empresa, incluyendo la información completa de la persona
16
16
  */
17
- buscarPorEmpresa(idEmpresa: number): Promise<PersonaEmpresa[]>;
17
+ buscarPorEmpresa(idEmpresa: number): Promise<PersonaEmpresaConPersona[]>;
18
18
  /**
19
19
  * Busca una relación específica por persona y empresa
20
20
  */
@@ -30,7 +30,7 @@ export declare const personaEmpresaService: {
30
30
  /**
31
31
  * Elimina una relación por persona y empresa
32
32
  */
33
- eliminar(idPersona: number, idEmpresa: number): Promise<boolean>;
33
+ eliminar(personaEmpresa: PersonaEmpresa): Promise<void>;
34
34
  /**
35
35
  * Elimina todas las relaciones de una persona
36
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"personaEmpresaService.d.ts","sourceRoot":"","sources":["../../../src/docs/docMockServices/personaEmpresaService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAmBnD;;GAEG;AACH,eAAO,MAAM,qBAAqB;IAChC;;OAEG;cACa,OAAO,CAAC,cAAc,EAAE,CAAC;IAKzC;;OAEG;gCAC+B,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAMpE;;OAEG;gCAC+B,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAMpE;;OAEG;wCAEU,MAAM,aACN,MAAM,GAChB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAQtC;;OAEG;sBACqB,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAgBhE;;OAEG;sBAEU,MAAM,aACN,MAAM,SACV,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,WAAW,CAAC,CAAC,GAC9D,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAajC;;OAEG;wBACuB,MAAM,aAAa,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAatE;;OAEG;kCACiC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5D;;OAEG;kCACiC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAU7D,CAAC"}
1
+ {"version":3,"file":"personaEmpresaService.d.ts","sourceRoot":"","sources":["../../../src/docs/docMockServices/personaEmpresaService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,cAAc,CAAC;AAqBtB;;GAEG;AACH,eAAO,MAAM,qBAAqB;IAChC;;OAEG;cACa,OAAO,CAAC,cAAc,EAAE,CAAC;IAKzC;;OAEG;gCAEU,MAAM,GAChB,OAAO,CAAC,wBAAwB,EAAE,CAAC;IA6BtC;;OAEG;gCAEU,MAAM,GAChB,OAAO,CAAC,wBAAwB,EAAE,CAAC;IAyCtC;;OAEG;wCAEU,MAAM,aACN,MAAM,GAChB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAQtC;;OAEG;sBACqB,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAgBhE;;OAEG;sBAEU,MAAM,aACN,MAAM,SACV,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,WAAW,CAAC,CAAC,GAC9D,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAajC;;OAEG;6BAC4B,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7D;;OAEG;kCACiC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5D;;OAEG;kCACiC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAU7D,CAAC"}
@@ -1,3 +1,5 @@
1
+ import { personaService } from "./personaService";
2
+ import { empresaService } from "./empresaService";
1
3
  const STORAGE_KEY = "docMockServices_personaEmpresas";
2
4
  /**
3
5
  * Simula un delay de red para hacer más realista el mock
@@ -24,20 +26,57 @@ export const personaEmpresaService = {
24
26
  return _obtenerTodas();
25
27
  },
26
28
  /**
27
- * Busca relaciones por ID de persona
29
+ * Busca relaciones por ID de persona, incluyendo la información completa de la empresa
28
30
  */
29
31
  async buscarPorPersona(idPersona) {
30
32
  await simulateNetworkDelay();
31
33
  const relaciones = _obtenerTodas();
32
- return relaciones.filter((rel) => rel.idPersona === idPersona);
34
+ const relacionesFiltradas = relaciones.filter((rel) => rel.idPersona.toString() === idPersona.toString());
35
+ // Obtener todas las empresas de una vez para optimizar
36
+ const todasLasEmpresas = await empresaService.listar();
37
+ // Enriquecer cada relación con la información de la empresa
38
+ const relacionesConEmpresas = await Promise.all(relacionesFiltradas.map(async (rel) => {
39
+ const empresa = todasLasEmpresas.find((e) => e.id.toString() === rel.idEmpresa.toString());
40
+ if (!empresa) {
41
+ throw new Error(`Empresa con id ${rel.idEmpresa} no encontrada para la relación`);
42
+ }
43
+ return {
44
+ ...rel,
45
+ empresa,
46
+ };
47
+ }));
48
+ return relacionesConEmpresas;
33
49
  },
34
50
  /**
35
- * Busca relaciones por ID de empresa
51
+ * Busca relaciones por ID de empresa, incluyendo la información completa de la persona
36
52
  */
37
53
  async buscarPorEmpresa(idEmpresa) {
54
+ console.log("Busca relaciones por empresa", idEmpresa);
38
55
  await simulateNetworkDelay();
39
56
  const relaciones = _obtenerTodas();
40
- return relaciones.filter((rel) => rel.idEmpresa === idEmpresa);
57
+ const relacionesFiltradas = relaciones.filter((rel) => rel.idEmpresa.toString() === idEmpresa.toString());
58
+ // Obtener todas las personas de una vez para optimizar
59
+ const todasLasPersonas = await personaService.listar();
60
+ // Enriquecer cada relación con la información de la persona
61
+ // PersonaConEmpresas extiende Persona, así que podemos usarlo directamente
62
+ const relacionesConPersonas = await Promise.all(relacionesFiltradas.map(async (rel) => {
63
+ const personaConEmpresas = todasLasPersonas.find((p) => p.id.toString() === rel.idPersona.toString());
64
+ if (!personaConEmpresas) {
65
+ throw new Error(`Persona con id ${rel.idPersona} no encontrada para la relación`);
66
+ }
67
+ // Extraer solo los campos de Persona (sin empresas)
68
+ const persona = {
69
+ id: personaConEmpresas.id,
70
+ nombre: personaConEmpresas.nombre,
71
+ email: personaConEmpresas.email,
72
+ fechaNacimiento: personaConEmpresas.fechaNacimiento,
73
+ };
74
+ return {
75
+ ...rel,
76
+ persona,
77
+ };
78
+ }));
79
+ return relacionesConPersonas;
41
80
  },
42
81
  /**
43
82
  * Busca una relación específica por persona y empresa
@@ -45,7 +84,7 @@ export const personaEmpresaService = {
45
84
  async buscarPorPersonaYEmpresa(idPersona, idEmpresa) {
46
85
  await simulateNetworkDelay();
47
86
  const relaciones = _obtenerTodas();
48
- return relaciones.find((rel) => rel.idPersona === idPersona && rel.idEmpresa === idEmpresa);
87
+ return relaciones.find((rel) => rel.idPersona.toString() === idPersona.toString() && rel.idEmpresa.toString() === idEmpresa.toString());
49
88
  },
50
89
  /**
51
90
  * Agrega una nueva relación
@@ -54,8 +93,8 @@ export const personaEmpresaService = {
54
93
  await simulateNetworkDelay();
55
94
  const relaciones = _obtenerTodas();
56
95
  // Verificar que no exista ya la relación
57
- const existe = relaciones.some((rel) => rel.idPersona === relacion.idPersona &&
58
- rel.idEmpresa === relacion.idEmpresa);
96
+ const existe = relaciones.some((rel) => rel.idPersona.toString() === relacion.idPersona.toString() &&
97
+ rel.idEmpresa.toString() === relacion.idEmpresa.toString());
59
98
  if (!existe) {
60
99
  relaciones.push(relacion);
61
100
  localStorage.setItem(STORAGE_KEY, JSON.stringify(relaciones));
@@ -68,7 +107,7 @@ export const personaEmpresaService = {
68
107
  async editar(idPersona, idEmpresa, datos) {
69
108
  await simulateNetworkDelay();
70
109
  const relaciones = _obtenerTodas();
71
- const index = relaciones.findIndex((rel) => rel.idPersona === idPersona && rel.idEmpresa === idEmpresa);
110
+ const index = relaciones.findIndex((rel) => rel.idPersona.toString() === idPersona.toString() && rel.idEmpresa.toString() === idEmpresa.toString());
72
111
  if (index === -1)
73
112
  return null;
74
113
  relaciones[index] = { ...relaciones[index], ...datos };
@@ -78,15 +117,14 @@ export const personaEmpresaService = {
78
117
  /**
79
118
  * Elimina una relación por persona y empresa
80
119
  */
81
- async eliminar(idPersona, idEmpresa) {
120
+ async eliminar(personaEmpresa) {
82
121
  await simulateNetworkDelay();
83
122
  const relaciones = _obtenerTodas();
84
- const index = relaciones.findIndex((rel) => rel.idPersona === idPersona && rel.idEmpresa === idEmpresa);
123
+ const index = relaciones.findIndex((rel) => rel.idPersona.toString() === personaEmpresa.idPersona.toString() && rel.idEmpresa.toString() === personaEmpresa.idEmpresa.toString());
85
124
  if (index === -1)
86
- return false;
125
+ return;
87
126
  relaciones.splice(index, 1);
88
127
  localStorage.setItem(STORAGE_KEY, JSON.stringify(relaciones));
89
- return true;
90
128
  },
91
129
  /**
92
130
  * Elimina todas las relaciones de una persona
@@ -95,7 +133,7 @@ export const personaEmpresaService = {
95
133
  await simulateNetworkDelay();
96
134
  const relaciones = _obtenerTodas();
97
135
  const inicialLength = relaciones.length;
98
- const nuevasRelaciones = relaciones.filter((rel) => rel.idPersona !== idPersona);
136
+ const nuevasRelaciones = relaciones.filter((rel) => rel.idPersona.toString() !== idPersona.toString());
99
137
  localStorage.setItem(STORAGE_KEY, JSON.stringify(nuevasRelaciones));
100
138
  return inicialLength - nuevasRelaciones.length;
101
139
  },
@@ -106,7 +144,7 @@ export const personaEmpresaService = {
106
144
  await simulateNetworkDelay();
107
145
  const relaciones = _obtenerTodas();
108
146
  const inicialLength = relaciones.length;
109
- const nuevasRelaciones = relaciones.filter((rel) => rel.idEmpresa !== idEmpresa);
147
+ const nuevasRelaciones = relaciones.filter((rel) => rel.idEmpresa.toString() !== idEmpresa.toString());
110
148
  localStorage.setItem(STORAGE_KEY, JSON.stringify(nuevasRelaciones));
111
149
  return inicialLength - nuevasRelaciones.length;
112
150
  },
@@ -32,7 +32,7 @@ export declare const personaService: {
32
32
  */
33
33
  editar(id: number, datos: Partial<Omit<Persona, "id">>): Promise<Persona | undefined>;
34
34
  /**
35
- * Elimina una persona por ID
35
+ * Elimina una persona por ID y todas sus relaciones con empresas
36
36
  */
37
37
  eliminar(persona: Persona): Promise<void>;
38
38
  };
@@ -1 +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;IAoB7D;;OAEG;eAEG,MAAM,SACH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAClC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAgB/B;;OAEG;sBACqB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAQhD,CAAC"}
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;IAoB7D;;OAEG;eAEG,MAAM,SACH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAClC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAgB/B;;OAEG;sBACqB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBhD,CAAC"}
@@ -38,7 +38,7 @@ const _enriquecerConEmpresas = async (persona, todasLasEmpresas) => {
38
38
  else {
39
39
  // Si no, obtener cada empresa individualmente
40
40
  for (const idEmpresa of empresasIds) {
41
- const empresa = await empresaService.buscarPorId(idEmpresa);
41
+ const empresa = await empresaService.buscarPorId(idEmpresa.toString());
42
42
  if (empresa) {
43
43
  empresas.push(empresa);
44
44
  }
@@ -88,8 +88,8 @@ export const personaService = {
88
88
  // y filtrar las personas que tienen esa relación
89
89
  if (params?.idEmpresa !== undefined) {
90
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));
91
+ const personasIdsConEmpresa = new Set(relaciones.map((rel) => rel.idPersona.toString()));
92
+ todasFiltradas = todasFiltradas.filter((per) => personasIdsConEmpresa.has(per.id.toString()));
93
93
  }
94
94
  const total = todasFiltradas.length;
95
95
  // Obtener todas las empresas de una vez para optimizar
@@ -169,13 +169,22 @@ export const personaService = {
169
169
  return personas[index];
170
170
  },
171
171
  /**
172
- * Elimina una persona por ID
172
+ * Elimina una persona por ID y todas sus relaciones con empresas
173
173
  */
174
174
  async eliminar(persona) {
175
175
  await simulateNetworkDelay();
176
176
  const personas = _obtenerTodas();
177
177
  const index = personas.findIndex((per) => per.id === persona.id);
178
+ if (index === -1)
179
+ return;
180
+ // Eliminar todas las relaciones de esta persona
181
+ await personaEmpresaService.eliminarPorPersona(persona.id);
178
182
  personas.splice(index, 1);
179
- localStorage.setItem(STORAGE_KEY, JSON.stringify(personas));
183
+ // Guardar convirtiendo fechaNacimiento a string ISO
184
+ const personasParaGuardar = personas.map((p) => ({
185
+ ...p,
186
+ fechaNacimiento: p.fechaNacimiento.toISOString(),
187
+ }));
188
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(personasParaGuardar));
180
189
  },
181
190
  };