flysoft-react-ui 0.5.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
  2. package/dist/components/form-controls/AutocompleteInput.js +175 -130
  3. package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -1
  4. package/dist/components/form-controls/SearchSelectInput-OLD.js +2 -2
  5. package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -1
  6. package/dist/components/form-controls/SearchSelectInput.js +1 -1
  7. package/dist/components/layout/AppLayout.d.ts.map +1 -1
  8. package/dist/components/layout/AppLayout.js +7 -7
  9. package/dist/components/layout/Card.d.ts.map +1 -1
  10. package/dist/components/layout/Card.js +4 -4
  11. package/dist/components/layout/DataTable.js +1 -1
  12. package/dist/components/layout/DropdownMenu.d.ts.map +1 -0
  13. package/dist/components/{utils → layout}/DropdownMenu.js +12 -6
  14. package/dist/components/layout/DropdownPanel.d.ts +7 -0
  15. package/dist/components/layout/DropdownPanel.d.ts.map +1 -0
  16. package/dist/components/layout/DropdownPanel.js +137 -0
  17. package/dist/components/{utils → layout}/Filter.d.ts +5 -0
  18. package/dist/components/layout/Filter.d.ts.map +1 -0
  19. package/dist/components/{utils → layout}/Filter.js +17 -9
  20. package/dist/components/layout/Menu.d.ts +31 -0
  21. package/dist/components/layout/Menu.d.ts.map +1 -0
  22. package/dist/components/layout/Menu.js +21 -0
  23. package/dist/components/layout/index.d.ts +8 -0
  24. package/dist/components/layout/index.d.ts.map +1 -1
  25. package/dist/components/layout/index.js +4 -0
  26. package/dist/components/utils/Dialog.d.ts +2 -2
  27. package/dist/components/utils/Dialog.d.ts.map +1 -1
  28. package/dist/components/utils/Dialog.js +2 -2
  29. package/dist/components/utils/FiltersDialog.d.ts +1 -1
  30. package/dist/components/utils/FiltersDialog.d.ts.map +1 -1
  31. package/dist/components/utils/FiltersDialog.js +2 -2
  32. package/dist/components/utils/index.d.ts +0 -2
  33. package/dist/components/utils/index.d.ts.map +1 -1
  34. package/dist/components/utils/index.js +0 -1
  35. package/dist/contexts/{ListCrudContext.d.ts → CrudContext.d.ts} +20 -8
  36. package/dist/contexts/CrudContext.d.ts.map +1 -0
  37. package/dist/contexts/{ListCrudContext.js → CrudContext.js} +102 -22
  38. package/dist/contexts/index.d.ts +2 -2
  39. package/dist/contexts/index.d.ts.map +1 -1
  40. package/dist/contexts/index.js +2 -2
  41. package/dist/docs/DialogDocs.d.ts.map +1 -1
  42. package/dist/docs/DialogDocs.js +1 -1
  43. package/dist/docs/DocsMenu.d.ts.map +1 -1
  44. package/dist/docs/DocsMenu.js +1 -1
  45. package/dist/docs/DocsRouter.d.ts.map +1 -1
  46. package/dist/docs/DocsRouter.js +3 -1
  47. package/dist/docs/DropdownPanelDocs.d.ts +4 -0
  48. package/dist/docs/DropdownPanelDocs.d.ts.map +1 -0
  49. package/dist/docs/DropdownPanelDocs.js +7 -0
  50. package/dist/docs/FilterDocs.d.ts.map +1 -1
  51. package/dist/docs/FilterDocs.js +19 -1
  52. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -1
  53. package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +26 -14
  54. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts +2 -0
  55. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts.map +1 -0
  56. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.js +34 -0
  57. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts +2 -0
  58. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts.map +1 -0
  59. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.js +66 -0
  60. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -1
  61. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +5 -5
  62. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts +10 -0
  63. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map +1 -0
  64. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.js +39 -0
  65. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -1
  66. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +3 -3
  67. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -1
  68. package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +4 -4
  69. package/dist/docs/MenuDocs.d.ts +4 -0
  70. package/dist/docs/MenuDocs.d.ts.map +1 -0
  71. package/dist/docs/MenuDocs.js +26 -0
  72. package/dist/docs/docMockServices/empresaService.d.ts +5 -5
  73. package/dist/docs/docMockServices/empresaService.d.ts.map +1 -1
  74. package/dist/docs/docMockServices/empresaService.js +18 -10
  75. package/dist/docs/docMockServices/interfaces.d.ts +12 -0
  76. package/dist/docs/docMockServices/interfaces.d.ts.map +1 -1
  77. package/dist/docs/docMockServices/personaEmpresaService.d.ts +6 -6
  78. package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -1
  79. package/dist/docs/docMockServices/personaEmpresaService.js +52 -14
  80. package/dist/docs/docMockServices/personaService.d.ts +1 -1
  81. package/dist/docs/docMockServices/personaService.d.ts.map +1 -1
  82. package/dist/docs/docMockServices/personaService.js +14 -5
  83. package/dist/index.css +1 -1
  84. package/dist/index.d.ts +8 -4
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +4 -2
  87. package/dist/index.js.map +1 -1
  88. package/package.json +4 -3
  89. package/dist/components/utils/DropdownMenu.d.ts.map +0 -1
  90. package/dist/components/utils/Filter.d.ts.map +0 -1
  91. package/dist/contexts/ListCrudContext.d.ts.map +0 -1
  92. /package/dist/components/{utils → layout}/DropdownMenu.d.ts +0 -0
