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 @@
1
+ {"version":3,"file":"DropdownPanelDocs.d.ts","sourceRoot":"","sources":["../../src/docs/DropdownPanelDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAuL9B,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Card, DropdownPanel, Button } from "../index";
4
+ const DropdownPanelDocs = () => {
5
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "DropdownPanel - Panel Flotante Gen\u00E9rico", 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 DropdownPanel muestra un panel flotante con contenido arbitrario (children). A diferencia de DropdownMenu, no maneja una lista de opciones, sino que renderiza lo que le pases." }), _jsx("div", { className: "space-y-4", children: _jsxs("div", { className: "flex items-center gap-4", children: [_jsx(DropdownPanel, { children: _jsxs("div", { className: "p-4 w-64", children: [_jsx("h4", { className: "font-bold mb-2", children: "Contenido del panel" }), _jsx("p", { className: "text-sm", children: "Aqu\u00ED puedes poner cualquier cosa: texto, im\u00E1genes, componentes, formularios, etc." })] }) }), _jsx("div", { className: "text-sm text-[var(--flysoft-text-secondary)]", children: "<- Click en los tres puntos para ver el panel" })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con renderNode personalizado" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Puedes personalizar el disparador (trigger) usando la prop", " ", _jsx("code", { children: "renderNode" }), "."] }), _jsx("div", { className: "space-y-4", children: _jsx(DropdownPanel, { renderNode: _jsx(Button, { variant: "primary", icon: "fa-filter", children: "Filtros Avanzados" }), children: _jsxs("div", { className: "p-4 w-80 space-y-4", children: [_jsx("h4", { className: "font-bold border-b pb-2", children: "Configuraci\u00F3n de Filtros" }), _jsxs("div", { children: [_jsx("label", { className: "block text-sm mb-1", children: "Buscar por nombre" }), _jsx("input", { type: "text", className: "w-full p-2 border rounded", placeholder: "Escribe..." })] }), _jsx("div", { className: "flex justify-end pt-2", children: _jsx(Button, { variant: "primary", size: "sm", children: "Aplicar" }) })] }) }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Props" }), _jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full border-collapse", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Prop" }), _jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Tipo" }), _jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Requerido" }), _jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Descripci\u00F3n" })] }) }), _jsxs("tbody", { children: [_jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "children" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "ReactNode" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "S\u00ED" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Contenido a mostrar dentro del panel flotante." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "renderNode" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "ReactNode" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Elemento personalizado que activa el panel. Si no se proporciona, se muestra un bot\u00F3n ghost con tres puntos." })] })] })] }) })] })] }) }) }));
6
+ };
7
+ export default DropdownPanelDocs;
@@ -1 +1 @@
1
- {"version":3,"file":"FilterDocs.d.ts","sourceRoot":"","sources":["../../src/docs/FilterDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EA4tBvB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"FilterDocs.d.ts","sourceRoot":"","sources":["../../src/docs/FilterDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAgzBvB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -107,6 +107,24 @@ const FilterDocs = () => {
107
107
  paramName: "ejemplo2",
108
108
  label: "Ejemplo 2",
109
109
  },
110
- ] }), _jsxs("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: [_jsxs("p", { className: "text-sm", children: [_jsx("span", { className: "font-semibold", children: "Query parameters actuales:" }), " ", _jsx("span", { style: { color: "var(--flysoft-text-secondary)" }, children: searchParams.toString() || "ninguno" })] }), _jsx("p", { className: "text-xs mt-2", style: { color: "var(--flysoft-text-secondary)" }, children: "\uD83D\uDCA1 Configura los filtros en el dialog y observa c\u00F3mo la URL no cambia hasta que hagas clic en \"Aplicar filtros\"." })] })] }) })] })] }) }) }));
110
+ ] }), _jsxs("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: [_jsxs("p", { className: "text-sm", children: [_jsx("span", { className: "font-semibold", children: "Query parameters actuales:" }), " ", _jsx("span", { style: { color: "var(--flysoft-text-secondary)" }, children: searchParams.toString() || "ninguno" })] }), _jsx("p", { className: "text-xs mt-2", style: { color: "var(--flysoft-text-secondary)" }, children: "\uD83D\uDCA1 Configura los filtros en el dialog y observa c\u00F3mo la URL no cambia hasta que hagas clic en \"Aplicar filtros\"." })] })] }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Search y FiltersDialog Combinados" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Una disposici\u00F3n com\u00FAn es tener una b\u00FAsqueda r\u00E1pida a la izquierda y filtros avanzados a la derecha. Esto se logra f\u00E1cilmente con un contenedor flex y ", _jsx("code", { children: "justify-between" }), "."] }), _jsx(Card, { title: "Barra de herramientas combinada", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center justify-between w-full", children: [_jsxs(Collection, { direction: "row", children: [_jsx(Filter, { paramName: "busquedaGlobal", label: "Buscar...", filterType: "search", inputWidth: "300px" }), _jsx(Filter, { paramName: "filtroFecha", label: "Fecha", filterType: "date", inputWidth: "300px", hideEmpty: true }), _jsx(Filter, { paramName: "filtroEstado", label: "Estado", filterType: "autocomplete", inputWidth: "300px", hideEmpty: true, options: [
111
+ { label: "Activo", value: "active" },
112
+ { label: "Inactivo", value: "inactive" },
113
+ ] })] }), _jsx(FiltersDialog, { filters: [
114
+ {
115
+ filterType: "date",
116
+ paramName: "filtroFecha",
117
+ label: "Fecha",
118
+ },
119
+ {
120
+ filterType: "autocomplete",
121
+ paramName: "filtroEstado",
122
+ label: "Estado",
123
+ options: [
124
+ { label: "Activo", value: "active" },
125
+ { label: "Inactivo", value: "inactive" },
126
+ ],
127
+ },
128
+ ] })] }), _jsxs("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: [_jsxs("p", { className: "text-sm", children: [_jsx("span", { className: "font-semibold", children: "Query parameters actuales:" }), " ", _jsx("span", { style: { color: "var(--flysoft-text-secondary)" }, children: searchParams.toString() || "ninguno" })] }), _jsx("p", { className: "text-xs mt-2", style: { color: "var(--flysoft-text-secondary)" }, children: "\uD83D\uDCA1 Prueba escribir en el buscador (aplica inmediato) y luego usar los filtros avanzados (aplica al aceptar). Ambos coexisten en la URL." })] })] }) })] })] }) }) }));
111
129
  };
