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.
Files changed (152) hide show
  1. package/dist/App.d.ts.map +1 -1
  2. package/dist/App.js +5 -6
  3. package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
  4. package/dist/components/form-controls/AutocompleteInput.js +177 -131
  5. package/dist/components/form-controls/Button.d.ts +3 -0
  6. package/dist/components/form-controls/Button.d.ts.map +1 -1
  7. package/dist/components/form-controls/Button.js +160 -19
  8. package/dist/components/form-controls/Checkbox.d.ts.map +1 -1
  9. package/dist/components/form-controls/Checkbox.js +3 -1
  10. package/dist/components/form-controls/DateInput.d.ts +5 -1
  11. package/dist/components/form-controls/DateInput.d.ts.map +1 -1
  12. package/dist/components/form-controls/DateInput.js +94 -27
  13. package/dist/components/form-controls/Input.d.ts.map +1 -1
  14. package/dist/components/form-controls/Input.js +2 -1
  15. package/dist/components/form-controls/LinkButton.d.ts +15 -0
  16. package/dist/components/form-controls/LinkButton.d.ts.map +1 -0
  17. package/dist/components/form-controls/LinkButton.js +248 -0
  18. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -1
  19. package/dist/components/form-controls/SearchSelectInput-OLD.js +5 -4
  20. package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -1
  21. package/dist/components/form-controls/SearchSelectInput.js +3 -2
  22. package/dist/components/form-controls/index.d.ts +2 -0
  23. package/dist/components/form-controls/index.d.ts.map +1 -1
  24. package/dist/components/form-controls/index.js +1 -0
  25. package/dist/components/layout/Accordion.d.ts +13 -0
  26. package/dist/components/layout/Accordion.d.ts.map +1 -0
  27. package/dist/components/layout/Accordion.js +67 -0
  28. package/dist/components/layout/AppLayout.d.ts.map +1 -1
  29. package/dist/components/layout/AppLayout.js +7 -7
  30. package/dist/components/layout/Card.d.ts +8 -3
  31. package/dist/components/layout/Card.d.ts.map +1 -1
  32. package/dist/components/layout/Card.js +21 -22
  33. package/dist/components/layout/DataTable.js +1 -1
  34. package/dist/components/layout/DropdownMenu.d.ts.map +1 -0
  35. package/dist/components/{utils → layout}/DropdownMenu.js +12 -6
  36. package/dist/components/layout/DropdownPanel.d.ts +7 -0
  37. package/dist/components/layout/DropdownPanel.d.ts.map +1 -0
  38. package/dist/components/layout/DropdownPanel.js +137 -0
  39. package/dist/components/{utils → layout}/Filter.d.ts +5 -0
  40. package/dist/components/layout/Filter.d.ts.map +1 -0
  41. package/dist/components/{utils → layout}/Filter.js +18 -9
  42. package/dist/components/layout/Menu.d.ts +31 -0
  43. package/dist/components/layout/Menu.d.ts.map +1 -0
  44. package/dist/components/layout/Menu.js +21 -0
  45. package/dist/components/layout/index.d.ts +10 -0
  46. package/dist/components/layout/index.d.ts.map +1 -1
  47. package/dist/components/layout/index.js +5 -0
  48. package/dist/components/utils/Badge.d.ts.map +1 -1
  49. package/dist/components/utils/Badge.js +3 -2
  50. package/dist/components/utils/Dialog.d.ts +2 -2
  51. package/dist/components/utils/Dialog.d.ts.map +1 -1
  52. package/dist/components/utils/Dialog.js +4 -3
  53. package/dist/components/utils/FiltersDialog.d.ts +1 -1
  54. package/dist/components/utils/FiltersDialog.d.ts.map +1 -1
  55. package/dist/components/utils/FiltersDialog.js +2 -2
  56. package/dist/components/utils/Loader.js +1 -1
  57. package/dist/components/utils/RoadMap.d.ts.map +1 -1
  58. package/dist/components/utils/RoadMap.js +2 -1
  59. package/dist/components/utils/Snackbar.d.ts.map +1 -1
  60. package/dist/components/utils/Snackbar.js +2 -1
  61. package/dist/components/utils/iconUtils.d.ts +16 -0
  62. package/dist/components/utils/iconUtils.d.ts.map +1 -0
  63. package/dist/components/utils/iconUtils.js +40 -0
  64. package/dist/components/utils/index.d.ts +0 -2
  65. package/dist/components/utils/index.d.ts.map +1 -1
  66. package/dist/components/utils/index.js +0 -1
  67. package/dist/contexts/CrudContext.d.ts +62 -0
  68. package/dist/contexts/CrudContext.d.ts.map +1 -0
  69. package/dist/contexts/CrudContext.js +333 -0
  70. package/dist/contexts/index.d.ts +2 -2
  71. package/dist/contexts/index.d.ts.map +1 -1
  72. package/dist/contexts/index.js +2 -2
  73. package/dist/docs/AccordionDocs.d.ts +4 -0
  74. package/dist/docs/AccordionDocs.d.ts.map +1 -0
  75. package/dist/docs/AccordionDocs.js +21 -0
  76. package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -5
  77. package/dist/docs/AutocompleteInputDocs.js +1 -1
  78. package/dist/docs/ButtonDocs.d.ts.map +1 -1
  79. package/dist/docs/ButtonDocs.js +1 -1
  80. package/dist/docs/CardDocs.d.ts.map +1 -1
  81. package/dist/docs/CardDocs.js +17 -8
  82. package/dist/docs/DataTableDocs.js +3 -3
  83. package/dist/docs/DialogDocs.d.ts.map +1 -1
  84. package/dist/docs/DialogDocs.js +1 -1
  85. package/dist/docs/DocAdmin.js +1 -1
  86. package/dist/docs/DocsMenu.d.ts.map +1 -1
  87. package/dist/docs/DocsMenu.js +3 -3
  88. package/dist/docs/DocsRouter.d.ts.map +1 -1
  89. package/dist/docs/DocsRouter.js +5 -1
  90. package/dist/docs/DropdownMenuDocs.js +1 -1
  91. package/dist/docs/DropdownPanelDocs.d.ts +4 -0
  92. package/dist/docs/DropdownPanelDocs.d.ts.map +1 -0
  93. package/dist/docs/DropdownPanelDocs.js +7 -0
  94. package/dist/docs/FilterDocs.d.ts.map +1 -1
  95. package/dist/docs/FilterDocs.js +19 -1
  96. package/dist/docs/LinkButtonDocs.d.ts +4 -0
  97. package/dist/docs/LinkButtonDocs.d.ts.map +1 -0
  98. package/dist/docs/LinkButtonDocs.js +7 -0
  99. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +0 -9
  100. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -1
  101. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +32 -16
  102. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts +2 -0
  103. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts.map +1 -0
  104. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.js +34 -0
  105. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts +2 -0
  106. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts.map +1 -0
  107. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.js +66 -0
  108. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +2 -0
  109. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -0
  110. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +7 -0
  111. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts +10 -0
  112. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map +1 -0
  113. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.js +39 -0
  114. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -1
  115. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +33 -27
  116. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +9 -0
  117. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -0
  118. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +30 -0
  119. package/dist/docs/MenuDocs.d.ts +4 -0
  120. package/dist/docs/MenuDocs.d.ts.map +1 -0
  121. package/dist/docs/MenuDocs.js +26 -0
  122. package/dist/docs/SearchSelectInputDocs.js +1 -1
  123. package/dist/docs/docMockServices/empresaService.d.ts +5 -5
  124. package/dist/docs/docMockServices/empresaService.d.ts.map +1 -1
  125. package/dist/docs/docMockServices/empresaService.js +20 -11
  126. package/dist/docs/docMockServices/interfaces.d.ts +12 -0
  127. package/dist/docs/docMockServices/interfaces.d.ts.map +1 -1
  128. package/dist/docs/docMockServices/personaEmpresaService.d.ts +6 -6
  129. package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -1
  130. package/dist/docs/docMockServices/personaEmpresaService.js +52 -14
  131. package/dist/docs/docMockServices/personaService.d.ts +2 -2
  132. package/dist/docs/docMockServices/personaService.d.ts.map +1 -1
  133. package/dist/docs/docMockServices/personaService.js +17 -7
  134. package/dist/index.css +1 -1
  135. package/dist/index.d.ts +12 -4
  136. package/dist/index.d.ts.map +1 -1
  137. package/dist/index.js +6 -2
  138. package/dist/index.js.map +1 -1
  139. package/dist/templates/forms/ContactForm.js +2 -2
  140. package/dist/templates/forms/LoginForm.js +1 -1
  141. package/dist/templates/forms/RegistrationForm.js +1 -1
  142. package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
  143. package/dist/templates/layouts/SidebarLayout.js +3 -2
  144. package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
  145. package/dist/templates/patterns/FormPattern.js +4 -3
  146. package/package.json +4 -3
  147. package/dist/components/utils/DropdownMenu.d.ts.map +0 -1
  148. package/dist/components/utils/Filter.d.ts.map +0 -1
  149. package/dist/contexts/ListCrudContext.d.ts +0 -29
  150. package/dist/contexts/ListCrudContext.d.ts.map +0 -1
  151. package/dist/contexts/ListCrudContext.js +0 -209
  152. /package/dist/components/{utils → layout}/DropdownMenu.d.ts +0 -0