@@ -3,23 +3,32 @@ import { createContext, useContext, useEffect, useMemo, useRef, useState, useCal
3
3
  import { useSearchParams } from "react-router-dom";
4
4
  import { Pagination, } from "../components/form-controls/Pagination";
5
5
  import { useAsyncRequest } from "../hooks/useAsyncRequest";
6
- const createListCrudContext = () => {
6
+ const createCrudContext = () => {
7
7
  return createContext(undefined);
8
8
  };
9
9
  // Crear el contexto con un tipo genérico por defecto
10
10
  // Los usuarios pueden crear su propio contexto con su tipo específico
11
- export const ListCrudContext = createListCrudContext();
12
- export function ListCrudProvider({ children, getPromise, postPromise, putPromise, deletePromise, limit = 15, pageParam = "pagina", urlParams = [], }) {
11
+ export const CrudContext = createCrudContext();
12
+ export function CrudProvider({ children, getPromise, getItemPromise, postPromise, putPromise, deletePromise, limit = 15, pageParam = "pagina", urlParams = [], singleItemId, extraData: extraDataProp, }) {
13
+ const [extraData, setExtraData] = useState(extraDataProp);
13
14
  const [list, setList] = useState(undefined);
15
+ const [item, setItem] = useState(undefined);
14
16
  const [page, setPage] = useState(1);
15
17
  const [pages, setPages] = useState(1);
16
18
  const [total, setTotal] = useState(0);
17
19
  const [searchParams, setSearchParams] = useSearchParams();
18
- const lastFetchParamsRef = useRef("");
19
20
  // Extraer funciones execute y opciones de las promises
20
- const getPromiseExecute = typeof getPromise === "function" ? getPromise : getPromise.execute;
21
- const getPromiseSuccessMessage = typeof getPromise === "function" ? undefined : getPromise.successMessage;
22
- const getPromiseErrorMessage = typeof getPromise === "function" ? undefined : getPromise.errorMessage;
21
+ const getPromiseExecute = getPromise
22
+ ? typeof getPromise === "function"
23
+ ? getPromise
24
+ : getPromise.execute
25
+ : undefined;
26
+ const getPromiseSuccessMessage = getPromise && typeof getPromise === "object"
27
+ ? getPromise.successMessage
28
+ : undefined;
29
+ const getPromiseErrorMessage = getPromise && typeof getPromise === "object"
30
+ ? getPromise.errorMessage
31
+ : undefined;
23
32
  const postPromiseExecute = postPromise
24
33
  ? typeof postPromise === "function"
25
34
  ? postPromise
@@ -53,6 +62,17 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
53
62
  const deletePromiseErrorMessage = deletePromise && typeof deletePromise === "object"
54
63
  ? deletePromise.errorMessage
55
64
  : undefined;
65
+ const getItemPromiseExecute = getItemPromise
66
+ ? typeof getItemPromise === "function"
67
+ ? getItemPromise
68
+ : getItemPromise.execute
69
+ : undefined;
70
+ const getItemPromiseSuccessMessage = getItemPromise && typeof getItemPromise === "object"
71
+ ? getItemPromise.successMessage
72
+ : undefined;
73
+ const getItemPromiseErrorMessage = getItemPromise && typeof getItemPromise === "object"
74
+ ? getItemPromise.errorMessage
75
+ : undefined;
56
76
  const getPromiseRef = useRef(getPromiseExecute);
57
77
  // Hooks para manejar las peticiones asíncronas con mensajes opcionales
58
78
  const fetchDataAsync = useAsyncRequest({
@@ -71,6 +91,10 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
71
91
  successMessage: deletePromiseSuccessMessage,
72
92
  errorMessage: deletePromiseErrorMessage,
73
93
  });
94
+ const fetchItemAsync = useAsyncRequest({
95
+ successMessage: getItemPromiseSuccessMessage,
96
+ errorMessage: getItemPromiseErrorMessage,
97
+ });
74
98
  // El isLoading del contexto usa el hook de fetchData
75
99
  const isLoading = fetchDataAsync.isLoading;
76
100
  // Actualizar la referencia cuando cambie getPromise
@@ -99,11 +123,11 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
99
123
  }, [searchParams, pageParam, urlParams, limit]);
100
124
  // Función para obtener los datos
101
125
  const fetchData = useCallback(async (params) => {
126
+ if (!getPromiseExecute) {
127
+ return;
128
+ }
102
129
  // Obtener los parámetros que se van a usar
103
130
  const requestParams = params || getUrlParams();
104
- // Crear una clave única para estos parámetros
105
- const paramsKey = JSON.stringify(requestParams);
106
- lastFetchParamsRef.current = paramsKey;
107
131
  const result = await fetchDataAsync.execute(async () => {
108
132
  return await getPromiseRef.current(requestParams);
109
133
  });
@@ -132,7 +156,7 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
132
156
  setTotal(0);
133
157
  }
134
158
  }
135
- }, [getUrlParams, limit, fetchDataAsync]);
159
+ }, [getUrlParams, limit, fetchDataAsync, getPromiseExecute]);
136
160
  // Ref para almacenar los valores anteriores de urlParams
137
161
  const prevUrlParamsValuesRef = useRef({});
138
162
  // Memoizar los valores actuales de los urlParams
@@ -145,6 +169,24 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
145
169
  }, [searchParams, urlParams]);
146
170
  // Memoizar los parámetros de URL para evitar re-renders innecesarios
147
171
  const urlParamsKey = useMemo(() => urlParams.join(","), [urlParams]);
172
+ // Memoizar solo los parámetros relevantes de la URL (urlParams + pageParam)
173
+ // para que el useEffect solo se ejecute cuando cambien estos parámetros
174
+ const relevantParamsKey = useMemo(() => {
175
+ const relevantParams = {};
176
+ // Agregar pageParam si existe
177
+ const pageValue = searchParams.get(pageParam);
178
+ if (pageValue) {
179
+ relevantParams[pageParam] = pageValue;
180
+ }
181
+ // Agregar urlParams si existen
182
+ urlParams.forEach((paramName) => {
183
+ const paramValue = searchParams.get(paramName);
184
+ if (paramValue !== null) {
185
+ relevantParams[paramName] = paramValue;
186
+ }
187
+ });
188
+ return JSON.stringify(relevantParams);
189
+ }, [searchParams, pageParam, urlParams]);
148
190
  // Memoizar los parámetros actuales para exponerlos