112
130
  export default FilterDocs;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const LinkButtonDocs: React.FC;
3
+ export default LinkButtonDocs;
4
+ //# sourceMappingURL=LinkButtonDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkButtonDocs.d.ts","sourceRoot":"","sources":["../../src/docs/LinkButtonDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,QAAA,MAAM,cAAc,EAAE,KAAK,CAAC,EAkhC3B,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Card, LinkButton, Button } from "../index";
4
+ const LinkButtonDocs = () => {
5
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "LinkButton - Variantes y Ejemplos", children: _jsxs("div", { className: "space-y-8", 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 LinkButton se ve y funciona como un Button, pero funciona como un enlace. Usa react-router-dom Link para rutas internas y un elemento <a> para enlaces externos." }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-6", children: [_jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/button", variant: "primary", children: "Ruta Interna" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Enlace a ruta interna" })] }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "https://github.com", target: "_blank", variant: "outline", children: "Enlace Externo" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Enlace externo con target" })] }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/card", variant: "ghost", children: "Ghost Link" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Variante ghost" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Variantes" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "LinkButton tiene las mismas variantes que Button: primary, outline y ghost." }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-6", children: [_jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/button", variant: "primary", icon: "fa-check", children: "Primario" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "variante primaria" })] }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/button", variant: "outline", icon: "fa-pen", children: "Outline" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "variante outline" })] }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/button", variant: "ghost", icon: "fa-trash", children: "Ghost" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "variante ghost" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Tama\u00F1os" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "LinkButton soporta los mismos tama\u00F1os que Button: sm, md y lg." }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-6", children: [_jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/button", size: "sm", variant: "primary", children: "Peque\u00F1o" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "tama\u00F1o peque\u00F1o" })] }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/button", size: "md", variant: "primary", children: "Mediano" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "tama\u00F1o mediano" })] }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/button", size: "lg", variant: "primary", children: "Grande" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "tama\u00F1o grande" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Colores" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Puedes especificar diferentes colores usando la propiedad", " ", _jsx("code", { children: "color" }), ". Los colores disponibles son: primary, secondary, success, warning, danger e info."] }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-md font-semibold mb-3", style: { color: "var(--flysoft-text-primary)" }, children: "Variante Primary" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(LinkButton, { to: "/docs/button", variant: "primary", color: "primary", children: "Primary" }), _jsx(LinkButton, { to: "/docs/button", variant: "primary", color: "secondary", children: "Secondary" }), _jsx(LinkButton, { to: "/docs/button", variant: "primary", color: "success", children: "Success" }), _jsx(LinkButton, { to: "/docs/button", variant: "primary", color: "warning", children: "Warning" }), _jsx(LinkButton, { to: "/docs/button", variant: "primary", color: "danger", children: "Danger" }), _jsx(LinkButton, { to: "/docs/button", variant: "primary", color: "info", children: "Info" })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-semibold mb-3", style: { color: "var(--flysoft-text-primary)" }, children: "Variante Outline" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(LinkButton, { to: "/docs/button", variant: "outline", color: "primary", children: "Primary" }), _jsx(LinkButton, { to: "/docs/button", variant: "outline", color: "secondary", children: "Secondary" }), _jsx(LinkButton, { to: "/docs/button", variant: "outline", color: "success", children: "Success" }), _jsx(LinkButton, { to: "/docs/button", variant: "outline", color: "warning", children: "Warning" }), _jsx(LinkButton, { to: "/docs/button", variant: "outline", color: "danger", children: "Danger" }), _jsx(LinkButton, { to: "/docs/button", variant: "outline", color: "info", children: "Info" })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-semibold mb-3", style: { color: "var(--flysoft-text-primary)" }, children: "Variante Ghost" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(LinkButton, { to: "/docs/button", variant: "ghost", color: "primary", children: "Primary" }), _jsx(LinkButton, { to: "/docs/button", variant: "ghost", color: "secondary", children: "Secondary" }), _jsx(LinkButton, { to: "/docs/button", variant: "ghost", color: "success", children: "Success" }), _jsx(LinkButton, { to: "/docs/button", variant: "ghost", color: "warning", children: "Warning" }), _jsx(LinkButton, { to: "/docs/button", variant: "ghost", color: "danger", children: "Danger" }), _jsx(LinkButton, { to: "/docs/button", variant: "ghost", color: "info", children: "Info" })] })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Colores personalizados" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Puedes especificar colores personalizados usando las propiedades", " ", _jsx("code", { children: "bg" }), " y ", _jsx("code", { children: "textColor" }), ". Acepta c\u00F3digos hex, rgb, rgba, hsl, o nombres de colores comunes (white, black, gray-50, gray-100, etc.)."] }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-md font-semibold mb-3", style: { color: "var(--flysoft-text-primary)" }, children: "Variante Primary con colores personalizados" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(LinkButton, { to: "/docs/button", variant: "primary", bg: "#8b5cf6", textColor: "white", children: "P\u00FArpura" }), _jsx(LinkButton, { to: "/docs/button", variant: "primary", bg: "#ec4899", textColor: "white", children: "Rosa" }), _jsx(LinkButton, { to: "/docs/button", variant: "primary", bg: "#14b8a6", textColor: "white", children: "Turquesa" }), _jsx(LinkButton, { to: "/docs/button", variant: "primary", bg: "rgb(239, 68, 68)", textColor: "white", children: "Rojo RGB" })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-semibold mb-3", style: { color: "var(--flysoft-text-primary)" }, children: "Variante Outline con colores personalizados" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(LinkButton, { to: "/docs/button", variant: "outline", bg: "#8b5cf6", textColor: "#8b5cf6", children: "P\u00FArpura" }), _jsx(LinkButton, { to: "/docs/button", variant: "outline", bg: "#ec4899", textColor: "#ec4899", children: "Rosa" }), _jsx(LinkButton, { to: "/docs/button", variant: "outline", bg: "#14b8a6", textColor: "#14b8a6", children: "Turquesa" })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-semibold mb-3", style: { color: "var(--flysoft-text-primary)" }, children: "Variante Ghost con colores personalizados" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(LinkButton, { to: "/docs/button", variant: "ghost", bg: "#8b5cf6", textColor: "#8b5cf6", children: "P\u00FArpura" }), _jsx(LinkButton, { to: "/docs/button", variant: "ghost", bg: "#ec4899", textColor: "#ec4899", children: "Rosa" }), _jsx(LinkButton, { to: "/docs/button", variant: "ghost", bg: "#14b8a6", textColor: "#14b8a6", children: "Turquesa" })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "text-md font-semibold mb-3", style: { color: "var(--flysoft-text-primary)" }, children: "Con nombres de colores" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx(LinkButton, { to: "/docs/button", variant: "primary", bg: "gray-800", textColor: "white", children: "Gray-800" }), _jsx(LinkButton, { to: "/docs/button", variant: "primary", bg: "gray-700", textColor: "white", children: "Gray-700" }), _jsx(LinkButton, { to: "/docs/button", variant: "outline", bg: "gray-600", textColor: "gray-600", children: "Gray-600" })] })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Con \u00EDcono" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "LinkButton soporta iconos FontAwesome 5 en las mismas posiciones que Button: izquierda o derecha." }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-6", children: [_jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/button", variant: "primary", icon: "fa-download", children: "Con \u00EDcono (izquierda)" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "\u00EDcono a la izquierda" })] }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/button", variant: "outline", icon: "fa-arrow-right", iconPosition: "right", children: "\u00CDcono a la derecha" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "\u00EDcono a la derecha" })] }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "/docs/button", variant: "ghost", icon: "fa-external-link-alt", children: "Solo \u00EDcono" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "sin texto, solo \u00EDcono" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Enlaces externos" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["LinkButton detecta autom\u00E1ticamente si el enlace es externo (http://, https://, mailto:, tel:) y usa un elemento <a> en lugar de react-router-dom Link. Puedes usar la propiedad", " ", _jsx("code", { children: "target" }), " para controlar c\u00F3mo se abre el enlace."] }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-6", children: [_jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "https://github.com", target: "_blank", variant: "primary", icon: "fa-external-link-alt", children: "GitHub" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "enlace externo con target=\"_blank\"" })] }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "mailto:contacto@ejemplo.com", variant: "outline", icon: "fa-envelope", children: "Email" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "enlace mailto" })] }), _jsxs("div", { className: "flex flex-col items-start gap-2", children: [_jsx(LinkButton, { to: "tel:+34600000000", variant: "ghost", icon: "fa-phone", children: "Tel\u00E9fono" }), _jsx("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "enlace tel" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Comparaci\u00F3n con Button" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "LinkButton tiene el mismo aspecto visual que Button, pero funciona como un enlace. \u00DAsalo cuando necesites navegar a otra p\u00E1gina o enlace externo." }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "p-4 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: [_jsx("h4", { className: "text-md font-semibold mb-3", style: { color: "var(--flysoft-text-primary)" }, children: "Button (acci\u00F3n)" }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "primary", icon: "fa-save", children: "Guardar" }), _jsx(Button, { variant: "outline", icon: "fa-cancel", children: "Cancelar" })] }), _jsx("p", { className: "text-xs mt-2", style: { color: "var(--flysoft-text-secondary)" }, children: "Usa Button para acciones que ocurren en la misma p\u00E1gina (guardar, eliminar, etc.)" })] }), _jsxs("div", { className: "p-4 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: [_jsx("h4", { className: "text-md font-semibold mb-3", style: { color: "var(--flysoft-text-primary)" }, children: "LinkButton (navegaci\u00F3n)" }), _jsxs("div", { className: "flex gap-2", children: [_jsx(LinkButton, { to: "/docs/button", variant: "primary", icon: "fa-link", children: "Ver Documentaci\u00F3n" }), _jsx(LinkButton, { to: "https://github.com", target: "_blank", variant: "outline", icon: "fa-external-link-alt", children: "GitHub" })] }), _jsx("p", { className: "text-xs mt-2", style: { color: "var(--flysoft-text-secondary)" }, children: "Usa LinkButton para navegar a otras p\u00E1ginas o enlaces externos" })] })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Caracter\u00EDsticas" }), _jsx("div", { className: "space-y-3", children: _jsx("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: _jsxs("ul", { className: "list-disc list-inside space-y-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: [_jsxs("li", { children: [_jsx("strong", { children: "Mismo aspecto que Button:" }), " LinkButton tiene exactamente el mismo dise\u00F1o visual que Button, incluyendo variantes, tama\u00F1os e iconos."] }), _jsxs("li", { children: [_jsx("strong", { children: "Rutas internas:" }), " Para rutas que empiezan con \"/\", usa react-router-dom Link para navegaci\u00F3n del lado del cliente."] }), _jsxs("li", { children: [_jsx("strong", { children: "Enlaces externos:" }), " Detecta autom\u00E1ticamente enlaces externos (http://, https://, mailto:, tel:) y usa un elemento <a>."] }), _jsxs("li", { children: [_jsx("strong", { children: "Target opcional:" }), " Puedes especificar el atributo target para controlar c\u00F3mo se abre el enlace. Para enlaces externos con target=\"_blank\", se agrega autom\u00E1ticamente rel=\"noopener noreferrer\" por seguridad."] }), _jsxs("li", { children: [_jsx("strong", { children: "Ripple effect:" }), " Incluye el mismo efecto ripple que Button al hacer clic."] }), _jsxs("li", { children: [_jsx("strong", { children: "Iconos:" }), " Soporta iconos FontAwesome 5 en posici\u00F3n izquierda o derecha."] }), _jsxs("li", { children: [_jsx("strong", { children: "Accesibilidad:" }), " Mantiene todas las caracter\u00EDsticas de accesibilidad de los enlaces HTML."] })] }) }) })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Props" }), _jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full border-collapse", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Prop" }), _jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Tipo" }), _jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Requerido" }), _jsx("th", { className: "px-4 py-2 text-left text-sm font-semibold", style: { color: "var(--flysoft-text-primary)" }, children: "Descripci\u00F3n" })] }) }), _jsxs("tbody", { children: [_jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "to" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "string" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "S\u00ED" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "URL o ruta a la que navegar. Puede ser una ruta interna (ej: \"/docs/button\") o un enlace externo (ej: \"https://github.com\", \"mailto:email@ejemplo.com\")." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "target" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "string" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Atributo target del enlace (ej: \"_blank\", \"_self\"). Para enlaces externos con target=\"_blank\", se agrega autom\u00E1ticamente rel=\"noopener noreferrer\" por seguridad." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "variant" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "\"primary\" | \"outline\" | \"ghost\"" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Variante visual del bot\u00F3n. Por defecto es \"primary\"." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "color" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "\"primary\" | \"secondary\" | \"success\" | \"warning\" | \"danger\" | \"info\"" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Color del bot\u00F3n. Por defecto es \"primary\". Permite usar otros colores del sistema de temas (secondary, success, warning, danger, info)." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "size" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "\"sm\" | \"md\" | \"lg\"" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Tama\u00F1o del bot\u00F3n. Por defecto es \"md\"." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "icon" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "string" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Clase de icono FontAwesome 5 (ej: \"fa-user\", \"fa-cog\") que se muestra junto al texto." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "iconPosition" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "\"left\" | \"right\"" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Posici\u00F3n del icono respecto al texto. Por defecto es \"left\"." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "children" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "ReactNode" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Contenido del bot\u00F3n. Si no se proporciona, solo se muestra el icono (si est\u00E1 definido)." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "bg" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "string" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Color de fondo personalizado. Acepta c\u00F3digos hex (ej: \"#8b5cf6\"), rgb/rgba (ej: \"rgb(139, 92, 246)\"), hsl, o nombres de colores comunes (white, black, gray-50, etc.). Cuando se especifica, sobrescribe las clases de variante." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "textColor" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "string" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Color del texto personalizado. Acepta los mismos formatos que bg. Si no se especifica y hay bg, usa un color por defecto seg\u00FAn la variante." })] }), _jsxs("tr", { className: "border-b border-[var(--color-border-default)]", children: [_jsx("td", { className: "px-4 py-2 text-sm font-mono", style: { color: "var(--flysoft-text-primary)" }, children: "className" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "string" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "No" }), _jsx("td", { className: "px-4 py-2 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Clases CSS adicionales." })] })] })] }) })] })] }) }) }));
6
+ };
7
+ export default LinkButtonDocs;
@@ -1,11 +1,2 @@
1
- /**
2
- * Componente de Documentación del ListCrudContext
3
- *
4
- * Este componente muestra cómo usar el ListCrudContext con un servicio mock
5
- * para propósitos de documentación y desarrollo.
6
- *
7
- * El servicio mock simula la operación principal:
8
- * - getPromise: Obtiene una lista de items (Array o PaginationInterface)
9
- */
10
1
  export declare const ListCrudDocs: () => import("react/jsx-runtime").JSX.Element;