@@ -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;
@@ -163,6 +163,6 @@ const SearchSelectInputDocs = () => {
163
163
  } }), _jsxs("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["La funci\u00F3n onSearchPromiseFn puede devolver un", " ", _jsx("code", { children: "PaginationInterface<T>" }), ". El componente extraer\u00E1 autom\u00E1ticamente el array de la propiedad", " ", _jsx("code", { children: "list" }), "."] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Personalizaci\u00F3n del Dialog" }), _jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Dialog personalizado", placeholder: "Escribe y busca...", icon: "fa-search", dialogTitle: "Buscar y seleccionar un pa\u00EDs", noResultsText: "No se encontraron pa\u00EDses con ese criterio", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsxs("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Puedes personalizar el t\u00EDtulo del dialog con", " ", _jsx("code", { children: "dialogTitle" }), " y el mensaje de sin resultados con", " ", _jsx("code", { children: "noResultsText" }), "."] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Uso gen\u00E9rico con renderOption personalizado" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Buscar usuario", placeholder: "Escribe nombre, email o rol...", icon: "fa-users", onSearchPromiseFn: mockUserSearch, onSingleSearchPromiseFn: mockSingleUserSearch, getOptionLabel: (user) => `${user.firstName} ${user.lastName}`, getOptionValue: (user) => user.id, getOptionDescription: (user) => user.email, onSelectOption: (user, userId) => {