149
191
  const currentParams = useMemo(() => getUrlParams(),
150
192
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -153,10 +195,28 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
153
195
  const fetchItemsExecute = useCallback(async (params) => {
154
196
  await fetchData(params);
155
197
  }, [fetchData]);
198
+ // Función para obtener un item individual
199
+ const fetchItemExecute = useCallback(async (params) => {
200
+ if (!getItemPromiseExecute) {
201
+ throw new Error("getItemPromise is not defined. Please provide getItemPromise to CrudProvider.");
202
+ }
203
+ // Si no se pasan parámetros, usar singleItemId si está disponible
204
+ const finalParams = params !== undefined ? params : singleItemId;
205
+ if (finalParams === undefined) {
206
+ throw new Error("No parameters provided and singleItemId is not defined. Please provide parameters or set singleItemId in CrudProvider.");
207
+ }
208
+ const result = await fetchItemAsync.execute(async () => {
209
+ return await getItemPromiseExecute(finalParams);
210
+ });
211
+ if (result !== undefined) {
212
+ setItem(result);
213
+ }
214
+ return result;
215
+ }, [getItemPromiseExecute, fetchItemAsync, singleItemId]);
156
216
  // Función para crear un item
157
217
  const createItemExecute = useCallback(async (item) => {
158
218
  if (!postPromiseExecute) {
159
- throw new Error("postPromise is not defined. Please provide postPromise to ListCrudProvider.");
219
+ throw new Error("postPromise is not defined. Please provide postPromise to CrudProvider.");
160
220
  }
161
221
  return await createItemAsync.execute(async () => {
162
222
  return await postPromiseExecute(item);
@@ -165,7 +225,7 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
165
225
  // Función para actualizar un item
166
226
  const updateItemExecute = useCallback(async (item) => {
167
227
  if (!putPromiseExecute) {
168
- throw new Error("putPromise is not defined. Please provide putPromise to ListCrudProvider.");
228
+ throw new Error("putPromise is not defined. Please provide putPromise to CrudProvider.");
169
229
  }
170
230
  return await updateItemAsync.execute(async () => {
171
231
  return await putPromiseExecute(item);
@@ -174,7 +234,7 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
174
234
  // Función para eliminar un item
175
235
  const deleteItemExecute = useCallback(async (item) => {
176
236
  if (!deletePromiseExecute) {
177
- throw new Error("deletePromise is not defined. Please provide deletePromise to ListCrudProvider.");
237
+ throw new Error("deletePromise is not defined. Please provide deletePromise to CrudProvider.");
178
238
  }
179
239
  await deleteItemAsync.execute(async () => {
180
240
  await deletePromiseExecute(item);
@@ -205,17 +265,31 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
205
265
  prevUrlParamsValuesRef.current = { ...urlParamsValues };
206
266
  // eslint-disable-next-line react-hooks/exhaustive-deps
207
267
  }, [JSON.stringify(urlParamsValues), pageParam, urlParamsKey]);
208
- // useEffect consolidado para escuchar cambios que requieren recargar datos
268
+ // useEffect para ejecutar fetchData cuando cambian los parámetros relevantes o getPromise
209
269
  useEffect(() => {
210
- // Usar un pequeño delay para agrupar múltiples cambios rápidos en el mismo tick
270
+ if (!getPromiseExecute) {
271
+ return;
272
+ }
211
273
  const timeoutId = setTimeout(() => {
212
274
  fetchData();
213
275
  }, 0);
214
276
  return () => clearTimeout(timeoutId);
215
277
  // eslint-disable-next-line react-hooks/exhaustive-deps
216
- }, [getPromiseExecute, searchParams, pageParam, urlParamsKey]);
278
+ }, [relevantParamsKey, getPromiseExecute]);
279
+ // useEffect para obtener el item individual cuando cambie singleItemId
280
+ useEffect(() => {
281
+ if (singleItemId !== undefined && getItemPromiseExecute) {
282
+ fetchItemExecute(singleItemId);
283
+ }
284
+ // eslint-disable-next-line react-hooks/exhaustive-deps
285
+ }, [singleItemId]);
286
+ // Sincronizar extraDataProp con el estado local
287
+ useEffect(() => {
288
+ setExtraData(extraDataProp);
289
+ }, [extraDataProp]);
217
290
  const value = {
218
291
  list,
292
+ item,
219
293
  page,
220
294
  pages,
221
295
  total,
@@ -226,6 +300,10 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
226
300
  execute: fetchItemsExecute,
227
301
  isLoading: fetchDataAsync.isLoading,
228
302
  },
303
+ fetchItem: {
304
+ execute: fetchItemExecute,
305
+ isLoading: fetchItemAsync.isLoading,
306
+ },
229
307
  createItem: {
230
308
  execute: createItemExecute,
231
309
  isLoading: createItemAsync.isLoading,
@@ -239,15 +317,17 @@ export function ListCrudProvider({ children, getPromise, postPromise, putPromise
239
317
  isLoading: deleteItemAsync.isLoading,
240
318
  },
241
319
  pagination: (_jsx(Pagination, { page: page, pages: pages, total: total, fieldName: pageParam, isLoading: isLoading })),
320
+ extraData,
321
+ setExtraData,
242
322
  };
243
- return (_jsx(ListCrudContext.Provider, { value: value, children: children }));
323
+ return _jsx(CrudContext.Provider, { value: value, children: children });
244
324
  }
245
- // Hook to use ListCrud context
325
+ // Hook to use Crud context
246
326
  // eslint-disable-next-line react-refresh/only-export-components
247
- export function useListCrud() {
248
- const context = useContext(ListCrudContext);
327
+ export function useCrud() {
328
+ const context = useContext(CrudContext);
249
329
  if (context === undefined) {
250
- throw new Error("useListCrud must be used within a ListCrudProvider");
330
+ throw new Error("useCrud must be used within a CrudProvider");
251
331
  }
252
332
  return context;
253
333
  }
@@ -4,8 +4,8 @@ export type { Theme, ThemeContextType, ThemeOverride } from "./types";
4
4
  export { lightTheme, darkTheme, blueTheme, greenTheme, defaultTheme, themes, } from "./presets";
5
5
  export { AuthProvider, AuthContext } from "./AuthContext";
6
6
  export type { AuthContextType, AuthContextUserInterface, AuthTokenInterface, } from "./AuthContext";
7
- export { ListCrudProvider, ListCrudContext, useListCrud } from "./ListCrudContext";
8
- export type { ListCrudContextType } from "./ListCrudContext";
7
+ export { CrudProvider, CrudContext, useCrud } from "./CrudContext";
8
+ export type { CrudContextType } from "./CrudContext";
9
9
  export { AppLayoutProvider, useAppLayout, useAppLayoutContext } from "./AppLayoutContext";
10
10
  export type { AppLayoutContextType, NavbarInterface, LeftDrawerInterface, } from "./AppLayoutContext";
11
11
  export { SnackbarProvider, useSnackbar } from "./SnackbarContext";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contexts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtE,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,MAAM,GACP,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnF,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contexts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtE,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,MAAM,GACP,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
@@ -5,8 +5,8 @@ export { useThemeOverride, useTemporaryOverride, } from "../hooks/useThemeOverri
5
5
  export { lightTheme, darkTheme, blueTheme, greenTheme, defaultTheme, themes, } from "./presets";
6
6
  // Auth system exports
7
7
  export { AuthProvider, AuthContext } from "./AuthContext";
8
- // ListCrud system exports
9
- export { ListCrudProvider, ListCrudContext, useListCrud } from "./ListCrudContext";
8
+ // Crud system exports
9
+ export { CrudProvider, CrudContext, useCrud } from "./CrudContext";
10
10
  // AppLayout system exports
11
11
  export { AppLayoutProvider, useAppLayout, useAppLayoutContext } from "./AppLayoutContext";
12
12
  // Snackbar system exports
@@ -1 +1 @@
1
- {"version":3,"file":"DialogDocs.d.ts","sourceRoot":"","sources":["../../src/docs/DialogDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAgYvB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"DialogDocs.d.ts","sourceRoot":"","sources":["../../src/docs/DialogDocs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EA2XvB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -7,6 +7,6 @@ const DialogDocs = () => {
7
7
  const [isOpenConfirm, setIsOpenConfirm] = useState(false);
8
8
  const [isOpenNoOverlay, setIsOpenNoOverlay] = useState(false);
9
9
  const [isOpenCustom, setIsOpenCustom] = useState(false);
10
- return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Dialog - Variantes y Ejemplos", 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" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["El componente Dialog muestra un modal centrado con overlay. Se controla mediante la prop ", _jsx("code", { children: "isOpen" }), " y se cierra con", " ", _jsx("code", { children: "onClose" }), "."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-window-maximize", onClick: () => setIsOpenBasic(true), children: "Abrir Dialog B\u00E1sico" }), _jsx(Dialog, { isOpen: isOpenBasic, title: "Dialog B\u00E1sico", dialogBody: _jsxs("div", { className: "space-y-3", children: [_jsxs("p", { style: { color: "var(--flysoft-text-secondary)" }, children: ["Este es un ejemplo de dialog b\u00E1sico. Puedes incluir cualquier contenido en el ", _jsx("code", { children: "dialogBody" }), "."] }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "El dialog se puede cerrar haciendo clic en el overlay, en el bot\u00F3n de cerrar (X), o presionando la tecla Escape." })] }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenBasic(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", onClick: () => setIsOpenBasic(false), children: "Aceptar" })] }), onClose: () => setIsOpenBasic(false) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog con formulario" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ejemplo de dialog que contiene un formulario completo con campos de entrada." }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-edit", onClick: () => setIsOpenForm(true), children: "Abrir Dialog con Formulario" }), _jsx(Dialog, { isOpen: isOpenForm, title: "Editar Usuario", dialogBody: _jsxs("div", { className: "space-y-4", children: [_jsx(Input, { label: "Nombre", placeholder: "Ingresa el nombre", icon: "fa-user" }), _jsx(Input, { label: "Email", type: "email", placeholder: "usuario@ejemplo.com", icon: "fa-envelope" }), _jsx(Input, { label: "Tel\u00E9fono", type: "tel", placeholder: "+34 600 000 000", icon: "fa-phone" })] }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", icon: "fa-times", onClick: () => setIsOpenForm(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", icon: "fa-save", onClick: () => setIsOpenForm(false), children: "Guardar Cambios" })] }), onClose: () => setIsOpenForm(false) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog de confirmaci\u00F3n" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ejemplo de dialog usado para confirmar una acci\u00F3n importante." }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-trash", onClick: () => setIsOpenConfirm(true), children: "Eliminar Item" }), _jsx(Dialog, { isOpen: isOpenConfirm, title: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("i", { className: "fal fa-exclamation-triangle text-[var(--color-danger)]" }), _jsx("span", { children: "Confirmar Eliminaci\u00F3n" })] }), dialogBody: _jsxs("div", { className: "space-y-3", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "\u00BFEst\u00E1s seguro de que deseas eliminar este elemento? Esta acci\u00F3n no se puede deshacer." }), _jsx("div", { className: "flex gap-2", children: _jsx(Badge, { variant: "danger", icon: "fa-exclamation-circle", children: "Acci\u00F3n irreversible" }) })] }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", icon: "fa-times", onClick: () => setIsOpenConfirm(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", icon: "fa-trash", onClick: () => setIsOpenConfirm(false), children: "Eliminar" })] }), onClose: () => setIsOpenConfirm(false) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog sin cerrar al hacer clic en overlay" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usando ", _jsxs("code", { children: ["closeOnOverlayClick=", false] }), " el dialog solo se puede cerrar mediante el bot\u00F3n de cerrar, los botones de acci\u00F3n, o la tecla Escape."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-lock", onClick: () => setIsOpenNoOverlay(true), children: "Abrir Dialog (sin cerrar en overlay)" }), _jsx(Dialog, { isOpen: isOpenNoOverlay, title: "Dialog Protegido", dialogBody: _jsxs("div", { className: "space-y-3", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este dialog no se cierra al hacer clic en el overlay. Debes usar el bot\u00F3n de cerrar o los botones de acci\u00F3n." }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "\u00DAtil para formularios importantes donde no quieres que el usuario cierre accidentalmente el dialog." })] }), dialogActions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenNoOverlay(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", onClick: () => setIsOpenNoOverlay(false), children: "Continuar" })] }), onClose: () => setIsOpenNoOverlay(false), closeOnOverlayClick: false })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog con t\u00EDtulo personalizado" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["El prop ", _jsx("code", { children: "title" }), " acepta un ReactNode, permitiendo incluir iconos, badges u otros componentes."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-star", onClick: () => setIsOpenCustom(true), children: "Abrir Dialog Personalizado" }), _jsx(Dialog, { isOpen: isOpenCustom, title: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("i", { className: "fal fa-info-circle text-[var(--color-primary)]" }), _jsx("span", { children: "Informaci\u00F3n Importante" }), _jsx(Badge, { variant: "info", size: "sm", children: "Nuevo" })] }), dialogBody: _jsxs("div", { className: "space-y-3", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este dialog muestra c\u00F3mo puedes personalizar el t\u00EDtulo usando ReactNode, incluyendo iconos y badges." }), _jsx("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: _jsxs("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: [_jsx("i", { className: "fal fa-lightbulb mr-2" }), "Puedes usar cualquier componente React en el t\u00EDtulo, body y acciones."] }) })] }), dialogActions: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", icon: "fa-bookmark", onClick: () => setIsOpenCustom(false), children: "Guardar para despu\u00E9s" }), _jsx(Button, { variant: "primary", icon: "fa-check", onClick: () => setIsOpenCustom(false), children: "Entendido" })] }), onClose: () => setIsOpenCustom(false) })] })] }), _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: "Overlay con blur:" }), " El overlay tiene un efecto de desenfoque (backdrop-blur) para mejor enfoque visual"] }), _jsxs("li", { children: [_jsx("strong", { children: "Cierre m\u00FAltiple:" }), " Se puede cerrar haciendo clic en el overlay, en el bot\u00F3n X, en los botones de acci\u00F3n, o presionando Escape"] }), _jsxs("li", { children: [_jsx("strong", { children: "Prevenci\u00F3n de scroll:" }), " Cuando el dialog est\u00E1 abierto, se previene el scroll del body"] }), _jsxs("li", { children: [_jsx("strong", { children: "Responsive:" }), " El dialog se adapta a diferentes tama\u00F1os de pantalla con padding adecuado"] }), _jsxs("li", { children: [_jsx("strong", { children: "Accesibilidad:" }), " Incluye atributos ARIA para mejor accesibilidad"] }), _jsxs("li", { children: [_jsx("strong", { children: "Contenido flexible:" }), " El body tiene scroll autom\u00E1tico si el contenido es muy largo"] })] }) }) })] })] }) }) }));
10
+ return (_jsx("div", { className: "max-w-5xl mx-auto space-y-8", children: _jsx(Card, { title: "Dialog - Variantes y Ejemplos", 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" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["El componente Dialog muestra un modal centrado con overlay. Se controla mediante la prop ", _jsx("code", { children: "isOpen" }), " y se cierra con", " ", _jsx("code", { children: "onClose" }), ". El contenido se pasa como ", _jsx("code", { children: "children" }), "."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-window-maximize", onClick: () => setIsOpenBasic(true), children: "Abrir Dialog B\u00E1sico" }), _jsx(Dialog, { isOpen: isOpenBasic, title: "Dialog B\u00E1sico", footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenBasic(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", onClick: () => setIsOpenBasic(false), children: "Aceptar" })] }), onClose: () => setIsOpenBasic(false), children: _jsxs("div", { className: "space-y-3", children: [_jsxs("p", { style: { color: "var(--flysoft-text-secondary)" }, children: ["Este es un ejemplo de dialog b\u00E1sico. Puedes incluir cualquier contenido como ", _jsx("code", { children: "children" }), "."] }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "El dialog se puede cerrar haciendo clic en el overlay, en el bot\u00F3n de cerrar (X), o presionando la tecla Escape." })] }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog con formulario" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ejemplo de dialog que contiene un formulario completo con campos de entrada." }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-edit", onClick: () => setIsOpenForm(true), children: "Abrir Dialog con Formulario" }), _jsx(Dialog, { isOpen: isOpenForm, title: "Editar Usuario", footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", icon: "fa-times", onClick: () => setIsOpenForm(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", icon: "fa-save", onClick: () => setIsOpenForm(false), children: "Guardar Cambios" })] }), onClose: () => setIsOpenForm(false), children: _jsxs("div", { className: "space-y-4", children: [_jsx(Input, { label: "Nombre", placeholder: "Ingresa el nombre", icon: "fa-user" }), _jsx(Input, { label: "Email", type: "email", placeholder: "usuario@ejemplo.com", icon: "fa-envelope" }), _jsx(Input, { label: "Tel\u00E9fono", type: "tel", placeholder: "+34 600 000 000", icon: "fa-phone" })] }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog de confirmaci\u00F3n" }), _jsx("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: "Ejemplo de dialog usado para confirmar una acci\u00F3n importante." }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-trash", onClick: () => setIsOpenConfirm(true), children: "Eliminar Item" }), _jsx(Dialog, { isOpen: isOpenConfirm, title: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("i", { className: "fal fa-exclamation-triangle text-[var(--color-danger)]" }), _jsx("span", { children: "Confirmar Eliminaci\u00F3n" })] }), footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", icon: "fa-times", onClick: () => setIsOpenConfirm(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", icon: "fa-trash", onClick: () => setIsOpenConfirm(false), children: "Eliminar" })] }), onClose: () => setIsOpenConfirm(false), children: _jsxs("div", { className: "space-y-3", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "\u00BFEst\u00E1s seguro de que deseas eliminar este elemento? Esta acci\u00F3n no se puede deshacer." }), _jsx("div", { className: "flex gap-2", children: _jsx(Badge, { variant: "danger", icon: "fa-exclamation-circle", children: "Acci\u00F3n irreversible" }) })] }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog sin cerrar al hacer clic en overlay" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["Usando ", _jsxs("code", { children: ["closeOnOverlayClick=", false] }), " el dialog solo se puede cerrar mediante el bot\u00F3n de cerrar, los botones de acci\u00F3n, o la tecla Escape."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-lock", onClick: () => setIsOpenNoOverlay(true), children: "Abrir Dialog (sin cerrar en overlay)" }), _jsx(Dialog, { isOpen: isOpenNoOverlay, title: "Dialog Protegido", footer: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setIsOpenNoOverlay(false), children: "Cancelar" }), _jsx(Button, { variant: "primary", onClick: () => setIsOpenNoOverlay(false), children: "Continuar" })] }), onClose: () => setIsOpenNoOverlay(false), closeOnOverlayClick: false, children: _jsxs("div", { className: "space-y-3", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este dialog no se cierra al hacer clic en el overlay. Debes usar el bot\u00F3n de cerrar o los botones de acci\u00F3n." }), _jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "\u00DAtil para formularios importantes donde no quieres que el usuario cierre accidentalmente el dialog." })] }) })] })] }), _jsxs("section", { children: [_jsx("h3", { className: "text-lg font-semibold mb-4", style: { color: "var(--flysoft-text-primary)" }, children: "Dialog con t\u00EDtulo personalizado" }), _jsxs("p", { className: "mb-4 text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: ["El prop ", _jsx("code", { children: "title" }), " acepta un ReactNode, permitiendo incluir iconos, badges u otros componentes."] }), _jsxs("div", { className: "space-y-4", children: [_jsx(Button, { variant: "primary", icon: "fa-star", onClick: () => setIsOpenCustom(true), children: "Abrir Dialog Personalizado" }), _jsx(Dialog, { isOpen: isOpenCustom, title: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("i", { className: "fal fa-info-circle text-[var(--color-primary)]" }), _jsx("span", { children: "Informaci\u00F3n Importante" }), _jsx(Badge, { variant: "info", size: "sm", children: "Nuevo" })] }), footer: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", icon: "fa-bookmark", onClick: () => setIsOpenCustom(false), children: "Guardar para despu\u00E9s" }), _jsx(Button, { variant: "primary", icon: "fa-check", onClick: () => setIsOpenCustom(false), children: "Entendido" })] }), onClose: () => setIsOpenCustom(false), children: _jsxs("div", { className: "space-y-3", children: [_jsx("p", { style: { color: "var(--flysoft-text-secondary)" }, children: "Este dialog muestra c\u00F3mo puedes personalizar el t\u00EDtulo usando ReactNode, incluyendo iconos y badges." }), _jsx("div", { className: "p-3 bg-[var(--color-bg-default)] border border-[var(--color-border-default)] rounded", children: _jsxs("p", { className: "text-sm", style: { color: "var(--flysoft-text-secondary)" }, children: [_jsx("i", { className: "fal fa-lightbulb mr-2" }), "Puedes usar cualquier componente React en el t\u00EDtulo, children y acciones."] }) })] }) })] })] }), _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: "Overlay con blur:" }), " El overlay tiene un efecto de desenfoque (backdrop-blur) para mejor enfoque visual"] }), _jsxs("li", { children: [_jsx("strong", { children: "Cierre m\u00FAltiple:" }), " Se puede cerrar haciendo clic en el overlay, en el bot\u00F3n X, en los botones de acci\u00F3n, o presionando Escape"] }), _jsxs("li", { children: [_jsx("strong", { children: "Prevenci\u00F3n de scroll:" }), " Cuando el dialog est\u00E1 abierto, se previene el scroll del body"] }), _jsxs("li", { children: [_jsx("strong", { children: "Responsive:" }), " El dialog se adapta a diferentes tama\u00F1os de pantalla con padding adecuado"] }), _jsxs("li", { children: [_jsx("strong", { children: "Accesibilidad:" }), " Incluye atributos ARIA para mejor accesibilidad"] }), _jsxs("li", { children: [_jsx("strong", { children: "Contenido flexible:" }), " El body tiene scroll autom\u00E1tico si el contenido es muy largo"] })] }) }) })] })] }) }) }));
11
11
  };