11
2
  //# sourceMappingURL=ListCrudDocs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListCrudDocs.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocs.tsx"],"names":[],"mappings":"AAWA;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,+CA8BxB,CAAC"}
1
+ {"version":3,"file":"ListCrudDocs.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocs.tsx"],"names":[],"mappings":"AAeA,eAAO,MAAM,YAAY,+CA6ExB,CAAC"}
@@ -1,25 +1,41 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect } from "react";
3
3
  import { useAppLayout } from "../../contexts";
4
- import { ListCrudProvider } from "../../contexts/ListCrudContext";
4
+ import { CrudProvider } from "../../contexts/CrudContext";
5
5
  import { empresaService, personaService, } from "../docMockServices";
6
6
  import { ListCrudDocsContentPersonas } from "./ListCrudDocsContentPersonas";
7
- import { Collection } from "../../components";
8
- /**
9
- * Componente de Documentación del ListCrudContext
10
- *
11
- * Este componente muestra cómo usar el ListCrudContext con un servicio mock
12
- * para propósitos de documentación y desarrollo.
13
- *
14
- * El servicio mock simula la operación principal:
15
- * - getPromise: Obtiene una lista de items (Array o PaginationInterface)
16
- */
7
+ import { Collection, TabPanel, TabsGroup } from "../../components";
8
+ import { ListCrudDocsContentEmpresas } from "./ListCrudDocsContentEmpresas";
9
+ import { useParams } from "react-router-dom";
10
+ import { ListCrudDocsContentEmpresaSingle } from "./ListCrudDocsContentEmpresaSingle";
17
11
  export const ListCrudDocs = () => {
18
- const { listarPaginados, eliminar } = personaService;
19
- const { listarPaginados: listarPaginadosEmpresa } = empresaService;
12
+ const { listarPaginados, eliminar, editar, agregar } = personaService;
13
+ const { listarPaginados: listarPaginadosEmpresa, buscarPorId, editar: editarEmpresa, eliminar: eliminarEmpresa, } = empresaService;
20
14
  const { setNavBarLeftNode } = useAppLayout();
21
15
  useEffect(() => {
22
- setNavBarLeftNode(_jsx("h3", { className: "text-2xl font-semibold", children: "ListCrudContext" }));
16
+ setNavBarLeftNode(_jsx("h3", { className: "text-2xl font-semibold", children: "CrudContext" }));
17
+ return () => {
18
+ setNavBarLeftNode(_jsx(_Fragment, {}));
19
+ };
23
20
  }, [setNavBarLeftNode]);
24
- return (_jsxs(Collection, { children: [_jsx(ListCrudProvider, { getPromise: listarPaginados, deletePromise: eliminar, urlParams: ["filtro", "idEmpresa"], children: _jsx(ListCrudDocsContentPersonas, {}) }), _jsx(ListCrudProvider, { getPromise: listarPaginadosEmpresa, urlParams: ["filtroEmpresa", "idEmpresaEmpresa"], children: "Empresas" })] }));
21
+ const { id } = useParams();
22
+ return (_jsx(Collection, { children: _jsxs(TabsGroup, { tabs: [
23
+ { id: "personas", label: "Personas" },
24
+ { id: "empresas", label: "Empresas" },
25
+ ], paramName: "tab", children: [_jsx(TabPanel, { tabId: "personas", children: _jsx(CrudProvider, { getPromise: listarPaginados, postPromise: {
26
+ execute: agregar,
27
+ successMessage: "Persona agregada correctamente",
28
+ }, putPromise: {
29
+ execute: (persona) => editar(persona.id, persona),
30
+ successMessage: "Cambios guardados",
31
+ }, deletePromise: {
32
+ execute: eliminar,
33
+ successMessage: "Persona eliminada correctamente",
34
+ }, urlParams: ["filtro", "idEmpresa"], children: _jsx(ListCrudDocsContentPersonas, {}) }) }), _jsx(TabPanel, { tabId: "empresas", children: _jsx(CrudProvider, { getPromise: listarPaginadosEmpresa, putPromise: {
35
+ execute: (empresa) => editarEmpresa(empresa.id, empresa),
36
+ successMessage: "Cambios guardados",
37
+ }, deletePromise: {
38
+ execute: eliminarEmpresa,
39
+ successMessage: "Persona eliminada correctamente",
40
+ }, getItemPromise: (params) => buscarPorId(params?.toString() || ""), pageParam: "paginaEmpresa", urlParams: ["filtroEmpresa", "idEmpresaEmpresa"], singleItemId: id, children: id ? (_jsx(ListCrudDocsContentEmpresaSingle, {})) : (_jsx(ListCrudDocsContentEmpresas, {})) }) })] }) }));
25
41
  };