164
164
  setSelectedUser(user);
165
165
  console.log("Usuario seleccionado:", user, "ID:", userId);
166
- }, renderOption: (user) => (_jsxs("div", { className: "flex items-start gap-3 w-full", children: [_jsx("div", { className: "flex-shrink-0 w-10 h-10 rounded-full bg-[var(--color-primary-soft)] flex items-center justify-center", children: _jsx("i", { className: "fa fa-user text-[var(--color-primary)]" }) }), _jsxs("div", { className: "flex flex-col flex-1 min-w-0", children: [_jsxs("span", { className: "font-medium text-[var(--color-text-primary)]", children: [user.firstName, " ", user.lastName] }), _jsx("span", { className: "text-xs text-[var(--color-text-secondary)] truncate", children: user.email }), _jsxs("div", { className: "flex items-center gap-2 mt-1", children: [_jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-[var(--color-bg-secondary)] text-[var(--color-text-secondary)]", children: user.role }), _jsxs("span", { className: "text-xs text-[var(--color-text-muted)]", children: ["\u2022 ", user.department] })] })] })] })) }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "usando getOptionLabel, getOptionValue y renderOption para personalizar completamente el renderizado de opciones sin propiedades label/value/description" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Usuario seleccionado" }), _jsx(Card, { variant: "outlined", children: selectedUser ? (_jsxs("div", { className: "space-y-2", children: [_jsxs("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: [selectedUser.firstName, " ", selectedUser.lastName] }), _jsx("p", { className: "text-xs", style: { color: "var(--flysoft-text-secondary)" }, children: selectedUser.email }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-[var(--color-bg-secondary)]", style: { color: "var(--flysoft-text-secondary)" }, children: selectedUser.role }), _jsx("span", { className: "text-xs", style: { color: "var(--flysoft-text-muted)" }, children: selectedUser.department })] }), _jsxs("p", { className: "text-xs mt-2", style: { color: "var(--flysoft-text-muted)" }, children: ["ID: ", selectedUser.id] })] })) : (_jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ning\u00FAn usuario seleccionado" })) })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplo de formulario" }), _jsx(Card, { title: "Formulario de b\u00FAsqueda con SearchSelectInput", subtitle: "Combinaci\u00F3n de SearchSelectInput, DateInput, Input y Button", children: _jsxs("form", { className: "space-y-4", onSubmit: handleSubmit(onSubmit), children: [_jsx(SearchSelectInput, { label: "Pa\u00EDs de residencia", ...register("country"), placeholder: "Busca y selecciona un pa\u00EDs", getOptionLabel: (option) => option.label, getOptionValue: (option) => option.value ?? "", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise, dialogTitle: "Seleccione un pa\u00EDs" }), _jsxs("div", { children: ["Pa\u00EDs de residencia: ", watch("country")?.toString()] }), _jsx(DateInput, { label: "Fecha de nacimiento", placeholder: "dd/mm/yyyy", ...register("birthDate") }), _jsx(Input, { label: "Ciudad", placeholder: "Introduce tu ciudad", icon: "fa-city", error: errors.city?.message }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", icon: "fa-times", type: "submit", onClick: () => reset(), children: "Limpiar" }), _jsx(Button, { variant: "primary", icon: "fa-search", type: "submit", children: "Buscar" })] })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tama\u00F1os" }), _jsxs("div", { className: "space-y-4", children: [_jsx(SearchSelectInput, { label: "Tama\u00F1o peque\u00F1o", placeholder: "Escribe y busca...", size: "sm", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx(SearchSelectInput, { label: "Tama\u00F1o mediano (por defecto)", placeholder: "Escribe y busca...", size: "md", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx(SearchSelectInput, { label: "Tama\u00F1o grande", placeholder: "Escribe y busca...", size: "lg", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Estados y validaci\u00F3n" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Con error", placeholder: "Escribe y busca...", error: "Este campo es requerido", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "respeta el estado error heredado del componente Input" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Deshabilitado", placeholder: "No editable", icon: "fa-ban", disabled: true, onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "respeta el estado disabled heredado del componente Input" })] })] })] })] }) }) }));
166
+ }, renderOption: (user) => (_jsxs("div", { className: "flex items-start gap-3 w-full", children: [_jsx("div", { className: "flex-shrink-0 w-10 h-10 rounded-full bg-[var(--color-primary-soft)] flex items-center justify-center", children: _jsx("i", { className: "fal fa-user text-[var(--color-primary)]" }) }), _jsxs("div", { className: "flex flex-col flex-1 min-w-0", children: [_jsxs("span", { className: "font-medium text-[var(--color-text-primary)]", children: [user.firstName, " ", user.lastName] }), _jsx("span", { className: "text-xs text-[var(--color-text-secondary)] truncate", children: user.email }), _jsxs("div", { className: "flex items-center gap-2 mt-1", children: [_jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-[var(--color-bg-secondary)] text-[var(--color-text-secondary)]", children: user.role }), _jsxs("span", { className: "text-xs text-[var(--color-text-muted)]", children: ["\u2022 ", user.department] })] })] })] })) }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "usando getOptionLabel, getOptionValue y renderOption para personalizar completamente el renderizado de opciones sin propiedades label/value/description" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: "Usuario seleccionado" }), _jsx(Card, { variant: "outlined", children: selectedUser ? (_jsxs("div", { className: "space-y-2", children: [_jsxs("p", { className: "text-sm font-medium", style: { color: "var(--flysoft-text-primary)" }, children: [selectedUser.firstName, " ", selectedUser.lastName] }), _jsx("p", { className: "text-xs", style: { color: "var(--flysoft-text-secondary)" }, children: selectedUser.email }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-[var(--color-bg-secondary)]", style: { color: "var(--flysoft-text-secondary)" }, children: selectedUser.role }), _jsx("span", { className: "text-xs", style: { color: "var(--flysoft-text-muted)" }, children: selectedUser.department })] }), _jsxs("p", { className: "text-xs mt-2", style: { color: "var(--flysoft-text-muted)" }, children: ["ID: ", selectedUser.id] })] })) : (_jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ning\u00FAn usuario seleccionado" })) })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Ejemplo de formulario" }), _jsx(Card, { title: "Formulario de b\u00FAsqueda con SearchSelectInput", subtitle: "Combinaci\u00F3n de SearchSelectInput, DateInput, Input y Button", children: _jsxs("form", { className: "space-y-4", onSubmit: handleSubmit(onSubmit), children: [_jsx(SearchSelectInput, { label: "Pa\u00EDs de residencia", ...register("country"), placeholder: "Busca y selecciona un pa\u00EDs", getOptionLabel: (option) => option.label, getOptionValue: (option) => option.value ?? "", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise, dialogTitle: "Seleccione un pa\u00EDs" }), _jsxs("div", { children: ["Pa\u00EDs de residencia: ", watch("country")?.toString()] }), _jsx(DateInput, { label: "Fecha de nacimiento", placeholder: "dd/mm/yyyy", ...register("birthDate") }), _jsx(Input, { label: "Ciudad", placeholder: "Introduce tu ciudad", icon: "fa-city", error: errors.city?.message }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { variant: "outline", icon: "fa-times", type: "submit", onClick: () => reset(), children: "Limpiar" }), _jsx(Button, { variant: "primary", icon: "fa-search", type: "submit", children: "Buscar" })] })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tama\u00F1os" }), _jsxs("div", { className: "space-y-4", children: [_jsx(SearchSelectInput, { label: "Tama\u00F1o peque\u00F1o", placeholder: "Escribe y busca...", size: "sm", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx(SearchSelectInput, { label: "Tama\u00F1o mediano (por defecto)", placeholder: "Escribe y busca...", size: "md", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx(SearchSelectInput, { label: "Tama\u00F1o grande", placeholder: "Escribe y busca...", size: "lg", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Estados y validaci\u00F3n" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Con error", placeholder: "Escribe y busca...", error: "Este campo es requerido", onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "respeta el estado error heredado del componente Input" })] }), _jsxs("div", { className: "space-y-3", children: [_jsx(SearchSelectInput, { label: "Deshabilitado", placeholder: "No editable", icon: "fa-ban", disabled: true, onSearchPromiseFn: mockSearchPromise, onSingleSearchPromiseFn: mockSingleSearchPromise }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "respeta el estado disabled heredado del componente Input" })] })] })] })] }) }) }));
167
167
  };
168
168
  export default SearchSelectInputDocs;
@@ -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;IAc7D;;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
@@ -79,9 +86,10 @@ export const empresaService = {
79
86
  await simulateNetworkDelay();
80
87
  const empresas = _obtenerTodas();
81
88
  const nuevoId = empresas.length > 0 ? Math.max(...empresas.map((e) => e.id)) + 1 : 1;
89
+ // Crear nueva empresa: el id generado siempre sobrescribe cualquier id que venga
82
90
  const nuevaEmpresa = {
83
- id: nuevoId,
84
91
  ...empresa,
92
+ id: nuevoId, // El id siempre se asigna después para sobrescribir cualquier id existente
85
93
  };
86
94
  empresas.push(nuevaEmpresa);
87
95
  localStorage.setItem(STORAGE_KEY, JSON.stringify(empresas));
@@ -101,16 +109,17 @@ export const empresaService = {
101
109
  return empresas[index];
102
110
  },
103
111
  /**
104
- * Elimina una empresa por ID
112
+ * Elimina una empresa por ID y todas sus relaciones con personas
105
113
  */
106
- async eliminar(id) {
114
+ async eliminar(empresa) {
107
115
  await simulateNetworkDelay();
108
116
  const empresas = _obtenerTodas();
109
- const index = empresas.findIndex((emp) => emp.id === id);
117
+ const index = empresas.findIndex((emp) => emp.id === empresa.id);
110
118
  if (index === -1)
111
- return false;
119
+ return;
120
+ // Eliminar todas las relaciones de esta empresa
121
+ await personaEmpresaService.eliminarPorEmpresa(empresa.id);
112
122
  empresas.splice(index, 1);
113
123
  localStorage.setItem(STORAGE_KEY, JSON.stringify(empresas));
114
- return true;
115
124
  },
116
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
  },
@@ -30,9 +30,9 @@ export declare const personaService: {
30
30
  /**
31
31
  * Edita una persona existente
32
32
  */
33
- editar(id: number, datos: Partial<Omit<Persona, "id">>): Promise<Persona | null>;
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;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"}
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
@@ -136,9 +136,10 @@ export const personaService = {
136
136
  await simulateNetworkDelay();
137
137
  const personas = _obtenerTodas();
138
138
  const nuevoId = personas.length > 0 ? Math.max(...personas.map((p) => p.id)) + 1 : 1;
139
+ // Crear nueva persona: el id generado siempre sobrescribe cualquier id que venga
139
140
  const nuevaPersona = {
140
- id: nuevoId,
141
141
  ...persona,
142
+ id: nuevoId, // El id siempre se asigna después para sobrescribir cualquier id existente
142
143
  };
143
144
  personas.push(nuevaPersona);
144
145
  // Guardar convirtiendo fechaNacimiento a string ISO
@@ -157,7 +158,7 @@ export const personaService = {
157
158
  const personas = _obtenerTodas();
158
159
  const index = personas.findIndex((per) => per.id === id);
159
160
  if (index === -1)
160
- return null;
161
+ return undefined;
161
162
  personas[index] = { ...personas[index], ...datos };
162
163
  // Guardar convirtiendo fechaNacimiento a string ISO
163
164
  const personasParaGuardar = personas.map((p) => ({
@@ -168,13 +169,22 @@ export const personaService = {
168
169
  return personas[index];
169
170
  },
170
171
  /**
171
- * Elimina una persona por ID
172
+ * Elimina una persona por ID y todas sus relaciones con empresas
172
173
  */
173
174
  async eliminar(persona) {
174
175
  await simulateNetworkDelay();
175
176
  const personas = _obtenerTodas();
176
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);
177
182
  personas.splice(index, 1);
178
- 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));
179
189
  },
180
190
  };