flysoft-react-ui 0.5.0 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +19 -7
- package/dist/components/form-controls/AutocompleteInput.d.ts +11 -3
- package/dist/components/form-controls/AutocompleteInput.d.ts.map +1 -1
- package/dist/components/form-controls/AutocompleteInput.js +411 -31
- package/dist/components/form-controls/Button.d.ts +3 -0
- package/dist/components/form-controls/Button.d.ts.map +1 -1
- package/dist/components/form-controls/Button.js +160 -19
- package/dist/components/form-controls/Checkbox.d.ts +14 -0
- package/dist/components/form-controls/Checkbox.d.ts.map +1 -0
- package/dist/components/form-controls/Checkbox.js +79 -0
- package/dist/components/form-controls/DateInput.d.ts +24 -4
- package/dist/components/form-controls/DateInput.d.ts.map +1 -1
- package/dist/components/form-controls/DateInput.js +492 -70
- package/dist/components/form-controls/DatePicker.d.ts +4 -3
- package/dist/components/form-controls/DatePicker.d.ts.map +1 -1
- package/dist/components/form-controls/DatePicker.js +26 -30
- package/dist/components/form-controls/Input.d.ts +10 -1
- package/dist/components/form-controls/Input.d.ts.map +1 -1
- package/dist/components/form-controls/Input.js +17 -10
- package/dist/components/form-controls/LinkButton.d.ts +15 -0
- package/dist/components/form-controls/LinkButton.d.ts.map +1 -0
- package/dist/components/form-controls/LinkButton.js +248 -0
- package/dist/components/form-controls/Pagination.d.ts +1 -0
- package/dist/components/form-controls/Pagination.d.ts.map +1 -1
- package/dist/components/form-controls/Pagination.js +3 -40
- package/dist/components/form-controls/RadioButtonGroup.d.ts +62 -0
- package/dist/components/form-controls/RadioButtonGroup.d.ts.map +1 -0
- package/dist/components/form-controls/RadioButtonGroup.js +220 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.d.ts +68 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.d.ts.map +1 -0
- package/dist/components/form-controls/SearchSelectInput-OLD.js +963 -0
- package/dist/components/form-controls/SearchSelectInput.d.ts +70 -0
- package/dist/components/form-controls/SearchSelectInput.d.ts.map +1 -0
- package/dist/components/form-controls/SearchSelectInput.js +336 -0
- package/dist/components/form-controls/index.d.ts +9 -1
- package/dist/components/form-controls/index.d.ts.map +1 -1
- package/dist/components/form-controls/index.js +4 -0
- package/dist/components/layout/Accordion.d.ts +13 -0
- package/dist/components/layout/Accordion.d.ts.map +1 -0
- package/dist/components/layout/Accordion.js +67 -0
- package/dist/components/layout/AppLayout.d.ts +3 -2
- package/dist/components/layout/AppLayout.d.ts.map +1 -1
- package/dist/components/layout/AppLayout.js +104 -31
- package/dist/components/layout/Card.d.ts +8 -3
- package/dist/components/layout/Card.d.ts.map +1 -1
- package/dist/components/layout/Card.js +18 -19
- package/dist/components/layout/Collection.js +1 -1
- package/dist/components/layout/DataTable.d.ts +3 -1
- package/dist/components/layout/DataTable.d.ts.map +1 -1
- package/dist/components/layout/DataTable.js +34 -29
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +1 -0
- package/dist/components/utils/Avatar.d.ts +49 -0
- package/dist/components/utils/Avatar.d.ts.map +1 -0
- package/dist/components/utils/Avatar.js +93 -0
- package/dist/components/utils/Badge.d.ts +3 -0
- package/dist/components/utils/Badge.d.ts.map +1 -1
- package/dist/components/utils/Badge.js +131 -26
- package/dist/components/utils/Dialog.d.ts.map +1 -1
- package/dist/components/utils/Dialog.js +6 -1
- package/dist/components/utils/Filter.d.ts +57 -0
- package/dist/components/utils/Filter.d.ts.map +1 -0
- package/dist/components/utils/Filter.js +581 -0
- package/dist/components/utils/FiltersDialog.d.ts +21 -0
- package/dist/components/utils/FiltersDialog.d.ts.map +1 -0
- package/dist/components/utils/FiltersDialog.js +104 -0
- package/dist/components/utils/Loader.js +2 -2
- package/dist/components/utils/RoadMap.d.ts +59 -0
- package/dist/components/utils/RoadMap.d.ts.map +1 -0
- package/dist/components/utils/RoadMap.js +139 -0
- package/dist/components/utils/Snackbar.d.ts +13 -0
- package/dist/components/utils/Snackbar.d.ts.map +1 -0
- package/dist/components/utils/Snackbar.js +122 -0
- package/dist/components/utils/SnackbarContainer.d.ts +7 -0
- package/dist/components/utils/SnackbarContainer.d.ts.map +1 -0
- package/dist/components/utils/SnackbarContainer.js +25 -0
- package/dist/components/utils/iconUtils.d.ts +16 -0
- package/dist/components/utils/iconUtils.d.ts.map +1 -0
- package/dist/components/utils/iconUtils.js +40 -0
- package/dist/components/utils/index.d.ts +12 -0
- package/dist/components/utils/index.d.ts.map +1 -1
- package/dist/components/utils/index.js +6 -0
- package/dist/contexts/AppLayoutContext.d.ts +40 -0
- package/dist/contexts/AppLayoutContext.d.ts.map +1 -0
- package/dist/contexts/AppLayoutContext.js +98 -0
- package/dist/contexts/ListCrudContext.d.ts +50 -0
- package/dist/contexts/ListCrudContext.d.ts.map +1 -0
- package/dist/contexts/ListCrudContext.js +253 -0
- package/dist/contexts/SnackbarContext.d.ts +26 -0
- package/dist/contexts/SnackbarContext.d.ts.map +1 -0
- package/dist/contexts/SnackbarContext.js +34 -0
- package/dist/contexts/index.d.ts +6 -0
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/contexts/index.js +6 -0
- package/dist/contexts/presets.js +6 -6
- package/dist/docs/AccordionDocs.d.ts +4 -0
- package/dist/docs/AccordionDocs.d.ts.map +1 -0
- package/dist/docs/AccordionDocs.js +21 -0
- package/dist/docs/AuthDocs.tsx/AuthDocsContent.js +3 -5
- package/dist/docs/AutocompleteInputDocs.js +1 -1
- package/dist/docs/AvatarDocs.d.ts +4 -0
- package/dist/docs/AvatarDocs.d.ts.map +1 -0
- package/dist/docs/AvatarDocs.js +7 -0
- package/dist/docs/BadgeDocs.d.ts.map +1 -1
- package/dist/docs/BadgeDocs.js +4 -2
- package/dist/docs/ButtonDocs.d.ts.map +1 -1
- package/dist/docs/ButtonDocs.js +1 -1
- package/dist/docs/CardDocs.d.ts.map +1 -1
- package/dist/docs/CardDocs.js +17 -8
- package/dist/docs/CheckboxDocs.d.ts +4 -0
- package/dist/docs/CheckboxDocs.d.ts.map +1 -0
- package/dist/docs/CheckboxDocs.js +7 -0
- package/dist/docs/DataTableDocs.d.ts.map +1 -1
- package/dist/docs/DataTableDocs.js +9 -5
- package/dist/docs/DateInputDocs.d.ts +1 -0
- package/dist/docs/DateInputDocs.d.ts.map +1 -1
- package/dist/docs/DateInputDocs.js +7 -9
- package/dist/docs/DatePickerDocs.d.ts +1 -0
- package/dist/docs/DatePickerDocs.d.ts.map +1 -1
- package/dist/docs/DatePickerDocs.js +6 -8
- package/dist/docs/DialogDocs.js +1 -1
- package/dist/docs/DocAdmin.d.ts +4 -0
- package/dist/docs/DocAdmin.d.ts.map +1 -0
- package/dist/docs/DocAdmin.js +68 -0
- package/dist/docs/DocsMenu.d.ts.map +1 -1
- package/dist/docs/DocsMenu.js +3 -3
- package/dist/docs/DocsRouter.d.ts.map +1 -1
- package/dist/docs/DocsRouter.js +13 -1
- package/dist/docs/DropdownMenuDocs.js +1 -1
- package/dist/docs/ExampleFormDocs.d.ts +4 -0
- package/dist/docs/ExampleFormDocs.d.ts.map +1 -0
- package/dist/docs/ExampleFormDocs.js +148 -0
- package/dist/docs/FilterDocs.d.ts +4 -0
- package/dist/docs/FilterDocs.d.ts.map +1 -0
- package/dist/docs/FilterDocs.js +112 -0
- package/dist/docs/InputDocs.d.ts.map +1 -1
- package/dist/docs/InputDocs.js +11 -1
- package/dist/docs/LinkButtonDocs.d.ts +4 -0
- package/dist/docs/LinkButtonDocs.d.ts.map +1 -0
- package/dist/docs/LinkButtonDocs.js +7 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocs.js +29 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentEmpresas.js +7 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts +2 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsContentPersonas.js +57 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts +9 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.d.ts.map +1 -0
- package/dist/docs/ListCrudDocs.tsx/ListCrudDocsEditDialog.js +30 -0
- package/dist/docs/PaginationDocs.js +6 -6
- package/dist/docs/RadioButtonGroupDocs.d.ts +4 -0
- package/dist/docs/RadioButtonGroupDocs.d.ts.map +1 -0
- package/dist/docs/RadioButtonGroupDocs.js +46 -0
- package/dist/docs/RoadMapDocs.d.ts +4 -0
- package/dist/docs/RoadMapDocs.d.ts.map +1 -0
- package/dist/docs/RoadMapDocs.js +171 -0
- package/dist/docs/SearchSelectInputDocs.d.ts +4 -0
- package/dist/docs/SearchSelectInputDocs.d.ts.map +1 -0
- package/dist/docs/SearchSelectInputDocs.js +168 -0
- package/dist/docs/SnackbarDocs.d.ts +4 -0
- package/dist/docs/SnackbarDocs.d.ts.map +1 -0
- package/dist/docs/SnackbarDocs.js +50 -0
- package/dist/docs/TabsGroupDocs.d.ts.map +1 -1
- package/dist/docs/TabsGroupDocs.js +12 -1
- package/dist/docs/docMockServices/empresaService.d.ts +38 -0
- package/dist/docs/docMockServices/empresaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/empresaService.js +117 -0
- package/dist/docs/docMockServices/index.d.ts +9 -0
- package/dist/docs/docMockServices/index.d.ts.map +1 -0
- package/dist/docs/docMockServices/index.js +8 -0
- package/dist/docs/docMockServices/initialData.d.ts +6 -0
- package/dist/docs/docMockServices/initialData.d.ts.map +1 -0
- package/dist/docs/docMockServices/initialData.js +132 -0
- package/dist/docs/docMockServices/interfaces.d.ts +26 -0
- package/dist/docs/docMockServices/interfaces.d.ts.map +1 -0
- package/dist/docs/docMockServices/interfaces.js +1 -0
- package/dist/docs/docMockServices/personaEmpresaService.d.ts +43 -0
- package/dist/docs/docMockServices/personaEmpresaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/personaEmpresaService.js +113 -0
- package/dist/docs/docMockServices/personaService.d.ts +39 -0
- package/dist/docs/docMockServices/personaService.d.ts.map +1 -0
- package/dist/docs/docMockServices/personaService.js +181 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useAsyncRequest.d.ts +17 -0
- package/dist/hooks/useAsyncRequest.d.ts.map +1 -0
- package/dist/hooks/useAsyncRequest.js +70 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +23 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/templates/forms/ContactForm.js +2 -2
- package/dist/templates/forms/LoginForm.js +1 -1
- package/dist/templates/forms/RegistrationForm.js +1 -1
- package/dist/templates/layouts/SidebarLayout.d.ts.map +1 -1
- package/dist/templates/layouts/SidebarLayout.js +3 -2
- package/dist/templates/patterns/FormPattern.d.ts.map +1 -1
- package/dist/templates/patterns/FormPattern.js +4 -3
- package/package.json +5 -2
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { useFormContext } from "react-hook-form";
|
|
4
|
+
export const RadioButtonGroup = React.forwardRef(({ options, value, onChange, labelPosition = "right", size = "md", error, direction = "vertical", gap = "md", className = "", name, disabled, onBlur, readOnly = false, ...props }, ref) => {
|
|
5
|
+
// useFormContext debe llamarse incondicionalmente (regla de hooks)
|
|
6
|
+
// Si no hay FormProvider, esto lanzará un error
|
|
7
|
+
// Para modo controlado sin FormProvider, necesitamos envolver los ejemplos
|
|
8
|
+
// en un FormProvider mínimo o usar una detección diferente
|
|
9
|
+
// Por ahora, llamamos useFormContext incondicionalmente
|
|
10
|
+
const formContext = useFormContext();
|
|
11
|
+
const setValue = formContext?.setValue;
|
|
12
|
+
// Detectar si estamos en modo register
|
|
13
|
+
// Modo register: formContext existe (hay FormProvider) Y name está definido
|
|
14
|
+
// Modo controlado: no hay formContext (no hay FormProvider) o no hay name
|
|
15
|
+
// Nota: Si no hay FormProvider, useFormContext lanzará error, pero esto es esperado
|
|
16
|
+
// cuando se usa register. Para modo controlado, el componente puede funcionar
|
|
17
|
+
// si simplemente no usamos el contexto cuando no está disponible
|
|
18
|
+
const isRegisterMode = React.useMemo(() => {
|
|
19
|
+
// Si no hay formContext, definitivamente es modo controlado
|
|
20
|
+
if (!formContext)
|
|
21
|
+
return false;
|
|
22
|
+
// Si hay formContext pero no hay name, es modo controlado
|
|
23
|
+
if (!name)
|
|
24
|
+
return false;
|
|
25
|
+
// Si hay formContext y name, es modo register
|
|
26
|
+
return true;
|
|
27
|
+
}, [formContext, name]);
|
|
28
|
+
// Usar el valor proporcionado solo en modo controlado (no register)
|
|
29
|
+
// En modo register, react-hook-form maneja el valor automáticamente
|
|
30
|
+
const currentValue = !isRegisterMode ? value : undefined;
|
|
31
|
+
// Input hidden para compatibilidad con react-hook-form
|
|
32
|
+
const hiddenInputRef = React.useRef(null);
|
|
33
|
+
// Combinar el ref del forwardRef (de register) con el ref interno del input hidden
|
|
34
|
+
const combinedRef = React.useCallback((node) => {
|
|
35
|
+
hiddenInputRef.current = node;
|
|
36
|
+
if (typeof ref === "function") {
|
|
37
|
+
ref(node);
|
|
38
|
+
}
|
|
39
|
+
else if (ref) {
|
|
40
|
+
ref.current = node;
|
|
41
|
+
}
|
|
42
|
+
}, [ref]);
|
|
43
|
+
// Obtener el valor actual desde react-hook-form en modo register
|
|
44
|
+
const watchValue = formContext?.watch(name || "");
|
|
45
|
+
const actualValue = isRegisterMode
|
|
46
|
+
? watchValue !== undefined
|
|
47
|
+
? watchValue
|
|
48
|
+
: currentValue
|
|
49
|
+
: currentValue;
|
|
50
|
+
const gapClasses = {
|
|
51
|
+
sm: "gap-2",
|
|
52
|
+
md: "gap-3",
|
|
53
|
+
lg: "gap-4",
|
|
54
|
+
};
|
|
55
|
+
const directionClasses = {
|
|
56
|
+
vertical: "flex-col",
|
|
57
|
+
horizontal: "flex-row flex-wrap",
|
|
58
|
+
};
|
|
59
|
+
const containerClasses = `
|
|
60
|
+
flex ${directionClasses[direction]} ${gapClasses[gap]}
|
|
61
|
+
${className}
|
|
62
|
+
`;
|
|
63
|
+
const sizeClasses = {
|
|
64
|
+
sm: "w-4 h-4",
|
|
65
|
+
md: "w-5 h-5",
|
|
66
|
+
lg: "w-6 h-6",
|
|
67
|
+
};
|
|
68
|
+
const labelSizeClasses = {
|
|
69
|
+
sm: "text-sm",
|
|
70
|
+
md: "text-base",
|
|
71
|
+
lg: "text-lg",
|
|
72
|
+
};
|
|
73
|
+
const handleOptionClick = (optionValue) => {
|
|
74
|
+
if (disabled || readOnly)
|
|
75
|
+
return;
|
|
76
|
+
const valueString = String(optionValue);
|
|
77
|
+
if (isRegisterMode && name) {
|
|
78
|
+
// En modo register, actualizar el input hidden y usar setValue
|
|
79
|
+
if (hiddenInputRef.current) {
|
|
80
|
+
const nativeInput = hiddenInputRef.current;
|
|
81
|
+
const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value")?.set;
|
|
82
|
+
if (nativeInputValueSetter) {
|
|
83
|
+
nativeInputValueSetter.call(nativeInput, valueString);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
nativeInput.value = valueString;
|
|
87
|
+
}
|
|
88
|
+
// Disparar evento change para react-hook-form
|
|
89
|
+
const changeEvent = {
|
|
90
|
+
target: nativeInput,
|
|
91
|
+
currentTarget: nativeInput,
|
|
92
|
+
};
|
|
93
|
+
if (onChange) {
|
|
94
|
+
// En modo register, siempre usar formato de evento
|
|
95
|
+
onChange(changeEvent);
|
|
96
|
+
}
|
|
97
|
+
// Disparar eventos nativos
|
|
98
|
+
const inputEvent = new Event("input", {
|
|
99
|
+
bubbles: true,
|
|
100
|
+
cancelable: true,
|
|
101
|
+
});
|
|
102
|
+
nativeInput.dispatchEvent(inputEvent);
|
|
103
|
+
const changeEventNative = new Event("change", {
|
|
104
|
+
bubbles: true,
|
|
105
|
+
cancelable: true,
|
|
106
|
+
});
|
|
107
|
+
nativeInput.dispatchEvent(changeEventNative);
|
|
108
|
+
}
|
|
109
|
+
// También usar setValue directamente como respaldo
|
|
110
|
+
if (setValue) {
|
|
111
|
+
setValue(name, optionValue, {
|
|
112
|
+
shouldValidate: true,
|
|
113
|
+
shouldDirty: true,
|
|
114
|
+
shouldTouch: true,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Modo controlado - llamar onChange con valor directo
|
|
120
|
+
if (onChange) {
|
|
121
|
+
// Verificar si onChange es una función de valor directo o ChangeEventHandler
|
|
122
|
+
// Intentar primero como función de valor directo (modo controlado típico)
|
|
123
|
+
const onChangeAsValueFn = onChange;
|
|
124
|
+
// Si la función tiene la firma correcta, llamarla directamente
|
|
125
|
+
if (typeof onChangeAsValueFn === "function") {
|
|
126
|
+
onChangeAsValueFn(optionValue);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// Si no, intentar como ChangeEventHandler (por compatibilidad)
|
|
130
|
+
const syntheticEvent = {
|
|
131
|
+
target: { value: String(optionValue) },
|
|
132
|
+
currentTarget: { value: String(optionValue) },
|
|
133
|
+
};
|
|
134
|
+
onChange(syntheticEvent);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
const handleBlur = (event) => {
|
|
140
|
+
if (onBlur) {
|
|
141
|
+
if (isRegisterMode && hiddenInputRef.current) {
|
|
142
|
+
// En modo register, crear un evento de blur para react-hook-form
|
|
143
|
+
const blurEvent = event ||
|
|
144
|
+
{
|
|
145
|
+
target: hiddenInputRef.current,
|
|
146
|
+
currentTarget: hiddenInputRef.current,
|
|
147
|
+
};
|
|
148
|
+
onBlur(blurEvent);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// En modo controlado, llamar como función sin parámetros
|
|
152
|
+
onBlur();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// También disparar blur en el input hidden si existe
|
|
156
|
+
if (hiddenInputRef.current) {
|
|
157
|
+
hiddenInputRef.current.blur();
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
return (_jsxs("div", { className: "w-full", children: [_jsx("input", { ref: combinedRef, type: "hidden", name: name, value: actualValue !== undefined ? String(actualValue) : "", readOnly: true, tabIndex: -1, "aria-hidden": "true" }), _jsx("div", { className: containerClasses, role: "radiogroup", "aria-label": name, "aria-invalid": error ? "true" : "false", "aria-errormessage": error ? `${name}-error` : undefined, ...props, children: options.map((option, index) => {
|
|
161
|
+
const optionValue = String(option.value);
|
|
162
|
+
const isSelected = actualValue !== undefined && String(actualValue) === optionValue;
|
|
163
|
+
// En modo readOnly, las opciones no seleccionadas se ven deshabilitadas
|
|
164
|
+
const isDisabled = disabled || option.disabled || (readOnly && !isSelected);
|
|
165
|
+
const radioId = `${name || "radio"}-${index}-${option.value}`;
|
|
166
|
+
const radioClasses = `
|
|
167
|
+
${sizeClasses[size]}
|
|
168
|
+
rounded-full border-2 transition-all duration-200
|
|
169
|
+
flex items-center justify-center
|
|
170
|
+
${isSelected
|
|
171
|
+
? "border-[var(--color-primary)]"
|
|
172
|
+
: "border-[var(--color-border-default)]"}
|
|
173
|
+
${isSelected ? "bg-[var(--color-primary)]" : "bg-transparent"}
|
|
174
|
+
${isDisabled
|
|
175
|
+
? "opacity-50 cursor-not-allowed"
|
|
176
|
+
: "cursor-pointer hover:border-[var(--color-primary)]"}
|
|
177
|
+
focus:outline-none focus:ring-2 focus:ring-offset-0 focus:ring-[var(--color-primary)]
|
|
178
|
+
`;
|
|
179
|
+
const labelClasses = `
|
|
180
|
+
${labelSizeClasses[size]}
|
|
181
|
+
font-[var(--font-default)] select-none
|
|
182
|
+
${isDisabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"}
|
|
183
|
+
text-[var(--color-text-primary)]
|
|
184
|
+
`;
|
|
185
|
+
const optionContainerClasses = `
|
|
186
|
+
flex items-center
|
|
187
|
+
${labelPosition === "left" ? "flex-row-reverse" : "flex-row"}
|
|
188
|
+
${gapClasses[gap]}
|
|
189
|
+
`;
|
|
190
|
+
return (_jsxs("div", { className: optionContainerClasses, onClick: () => !isDisabled && handleOptionClick(option.value), onBlur: index === options.length - 1
|
|
191
|
+
? () => {
|
|
192
|
+
handleBlur();
|
|
193
|
+
}
|
|
194
|
+
: undefined, role: "radio", "aria-checked": isSelected, "aria-disabled": isDisabled, tabIndex: isDisabled ? -1 : 0, onKeyDown: (e) => {
|
|
195
|
+
if (isDisabled || readOnly)
|
|
196
|
+
return;
|
|
197
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
198
|
+
e.preventDefault();
|
|
199
|
+
handleOptionClick(option.value);
|
|
200
|
+
}
|
|
201
|
+
}, children: [_jsx("div", { className: radioClasses, children: isSelected && (_jsx("div", { className: "rounded-full bg-white", style: {
|
|
202
|
+
width: size === "sm"
|
|
203
|
+
? "8px"
|
|
204
|
+
: size === "md"
|
|
205
|
+
? "10px"
|
|
206
|
+
: "12px",
|
|
207
|
+
height: size === "sm"
|
|
208
|
+
? "8px"
|
|
209
|
+
: size === "md"
|
|
210
|
+
? "10px"
|
|
211
|
+
: "12px",
|
|
212
|
+
} })) }), option.label && (_jsx("label", { htmlFor: radioId, className: labelClasses, onClick: (e) => {
|
|
213
|
+
e.preventDefault();
|
|
214
|
+
if (!isDisabled) {
|
|
215
|
+
handleOptionClick(option.value);
|
|
216
|
+
}
|
|
217
|
+
}, children: option.label }))] }, radioId));
|
|
218
|
+
}) }), error && (_jsx("p", { id: name ? `${name}-error` : undefined, className: "mt-1 text-sm text-[var(--color-danger)] font-[var(--font-default)]", children: error }))] }));
|
|
219
|
+
});
|
|
220
|
+
RadioButtonGroup.displayName = "RadioButtonGroup";
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { InputProps } from "./Input";
|
|
3
|
+
import type { PaginationInterface } from "./Pagination";
|
|
4
|
+
export interface SearchSelectOption {
|
|
5
|
+
label: string;
|
|
6
|
+
value?: string;
|
|
7
|
+
description?: string | number;
|
|
8
|
+
icon?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SearchSelectInputProps<T = SearchSelectOption, K = string> extends Omit<InputProps, "onChange" | "value" | "ref"> {
|
|
11
|
+
/**
|
|
12
|
+
* Valor del input (controlado).
|
|
13
|
+
* Puede ser la opción completa (T), el valor extraído (K si hay getOptionValue), o un string (para compatibilidad con react-hook-form).
|
|
14
|
+
*/
|
|
15
|
+
value?: T | K | string;
|
|
16
|
+
/**
|
|
17
|
+
* Callback cuando cambia el valor del input.
|
|
18
|
+
* Recibe la opción completa (T) si no hay getOptionValue, o el valor extraído (K) si hay getOptionValue.
|
|
19
|
+
* También es compatible con react-hook-form: acepta el onChange estándar de HTML.
|
|
20
|
+
*/
|
|
21
|
+
onChange?: ((value: T | K) => void) | React.ChangeEventHandler<HTMLInputElement>;
|
|
22
|
+
/**
|
|
23
|
+
* Función que realiza la búsqueda y devuelve un Promise con los resultados
|
|
24
|
+
*/
|
|
25
|
+
onSearchPromiseFn: (text: string) => Promise<Array<T> | PaginationInterface<T>>;
|
|
26
|
+
/**
|
|
27
|
+
* Función que busca un elemento individual usando su valor (K).
|
|
28
|
+
* Se usa cuando hay un valor por defecto que no está presente en las opciones cargadas.
|
|
29
|
+
* Recibe el valor (K) y devuelve una Promise con el objeto completo (T) o undefined si no se encuentra.
|
|
30
|
+
*/
|
|
31
|
+
onSingleSearchPromiseFn: (value: K) => Promise<T | undefined>;
|
|
32
|
+
/**
|
|
33
|
+
* Callback al seleccionar una opción. Devuelve el item completo (T) y el valor mapeado (K)
|
|
34
|
+
*/
|
|
35
|
+
onSelectOption?: (option: T, value: K) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Título del dialog de selección. Por defecto "Seleccione una opción"
|
|
38
|
+
*/
|
|
39
|
+
dialogTitle?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Posición del botón de búsqueda. Por defecto "right"
|
|
42
|
+
*/
|
|
43
|
+
searchButtonPosition?: "left" | "right";
|
|
44
|
+
/**
|
|
45
|
+
* Texto a mostrar cuando no hay resultados
|
|
46
|
+
*/
|
|
47
|
+
noResultsText?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Obtiene el label que se muestra para cada opción. Por defecto usa la propiedad "label".
|
|
50
|
+
*/
|
|
51
|
+
getOptionLabel?: (item: T) => string;
|
|
52
|
+
/**
|
|
53
|
+
* Obtiene el valor que se devuelve al seleccionar una opción. Por defecto usa la propiedad "value".
|
|
54
|
+
*/
|
|
55
|
+
getOptionValue?: (item: T) => K;
|
|
56
|
+
/**
|
|
57
|
+
* Obtiene la descripción opcional para cada opción. Por defecto usa la propiedad "description".
|
|
58
|
+
*/
|
|
59
|
+
getOptionDescription?: (item: T) => string | number | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Renderizado personalizado de cada opción. Si se define, se ignora el render por defecto.
|
|
62
|
+
*/
|
|
63
|
+
renderOption?: (item: T) => React.ReactNode;
|
|
64
|
+
}
|
|
65
|
+
export declare const SearchSelectInput: <T = SearchSelectOption, K = string>(props: SearchSelectInputProps<T, K> & {
|
|
66
|
+
ref?: React.ForwardedRef<HTMLInputElement>;
|
|
67
|
+
}) => React.ReactElement;
|
|
68
|
+
//# sourceMappingURL=SearchSelectInput-OLD.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchSelectInput-OLD.d.ts","sourceRoot":"","sources":["../../../src/components/form-controls/SearchSelectInput-OLD.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAIxD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,kBAAkB,EAAE,CAAC,GAAG,MAAM,CACxE,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,GAAG,KAAK,CAAC;IACtD;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EACL,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GACxB,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC/C;;OAEG;IACH,iBAAiB,EAAE,CACjB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD;;;;OAIG;IACH,uBAAuB,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC9D;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/C;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IACrC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IAChC;;OAEG;IACH,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAChE;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;CAC7C;AA6sCD,eAAO,MAAM,iBAAiB,EAAiC,CAC7D,CAAC,GAAG,kBAAkB,EACtB,CAAC,GAAG,MAAM,EAEV,KAAK,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IACpC,GAAG,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;CAC5C,KACE,KAAK,CAAC,YAAY,CAAC"}
|