@@ -0,0 +1,2 @@
1
+ export declare const ListCrudDocsContentEmpresaPersonas: () => import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ListCrudDocsContentEmpresaPersonas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListCrudDocsContentEmpresaPersonas.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,kCAAkC,+CAsG9C,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Button, Card, DataTable, Dialog, Loader } from "../../components";
4
+ import { useCrud } from "../../contexts";
5
+ import { ListCrudDocsContentEmpresasPersonasEditDialog } from "./ListCrudDocsContentEmpresasPersonasEditDialog";
6
+ export const ListCrudDocsContentEmpresaPersonas = () => {
7
+ const { list, fetchItems, deleteItem } = useCrud();
8
+ const [isOpenEditDialog, setIsOpenEditDialog] = useState(false);
9
+ const [isOpenEliminarDialog, setIsOpenEliminarDialog] = useState(false);
10
+ const [selectedPersonaEmpresa, setSelectedPersonaEmpresa] = useState();
11
+ const onEditPersonaEmpresa = (personaEmpresa) => {
12
+ setSelectedPersonaEmpresa(personaEmpresa);
13
+ setIsOpenEditDialog(true);
14
+ };
15
+ const onEliminarPersonaEmpresa = (personaEmpresa) => {
16
+ setSelectedPersonaEmpresa(personaEmpresa);
17
+ setIsOpenEliminarDialog(true);
18
+ };
19
+ const onDeletePersonaSubmit = async () => {
20
+ await deleteItem.execute(selectedPersonaEmpresa);
21
+ setIsOpenEliminarDialog(false);
22
+ await fetchItems.execute();
23
+ };
24
+ return (_jsxs(_Fragment, { children: [_jsx(Card, { title: "Personas", headerActions: _jsx(Button, { icon: "fa-plus", onClick: () => onEditPersonaEmpresa(undefined), children: "Agregar Persona" }), alwaysDisplayHeaderActions: true, children: _jsx(DataTable, { isLoading: fetchItems.isLoading, columns: [
25
+ { header: "Nombre", value: (row) => row.persona.nombre },
26
+ { header: "Cargo", value: (row) => row.cargo },
27
+ {
28
+ actions: (row) => [
29
+ _jsx(Button, { icon: "fa-edit", onClick: () => onEditPersonaEmpresa(row), variant: "ghost", children: " Editar " }),
30
+ _jsx(Button, { icon: "fa-trash", onClick: () => onEliminarPersonaEmpresa(row), variant: "ghost", children: " Eliminar " })
31
+ ]
32
+ }
33
+ ], rows: list || [] }) }), isOpenEditDialog && (_jsx(ListCrudDocsContentEmpresasPersonasEditDialog, { isOpen: isOpenEditDialog, onClose: () => setIsOpenEditDialog(false), personaEmpresa: selectedPersonaEmpresa, personasEnEmpresa: list || [] })), isOpenEliminarDialog && (_jsxs(Dialog, { isOpen: isOpenEliminarDialog, title: "Eliminar Persona", onClose: () => setIsOpenEliminarDialog(false), footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenEliminarDialog(false), disabled: deleteItem.isLoading, children: "Cancelar" }), _jsx(Button, { onClick: onDeletePersonaSubmit, disabled: deleteItem.isLoading, children: "Eliminar" })] }), children: [_jsx("p", { children: "\u00BFEst\u00E1s seguro de querer eliminar esta persona?" }), _jsx(Loader, { isLoading: deleteItem.isLoading })] }))] }));
34
+ };
@@ -0,0 +1,2 @@
1
+ export declare const ListCrudDocsContentEmpresaSingle: () => import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ListCrudDocsContentEmpresaSingle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListCrudDocsContentEmpresaSingle.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.tsx"],"names":[],"mappings":"AAUA,eAAO,MAAM,gCAAgC,+CAgK5C,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { personaEmpresaService } from "../docMockServices";
3
+ import { CrudProvider, useCrud } from "../../contexts";
4
+ import { Button, Card, Collection, Dialog, Input, Loader } from "../../components";
5
+ import { useNavigate } from "react-router-dom";
6
+ import { ListCrudDocsContentEmpresaPersonas } from "./ListCrudDocsContentEmpresaPersonas";
7
+ import { useEffect, useState, useCallback } from "react";
8
+ import { DropdownMenu } from "../../components/layout/DropdownMenu";
9
+ import { FormProvider, useForm } from "react-hook-form";
10
+ export const ListCrudDocsContentEmpresaSingle = () => {
11
+ const { item, fetchItem, fetchItems, updateItem, deleteItem } = useCrud();
12
+ const methods = useForm({
13
+ defaultValues: item,
14
+ });
15
+ const { buscarPorEmpresa, agregar, editar, eliminar } = personaEmpresaService;
16
+ const navigate = useNavigate();
17
+ const [isEditing, setIsEditing] = useState(false);
18
+ const [isOpenEliminarDialog, setIsOpenEliminarDialog] = useState(false);
19
+ const buscarPersonasPorEmpresa = useCallback(async () => {
20
+ if (!item?.id) {
21
+ return [];
22
+ }
23
+ const personas = await buscarPorEmpresa(item.id);
24
+ return personas;
25
+ }, [item?.id, buscarPorEmpresa]);
26
+ useEffect(() => {
27
+ if (item) {
28
+ methods.reset(item);
29
+ }
30
+ // eslint-disable-next-line react-hooks/exhaustive-deps
31
+ }, [item]);
32
+ const onSubmitEdit = async (empresa) => {
33
+ await updateItem.execute(empresa);
34
+ setIsEditing(false);
35
+ fetchItem.execute();
36
+ fetchItems.execute();
37
+ };
38
+ const onDeleteEmpresaSubmit = async () => {
39
+ await deleteItem.execute(item);
40
+ setIsOpenEliminarDialog(false);
41
+ navigate(-1);
42
+ fetchItems.execute();
43
+ };
44
+ return (_jsxs(_Fragment, { children: [_jsx(Card, { title: fetchItem.isLoading ? "" : item?.nombre, headerActions: !isEditing ? (_jsxs(Collection, { direction: "row", children: [_jsx(DropdownMenu, { options: [
45
+ { label: "Editar", icon: "fa-edit" },
46
+ { label: "Eliminar", icon: "fa-trash" },
47
+ ], onOptionSelected: (item) => {
48
+ if (item.label === "Editar") {
49
+ setIsEditing(true);
50
+ }
51
+ if (item.label === "Eliminar") {
52
+ setIsOpenEliminarDialog(true);
53
+ }
54
+ } }), _jsx(Button, { icon: "fa-undo", variant: "ghost", size: "sm", onClick: () => navigate(-1) })] })) : null, alwaysDisplayHeaderActions: true, footer: isEditing ? (_jsx("div", { className: "flex justify-end", children: _jsxs(Collection, { direction: "row", children: [_jsx(Button, { variant: "outline", onClick: () => setIsEditing(false), disabled: updateItem.isLoading, children: "Cancelar" }), _jsx(Button, { icon: "fa-save", onClick: methods.handleSubmit(onSubmitEdit), disabled: updateItem.isLoading, children: "Guardar" })] }) })) : null, children: !isEditing ? (_jsx(CrudProvider, { getPromise: buscarPersonasPorEmpresa, postPromise: {
55
+ execute: (persona) => agregar(persona),
56
+ successMessage: "Persona agregada correctamente",
57
+ }, putPromise: {
58
+ execute: (personaEmpresa) => editar(personaEmpresa.idPersona, personaEmpresa.idEmpresa, personaEmpresa),
59
+ successMessage: "Cambios guardados",
60
+ }, deletePromise: {
61
+ execute: (persona) => eliminar(persona),
62
+ successMessage: "Persona eliminada correctamente",
63
+ }, extraData: { idEmpresa: item?.id }, children: _jsx(ListCrudDocsContentEmpresaPersonas, {}) })) : (_jsx(FormProvider, { ...methods, children: _jsx("form", { onSubmit: methods.handleSubmit(onSubmitEdit), children: _jsx(Collection, { children: _jsx("div", { className: "w-[300px]", children: _jsx(Input, { label: "Nombre", ...methods.register("nombre", {
64
+ required: "Campo obligatorio",
65
+ }) }) }) }) }) })) }), isOpenEliminarDialog && (_jsxs(Dialog, { isOpen: isOpenEliminarDialog, title: "Eliminar Empresa", onClose: () => setIsOpenEliminarDialog(false), footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenEliminarDialog(false), disabled: deleteItem.isLoading, children: "Cancelar" }), _jsx(Button, { onClick: onDeleteEmpresaSubmit, disabled: deleteItem.isLoading, children: "Eliminar" })] }), children: [_jsx("p", { children: "\u00BFEst\u00E1s seguro de querer eliminar esta empresa?" }), _jsx(Loader, { isLoading: deleteItem.isLoading })] }))] }));
66
+ };
@@ -0,0 +1,2 @@
1
+ export declare const ListCrudDocsContentEmpresas: () => import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ListCrudDocsContentEmpresas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListCrudDocsContentEmpresas.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,2BAA2B,+CAsCvC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Card, Collection, Filter, LinkButton, Loader } from "../../components";
3
+ import { useCrud } from "../../contexts";
4
+ export const ListCrudDocsContentEmpresas = () => {
5
+ const { list, pagination, fetchItems } = useCrud();
6
+ return (_jsxs(Card, { className: "bg-gray-50", title: "Empresas", children: [_jsxs("div", { className: "flex justify-between items-center my-2", children: [_jsx(Collection, { direction: "row", wrap: true, children: _jsx(Filter, { paramName: "filtroEmpresa", label: "Buscar", filterType: "search" }) }), _jsx(Collection, { direction: "row", wrap: true, children: pagination })] }), _jsx(Loader, { isLoading: fetchItems.isLoading, children: _jsx(Collection, { direction: "row", wrap: true, children: list?.map((empresa) => (_jsx(Card, { className: "bg-white w-[100%] md:w-[45%] lg:w-[30%] xl:w-[18%]", title: empresa.nombre, headerActions: _jsx(LinkButton, { to: `/docs/listcrud/empresa/${empresa.id}`, icon: "fa-search", variant: "ghost", size: "sm" }) }, empresa.id))) }) })] }));
7
+ };
@@ -0,0 +1,10 @@
1
+ import { type PersonaEmpresaConPersona } from "../docMockServices";
2
+ interface ListCrudDocsContentEmpresasPersonasEditDialogProps {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ personaEmpresa: PersonaEmpresaConPersona | undefined;
6
+ personasEnEmpresa: PersonaEmpresaConPersona[];
7
+ }
8
+ export declare const ListCrudDocsContentEmpresasPersonasEditDialog: ({ isOpen, onClose, personaEmpresa, personasEnEmpresa, }: ListCrudDocsContentEmpresasPersonasEditDialogProps) => import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListCrudDocsContentEmpresasPersonasEditDialog.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.tsx"],"names":[],"mappings":"AASA,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,oBAAoB,CAAC;AAK5B,UAAU,kDAAkD;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACrD,iBAAiB,EAAE,wBAAwB,EAAE,CAAC;CAC/C;AAED,eAAO,MAAM,6CAA6C,GAAI,yDAK3D,kDAAkD,4CAyEpD,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { FormProvider, useForm } from "react-hook-form";
3
+ import { AutocompleteInput, Button, Collection, Dialog, Input, Loader, } from "../../components";
4
+ import { personaService, } from "../docMockServices";
5
+ import { useEffect, useState } from "react";
6
+ import { useCrud } from "../../contexts";
7
+ import { useAsyncRequest } from "../../hooks";
8
+ export const ListCrudDocsContentEmpresasPersonasEditDialog = ({ isOpen, onClose, personaEmpresa, personasEnEmpresa, }) => {
9
+ const { listar } = personaService;
10
+ const { updateItem, createItem, extraData, fetchItems } = useCrud();
11
+ const [personas, setPersonas] = useState([]);
12
+ const listarPersonas = useAsyncRequest();
13
+ useEffect(() => {
14
+ listarPersonas.execute(listar).then((personas) => {
15
+ setPersonas((personas || []).filter((persona) => !personasEnEmpresa.some((personaEnEmpresa) => personaEnEmpresa.idPersona === persona.id)));
16
+ });
17
+ }, [listar, personasEnEmpresa]);
18
+ const methods = useForm({
19
+ defaultValues: personaEmpresa,
20
+ });
21
+ const onSubmit = async (personaEmpresa) => {
22
+ if (personaEmpresa.idEmpresa) {
23
+ await updateItem.execute(personaEmpresa);
24
+ }
25
+ else {
26
+ if (!extraData?.idEmpresa) {
27
+ throw new Error("No se encontro el id de la empresa");
28
+ }
29
+ await createItem.execute({ ...personaEmpresa, idEmpresa: extraData.idEmpresa });
30
+ }
31
+ onClose();
32
+ await fetchItems.execute();
33
+ };
34
+ return (_jsx(FormProvider, { ...methods, children: _jsx(Dialog, { isOpen: isOpen, onClose: onClose, title: "Editar Persona Empresa", footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: onClose, children: "Cancelar" }), _jsx(Button, { onClick: methods.handleSubmit(onSubmit), children: "Guardar" })] }), children: _jsx("form", { onSubmit: methods.handleSubmit(onSubmit), children: _jsxs(Collection, { children: [_jsx(AutocompleteInput, { label: "Persona", options: personas, getOptionLabel: (option) => option.nombre, getOptionValue: (option) => option.id.toString(), ...methods.register("idPersona", {
35
+ required: "Campo obligatorio",
36
+ }), error: methods.formState.errors.idPersona?.message, disabled: listarPersonas.isLoading || updateItem.isLoading || createItem.isLoading }), _jsx(Input, { label: "Cargo", ...methods.register("cargo", {
37
+ required: "Campo obligatorio",
38
+ }), error: methods.formState.errors.cargo?.message, disabled: listarPersonas.isLoading || updateItem.isLoading || createItem.isLoading }), _jsx(Loader, { isLoading: listarPersonas.isLoading || updateItem.isLoading || createItem.isLoading })] }) }) }) }));
39
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"ListCrudDocsContentPersonas.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.tsx"],"names":[],"mappings":"AAcA,eAAO,MAAM,2BAA2B,+CAsHvC,CAAC"}
1
+ {"version":3,"file":"ListCrudDocsContentPersonas.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.tsx"],"names":[],"mappings":"AAgBA,eAAO,MAAM,2BAA2B,+CAkJvC,CAAC"}
@@ -1,14 +1,16 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useListCrud } from "../../contexts";
3
- import { Button, Card, Collection, DataTable, Dialog, Filter, } from "../../components";
2
+ import { useCrud } from "../../contexts";
3
+ import { Button, Card, Collection, DataTable, Dialog, Filter, Loader, } from "../../components";
4
4
  import { useEffect } from "react";