12
12
  export default DialogDocs;
@@ -1 +1 @@
1
- {"version":3,"file":"DocsMenu.d.ts","sourceRoot":"","sources":["../../src/docs/DocsMenu.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,+CAyRpB,CAAC"}
1
+ {"version":3,"file":"DocsMenu.d.ts","sourceRoot":"","sources":["../../src/docs/DocsMenu.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,+CA2SpB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Accordion, LinkButton } from "../index";
3
3
  export const DocsMenu = () => {
4
- return (_jsxs("div", { className: "space-y-2 p-4 bg-gray-100 h-full", children: [_jsx(Accordion, { title: "Form Controls", icon: "fa-edit", defaultOpen: true, children: _jsxs("div", { className: "space-y-2", children: [_jsx(LinkButton, { to: "/docs/button", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Button" }), _jsx(LinkButton, { to: "/docs/linkbutton", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "LinkButton" }), _jsx(LinkButton, { to: "/docs/input", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Input" }), _jsx(LinkButton, { to: "/docs/autocomplete-input", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "AutocompleteInput" }), _jsx(LinkButton, { to: "/docs/search-select-input", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "SearchSelectInput" }), _jsx(LinkButton, { to: "/docs/datepicker", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DatePicker" }), _jsx(LinkButton, { to: "/docs/dateinput", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DateInput" }), _jsx(LinkButton, { to: "/docs/checkbox", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Checkbox" }), _jsx(LinkButton, { to: "/docs/radiobuttongroup", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "RadioButtonGroup" }), _jsx(LinkButton, { to: "/docs/pagination", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Pagination" })] }) }), _jsx(Accordion, { title: "Layout", icon: "fa-th-large", children: _jsxs("div", { className: "space-y-2", children: [_jsx(LinkButton, { to: "/docs/card", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Card" }), _jsx(LinkButton, { to: "/docs/datafield", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DataField" }), _jsx(LinkButton, { to: "/docs/tabsgroup", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "TabsGroup" }), _jsx(LinkButton, { to: "/docs/datatable", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DataTable" }), _jsx(LinkButton, { to: "/docs/accordion", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Accordion" })] }) }), _jsx(Accordion, { title: "Utils", icon: "fa-tools", children: _jsxs("div", { className: "space-y-2", children: [_jsx(LinkButton, { to: "/docs/badge", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Badge" }), _jsx(LinkButton, { to: "/docs/avatar", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Avatar" }), _jsx(LinkButton, { to: "/docs/roadmap", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "RoadMap" }), _jsx(LinkButton, { to: "/docs/dialog", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Dialog" }), _jsx(LinkButton, { to: "/docs/loader", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Loader" }), _jsx(LinkButton, { to: "/docs/dropdownmenu", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DropdownMenu" }), _jsx(LinkButton, { to: "/docs/filter", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Filter" }), _jsx(LinkButton, { to: "/docs/snackbar", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Snackbar" }), _jsx(LinkButton, { to: "/docs/theme", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "ThemeSwitcher" })] }) }), _jsx(Accordion, { title: "Contexts", icon: "fa-database", children: _jsxs("div", { className: "space-y-2", children: [_jsx(LinkButton, { to: "/docs/auth", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "AuthContext" }), _jsx(LinkButton, { to: "/docs/listcrud", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "ListCrudContext" })] }) }), _jsx(Accordion, { title: "Otros", icon: "fa-folder", children: _jsxs("div", { className: "space-y-2", children: [_jsx(LinkButton, { to: "/docs/example-form", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Formulario de Ejemplo" }), _jsx(LinkButton, { to: "/docs/admin", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Admin (Mock Services)" })] }) })] }));
4
+ return (_jsxs("div", { className: "space-y-2 p-4 bg-gray-100 h-full", children: [_jsx(Accordion, { title: "Form Controls", icon: "fa-edit", defaultOpen: true, children: _jsxs("div", { className: "space-y-2", children: [_jsx(LinkButton, { to: "/docs/button", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Button" }), _jsx(LinkButton, { to: "/docs/linkbutton", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "LinkButton" }), _jsx(LinkButton, { to: "/docs/input", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Input" }), _jsx(LinkButton, { to: "/docs/autocomplete-input", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "AutocompleteInput" }), _jsx(LinkButton, { to: "/docs/search-select-input", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "SearchSelectInput" }), _jsx(LinkButton, { to: "/docs/datepicker", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DatePicker" }), _jsx(LinkButton, { to: "/docs/dateinput", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DateInput" }), _jsx(LinkButton, { to: "/docs/checkbox", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Checkbox" }), _jsx(LinkButton, { to: "/docs/radiobuttongroup", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "RadioButtonGroup" }), _jsx(LinkButton, { to: "/docs/pagination", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Pagination" })] }) }), _jsx(Accordion, { title: "Layout", icon: "fa-th-large", children: _jsxs("div", { className: "space-y-2", children: [_jsx(LinkButton, { to: "/docs/card", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Card" }), _jsx(LinkButton, { to: "/docs/datafield", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DataField" }), _jsx(LinkButton, { to: "/docs/tabsgroup", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "TabsGroup" }), _jsx(LinkButton, { to: "/docs/datatable", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DataTable" }), _jsx(LinkButton, { to: "/docs/accordion", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Accordion" }), _jsx(LinkButton, { to: "/docs/menu", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Menu" }), _jsx(LinkButton, { to: "/docs/dropdownmenu", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DropdownMenu" }), _jsx(LinkButton, { to: "/docs/dropdownpanel", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "DropdownPanel" }), _jsx(LinkButton, { to: "/docs/filter", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Filter" })] }) }), _jsx(Accordion, { title: "Utils", icon: "fa-tools", children: _jsxs("div", { className: "space-y-2", children: [_jsx(LinkButton, { to: "/docs/badge", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Badge" }), _jsx(LinkButton, { to: "/docs/avatar", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Avatar" }), _jsx(LinkButton, { to: "/docs/roadmap", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "RoadMap" }), _jsx(LinkButton, { to: "/docs/dialog", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Dialog" }), _jsx(LinkButton, { to: "/docs/loader", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Loader" }), _jsx(LinkButton, { to: "/docs/snackbar", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Snackbar" }), _jsx(LinkButton, { to: "/docs/theme", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "ThemeSwitcher" })] }) }), _jsx(Accordion, { title: "Contexts", icon: "fa-database", children: _jsxs("div", { className: "space-y-2", children: [_jsx(LinkButton, { to: "/docs/auth", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "AuthContext" }), _jsx(LinkButton, { to: "/docs/listcrud", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "CrudContext" })] }) }), _jsx(Accordion, { title: "Otros", icon: "fa-folder", children: _jsxs("div", { className: "space-y-2", children: [_jsx(LinkButton, { to: "/docs/example-form", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Formulario de Ejemplo" }), _jsx(LinkButton, { to: "/docs/admin", variant: "ghost", size: "sm", className: "w-full justify-start", color: "secondary", children: "Admin (Mock Services)" })] }) })] }));
5
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DocsRouter.d.ts","sourceRoot":"","sources":["../../src/docs/DocsRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AA+B1B,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAkC9B,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"DocsRouter.d.ts","sourceRoot":"","sources":["../../src/docs/DocsRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAiC1B,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAqC9B,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -20,16 +20,18 @@ import PaginationDocs from "./PaginationDocs";
20
20
  import LoaderDocs from "./LoaderDocs";
21
21
  import DataTableDocs from "./DataTableDocs";
22
22
  import DropdownMenuDocs from "./DropdownMenuDocs";
23
+ import DropdownPanelDocs from "./DropdownPanelDocs";
23
24
  import FilterDocs from "./FilterDocs";
24
25
  import { AuthDocs } from "./AuthDocs.tsx/AuthDocs";
25
26
  import { ListCrudDocs } from "./ListCrudDocs.tsx/ListCrudDocs";
26
27
  import ExampleFormDocs from "./ExampleFormDocs";
27
28
  import CheckboxDocs from "./CheckboxDocs";
28
29
  import RadioButtonGroupDocs from "./RadioButtonGroupDocs";
30
+ import MenuDocs from "./MenuDocs";
29
31
  import SnackbarDocs from "./SnackbarDocs";
30
32
  import AccordionDocs from "./AccordionDocs";
31
33
  import DocAdmin from "./DocAdmin";
32
34
  export const DocsRouter = () => {
33
- return (_jsxs(Routes, { children: [_jsx(Route, { path: "", element: _jsx(Navigate, { to: "button", replace: true }) }), _jsx(Route, { path: "button", element: _jsx(ButtonDocs, {}) }), _jsx(Route, { path: "linkbutton", element: _jsx(LinkButtonDocs, {}) }), _jsx(Route, { path: "badge", element: _jsx(BadgeDocs, {}) }), _jsx(Route, { path: "avatar", element: _jsx(AvatarDocs, {}) }), _jsx(Route, { path: "roadmap", element: _jsx(RoadMapDocs, {}) }), _jsx(Route, { path: "card", element: _jsx(CardDocs, {}) }), _jsx(Route, { path: "input", element: _jsx(InputDocs, {}) }), _jsx(Route, { path: "autocomplete-input", element: _jsx(AutocompleteInputDocs, {}) }), _jsx(Route, { path: "search-select-input", element: _jsx(SearchSelectInputDocs, {}) }), _jsx(Route, { path: "datepicker", element: _jsx(DatePickerDocs, {}) }), _jsx(Route, { path: "dateinput", element: _jsx(DateInputDocs, {}) }), _jsx(Route, { path: "checkbox", element: _jsx(CheckboxDocs, {}) }), _jsx(Route, { path: "radiobuttongroup", element: _jsx(RadioButtonGroupDocs, {}) }), _jsx(Route, { path: "theme", element: _jsx(ThemeSwitcherDocs, {}) }), _jsx(Route, { path: "datafield", element: _jsx(DataFieldDocs, {}) }), _jsx(Route, { path: "tabsgroup", element: _jsx(TabsGroupDocs, {}) }), _jsx(Route, { path: "dialog", element: _jsx(DialogDocs, {}) }), _jsx(Route, { path: "pagination", element: _jsx(PaginationDocs, {}) }), _jsx(Route, { path: "loader", element: _jsx(LoaderDocs, {}) }), _jsx(Route, { path: "datatable", element: _jsx(DataTableDocs, {}) }), _jsx(Route, { path: "dropdownmenu", element: _jsx(DropdownMenuDocs, {}) }), _jsx(Route, { path: "filter", element: _jsx(FilterDocs, {}) }), _jsx(Route, { path: "auth", element: _jsx(AuthDocs, {}) }), _jsx(Route, { path: "listcrud", element: _jsx(ListCrudDocs, {}) }), _jsx(Route, { path: "example-form", element: _jsx(ExampleFormDocs, {}) }), _jsx(Route, { path: "snackbar", element: _jsx(SnackbarDocs, {}) }), _jsx(Route, { path: "accordion", element: _jsx(AccordionDocs, {}) }), _jsx(Route, { path: "admin", element: _jsx(DocAdmin, {}) })] }));
35
+ return (_jsxs(Routes, { children: [_jsx(Route, { path: "", element: _jsx(Navigate, { to: "button", replace: true }) }), _jsx(Route, { path: "button", element: _jsx(ButtonDocs, {}) }), _jsx(Route, { path: "linkbutton", element: _jsx(LinkButtonDocs, {}) }), _jsx(Route, { path: "badge", element: _jsx(BadgeDocs, {}) }), _jsx(Route, { path: "avatar", element: _jsx(AvatarDocs, {}) }), _jsx(Route, { path: "roadmap", element: _jsx(RoadMapDocs, {}) }), _jsx(Route, { path: "card", element: _jsx(CardDocs, {}) }), _jsx(Route, { path: "input", element: _jsx(InputDocs, {}) }), _jsx(Route, { path: "autocomplete-input", element: _jsx(AutocompleteInputDocs, {}) }), _jsx(Route, { path: "search-select-input", element: _jsx(SearchSelectInputDocs, {}) }), _jsx(Route, { path: "datepicker", element: _jsx(DatePickerDocs, {}) }), _jsx(Route, { path: "dateinput", element: _jsx(DateInputDocs, {}) }), _jsx(Route, { path: "checkbox", element: _jsx(CheckboxDocs, {}) }), _jsx(Route, { path: "radiobuttongroup", element: _jsx(RadioButtonGroupDocs, {}) }), _jsx(Route, { path: "theme", element: _jsx(ThemeSwitcherDocs, {}) }), _jsx(Route, { path: "datafield", element: _jsx(DataFieldDocs, {}) }), _jsx(Route, { path: "tabsgroup", element: _jsx(TabsGroupDocs, {}) }), _jsx(Route, { path: "dialog", element: _jsx(DialogDocs, {}) }), _jsx(Route, { path: "pagination", element: _jsx(PaginationDocs, {}) }), _jsx(Route, { path: "loader", element: _jsx(LoaderDocs, {}) }), _jsx(Route, { path: "datatable", element: _jsx(DataTableDocs, {}) }), _jsx(Route, { path: "dropdownmenu", element: _jsx(DropdownMenuDocs, {}) }), _jsx(Route, { path: "dropdownpanel", element: _jsx(DropdownPanelDocs, {}) }), _jsx(Route, { path: "filter", element: _jsx(FilterDocs, {}) }), _jsx(Route, { path: "auth", element: _jsx(AuthDocs, {}) }), _jsx(Route, { path: "listcrud/empresa/:id", element: _jsx(ListCrudDocs, {}) }), _jsx(Route, { path: "listcrud", element: _jsx(ListCrudDocs, {}) }), _jsx(Route, { path: "example-form", element: _jsx(ExampleFormDocs, {}) }), _jsx(Route, { path: "menu", element: _jsx(MenuDocs, {}) }), _jsx(Route, { path: "snackbar", element: _jsx(SnackbarDocs, {}) }), _jsx(Route, { path: "accordion", element: _jsx(AccordionDocs, {}) }), _jsx(Route, { path: "admin", element: _jsx(DocAdmin, {}) })] }));
34
36
  };
35
37
  export default DocsRouter;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ declare const DropdownPanelDocs: React.FC;
3
+ export default DropdownPanelDocs;
4
+ //# sourceMappingURL=DropdownPanelDocs.d.ts.map
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"ListCrudDocs.d.ts","sourceRoot":"","sources":["../../../src/docs/ListCrudDocs.tsx/ListCrudDocs.tsx"],"names":[],"mappings":"AAaA,eAAO,MAAM,YAAY,+CA6CxB,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,29 +1,41 @@
1
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";
7
+ import { Collection, TabPanel, TabsGroup } from "../../components";
8
8
  import { ListCrudDocsContentEmpresas } from "./ListCrudDocsContentEmpresas";
9
+ import { useParams } from "react-router-dom";
10
+ import { ListCrudDocsContentEmpresaSingle } from "./ListCrudDocsContentEmpresaSingle";
9
11
  export const ListCrudDocs = () => {
10
12
  const { listarPaginados, eliminar, editar, agregar } = personaService;
11
- const { listarPaginados: listarPaginadosEmpresa } = empresaService;
13
+ const { listarPaginados: listarPaginadosEmpresa, buscarPorId, editar: editarEmpresa, eliminar: eliminarEmpresa, } = empresaService;
12
14
  const { setNavBarLeftNode } = useAppLayout();
13
15
  useEffect(() => {
14
- setNavBarLeftNode(_jsx("h3", { className: "text-2xl font-semibold", children: "ListCrudContext" }));
16
+ setNavBarLeftNode(_jsx("h3", { className: "text-2xl font-semibold", children: "CrudContext" }));
15
17
  return () => {
16
18
  setNavBarLeftNode(_jsx(_Fragment, {}));
17
19
  };
18
20
  }, [setNavBarLeftNode]);
19
- return (_jsxs(Collection, { children: [_jsx(ListCrudProvider, { getPromise: listarPaginados, postPromise: {
20
- execute: (persona) => agregar(persona),
21
- successMessage: "Persona agregada correctamente",
22
- }, putPromise: {
23
- execute: (persona) => editar(persona.id, persona),
24
- successMessage: "Cambios guardados",
25
- }, deletePromise: {
26
- execute: eliminar,
27
- successMessage: "Persona eliminada correctamente",
28
- }, urlParams: ["filtro", "idEmpresa"], children: _jsx(ListCrudDocsContentPersonas, {}) }), _jsx(ListCrudProvider, { getPromise: listarPaginadosEmpresa, urlParams: ["filtroEmpresa", "idEmpresaEmpresa"], children: _jsx(ListCrudDocsContentEmpresas, {}) })] }));
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, {})) }) })] }) }));
29
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"}