flysoft-react-ui 1.2.4 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI_CONTEXT.md +1400 -217
- package/AI_INTEGRATION_GUIDE.md +343 -0
- package/INTEGRATION_GUIDE.md +60 -0
- package/README.md +5 -3
- package/dist/components/form-controls/Input.d.ts.map +1 -1
- package/dist/components/layout/Accordion.d.ts +1 -0
- package/dist/components/layout/Accordion.d.ts.map +1 -1
- package/dist/components/layout/DataTable.d.ts.map +1 -1
- package/dist/components/layout/DropdownMenu.d.ts +2 -1
- package/dist/components/layout/DropdownMenu.d.ts.map +1 -1
- package/dist/components/layout/DropdownPanel.d.ts +2 -1
- package/dist/components/layout/DropdownPanel.d.ts.map +1 -1
- package/dist/components/layout/Filter.d.ts +1 -0
- package/dist/components/layout/Filter.d.ts.map +1 -1
- package/dist/components/layout/Menu.d.ts +2 -1
- package/dist/components/layout/Menu.d.ts.map +1 -1
- package/dist/components/layout/TabsGroup.d.ts +1 -0
- package/dist/components/layout/TabsGroup.d.ts.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11190 -24
- package/dist/index.js.map +1 -1
- package/dist/templates/forms/ContactForm.d.ts +1 -0
- package/dist/templates/forms/ContactForm.d.ts.map +1 -1
- package/dist/templates/forms/LoginForm.d.ts +1 -0
- package/dist/templates/forms/LoginForm.d.ts.map +1 -1
- package/dist/templates/forms/RegistrationForm.d.ts +1 -0
- package/dist/templates/forms/RegistrationForm.d.ts.map +1 -1
- package/dist/templates/layouts/DashboardLayout.d.ts +1 -0
- package/dist/templates/layouts/DashboardLayout.d.ts.map +1 -1
- package/dist/templates/layouts/SidebarLayout.d.ts +1 -0
- package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
- package/dist/templates/patterns/FormPattern.d.ts +1 -0
- package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
- package/dist/templates/patterns/ListPattern.d.ts +77 -0
- package/dist/templates/patterns/ListPattern.d.ts.map +1 -0
- package/package.json +8 -4
- package/dist/App.d.ts +0 -4
- package/dist/App.d.ts.map +0 -1
- package/dist/App.js +0 -30
- package/dist/components/ThemeSwitcher.js +0 -12
- package/dist/components/form-controls/AutocompleteInput.js +0 -680
- package/dist/components/form-controls/Button.js +0 -211
- package/dist/components/form-controls/Checkbox.js +0 -79
- package/dist/components/form-controls/CurrencyInput.js +0 -106
- package/dist/components/form-controls/DateInput.js +0 -578
- package/dist/components/form-controls/DatePicker.js +0 -144
- package/dist/components/form-controls/Input.js +0 -35
- package/dist/components/form-controls/LinkButton.js +0 -248
- package/dist/components/form-controls/Pagination.js +0 -23
- package/dist/components/form-controls/RadioButtonGroup.js +0 -220
- package/dist/components/form-controls/SearchSelectInput.js +0 -336
- package/dist/components/form-controls/index.js +0 -11
- package/dist/components/index.js +0 -7
- package/dist/components/layout/Accordion.js +0 -67
- package/dist/components/layout/AppLayout.js +0 -230
- package/dist/components/layout/Card.js +0 -54
- package/dist/components/layout/Collection.js +0 -18
- package/dist/components/layout/DataField.js +0 -38
- package/dist/components/layout/DataTable.js +0 -164
- package/dist/components/layout/DropdownMenu.js +0 -176
- package/dist/components/layout/DropdownPanel.js +0 -162
- package/dist/components/layout/Filter.js +0 -629
- package/dist/components/layout/Menu.js +0 -21
- package/dist/components/layout/TabPanel.js +0 -11
- package/dist/components/layout/TabsGroup.js +0 -52
- package/dist/components/layout/index.js +0 -12
- package/dist/components/utils/Avatar.js +0 -77
- package/dist/components/utils/Badge.js +0 -151
- package/dist/components/utils/Dialog.js +0 -44
- package/dist/components/utils/FiltersDialog.js +0 -104
- package/dist/components/utils/Loader.js +0 -44
- package/dist/components/utils/RoadMap.js +0 -139
- package/dist/components/utils/Skeleton.js +0 -10
- package/dist/components/utils/Snackbar.js +0 -136
- package/dist/components/utils/SnackbarContainer.js +0 -26
- package/dist/components/utils/iconUtils.js +0 -40
- package/dist/components/utils/index.js +0 -9
- package/dist/contexts/AppLayoutContext.js +0 -104
- package/dist/contexts/AuthContext.js +0 -224
- package/dist/contexts/CrudContext.js +0 -333
- package/dist/contexts/SnackbarContext.js +0 -41
- package/dist/contexts/ThemeContext.js +0 -197
- package/dist/contexts/index.js +0 -13
- package/dist/contexts/presets.js +0 -311
- package/dist/contexts/types.js +0 -1
- package/dist/docs/AccordionDocs.d.ts +0 -4
- package/dist/docs/AccordionDocs.d.ts.map +0 -1
- package/dist/docs/AccordionDocs.js +0 -21
- package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts +0 -13
- package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts.map +0 -1
- package/dist/docs/AuthDocs.tsx/AuthDocs.js +0 -18
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.d.ts +0 -2
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.d.ts.map +0 -1
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +0 -22
- package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts +0 -24
- package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts.map +0 -1
- package/dist/docs/AuthDocs.tsx/mockAuthService.js +0 -78
- package/dist/docs/AutocompleteInputDocs.d.ts +0 -4
- package/dist/docs/AutocompleteInputDocs.d.ts.map +0 -1
- package/dist/docs/AutocompleteInputDocs.js +0 -84
- package/dist/docs/AvatarDocs.d.ts +0 -4
- package/dist/docs/AvatarDocs.d.ts.map +0 -1
- package/dist/docs/AvatarDocs.js +0 -7
- package/dist/docs/BadgeDocs.d.ts +0 -4
- package/dist/docs/BadgeDocs.d.ts.map +0 -1
- package/dist/docs/BadgeDocs.js +0 -9
- package/dist/docs/ButtonDocs.d.ts +0 -4
- package/dist/docs/ButtonDocs.d.ts.map +0 -1
- package/dist/docs/ButtonDocs.js +0 -7
- package/dist/docs/CardDocs.d.ts +0 -4
- package/dist/docs/CardDocs.d.ts.map +0 -1
- package/dist/docs/CardDocs.js +0 -22
- package/dist/docs/CheckboxDocs.d.ts +0 -4
- package/dist/docs/CheckboxDocs.d.ts.map +0 -1
- package/dist/docs/CheckboxDocs.js +0 -7
- package/dist/docs/CurrencyInputDocs.d.ts +0 -4
- package/dist/docs/CurrencyInputDocs.d.ts.map +0 -1
- package/dist/docs/CurrencyInputDocs.js +0 -22
- package/dist/docs/DataFieldDocs.d.ts +0 -4
- package/dist/docs/DataFieldDocs.d.ts.map +0 -1
- package/dist/docs/DataFieldDocs.js +0 -7
- package/dist/docs/DataTableDocs.d.ts +0 -4
- package/dist/docs/DataTableDocs.d.ts.map +0 -1
- package/dist/docs/DataTableDocs.js +0 -244
- package/dist/docs/DateInputDocs.d.ts +0 -5
- package/dist/docs/DateInputDocs.d.ts.map +0 -1
- package/dist/docs/DateInputDocs.js +0 -19
- package/dist/docs/DatePickerDocs.d.ts +0 -5
- package/dist/docs/DatePickerDocs.d.ts.map +0 -1
- package/dist/docs/DatePickerDocs.js +0 -16
- package/dist/docs/DialogDocs.d.ts +0 -4
- package/dist/docs/DialogDocs.d.ts.map +0 -1
- package/dist/docs/DialogDocs.js +0 -13
- package/dist/docs/DocAdmin.d.ts +0 -4
- package/dist/docs/DocAdmin.d.ts.map +0 -1
- package/dist/docs/DocAdmin.js +0 -68
- package/dist/docs/DocsMenu.d.ts +0 -2
- package/dist/docs/DocsMenu.d.ts.map +0 -1
- package/dist/docs/DocsMenu.js +0 -5
- package/dist/docs/DocsRouter.d.ts +0 -4
- package/dist/docs/DocsRouter.d.ts.map +0 -1
- package/dist/docs/DocsRouter.js +0 -39
- package/dist/docs/DropdownMenuDocs.d.ts +0 -4
- package/dist/docs/DropdownMenuDocs.d.ts.map +0 -1
- package/dist/docs/DropdownMenuDocs.js +0 -66
- package/dist/docs/DropdownPanelDocs.d.ts +0 -4
- package/dist/docs/DropdownPanelDocs.d.ts.map +0 -1
- package/dist/docs/DropdownPanelDocs.js +0 -7
- package/dist/docs/ExampleFormDocs.d.ts +0 -4
- package/dist/docs/ExampleFormDocs.d.ts.map +0 -1
- package/dist/docs/ExampleFormDocs.js +0 -153
- package/dist/docs/FilterDocs.d.ts +0 -4
- package/dist/docs/FilterDocs.d.ts.map +0 -1
- package/dist/docs/FilterDocs.js +0 -130
- package/dist/docs/InputDocs.d.ts +0 -4
- package/dist/docs/InputDocs.d.ts.map +0 -1
- package/dist/docs/InputDocs.js +0 -17
- package/dist/docs/LinkButtonDocs.d.ts +0 -4
- package/dist/docs/LinkButtonDocs.d.ts.map +0 -1
- package/dist/docs/LinkButtonDocs.js +0 -7
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +0 -2
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +0 -47
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts +0 -2
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaPersonas.js +0 -34
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts +0 -2
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresaSingle.js +0 -66
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +0 -2
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +0 -7
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts +0 -10
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresasPersonasEditDialog.js +0 -39
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +0 -2
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +0 -57
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +0 -9
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +0 -1
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +0 -30
- package/dist/docs/LoaderDocs.d.ts +0 -4
- package/dist/docs/LoaderDocs.d.ts.map +0 -1
- package/dist/docs/LoaderDocs.js +0 -33
- package/dist/docs/MenuDocs.d.ts +0 -4
- package/dist/docs/MenuDocs.d.ts.map +0 -1
- package/dist/docs/MenuDocs.js +0 -26
- package/dist/docs/PaginationDocs.d.ts +0 -4
- package/dist/docs/PaginationDocs.d.ts.map +0 -1
- package/dist/docs/PaginationDocs.js +0 -38
- package/dist/docs/RadioButtonGroupDocs.d.ts +0 -4
- package/dist/docs/RadioButtonGroupDocs.d.ts.map +0 -1
- package/dist/docs/RadioButtonGroupDocs.js +0 -46
- package/dist/docs/RoadMapDocs.d.ts +0 -4
- package/dist/docs/RoadMapDocs.d.ts.map +0 -1
- package/dist/docs/RoadMapDocs.js +0 -171
- package/dist/docs/SearchSelectInputDocs.d.ts +0 -4
- package/dist/docs/SearchSelectInputDocs.d.ts.map +0 -1
- package/dist/docs/SearchSelectInputDocs.js +0 -168
- package/dist/docs/SkeletonDocs.d.ts +0 -4
- package/dist/docs/SkeletonDocs.d.ts.map +0 -1
- package/dist/docs/SkeletonDocs.js +0 -7
- package/dist/docs/SnackbarDocs.d.ts +0 -4
- package/dist/docs/SnackbarDocs.d.ts.map +0 -1
- package/dist/docs/SnackbarDocs.js +0 -69
- package/dist/docs/TabsGroupDocs.d.ts +0 -4
- package/dist/docs/TabsGroupDocs.d.ts.map +0 -1
- package/dist/docs/TabsGroupDocs.js +0 -38
- package/dist/docs/ThemeSwitcherDocs.d.ts +0 -4
- package/dist/docs/ThemeSwitcherDocs.d.ts.map +0 -1
- package/dist/docs/ThemeSwitcherDocs.js +0 -11
- package/dist/docs/docMockServices/empresaService.d.ts +0 -38
- package/dist/docs/docMockServices/empresaService.d.ts.map +0 -1
- package/dist/docs/docMockServices/empresaService.js +0 -125
- package/dist/docs/docMockServices/index.d.ts +0 -9
- package/dist/docs/docMockServices/index.d.ts.map +0 -1
- package/dist/docs/docMockServices/index.js +0 -8
- package/dist/docs/docMockServices/initialData.d.ts +0 -6
- package/dist/docs/docMockServices/initialData.d.ts.map +0 -1
- package/dist/docs/docMockServices/initialData.js +0 -132
- package/dist/docs/docMockServices/interfaces.d.ts +0 -38
- package/dist/docs/docMockServices/interfaces.d.ts.map +0 -1
- package/dist/docs/docMockServices/interfaces.js +0 -1
- package/dist/docs/docMockServices/personaEmpresaService.d.ts +0 -43
- package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +0 -1
- package/dist/docs/docMockServices/personaEmpresaService.js +0 -151
- package/dist/docs/docMockServices/personaService.d.ts +0 -39
- package/dist/docs/docMockServices/personaService.d.ts.map +0 -1
- package/dist/docs/docMockServices/personaService.js +0 -190
- package/dist/helpers/currencyFormat.js +0 -3
- package/dist/helpers/getErrorMessage.js +0 -13
- package/dist/helpers/getInitialLetters.js +0 -5
- package/dist/helpers/getQueryString.js +0 -13
- package/dist/helpers/index.js +0 -9
- package/dist/helpers/mappers.js +0 -27
- package/dist/helpers/nameValueArrayToObject.js +0 -3
- package/dist/helpers/objectToQueryString.js +0 -3
- package/dist/helpers/queryStringToObject.js +0 -13
- package/dist/helpers/regularExpressions.js +0 -5
- package/dist/hooks/index.js +0 -6
- package/dist/hooks/useAsyncRequest.js +0 -53
- package/dist/hooks/useBreakpoint.js +0 -59
- package/dist/hooks/useElementScroll.js +0 -58
- package/dist/hooks/useEnum.js +0 -21
- package/dist/hooks/useGlobalThemeStyles.js +0 -40
- package/dist/hooks/useThemeOverride.js +0 -99
- package/dist/interfaces/index.js +0 -1
- package/dist/interfaces/name-value.interface.js +0 -1
- package/dist/interfaces/pagination.interface.js +0 -1
- package/dist/main.d.ts +0 -2
- package/dist/main.d.ts.map +0 -1
- package/dist/main.js +0 -6
- package/dist/services/apiClient.js +0 -216
- package/dist/services/index.js +0 -1
- package/dist/styles.d.ts +0 -2
- package/dist/styles.d.ts.map +0 -1
- package/dist/styles.js +0 -3
- package/dist/templates/forms/ContactForm.js +0 -58
- package/dist/templates/forms/LoginForm.js +0 -36
- package/dist/templates/forms/RegistrationForm.js +0 -54
- package/dist/templates/layouts/DashboardLayout.js +0 -26
- package/dist/templates/layouts/SidebarLayout.js +0 -28
- package/dist/templates/patterns/FormPattern.js +0 -68
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import dayjs, {} from "dayjs";
|
|
4
|
-
import { Button } from "./Button";
|
|
5
|
-
const createDateAtMidnight = (date) => {
|
|
6
|
-
const d = dayjs(date);
|
|
7
|
-
return d.startOf("day");
|
|
8
|
-
};
|
|
9
|
-
const isSameDay = (a, b) => {
|
|
10
|
-
return a.isSame(b, "day");
|
|
11
|
-
};
|
|
12
|
-
const getDaysInMonth = (year, month) => {
|
|
13
|
-
return dayjs().year(year).month(month).daysInMonth();
|
|
14
|
-
};
|
|
15
|
-
const getWeekdayLabels = (startWeekOn) => {
|
|
16
|
-
const base = ["D", "L", "M", "X", "J", "V", "S"];
|
|
17
|
-
if (startWeekOn === "sunday") {
|
|
18
|
-
return base;
|
|
19
|
-
}
|
|
20
|
-
return [...base.slice(1), base[0]];
|
|
21
|
-
};
|
|
22
|
-
export const DatePicker = ({ value, onChange, initialViewDate, startWeekOn = "sunday", className = "", }) => {
|
|
23
|
-
const today = React.useMemo(() => dayjs().startOf("day"), []);
|
|
24
|
-
const getViewFromValue = React.useCallback((val) => {
|
|
25
|
-
const base = val ?? initialViewDate ?? today;
|
|
26
|
-
return {
|
|
27
|
-
month: base.month(),
|
|
28
|
-
year: base.year(),
|
|
29
|
-
};
|
|
30
|
-
}, [initialViewDate, today]);
|
|
31
|
-
const [view, setView] = React.useState(() => getViewFromValue(value));
|
|
32
|
-
React.useEffect(() => {
|
|
33
|
-
// Sincronizar la vista con el valor actual, incluso si es null/undefined
|
|
34
|
-
setView(getViewFromValue(value));
|
|
35
|
-
}, [value, getViewFromValue]);
|
|
36
|
-
const handlePrevMonth = () => {
|
|
37
|
-
setView((prev) => {
|
|
38
|
-
const month = prev.month === 0 ? 11 : prev.month - 1;
|
|
39
|
-
const year = prev.month === 0 ? prev.year - 1 : prev.year;
|
|
40
|
-
return { month, year };
|
|
41
|
-
});
|
|
42
|
-
};
|
|
43
|
-
const handleNextMonth = () => {
|
|
44
|
-
setView((prev) => {
|
|
45
|
-
const month = prev.month === 11 ? 0 : prev.month + 1;
|
|
46
|
-
const year = prev.month === 11 ? prev.year + 1 : prev.year;
|
|
47
|
-
return { month, year };
|
|
48
|
-
});
|
|
49
|
-
};
|
|
50
|
-
const handlePrevYear = () => {
|
|
51
|
-
setView((prev) => ({ ...prev, year: prev.year - 1 }));
|
|
52
|
-
};
|
|
53
|
-
const handleNextYear = () => {
|
|
54
|
-
setView((prev) => ({ ...prev, year: prev.year + 1 }));
|
|
55
|
-
};
|
|
56
|
-
const handleSelectDay = (day, month, year) => {
|
|
57
|
-
const targetMonth = month !== undefined ? month : view.month;
|
|
58
|
-
const targetYear = year !== undefined ? year : view.year;
|
|
59
|
-
const date = dayjs().year(targetYear).month(targetMonth).date(day);
|
|
60
|
-
onChange?.(createDateAtMidnight(date));
|
|
61
|
-
// Si el día es de otro mes, cambiar la vista
|
|
62
|
-
if (month !== undefined && month !== view.month) {
|
|
63
|
-
setView({ month: targetMonth, year: targetYear });
|
|
64
|
-
}
|
|
65
|
-
else if (year !== undefined && year !== view.year) {
|
|
66
|
-
setView({ month: targetMonth, year: targetYear });
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
const firstDayOfMonth = dayjs().year(view.year).month(view.month).date(1);
|
|
70
|
-
const firstWeekday = firstDayOfMonth.day(); // 0-6, Sunday=0
|
|
71
|
-
const daysInMonth = getDaysInMonth(view.year, view.month);
|
|
72
|
-
const weekdayLabels = getWeekdayLabels(startWeekOn);
|
|
73
|
-
const offset = startWeekOn === "sunday"
|
|
74
|
-
? firstWeekday
|
|
75
|
-
: firstWeekday === 0
|
|
76
|
-
? 6
|
|
77
|
-
: firstWeekday - 1;
|
|
78
|
-
// Calcular días del mes anterior y siguiente
|
|
79
|
-
const prevMonth = view.month === 0 ? 11 : view.month - 1;
|
|
80
|
-
const prevYear = view.month === 0 ? view.year - 1 : view.year;
|
|
81
|
-
const daysInPrevMonth = getDaysInMonth(prevYear, prevMonth);
|
|
82
|
-
const nextMonth = view.month === 11 ? 0 : view.month + 1;
|
|
83
|
-
const nextYear = view.month === 11 ? view.year + 1 : view.year;
|
|
84
|
-
const weeks = [];
|
|
85
|
-
// Construir todas las semanas (6 semanas = 42 días)
|
|
86
|
-
let dayCounter = 1 - offset; // Puede ser negativo para días del mes anterior
|
|
87
|
-
for (let week = 0; week < 6; week++) {
|
|
88
|
-
const currentWeek = [];
|
|
89
|
-
for (let dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {
|
|
90
|
-
if (dayCounter < 1) {
|
|
91
|
-
// Día del mes anterior
|
|
92
|
-
const day = daysInPrevMonth + dayCounter;
|
|
93
|
-
currentWeek.push({ day, month: prevMonth, year: prevYear });
|
|
94
|
-
}
|
|
95
|
-
else if (dayCounter > daysInMonth) {
|
|
96
|
-
// Día del mes siguiente
|
|
97
|
-
const day = dayCounter - daysInMonth;
|
|
98
|
-
currentWeek.push({ day, month: nextMonth, year: nextYear });
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
// Día del mes actual
|
|
102
|
-
currentWeek.push({
|
|
103
|
-
day: dayCounter,
|
|
104
|
-
month: view.month,
|
|
105
|
-
year: view.year,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
dayCounter++;
|
|
109
|
-
}
|
|
110
|
-
weeks.push(currentWeek);
|
|
111
|
-
}
|
|
112
|
-
const selectedDate = value && value.isValid() ? createDateAtMidnight(value) : null;
|
|
113
|
-
const monthName = dayjs()
|
|
114
|
-
.year(view.year)
|
|
115
|
-
.month(view.month)
|
|
116
|
-
.date(1)
|
|
117
|
-
.format("MMMM");
|
|
118
|
-
return (_jsxs("div", { className: `inline-flex flex-col rounded-lg border border-[var(--color-border-default)]
|
|
119
|
-
bg-[var(--color-bg-default)] p-3 shadow-sm font-[var(--font-default)] text-sm ${className}`, children: [_jsxs("div", { className: "flex items-center justify-between mb-2", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-double-left", onClick: handlePrevYear, "aria-label": "A\u00F1o anterior" }), _jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-left", onClick: handlePrevMonth, "aria-label": "Mes anterior" })] }), _jsx("div", { className: "text-center", children: _jsxs("div", { className: "text-[var(--color-text-primary)] font-medium capitalize", children: [monthName, " ", view.year] }) }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-right", onClick: handleNextMonth, "aria-label": "Mes siguiente" }), _jsx(Button, { type: "button", size: "sm", variant: "ghost", icon: "fa-angle-double-right", onClick: handleNextYear, "aria-label": "A\u00F1o siguiente" })] })] }), _jsx("div", { className: "grid grid-cols-7 gap-1 mb-1", children: weekdayLabels.map((label) => (_jsx("div", { className: "text-xs text-center text-[var(--color-text-secondary)]", children: label }, label))) }), _jsx("div", { className: "grid grid-rows-6 gap-1", children: weeks.map((week, rowIndex) => (_jsx("div", { className: "grid grid-cols-7 gap-1", children: week.map((dayInfo, index) => {
|
|
120
|
-
const { day, month, year } = dayInfo;
|
|
121
|
-
const isCurrentMonth = month === view.month && year === view.year;
|
|
122
|
-
const date = dayjs().year(year).month(month).date(day);
|
|
123
|
-
const isToday = isSameDay(date, today);
|
|
124
|
-
const isSelected = selectedDate !== null && isSameDay(date, selectedDate);
|
|
125
|
-
let dayClasses = "w-8 h-8 flex items-center justify-center rounded-full cursor-pointer text-xs";
|
|
126
|
-
if (isSelected) {
|
|
127
|
-
dayClasses +=
|
|
128
|
-
" bg-[var(--color-primary)] text-[var(--color-primary-contrast)]";
|
|
129
|
-
}
|
|
130
|
-
else if (isToday) {
|
|
131
|
-
dayClasses +=
|
|
132
|
-
" border border-[var(--color-primary)] text-[var(--color-primary)]";
|
|
133
|
-
}
|
|
134
|
-
else if (isCurrentMonth) {
|
|
135
|
-
dayClasses +=
|
|
136
|
-
" text-[var(--color-text-primary)] hover:bg-[var(--color-bg-secondary)]";
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
dayClasses +=
|
|
140
|
-
" text-[var(--color-text-muted)] opacity-50 hover:bg-[var(--color-bg-secondary)] hover:opacity-75";
|
|
141
|
-
}
|
|
142
|
-
return (_jsx("button", { type: "button", className: dayClasses, onClick: () => handleSelectDay(day, month, year), children: day }, index));
|
|
143
|
-
}) }, rowIndex))) })] }));
|
|
144
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { normalizeIconClass } from "../utils/iconUtils";
|
|
4
|
-
export const Input = React.forwardRef(({ label, error, icon, iconPosition = "left", size = "md", className = "", id, onIconClick, readOnly = false, ...props }, ref) => {
|
|
5
|
-
const inputId = id || `input-${Math.random().toString(36).substr(2, 9)}`;
|
|
6
|
-
const baseClasses = `
|
|
7
|
-
w-full border rounded-lg transition-colors focus:outline-none
|
|
8
|
-
disabled:opacity-50 disabled:cursor-not-allowed
|
|
9
|
-
font-[var(--font-default)] text-[var(--color-text-primary)]
|
|
10
|
-
flysoft-input-reset box-border
|
|
11
|
-
`;
|
|
12
|
-
const readOnlyClasses = readOnly
|
|
13
|
-
? `border-transparent bg-transparent focus:ring-0`
|
|
14
|
-
: `focus:ring-1 bg-[var(--color-bg-default)]`;
|
|
15
|
-
const sizeClasses = {
|
|
16
|
-
sm: `${readOnly ? "p-0" : "px-3 py-1.5"} text-sm`,
|
|
17
|
-
md: `${readOnly ? "p-0" : "px-4 py-2"} text-base`,
|
|
18
|
-
lg: `${readOnly ? "p-0" : "px-6 py-3"} text-lg`,
|
|
19
|
-
};
|
|
20
|
-
const stateClasses = readOnly
|
|
21
|
-
? ""
|
|
22
|
-
: error
|
|
23
|
-
? `border-[var(--color-border-error)] focus:border-[var(--color-border-error)] focus:ring-[var(--color-border-error)]`
|
|
24
|
-
: `border-[var(--color-border-default)] focus:border-[var(--color-border-focus)] focus:ring-[var(--color-border-focus)]`;
|
|
25
|
-
const inputClasses = `${baseClasses} ${readOnlyClasses} ${sizeClasses[size]} ${stateClasses} ${className}`;
|
|
26
|
-
const iconClasses = size === "sm" ? "w-4 h-4" : size === "md" ? "w-5 h-5" : "w-6 h-6";
|
|
27
|
-
const renderIcon = () => {
|
|
28
|
-
if (!icon || readOnly)
|
|
29
|
-
return null;
|
|
30
|
-
const iconElement = (_jsx("i", { className: `${normalizeIconClass(icon)} ${iconClasses} text-[var(--color-text-muted)] absolute top-1/2 transform -translate-y-1/2 ${iconPosition === "left" ? "left-3" : "right-3"} ${onIconClick && !readOnly ? "cursor-pointer hover:text-[var(--color-primary)] transition-colors" : ""}`, onClick: readOnly ? undefined : onIconClick }));
|
|
31
|
-
return iconElement;
|
|
32
|
-
};
|
|
33
|
-
return (_jsxs("div", { className: "w-full", children: [label && (_jsx("label", { htmlFor: inputId, className: "block text-sm text-[var(--color-primary)] mb-1 font-[var(--font-default)]", children: label })), _jsxs("div", { className: "relative", children: [icon && iconPosition === "left" && renderIcon(), _jsx("input", { ref: ref, id: inputId, className: `${inputClasses} ${icon && iconPosition === "left" && !readOnly ? "pl-10" : ""} ${icon && iconPosition === "right" && !readOnly ? "pr-10" : ""}`, autoComplete: "off", readOnly: readOnly, ...props }), icon && iconPosition === "right" && renderIcon()] }), error && (_jsx("p", { className: "mt-1 text-sm text-[var(--color-danger)] font-[var(--font-default)]", children: error }))] }));
|
|
34
|
-
});
|
|
35
|
-
Input.displayName = "Input";
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { Link } from "react-router-dom";
|
|
4
|
-
import { normalizeIconClass } from "../utils/iconUtils";
|
|
5
|
-
// Función helper para convertir nombres de colores comunes a valores CSS válidos
|
|
6
|
-
const getColorValue = (color) => {
|
|
7
|
-
if (!color)
|
|
8
|
-
return undefined;
|
|
9
|
-
// Si ya es un valor CSS válido (hex, rgb, rgba, hsl, etc.), retornarlo
|
|
10
|
-
if (color.startsWith("#") ||
|
|
11
|
-
color.startsWith("rgb") ||
|
|
12
|
-
color.startsWith("hsl")) {
|
|
13
|
-
return color;
|
|
14
|
-
}
|
|
15
|
-
// Mapeo de nombres de colores comunes
|
|
16
|
-
const colorMap = {
|
|
17
|
-
white: "#ffffff",
|
|
18
|
-
black: "#000000",
|
|
19
|
-
"gray-800": "#1f2937",
|
|
20
|
-
"gray-700": "#374151",
|
|
21
|
-
"gray-600": "#4b5563",
|
|
22
|
-
"gray-500": "#6b7280",
|
|
23
|
-
"gray-400": "#9ca3af",
|
|
24
|
-
"gray-300": "#d1d5db",
|
|
25
|
-
"gray-200": "#e5e7eb",
|
|
26
|
-
"gray-100": "#f3f4f6",
|
|
27
|
-
"gray-50": "#f9fafb",
|
|
28
|
-
};
|
|
29
|
-
return colorMap[color.toLowerCase()] || color;
|
|
30
|
-
};
|
|
31
|
-
export const LinkButton = ({ to, target, variant = "primary", size = "md", color = "primary", bg, textColor, icon, iconPosition = "left", children, className = "", onClick, ...props }) => {
|
|
32
|
-
const [ripples, setRipples] = React.useState([]);
|
|
33
|
-
const baseClasses = `
|
|
34
|
-
inline-flex items-center justify-center font-medium rounded-sm transition-colors
|
|
35
|
-
cursor-pointer relative overflow-hidden no-underline outline-none focus:outline-none
|
|
36
|
-
focus-visible:outline-none active:outline-none focus:ring-0 focus:ring-offset-0
|
|
37
|
-
font-[var(--font-default)]
|
|
38
|
-
`;
|
|
39
|
-
// Mapeo de clases para variant primary con color primary (usa Tailwind)
|
|
40
|
-
const getVariantClasses = (variantType, colorType) => {
|
|
41
|
-
// Solo usar clases Tailwind para primary con color primary
|
|
42
|
-
if (colorType === "primary") {
|
|
43
|
-
if (variantType === "primary") {
|
|
44
|
-
return `
|
|
45
|
-
bg-[var(--color-primary)] text-[var(--color-primary-contrast)]
|
|
46
|
-
hover:bg-[var(--color-primary-dark)]
|
|
47
|
-
`;
|
|
48
|
-
}
|
|
49
|
-
else if (variantType === "outline") {
|
|
50
|
-
return `
|
|
51
|
-
border border-[var(--color-primary)] text-[var(--color-primary)]
|
|
52
|
-
hover:bg-[var(--color-bg-secondary)]
|
|
53
|
-
`;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
return `
|
|
57
|
-
text-[var(--color-primary)] hover:bg-[var(--color-bg-secondary)]
|
|
58
|
-
`;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
// Para otros colores, retornar clases base sin color (se aplicarán con estilos inline)
|
|
62
|
-
if (variantType === "primary") {
|
|
63
|
-
return ``;
|
|
64
|
-
}
|
|
65
|
-
else if (variantType === "outline") {
|
|
66
|
-
return `border hover:bg-[var(--color-bg-secondary)]`;
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
return `hover:bg-[var(--color-bg-secondary)]`;
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
// Si se proporciona bg personalizado, no usar las clases de variante
|
|
73
|
-
const variantClasses = bg ? "" : getVariantClasses(variant, color);
|
|
74
|
-
// Determinar si necesitamos usar estilos inline para colores del sistema
|
|
75
|
-
const needsInlineStyles = !bg && color !== "primary";
|
|
76
|
-
const sizeClasses = {
|
|
77
|
-
sm: `${children ? "px-3 py-1.5" : "p-1.5"} text-sm`,
|
|
78
|
-
md: `${children ? "px-4 py-2" : "p-2"} text-base`,
|
|
79
|
-
lg: `${children ? "px-6 py-3" : "p-3"} text-lg`,
|
|
80
|
-
};
|
|
81
|
-
// Clases adicionales para variant outline cuando hay bg personalizado
|
|
82
|
-
const outlineClasses = bg && variant === "outline" ? "border" : "";
|
|
83
|
-
const classes = `${baseClasses} ${variantClasses} ${sizeClasses[size]} ${outlineClasses} ${className}`;
|
|
84
|
-
// Función para obtener el valor de una variable CSS
|
|
85
|
-
const getCSSVariable = (varName) => {
|
|
86
|
-
if (typeof window !== "undefined") {
|
|
87
|
-
const value = getComputedStyle(document.documentElement)
|
|
88
|
-
.getPropertyValue(varName)
|
|
89
|
-
.trim();
|
|
90
|
-
// Si no se encuentra la variable, intentar con el prefijo flysoft
|
|
91
|
-
if (!value && varName.startsWith("--color-")) {
|
|
92
|
-
const flysoftVarName = varName.replace("--color-", "--flysoft-");
|
|
93
|
-
return (getComputedStyle(document.documentElement)
|
|
94
|
-
.getPropertyValue(flysoftVarName)
|
|
95
|
-
.trim() || value);
|
|
96
|
-
}
|
|
97
|
-
return value;
|
|
98
|
-
}
|
|
99
|
-
return "";
|
|
100
|
-
};
|
|
101
|
-
// Estilos inline para colores personalizados o colores del sistema (no primary)
|
|
102
|
-
const inlineStyles = bg
|
|
103
|
-
? {
|
|
104
|
-
backgroundColor: variant === "primary" ? getColorValue(bg) || bg : undefined,
|
|
105
|
-
color: getColorValue(textColor) ||
|
|
106
|
-
textColor ||
|
|
107
|
-
(variant === "primary" ? "#ffffff" : getColorValue(bg) || bg),
|
|
108
|
-
borderColor: variant === "outline" ? getColorValue(bg) || bg : undefined,
|
|
109
|
-
...(variant === "ghost" && {
|
|
110
|
-
color: getColorValue(textColor) || textColor || getColorValue(bg) || bg,
|
|
111
|
-
}),
|
|
112
|
-
}
|
|
113
|
-
: needsInlineStyles
|
|
114
|
-
? {
|
|
115
|
-
...(variant === "primary" && {
|
|
116
|
-
backgroundColor: getCSSVariable(`--color-${color}`),
|
|
117
|
-
color: getCSSVariable(`--color-${color}-contrast`) || "#ffffff",
|
|
118
|
-
}),
|
|
119
|
-
...(variant === "outline" && {
|
|
120
|
-
borderColor: getCSSVariable(`--color-${color}`),
|
|
121
|
-
color: getCSSVariable(`--color-${color}`),
|
|
122
|
-
}),
|
|
123
|
-
...(variant === "ghost" && {
|
|
124
|
-
color: getCSSVariable(`--color-${color}`),
|
|
125
|
-
}),
|
|
126
|
-
}
|
|
127
|
-
: {};
|
|
128
|
-
// Función para oscurecer un color (para hover en variant primary con bg personalizado)
|
|
129
|
-
const darkenColor = (color, percent) => {
|
|
130
|
-
const hex = color.replace("#", "");
|
|
131
|
-
const num = parseInt(hex, 16);
|
|
132
|
-
const r = Math.max(0, Math.floor((num >> 16) * (1 - percent / 100)));
|
|
133
|
-
const g = Math.max(0, Math.floor(((num >> 8) & 0x00ff) * (1 - percent / 100)));
|
|
134
|
-
const b = Math.max(0, Math.floor((num & 0x0000ff) * (1 - percent / 100)));
|
|
135
|
-
return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, "0")}`;
|
|
136
|
-
};
|
|
137
|
-
const renderIcon = () => {
|
|
138
|
-
if (!icon)
|
|
139
|
-
return null;
|
|
140
|
-
const iconClasses = size === "sm" ? "w-4 h-4" : size === "md" ? "w-5 h-5" : "w-6 h-6";
|
|
141
|
-
return (_jsx("i", { className: `${normalizeIconClass(icon)} ${iconClasses} ${children ? (iconPosition === "right" ? "ml-2" : "mr-2") : ""} mt-0.5` }));
|
|
142
|
-
};
|
|
143
|
-
// Determinar el color del ripple basado en el variant y si hay bg personalizado
|
|
144
|
-
const rippleColor = bg
|
|
145
|
-
? variant === "primary"
|
|
146
|
-
? "rgba(255, 255, 255, 0.45)"
|
|
147
|
-
: "rgba(0, 0, 0, 0.15)"
|
|
148
|
-
: variant === "primary"
|
|
149
|
-
? "rgba(255, 255, 255, 0.45)"
|
|
150
|
-
: "rgba(0, 0, 0, 0.15)";
|
|
151
|
-
const handleClick = (event) => {
|
|
152
|
-
const targetElement = event.currentTarget;
|
|
153
|
-
if (targetElement) {
|
|
154
|
-
const rect = targetElement.getBoundingClientRect();
|
|
155
|
-
const size = Math.max(rect.width, rect.height) * 1.2;
|
|
156
|
-
const x = event.clientX - rect.left;
|
|
157
|
-
const y = event.clientY - rect.top;
|
|
158
|
-
const id = window.performance.now();
|
|
159
|
-
const newRipple = { id, x, y, size };
|
|
160
|
-
setRipples((prev) => [...prev, newRipple]);
|
|
161
|
-
window.setTimeout(() => {
|
|
162
|
-
setRipples((prev) => prev.filter((ripple) => ripple.id !== id));
|
|
163
|
-
}, 600);
|
|
164
|
-
}
|
|
165
|
-
onClick?.(event);
|
|
166
|
-
};
|
|
167
|
-
// Determinar si es una ruta externa (http/https) o interna
|
|
168
|
-
const isExternal = to.startsWith("http://") || to.startsWith("https://") || to.startsWith("mailto:") || to.startsWith("tel:");
|
|
169
|
-
// Combinar estilos inline - agregar outline: none para asegurar que no aparezca
|
|
170
|
-
const combinedStyles = {
|
|
171
|
-
...inlineStyles,
|
|
172
|
-
outline: "none",
|
|
173
|
-
outlineWidth: "0",
|
|
174
|
-
outlineStyle: "none",
|
|
175
|
-
outlineOffset: "0",
|
|
176
|
-
WebkitTapHighlightColor: "transparent",
|
|
177
|
-
boxShadow: "none",
|
|
178
|
-
};
|
|
179
|
-
const linkProps = {
|
|
180
|
-
className: classes,
|
|
181
|
-
style: combinedStyles,
|
|
182
|
-
onClick: handleClick,
|
|
183
|
-
onFocus: (e) => {
|
|
184
|
-
e.currentTarget.style.outline = "none";
|
|
185
|
-
e.currentTarget.style.outlineWidth = "0";
|
|
186
|
-
e.currentTarget.style.outlineStyle = "none";
|
|
187
|
-
e.currentTarget.style.outlineOffset = "0";
|
|
188
|
-
e.currentTarget.style.boxShadow = "none";
|
|
189
|
-
},
|
|
190
|
-
onBlur: (e) => {
|
|
191
|
-
e.currentTarget.style.outline = "none";
|
|
192
|
-
e.currentTarget.style.outlineWidth = "0";
|
|
193
|
-
e.currentTarget.style.outlineStyle = "none";
|
|
194
|
-
e.currentTarget.style.outlineOffset = "0";
|
|
195
|
-
e.currentTarget.style.boxShadow = "none";
|
|
196
|
-
},
|
|
197
|
-
onKeyDown: (e) => {
|
|
198
|
-
// Eliminar outline cuando se presiona cualquier tecla
|
|
199
|
-
if (e.key === "Tab" || e.key === "Enter" || e.key === " ") {
|
|
200
|
-
e.currentTarget.style.outline = "none";
|
|
201
|
-
e.currentTarget.style.outlineWidth = "0";
|
|
202
|
-
e.currentTarget.style.outlineStyle = "none";
|
|
203
|
-
e.currentTarget.style.outlineOffset = "0";
|
|
204
|
-
e.currentTarget.style.boxShadow = "none";
|
|
205
|
-
}
|
|
206
|
-
},
|
|
207
|
-
onMouseEnter: (e) => {
|
|
208
|
-
if (variant === "primary") {
|
|
209
|
-
if (bg) {
|
|
210
|
-
const hoverBg = darkenColor(getColorValue(bg) || bg, 15);
|
|
211
|
-
e.currentTarget.style.backgroundColor = hoverBg;
|
|
212
|
-
}
|
|
213
|
-
else if (needsInlineStyles) {
|
|
214
|
-
const hoverBg = getCSSVariable(`--color-${color}-dark`);
|
|
215
|
-
e.currentTarget.style.backgroundColor = hoverBg;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
},
|
|
219
|
-
onMouseLeave: (e) => {
|
|
220
|
-
if (variant === "primary") {
|
|
221
|
-
if (bg) {
|
|
222
|
-
e.currentTarget.style.backgroundColor = getColorValue(bg) || bg;
|
|
223
|
-
}
|
|
224
|
-
else if (needsInlineStyles) {
|
|
225
|
-
e.currentTarget.style.backgroundColor = getCSSVariable(`--color-${color}`);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
...props,
|
|
230
|
-
};
|
|
231
|
-
if (isExternal) {
|
|
232
|
-
const externalTarget = target || "_blank";
|
|
233
|
-
return (_jsxs("a", { href: to, target: externalTarget, rel: externalTarget === "_blank" ? "noopener noreferrer" : undefined, ...linkProps, children: [_jsx("span", { className: "absolute inset-0 pointer-events-none", children: ripples.map((ripple) => (_jsx("span", { className: "absolute rounded-full opacity-40 flysoft-button-ripple", style: {
|
|
234
|
-
top: ripple.y,
|
|
235
|
-
left: ripple.x,
|
|
236
|
-
width: ripple.size,
|
|
237
|
-
height: ripple.size,
|
|
238
|
-
backgroundColor: rippleColor,
|
|
239
|
-
} }, ripple.id))) }), _jsxs("span", { className: "relative inline-flex items-center justify-center", children: [icon && iconPosition === "left" && renderIcon(), children, icon && iconPosition === "right" && renderIcon()] })] }));
|
|
240
|
-
}
|
|
241
|
-
return (_jsxs(Link, { to: to, ...linkProps, children: [_jsx("span", { className: "absolute inset-0 pointer-events-none", children: ripples.map((ripple) => (_jsx("span", { className: "absolute rounded-full opacity-40 flysoft-button-ripple", style: {
|
|
242
|
-
top: ripple.y,
|
|
243
|
-
left: ripple.x,
|
|
244
|
-
width: ripple.size,
|
|
245
|
-
height: ripple.size,
|
|
246
|
-
backgroundColor: rippleColor,
|
|
247
|
-
} }, ripple.id))) }), _jsxs("span", { className: "relative inline-flex items-center justify-center", children: [icon && iconPosition === "left" && renderIcon(), children, icon && iconPosition === "right" && renderIcon()] })] }));
|
|
248
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { useSearchParams } from "react-router-dom";
|
|
4
|
-
import { Button } from "./Button";
|
|
5
|
-
export const Pagination = ({ fieldName = "pagina", page = 1, pages = 1, total = 0, isLoading = false, }) => {
|
|
6
|
-
const [searchParams, setSearchParams] = useSearchParams();
|
|
7
|
-
const navigateToPage = (newPage) => {
|
|
8
|
-
if (newPage < 1 || newPage > pages || newPage === page) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
const newSearchParams = new URLSearchParams(searchParams);
|
|
12
|
-
newSearchParams.set(fieldName, newPage.toString());
|
|
13
|
-
setSearchParams(newSearchParams, { replace: true });
|
|
14
|
-
};
|
|
15
|
-
const goToFirstPage = () => navigateToPage(1);
|
|
16
|
-
const goToPreviousPage = () => navigateToPage(page - 1);
|
|
17
|
-
const goToNextPage = () => navigateToPage(page + 1);
|
|
18
|
-
const goToLastPage = () => navigateToPage(pages);
|
|
19
|
-
const isFirstPage = page <= 1;
|
|
20
|
-
const isLastPage = page >= pages;
|
|
21
|
-
const hasPages = pages > 1;
|
|
22
|
-
return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-double-left", onClick: goToFirstPage, disabled: isFirstPage || !hasPages || isLoading, "aria-label": "Primera p\u00E1gina" }) }), _jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-left", onClick: goToPreviousPage, disabled: isFirstPage || !hasPages || isLoading, "aria-label": "P\u00E1gina anterior" }) }), _jsx("div", { className: `text-xs h-[32px] min-w-[100px] text-center flex flex-col justify-center`, children: isLoading ? (_jsx(_Fragment, { children: _jsx("span", { className: "block", children: "Cargando..." }) })) : (_jsxs(_Fragment, { children: [_jsxs("span", { className: "block", children: ["P\u00E1gina ", page, " de ", pages] }), _jsxs("span", { className: "block", children: [total, " elemento", total !== 1 ? "s" : ""] })] })) }), _jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-right", onClick: goToNextPage, disabled: isLastPage || !hasPages || isLoading, "aria-label": "P\u00E1gina siguiente" }) }), _jsx("div", { children: _jsx(Button, { variant: "ghost", size: "sm", icon: "fa-angle-double-right", onClick: goToLastPage, disabled: isLastPage || !hasPages || isLoading, "aria-label": "\u00DAltima p\u00E1gina" }) })] }));
|
|
23
|
-
};
|