5
5
  import { useState } from "react";
6
6
  import { empresaService } from "../docMockServices";
7
+ import { ListCrudDocsEditDialog } from "./ListCrudDocsEditDialog";
7
8
  export const ListCrudDocsContentPersonas = () => {
8
- const { list, pagination, isLoading, refetch, deleteItem } = useListCrud();
9
+ const { list, pagination, isLoading, fetchItems, deleteItem } = useCrud();
9
10
  const { listar } = empresaService;
10
11
  const [empresas, setEmpresas] = useState([]);
11
12
  const [isOpenDeleteDialog, setIsOpenDeleteDialog] = useState(false);
13
+ const [isOpenEditDialog, setIsOpenEditDialog] = useState(false);
12
14
  const [selectedPersona, setSelectedPersona] = useState();
13
15
  const onDeletePersona = (persona) => {
14
16
  setSelectedPersona(persona);
@@ -16,36 +18,40 @@ export const ListCrudDocsContentPersonas = () => {
16
18
  };
17
19
  const onDeletePersonaSubmit = async () => {
18
20
  if (selectedPersona) {
19
- await deleteItem(selectedPersona);
20
- refetch();
21
+ await deleteItem.execute(selectedPersona);
21
22
  setIsOpenDeleteDialog(false);
23
+ fetchItems.execute();
22
24
  }
23
25
  };
26
+ const onEditPersona = (persona) => {
27
+ setSelectedPersona(persona);
28
+ setIsOpenEditDialog(true);
29
+ };
24
30
  useEffect(() => {
25
31
  listar().then((empresas) => {
26
32
  setEmpresas(empresas);
27
33
  });
28
34
  }, [listar]);
29
- return (_jsxs(_Fragment, { children: [_jsxs(Collection, { children: [_jsxs(Card, { className: "bg-gray-50", title: "Personas", children: [_jsxs("div", { className: "flex justify-between items-center my-2", children: [_jsx("div", { children: _jsxs(Collection, { direction: "row", wrap: true, gap: "12px", children: [_jsx(Filter, { paramName: "filtro", label: "Buscar", filterType: "search" }), _jsx(Filter, { paramName: "idEmpresa", label: "Empresa", filterType: "autocomplete", options: empresas.map((empresa) => ({
30
- label: empresa.nombre,
31
- value: empresa.id.toString(),
32
- })) })] }) }), _jsx("div", { children: pagination })] }), _jsx(DataTable, { columns: [
33
- { header: "Nombre", value: (row) => row.nombre },
34
- { header: "Email", value: (row) => row.email },
35
- {
36
- header: "Fecha de Nacimiento",
37
- value: (row) => row.fechaNacimiento.format("DD/MM/YYYY"),
38
- },
39
- {
40
- header: "Empresas",
41
- value: (row) => row.empresas.map((empresa) => empresa.nombre).join(", "),
42
- },
43
- {
44
- align: "center",
45
- actions: (row) => [
46
- _jsx(Button, { size: "sm", variant: "ghost", icon: "fa-edit", onClick: () => console.log("Editar", row), children: "Editar" }, "edit"),
47
- _jsx(Button, { size: "sm", variant: "ghost", icon: "fa-trash", onClick: () => onDeletePersona(row), children: "Eliminar" }, "delete"),
48
- ],
49
- },
50
- ], rows: list || [], maxRows: 10, isLoading: isLoading, loadingRows: 10 })] }), _jsx("div", { children: _jsx(Button, { onClick: () => refetch(), children: "Refetch" }) })] }), isOpenDeleteDialog && (_jsx(Dialog, { isOpen: isOpenDeleteDialog, title: "Eliminar Persona", onClose: () => setIsOpenDeleteDialog(false), dialogBody: _jsx("p", { children: "\u00BFEst\u00E1s seguro de querer eliminar esta persona?" }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenDeleteDialog(false), children: "Cancelar" }), _jsx(Button, { onClick: onDeletePersonaSubmit, children: "Eliminar" })] }) }))] }));
35
+ return (_jsxs(_Fragment, { children: [_jsxs(Card, { className: "bg-gray-50", title: "Personas", headerActions: _jsxs(Collection, { direction: "row", children: [_jsx(Button, { icon: "fa-plus", onClick: () => onEditPersona(undefined), children: "Agregar Persona" }), _jsx(Button, { icon: "fa-sync", onClick: () => fetchItems.execute() })] }), alwaysDisplayHeaderActions: true, children: [_jsxs("div", { className: "flex justify-between items-center my-2", children: [_jsxs(Collection, { direction: "row", wrap: true, children: [_jsx(Filter, { paramName: "filtro", label: "Buscar", filterType: "search" }), _jsx(Filter, { paramName: "idEmpresa", label: "Empresa", filterType: "autocomplete", options: empresas.map((empresa) => ({
36
+ label: empresa.nombre,
37
+ value: empresa.id.toString(),
38
+ })) })] }), _jsx(Collection, { direction: "row", wrap: true, children: pagination })] }), _jsx(DataTable, { columns: [
39
+ { header: "Nombre", value: (row) => row.nombre },
40
+ { header: "Email", value: (row) => row.email },
41
+ {
42
+ header: "Fecha de Nacimiento",
43
+ value: (row) => row.fechaNacimiento.format("DD/MM/YYYY"),
44
+ },
45
+ {
46
+ header: "Empresas",
47
+ value: (row) => row.empresas.map((empresa) => empresa.nombre).join(", "),
48
+ },
49
+ {
50
+ align: "center",
51
+ actions: (row) => [
52
+ _jsx(Button, { size: "sm", variant: "ghost", icon: "fa-edit", onClick: () => onEditPersona(row), children: "Editar" }, "edit"),
53
+ _jsx(Button, { size: "sm", variant: "ghost", icon: "fa-trash", onClick: () => onDeletePersona(row), children: "Eliminar" }, "delete"),
54
+ ],
55
+ },
56
+ ], rows: list || [], maxRows: 10, isLoading: isLoading, loadingRows: 10 })] }), isOpenDeleteDialog && (_jsxs(Dialog, { isOpen: isOpenDeleteDialog, title: "Eliminar Persona", onClose: () => setIsOpenDeleteDialog(false), footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenDeleteDialog(false), disabled: deleteItem.isLoading, children: "Cancelar" }), _jsx(Button, { onClick: onDeletePersonaSubmit, disabled: deleteItem.isLoading, children: "Eliminar" })] }), children: [_jsx("p", { children: "\u00BFEst\u00E1s seguro de querer eliminar esta persona?" }), _jsx(Loader, { isLoading: deleteItem.isLoading })] })), isOpenEditDialog && (_jsx(ListCrudDocsEditDialog, { isOpen: isOpenEditDialog, onClose: () => setIsOpenEditDialog(false), persona: selectedPersona }))] }));
51
57
  };
