flysoft-react-ui 0.5.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +5 -6
- package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
- package/dist/components/form-controls/AutocompleteInput.js +177 -131
- package/dist/components/form-controls/Button.d.ts +3 -0
- package/dist/components/form-controls/Button.d.ts.map +1 -1
- package/dist/components/form-controls/Button.js +160 -19
- package/dist/components/form-controls/Checkbox.d.ts.map +1 -1
- package/dist/components/form-controls/Checkbox.js +3 -1
- package/dist/components/form-controls/DateInput.d.ts +5 -1
- package/dist/components/form-controls/DateInput.d.ts.map +1 -1
- package/dist/components/form-controls/DateInput.js +94 -27
- package/dist/components/form-controls/Input.d.ts.map +1 -1
- package/dist/components/form-controls/Input.js +2 -1
- package/dist/components/form-controls/LinkButton.d.ts +15 -0
- package/dist/components/form-controls/LinkButton.d.ts.map +1 -0
- package/dist/components/form-controls/LinkButton.js +248 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -1
- package/dist/components/form-controls/SearchSelectInput-OLD.js +5 -4
- package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -1
- package/dist/components/form-controls/SearchSelectInput.js +3 -2
- package/dist/components/form-controls/index.d.ts +2 -0
- package/dist/components/form-controls/index.d.ts.map +1 -1
- package/dist/components/form-controls/index.js +1 -0
- package/dist/components/layout/Accordion.d.ts +13 -0
- package/dist/components/layout/Accordion.d.ts.map +1 -0
- package/dist/components/layout/Accordion.js +67 -0
- package/dist/components/layout/AppLayout.d.ts.map +1 -1
- package/dist/components/layout/AppLayout.js +7 -7
- package/dist/components/layout/Card.d.ts +8 -3
- package/dist/components/layout/Card.d.ts.map +1 -1
- package/dist/components/layout/Card.js +21 -22
- package/dist/components/layout/DataTable.js +1 -1
- package/dist/components/layout/DropdownMenu.d.ts.map +1 -0
- package/dist/components/{utils → layout}/DropdownMenu.js +12 -6
- package/dist/components/layout/DropdownPanel.d.ts +7 -0
- package/dist/components/layout/DropdownPanel.d.ts.map +1 -0
- package/dist/components/layout/DropdownPanel.js +137 -0
- package/dist/components/{utils → layout}/Filter.d.ts +5 -0
- package/dist/components/layout/Filter.d.ts.map +1 -0
- package/dist/components/{utils → layout}/Filter.js +18 -9
- package/dist/components/layout/Menu.d.ts +31 -0
- package/dist/components/layout/Menu.d.ts.map +1 -0
- package/dist/components/layout/Menu.js +21 -0
- package/dist/components/layout/index.d.ts +10 -0
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +5 -0
- package/dist/components/utils/Badge.d.ts.map +1 -1
- package/dist/components/utils/Badge.js +3 -2
- package/dist/components/utils/Dialog.d.ts +2 -2
- package/dist/components/utils/Dialog.d.ts.map +1 -1
- package/dist/components/utils/Dialog.js +4 -3
- package/dist/components/utils/FiltersDialog.d.ts +1 -1
- package/dist/components/utils/FiltersDialog.d.ts.map +1 -1
- package/dist/components/utils/FiltersDialog.js +2 -2
- package/dist/components/utils/Loader.js +1 -1
- package/dist/components/utils/RoadMap.d.ts.map +1 -1
- package/dist/components/utils/RoadMap.js +2 -1
- package/dist/components/utils/Snackbar.d.ts.map +1 -1
- package/dist/components/utils/Snackbar.js +2 -1
- package/dist/components/utils/iconUtils.d.ts +16 -0
- package/dist/components/utils/iconUtils.d.ts.map +1 -0
- package/dist/components/utils/iconUtils.js +40 -0
- package/dist/components/utils/index.d.ts +0 -2
- package/dist/components/utils/index.d.ts.map +1 -1
- package/dist/components/utils/index.js +0 -1
- package/dist/contexts/CrudContext.d.ts +62 -0
- package/dist/contexts/CrudContext.d.ts.map +1 -0
- package/dist/contexts/CrudContext.js +333 -0
- package/dist/contexts/index.d.ts +2 -2
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/contexts/index.js +2 -2
- package/dist/docs/AccordionDocs.d.ts +4 -0
- package/dist/docs/AccordionDocs.d.ts.map +1 -0
- package/dist/docs/AccordionDocs.js +21 -0
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -5
- package/dist/docs/AutocompleteInputDocs.js +1 -1
- package/dist/docs/ButtonDocs.d.ts.map +1 -1
- package/dist/docs/ButtonDocs.js +1 -1
- package/dist/docs/CardDocs.d.ts.map +1 -1
- package/dist/docs/CardDocs.js +17 -8
- package/dist/docs/DataTableDocs.js +3 -3
- package/dist/docs/DialogDocs.d.ts.map +1 -1
- package/dist/docs/DialogDocs.js +1 -1
- package/dist/docs/DocAdmin.js +1 -1
- package/dist/docs/DocsMenu.d.ts.map +1 -1
- package/dist/docs/DocsMenu.js +3 -3
- package/dist/docs/DocsRouter.d.ts.map +1 -1
- package/dist/docs/DocsRouter.js +5 -1
- package/dist/docs/DropdownMenuDocs.js +1 -1
- package/dist/docs/DropdownPanelDocs.d.ts +4 -0
- package/dist/docs/DropdownPanelDocs.d.ts.map +1 -0
- package/dist/docs/DropdownPanelDocs.js +7 -0
- package/dist/docs/FilterDocs.d.ts.map +1 -1
- package/dist/docs/FilterDocs.js +19 -1
- package/dist/docs/LinkButtonDocs.d.ts +4 -0
- package/dist/docs/LinkButtonDocs.d.ts.map +1 -0
- package/dist/docs/LinkButtonDocs.js +7 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +0 -9
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +32 -16
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.js +34 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.js +66 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +7 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts +10 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.js +39 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +33 -27
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +9 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +30 -0
- package/dist/docs/MenuDocs.d.ts +4 -0
- package/dist/docs/MenuDocs.d.ts.map +1 -0
- package/dist/docs/MenuDocs.js +26 -0
- package/dist/docs/SearchSelectInputDocs.js +1 -1
- package/dist/docs/docMockServices/empresaService.d.ts +5 -5
- package/dist/docs/docMockServices/empresaService.d.ts.map +1 -1
- package/dist/docs/docMockServices/empresaService.js +20 -11
- package/dist/docs/docMockServices/interfaces.d.ts +12 -0
- package/dist/docs/docMockServices/interfaces.d.ts.map +1 -1
- package/dist/docs/docMockServices/personaEmpresaService.d.ts +6 -6
- package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -1
- package/dist/docs/docMockServices/personaEmpresaService.js +52 -14
- package/dist/docs/docMockServices/personaService.d.ts +2 -2
- package/dist/docs/docMockServices/personaService.d.ts.map +1 -1
- package/dist/docs/docMockServices/personaService.js +17 -7
- package/dist/index.css +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/templates/forms/ContactForm.js +2 -2
- package/dist/templates/forms/LoginForm.js +1 -1
- package/dist/templates/forms/RegistrationForm.js +1 -1
- package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
- package/dist/templates/layouts/SidebarLayout.js +3 -2
- package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
- package/dist/templates/patterns/FormPattern.js +4 -3
- package/package.json +4 -3
- package/dist/components/utils/DropdownMenu.d.ts.map +0 -1
- package/dist/components/utils/Filter.d.ts.map +0 -1
- package/dist/contexts/ListCrudContext.d.ts +0 -29
- package/dist/contexts/ListCrudContext.d.ts.map +0 -1
- package/dist/contexts/ListCrudContext.js +0 -209
- /package/dist/components/{utils → layout}/DropdownMenu.d.ts +0 -0
|
@@ -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: "
|
|
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
|
-
|
|
18
|
-
|
|
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:
|
|
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(
|
|
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;
|
|
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?.
|
|
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?.
|
|
41
|
-
const filtroLower = params.
|
|
42
|
-
todasFiltradas =
|
|
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
|
-
|
|
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(
|
|
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
|
|
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<
|
|
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<
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
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 |
|
|
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;
|
|
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
|
|
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
|
-
|
|
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
|
};
|