@@ -0,0 +1,9 @@
1
+ import type { Persona } from "../docMockServices";
2
+ interface ListCrudDocsEditDialogProps {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ persona: Persona | undefined;
6
+ }
7
+ export declare const ListCrudDocsEditDialog: ({ isOpen, onClose, persona, }: ListCrudDocsEditDialogProps) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=ListCrudDocsEditDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListCrudDocsEditDialog.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAsB,MAAM,oBAAoB,CAAC;AAGtE,UAAU,2BAA2B;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,eAAO,MAAM,sBAAsB,GAAI,+BAIpC,2BAA2B,4CA2E7B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useForm, FormProvider } from "react-hook-form";
3
+ import { Button, Collection, DateInput, Dialog, Input, Loader, } from "../../components";
4
+ import { useCrud } from "../../contexts";
5
+ export const ListCrudDocsEditDialog = ({ isOpen, onClose, persona, }) => {
6
+ const methods = useForm({
7
+ defaultValues: persona,
8
+ });
9
+ const { createItem, updateItem, fetchItems } = useCrud();
10
+ const { register, handleSubmit, formState: { errors }, } = methods;
11
+ const onSubmit = async (persona) => {
12
+ if (persona.id) {
13
+ await updateItem.execute(persona);
14
+ }
15
+ else {
16
+ await createItem.execute(persona);
17
+ }
18
+ onClose();
19
+ fetchItems.execute();
20
+ };
21
+ const isLoading = createItem.isLoading || updateItem.isLoading;
22
+ return (_jsx(FormProvider, { ...methods, children: _jsx(Dialog, { isOpen: isOpen, onClose: onClose, title: "Editar Persona", footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: onClose, children: "Cancelar" }), _jsx(Button, { onClick: handleSubmit(onSubmit), children: "Guardar" })] }), children: _jsx("form", { onSubmit: handleSubmit(onSubmit), onKeyDown: (e) => {
23
+ if (e.key === "Enter") {
24
+ e.preventDefault();
25
+ handleSubmit(onSubmit)();
26
+ }
27
+ }, children: _jsxs(Collection, { children: [_jsx(Input, { label: "Nombre", ...register("nombre", { required: "Campo obligatorio" }), error: errors.nombre?.message }), _jsx(Input, { label: "Email", ...register("email", { required: "Campo obligatorio" }), error: errors.email?.message }), _jsx(DateInput, { label: "Fecha de Nacimiento", placeholder: "dd/mm/yyyy", icon: "fa-calendar-alt", ...register("fechaNacimiento", {
28
+ required: "Campo obligatorio",
29
+ }), error: errors.fechaNacimiento?.message }), _jsx(Loader, { isLoading: isLoading })] }) }) }) }));
30
+ };
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const MenuDocs: React.FC;
3
+ export default MenuDocs;
4
+ //# sourceMappingURL=MenuDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenuDocs.d.ts","sourceRoot":"","sources":["../../src/docs/MenuDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAqBxC,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EA2KrB,CAAC;AAEF,eAAe,QAAQ,CAAC"}