@envisiongroup/porygon 0.1.0-rc.1
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/LICENSE +11 -0
- package/README.md +69 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +60 -0
- package/dist/react-components/buttons/EFWButton/EFWButton.d.ts +59 -0
- package/dist/react-components/buttons/EFWButton/EFWButton.hooks.d.ts +45 -0
- package/dist/react-components/buttons/EFWButton/EFWButton.hooks.js +75 -0
- package/dist/react-components/buttons/EFWButton/EFWButton.js +164 -0
- package/dist/react-components/buttons/EFWButton/EFWButton.types.d.ts +282 -0
- package/dist/react-components/buttons/EFWButton/index.d.ts +3 -0
- package/dist/react-components/buttons/EFWButton/index.js +6 -0
- package/dist/react-components/buttons/EFWDrawerButton/EFWDrawerButton.d.ts +36 -0
- package/dist/react-components/buttons/EFWDrawerButton/EFWDrawerButton.js +32 -0
- package/dist/react-components/buttons/EFWDrawerButton/EFWDrawerButton.types.d.ts +87 -0
- package/dist/react-components/buttons/EFWDrawerButton/index.d.ts +12 -0
- package/dist/react-components/buttons/EFWDrawerButton/index.js +4 -0
- package/dist/react-components/buttons/EFWGroupButton/EFWGroupButton.d.ts +65 -0
- package/dist/react-components/buttons/EFWGroupButton/EFWGroupButton.js +129 -0
- package/dist/react-components/buttons/EFWGroupButton/EFWGroupButton.types.d.ts +232 -0
- package/dist/react-components/buttons/EFWGroupButton/index.d.ts +2 -0
- package/dist/react-components/buttons/EFWGroupButton/index.js +4 -0
- package/dist/react-components/commons/utils.d.ts +55 -0
- package/dist/react-components/commons/utils.js +18 -0
- package/dist/react-components/fields/EFWAttachments/EFWAttachments.d.ts +18 -0
- package/dist/react-components/fields/EFWAttachments/EFWAttachments.js +124 -0
- package/dist/react-components/fields/EFWAttachments/EFWAttachments.types.d.ts +78 -0
- package/dist/react-components/fields/EFWAttachments/EFWAttachmentsCard/EFWAttachmentsCard.d.ts +23 -0
- package/dist/react-components/fields/EFWAttachments/EFWAttachmentsCard/EFWAttachmentsCard.js +107 -0
- package/dist/react-components/fields/EFWAttachments/EFWAttachmentsCard/EFWAttachmentsCard.types.d.ts +73 -0
- package/dist/react-components/fields/EFWAttachments/EFWAttachmentsCard/index.d.ts +1 -0
- package/dist/react-components/fields/EFWAttachments/EFWAttachmentsCard/index.js +0 -0
- package/dist/react-components/fields/EFWAttachments/index.d.ts +2 -0
- package/dist/react-components/fields/EFWAttachments/index.js +4 -0
- package/dist/react-components/fields/EFWAttachmentsField/EFWAttachmentsField.d.ts +21 -0
- package/dist/react-components/fields/EFWAttachmentsField/EFWAttachmentsField.js +55 -0
- package/dist/react-components/fields/EFWAttachmentsField/EFWAttachmentsField.types.d.ts +7 -0
- package/dist/react-components/fields/EFWAttachmentsField/index.d.ts +2 -0
- package/dist/react-components/fields/EFWAttachmentsField/index.js +4 -0
- package/dist/react-components/fields/EFWDatePicker/EFWDatePicker.d.ts +34 -0
- package/dist/react-components/fields/EFWDatePicker/EFWDatePicker.js +135 -0
- package/dist/react-components/fields/EFWDatePicker/EFWDatePicker.types.d.ts +81 -0
- package/dist/react-components/fields/EFWDatePicker/EFWDatePicker.utils.d.ts +22 -0
- package/dist/react-components/fields/EFWDatePicker/EFWDatePicker.utils.js +76 -0
- package/dist/react-components/fields/EFWDatePicker/index.d.ts +2 -0
- package/dist/react-components/fields/EFWDatePicker/index.js +4 -0
- package/dist/react-components/fields/EFWDatePickerField/EFWDatePickerField.d.ts +3 -0
- package/dist/react-components/fields/EFWDatePickerField/EFWDatePickerField.js +63 -0
- package/dist/react-components/fields/EFWDatePickerField/EFWDatePickerField.types.d.ts +7 -0
- package/dist/react-components/fields/EFWDatePickerField/index.d.ts +2 -0
- package/dist/react-components/fields/EFWDatePickerField/index.js +4 -0
- package/dist/react-components/fields/EFWField/EFWField.d.ts +53 -0
- package/dist/react-components/fields/EFWField/EFWField.js +90 -0
- package/dist/react-components/fields/EFWField/EFWField.types.d.ts +294 -0
- package/dist/react-components/fields/EFWField/EFWField.utils.d.ts +3 -0
- package/dist/react-components/fields/EFWField/EFWField.utils.js +17 -0
- package/dist/react-components/fields/EFWField/index.d.ts +2 -0
- package/dist/react-components/fields/EFWField/index.js +4 -0
- package/dist/react-components/fields/EFWInput/EFWInput.d.ts +26 -0
- package/dist/react-components/fields/EFWInput/EFWInput.js +100 -0
- package/dist/react-components/fields/EFWInput/EFWInput.types.d.ts +257 -0
- package/dist/react-components/fields/EFWInput/EFWInput.utils.d.ts +20 -0
- package/dist/react-components/fields/EFWInput/EFWInput.utils.js +84 -0
- package/dist/react-components/fields/EFWInput/index.d.ts +2 -0
- package/dist/react-components/fields/EFWInput/index.js +4 -0
- package/dist/react-components/fields/EFWInputField/EFWInputField.d.ts +3 -0
- package/dist/react-components/fields/EFWInputField/EFWInputField.js +71 -0
- package/dist/react-components/fields/EFWInputField/EFWInputField.types.d.ts +6 -0
- package/dist/react-components/fields/EFWInputField/EFWInputField.utils.d.ts +1 -0
- package/dist/react-components/fields/EFWInputField/EFWInputField.utils.js +0 -0
- package/dist/react-components/fields/EFWInputField/index.d.ts +2 -0
- package/dist/react-components/fields/EFWInputField/index.js +4 -0
- package/dist/react-components/fields/EFWNumberInput/EFWNumberInput.d.ts +8 -0
- package/dist/react-components/fields/EFWNumberInput/EFWNumberInput.js +183 -0
- package/dist/react-components/fields/EFWNumberInput/EFWNumberInput.types.d.ts +226 -0
- package/dist/react-components/fields/EFWNumberInput/EFWNumberInput.utils.d.ts +74 -0
- package/dist/react-components/fields/EFWNumberInput/EFWNumberInput.utils.js +76 -0
- package/dist/react-components/fields/EFWNumberInput/index.d.ts +2 -0
- package/dist/react-components/fields/EFWNumberInput/index.js +4 -0
- package/dist/react-components/fields/EFWNumberInputField/EFWNumberInputField.d.ts +3 -0
- package/dist/react-components/fields/EFWNumberInputField/EFWNumberInputField.js +65 -0
- package/dist/react-components/fields/EFWNumberInputField/EFWNumberInputField.types.d.ts +6 -0
- package/dist/react-components/fields/EFWNumberInputField/EFWNumberInputField.utils.d.ts +1 -0
- package/dist/react-components/fields/EFWNumberInputField/EFWNumberInputField.utils.js +0 -0
- package/dist/react-components/fields/EFWNumberInputField/index.d.ts +2 -0
- package/dist/react-components/fields/EFWNumberInputField/index.js +4 -0
- package/dist/react-components/fields/EFWSwitch/EFWSwitch.d.ts +3 -0
- package/dist/react-components/fields/EFWSwitch/EFWSwitch.js +54 -0
- package/dist/react-components/fields/EFWSwitch/EFWSwitch.types.d.ts +49 -0
- package/dist/react-components/fields/EFWSwitch/index.d.ts +2 -0
- package/dist/react-components/fields/EFWSwitch/index.js +4 -0
- package/dist/react-components/fields/EFWSwitchField/EFWSwitchField.d.ts +3 -0
- package/dist/react-components/fields/EFWSwitchField/EFWSwitchField.js +53 -0
- package/dist/react-components/fields/EFWSwitchField/EFWSwitchField.types.d.ts +7 -0
- package/dist/react-components/fields/EFWSwitchField/index.d.ts +2 -0
- package/dist/react-components/fields/EFWSwitchField/index.js +4 -0
- package/dist/react-components/fields/EFWTagPicker/EFWTagPicker.d.ts +8 -0
- package/dist/react-components/fields/EFWTagPicker/EFWTagPicker.js +230 -0
- package/dist/react-components/fields/EFWTagPicker/EFWTagPicker.types.d.ts +136 -0
- package/dist/react-components/fields/EFWTagPicker/index.d.ts +2 -0
- package/dist/react-components/fields/EFWTagPicker/index.js +4 -0
- package/dist/react-components/fields/EFWTagPickerField/EFWTagPickerField.d.ts +3 -0
- package/dist/react-components/fields/EFWTagPickerField/EFWTagPickerField.js +72 -0
- package/dist/react-components/fields/EFWTagPickerField/EFWTagPickerField.types.d.ts +8 -0
- package/dist/react-components/fields/EFWTagPickerField/EFWTagPickerField.utils.d.ts +1 -0
- package/dist/react-components/fields/EFWTagPickerField/EFWTagPickerField.utils.js +0 -0
- package/dist/react-components/fields/EFWTagPickerField/index.d.ts +2 -0
- package/dist/react-components/fields/EFWTagPickerField/index.js +4 -0
- package/dist/react-components/fields/EFWTextArea/EFWTextArea.d.ts +3 -0
- package/dist/react-components/fields/EFWTextArea/EFWTextArea.js +103 -0
- package/dist/react-components/fields/EFWTextArea/EFWTextArea.types.d.ts +79 -0
- package/dist/react-components/fields/EFWTextArea/EFWTextArea.utils.d.ts +1 -0
- package/dist/react-components/fields/EFWTextArea/EFWTextArea.utils.js +0 -0
- package/dist/react-components/fields/EFWTextArea/index.d.ts +2 -0
- package/dist/react-components/fields/EFWTextArea/index.js +4 -0
- package/dist/react-components/fields/EFWTextAreaField/EFWTextAreaField.d.ts +3 -0
- package/dist/react-components/fields/EFWTextAreaField/EFWTextAreaField.js +69 -0
- package/dist/react-components/fields/EFWTextAreaField/EFWTextAreaField.types.d.ts +6 -0
- package/dist/react-components/fields/EFWTextAreaField/EFWTextAreaField.utils.d.ts +1 -0
- package/dist/react-components/fields/EFWTextAreaField/EFWTextAreaField.utils.js +0 -0
- package/dist/react-components/fields/EFWTextAreaField/index.d.ts +2 -0
- package/dist/react-components/fields/EFWTextAreaField/index.js +4 -0
- package/dist/react-components/fields/types.d.ts +1 -0
- package/dist/react-components/fields/types.js +0 -0
- package/dist/react-components/forms/EFWForm/EFWForm.converter.d.ts +3 -0
- package/dist/react-components/forms/EFWForm/EFWForm.converter.js +30 -0
- package/dist/react-components/forms/EFWForm/EFWForm.d.ts +96 -0
- package/dist/react-components/forms/EFWForm/EFWForm.hooks.d.ts +55 -0
- package/dist/react-components/forms/EFWForm/EFWForm.hooks.js +41 -0
- package/dist/react-components/forms/EFWForm/EFWForm.js +363 -0
- package/dist/react-components/forms/EFWForm/EFWForm.types.d.ts +981 -0
- package/dist/react-components/forms/EFWForm/EFWForm.utils.d.ts +19 -0
- package/dist/react-components/forms/EFWForm/EFWForm.utils.js +252 -0
- package/dist/react-components/forms/EFWForm/index.d.ts +4 -0
- package/dist/react-components/forms/EFWForm/index.js +8 -0
- package/dist/react-components/forms/EFWFormMessageBarGroup/EFWFormMessageBarGroup.d.ts +3 -0
- package/dist/react-components/forms/EFWFormMessageBarGroup/EFWFormMessageBarGroup.js +86 -0
- package/dist/react-components/forms/EFWFormMessageBarGroup/EFWFormMessageBarGroup.types.d.ts +34 -0
- package/dist/react-components/forms/EFWFormMessageBarGroup/index.d.ts +2 -0
- package/dist/react-components/forms/EFWFormMessageBarGroup/index.js +4 -0
- package/dist/react-components/forms/EFWMessageBarManager/EFWMessageBarManager.d.ts +3 -0
- package/dist/react-components/forms/EFWMessageBarManager/EFWMessageBarManager.js +32 -0
- package/dist/react-components/forms/EFWMessageBarManager/EFWMessageBarManager.types.d.ts +7 -0
- package/dist/react-components/hooks/useDrawer/component/EFWDrawer/EFWDrawer.d.ts +3 -0
- package/dist/react-components/hooks/useDrawer/component/EFWDrawer/EFWDrawer.js +96 -0
- package/dist/react-components/hooks/useDrawer/component/EFWDrawer/EFWDrawer.types.d.ts +15 -0
- package/dist/react-components/hooks/useDrawer/component/EFWDrawer/index.d.ts +2 -0
- package/dist/react-components/hooks/useDrawer/component/EFWDrawer/index.js +4 -0
- package/dist/react-components/hooks/useDrawer/component/EFWDrawerLoader/EFWDrawerLoader.d.ts +5 -0
- package/dist/react-components/hooks/useDrawer/component/EFWDrawerLoader/EFWDrawerLoader.js +24 -0
- package/dist/react-components/hooks/useDrawer/component/EFWDrawerLoader/index.d.ts +1 -0
- package/dist/react-components/hooks/useDrawer/component/EFWDrawerLoader/index.js +4 -0
- package/dist/react-components/hooks/useDrawer/index.d.ts +2 -0
- package/dist/react-components/hooks/useDrawer/index.js +4 -0
- package/dist/react-components/hooks/useDrawer/useDrawer.d.ts +10 -0
- package/dist/react-components/hooks/useDrawer/useDrawer.js +158 -0
- package/dist/react-components/hooks/useDrawer/useDrawer.types.d.ts +72 -0
- package/dist/react-components/layout/MainNavBar/MainNavBar.js +81 -0
- package/dist/react-components/layout/MainNavBar/index.js +4 -0
- package/dist/react-components/layout/MainNavItems/MainNavItems.js +35 -0
- package/dist/react-components/layout/MainNavItems/MainNavItems.styles.js +0 -0
- package/dist/react-components/layout/MainNavItems/index.js +4 -0
- package/dist/react-components/layout/NavBarContext/NavBarContext.js +24 -0
- package/dist/react-components/tables/EFWTable/EFWTable.d.ts +8 -0
- package/dist/react-components/tables/EFWTable/EFWTable.js +585 -0
- package/dist/react-components/tables/EFWTable/EFWTable.types.d.ts +367 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableBody/EFWTableBody.d.ts +3 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableBody/EFWTableBody.js +75 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableBody/EFWTableBody.types.d.ts +18 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableBody/index.d.ts +2 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableBody/index.js +4 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableCell/EFWTableCell.d.ts +16 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableCell/EFWTableCell.js +38 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/EFWTableCommandBar.d.ts +17 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/EFWTableCommandBar.js +105 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/EFWTableCommandBar.types.d.ts +94 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/EFWTableCommandBar.utils.d.ts +14 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/EFWTableCommandBar.utils.js +26 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/index.d.ts +2 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/index.js +4 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableEmpty/EFWTableEmpty.d.ts +3 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableEmpty/EFWTableEmpty.js +46 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableEmpty/EFWTableEmpty.types.d.ts +6 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableEmpty/index.d.ts +2 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableEmpty/index.js +4 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableHeader/EFWTableHeader.d.ts +3 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableHeader/EFWTableHeader.js +87 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableHeader/EFWTableHeader.types.d.ts +13 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableHeader/index.d.ts +2 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableHeader/index.js +4 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableRow/EFWTableRow.d.ts +22 -0
- package/dist/react-components/tables/EFWTable/components/EFWTableRow/EFWTableRow.js +60 -0
- package/dist/react-components/tables/EFWTable/hooks/useDefaultAddButton/useDefaultAddButton.d.ts +3 -0
- package/dist/react-components/tables/EFWTable/hooks/useDefaultAddButton/useDefaultAddButton.js +95 -0
- package/dist/react-components/tables/EFWTable/hooks/useDefaultDeleteButton/useDefaultDeleteButton.d.ts +3 -0
- package/dist/react-components/tables/EFWTable/hooks/useDefaultDeleteButton/useDefaultDeleteButton.js +89 -0
- package/dist/react-components/tables/EFWTable/hooks/useDefaultUpdateButton/useDefaultUpdateButton.d.ts +3 -0
- package/dist/react-components/tables/EFWTable/hooks/useDefaultUpdateButton/useDefaultUpdateButton.js +98 -0
- package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController copy.d.ts +4 -0
- package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController copy.js +178 -0
- package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController.d.ts +4 -0
- package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController.js +178 -0
- package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController.types copy.d.ts +16 -0
- package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController.types copy.js +0 -0
- package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController.types.d.ts +16 -0
- package/dist/react-components/tables/EFWTable/hooks/useTableSelection/useTableSelection.d.ts +3 -0
- package/dist/react-components/tables/EFWTable/hooks/useTableSelection/useTableSelection.js +67 -0
- package/dist/react-components/tables/EFWTable/hooks/useTableSelection/useTableSelection.types.d.ts +37 -0
- package/dist/react-components/tables/EFWTable/index.d.ts +3 -0
- package/dist/react-components/tables/EFWTable/index.js +6 -0
- package/dist/react-components/tables/EFWTable/utils/CellRenderer/CellRenderer.d.ts +7 -0
- package/dist/react-components/tables/EFWTable/utils/CellRenderer/CellRenderer.js +38 -0
- package/dist/react-components/tables/EFWTable/utils/CellRenderer/CellRenderer.types.d.ts +14 -0
- package/dist/react-components/tables/EFWTable/utils/cache.d.ts +37 -0
- package/dist/react-components/tables/EFWTable/utils/cache.js +127 -0
- package/dist/react-components/tables/EFWTable/utils/comparison.d.ts +6 -0
- package/dist/react-components/tables/EFWTable/utils/comparison.js +56 -0
- package/dist/react-components/tables/EFWTable/utils/constants.d.ts +8 -0
- package/dist/react-components/tables/EFWTable/utils/constants.js +9 -0
- package/dist/react-components/tables/EFWTable/utils/context.d.ts +8 -0
- package/dist/react-components/tables/EFWTable/utils/context.js +8 -0
- package/dist/react-components/tables/EFWTable/utils/general.d.ts +4 -0
- package/dist/react-components/tables/EFWTable/utils/general.js +4 -0
- package/dist/react-components/tables/EFWTable/utils/hashing.d.ts +18 -0
- package/dist/react-components/tables/EFWTable/utils/hashing.js +43 -0
- package/dist/react-components/tables/EFWTable/utils/index.d.ts +11 -0
- package/dist/react-components/tables/EFWTable/utils/index.js +24 -0
- package/dist/react-components/tables/EFWTable/utils/renderers.d.ts +8 -0
- package/dist/react-components/tables/EFWTable/utils/renderers.js +25 -0
- package/dist/react-components/tables/EFWTable/utils/types.d.ts +31 -0
- package/dist/react-components/tables/EFWTable/utils/types.js +0 -0
- package/dist/utils/htmlConverter.d.ts +15 -0
- package/dist/utils/htmlConverter.js +12 -0
- package/package.json +114 -0
|
@@ -0,0 +1,981 @@
|
|
|
1
|
+
import { EFWInputFieldProps, EFWInputFieldValue } from '../../fields/EFWInputField';
|
|
2
|
+
import { EFWTagPickerFieldProps, EFWTagPickerFieldValue } from '../../fields/EFWTagPickerField';
|
|
3
|
+
import { EFWDatePickerFieldProps, EFWDatePickerFieldValue } from '../../fields/EFWDatePickerField';
|
|
4
|
+
import { EFWTextAreaFieldProps, EFWTextAreaFieldValue } from '../../fields/EFWTextAreaField';
|
|
5
|
+
import { EFWSwitchFieldProps, EFWSwitchFieldValue } from '../../fields/EFWSwitchField';
|
|
6
|
+
import { EFWAttachmentsFieldProps, EFWAttachmentsFieldValue } from '../../fields/EFWAttachmentsField';
|
|
7
|
+
import { EFWNumberInputFieldProps, EFWNumberInputFieldValue } from '../../fields/EFWNumberInputField';
|
|
8
|
+
import { EFWFormMessageBar } from '../EFWFormMessageBarGroup/EFWFormMessageBarGroup.types';
|
|
9
|
+
import { MutableRefObject } from 'react';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Arreglo constante que define todos los tipos de campos de formulario soportados.
|
|
13
|
+
* Estos tipos se utilizan para identificar qué tipo de componente renderizar
|
|
14
|
+
* y qué validaciones aplicar a cada campo.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* // Usar para validar tipos
|
|
18
|
+
* if (FORM_FIELD_TYPES.includes(fieldType)) {
|
|
19
|
+
* // El tipo es válido
|
|
20
|
+
* }
|
|
21
|
+
*/
|
|
22
|
+
export declare const FORM_FIELD_TYPES: readonly ["Text", "Number", "Choice", "Note", "Boolean", "MultiChoice", "Date", "Attachments"];
|
|
23
|
+
/**
|
|
24
|
+
* Tipo union literal derivado de FORM_FIELD_TYPES.
|
|
25
|
+
* Representa todos los tipos de campos posibles en el sistema.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const fieldType: EFWFormFieldType = 'Text'; // ✓ Válido
|
|
29
|
+
* const invalidType: EFWFormFieldType = 'Email'; // ✗ Error de TypeScript
|
|
30
|
+
*/
|
|
31
|
+
export type EFWFormFieldType = typeof FORM_FIELD_TYPES[number];
|
|
32
|
+
/**
|
|
33
|
+
* Mapeo que asocia cada tipo de campo con su tipo de valor correspondiente.
|
|
34
|
+
* Este mapeo es fundamental para el tipado estricto de los valores del formulario.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* // Obtener el tipo de valor para un campo específico
|
|
38
|
+
* type TextFieldValue = EFWFormFieldValueMap['Text']; // EFWInputFieldValue
|
|
39
|
+
* type NumberFieldValue = EFWFormFieldValueMap['Number']; // EFWNumberInputFieldValue
|
|
40
|
+
*/
|
|
41
|
+
export type EFWFormFieldValueMap = {
|
|
42
|
+
'Text': EFWInputFieldValue;
|
|
43
|
+
'Number': EFWNumberInputFieldValue;
|
|
44
|
+
'Choice': EFWTagPickerFieldValue[];
|
|
45
|
+
'Note': EFWTextAreaFieldValue;
|
|
46
|
+
'Boolean': EFWSwitchFieldValue;
|
|
47
|
+
'MultiChoice': EFWTagPickerFieldValue[];
|
|
48
|
+
'Date': EFWDatePickerFieldValue[];
|
|
49
|
+
'Attachments': EFWAttachmentsFieldValue[];
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Tipo genérico que obtiene el tipo de valor para un campo específico.
|
|
53
|
+
* Utiliza el mapeo EFWFormFieldValueMap para determinar el tipo correcto.
|
|
54
|
+
*
|
|
55
|
+
* @template T - Tipo de campo (por defecto todos los tipos)
|
|
56
|
+
* @example
|
|
57
|
+
* type TextValue = EFWFormFieldValue<'Text'>; // EFWInputFieldValue
|
|
58
|
+
* type AnyValue = EFWFormFieldValue; // Union de todos los valores posibles
|
|
59
|
+
*/
|
|
60
|
+
export type EFWFormFieldValue<T extends EFWFormFieldType = EFWFormFieldType> = EFWFormFieldValueMap[T];
|
|
61
|
+
/**
|
|
62
|
+
* Interfaz base que define las propiedades comunes a todos los campos de formulario.
|
|
63
|
+
* Proporciona la estructura fundamental que deben implementar todos los tipos de campos.
|
|
64
|
+
*
|
|
65
|
+
* @template T - Tipo específico de campo
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* // Implementación para un campo de texto
|
|
69
|
+
* const textField: EFWFormFieldBaseProps<'Text'> = {
|
|
70
|
+
* id: 'field-1',
|
|
71
|
+
* typeAsString: 'Text',
|
|
72
|
+
* internalName: 'userName',
|
|
73
|
+
* value: 'John Doe'
|
|
74
|
+
* };
|
|
75
|
+
*/
|
|
76
|
+
export interface EFWFormFieldBaseProps<T extends EFWFormFieldType = EFWFormFieldType> {
|
|
77
|
+
readonly id: string;
|
|
78
|
+
readonly typeAsString: T;
|
|
79
|
+
readonly internalName: string;
|
|
80
|
+
value?: EFWFormFieldValueMap[T];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Propiedades para campos de entrada de texto.
|
|
84
|
+
* Combina las propiedades base con las específicas del componente de texto.
|
|
85
|
+
*/
|
|
86
|
+
export interface EFWFormInputFieldProps extends EFWFormFieldBaseProps<'Text'>, EFWInputFieldProps {
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Propiedades para campos de entrada numérica.
|
|
90
|
+
* Combina las propiedades base con las específicas del componente numérico.
|
|
91
|
+
*/
|
|
92
|
+
export interface EFWFormNumberInputFieldProps extends EFWFormFieldBaseProps<'Number'>, EFWNumberInputFieldProps {
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Propiedades para campos de selección única.
|
|
96
|
+
* Utiliza el componente TagPicker pero limitado a una sola selección.
|
|
97
|
+
*/
|
|
98
|
+
export interface EFWFormTagPickerFieldProps extends EFWFormFieldBaseProps<'Choice'>, EFWTagPickerFieldProps {
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Propiedades para campos de selección múltiple.
|
|
102
|
+
* Extiende TagPicker con la propiedad multiple obligatoria en true.
|
|
103
|
+
*
|
|
104
|
+
* @property {true} multiple - Marca obligatoria que indica selección múltiple
|
|
105
|
+
*/
|
|
106
|
+
export interface EFWFormMultiChoiceFieldProps extends EFWFormFieldBaseProps<'MultiChoice'>, EFWTagPickerFieldProps {
|
|
107
|
+
multiple: true;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Propiedades para campos de selección de fecha.
|
|
111
|
+
* Puede manejar una o múltiples fechas dependiendo de la configuración.
|
|
112
|
+
*/
|
|
113
|
+
export interface EFWFormDatePickerFieldProps extends EFWFormFieldBaseProps<'Date'>, EFWDatePickerFieldProps {
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Propiedades para campos de área de texto.
|
|
117
|
+
* Permite entrada de texto multilínea con mayor capacidad que los campos de texto simples.
|
|
118
|
+
*/
|
|
119
|
+
export interface EFWFormTextAreaFieldProps extends EFWFormFieldBaseProps<'Note'>, EFWTextAreaFieldProps {
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Propiedades para campos de tipo switch/boolean.
|
|
123
|
+
* Representa valores de encendido/apagado, sí/no, habilitado/deshabilitado.
|
|
124
|
+
*/
|
|
125
|
+
export interface EFWFormSwitchFieldProps extends EFWFormFieldBaseProps<'Boolean'>, EFWSwitchFieldProps {
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Propiedades para campos de archivos adjuntos.
|
|
129
|
+
* Permite la carga y gestión de uno o múltiples archivos.
|
|
130
|
+
*/
|
|
131
|
+
export interface EFWFormAttachmentFieldProps extends EFWFormFieldBaseProps<'Attachments'>, EFWAttachmentsFieldProps {
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Mapeo que asocia cada tipo de campo con su interfaz de propiedades correspondiente.
|
|
135
|
+
* Este mapeo permite la resolución automática del tipo correcto de propiedades
|
|
136
|
+
* basándose en el tipo de campo especificado.
|
|
137
|
+
*/
|
|
138
|
+
export type EFWFormFieldPropsMap = {
|
|
139
|
+
'Text': EFWFormInputFieldProps;
|
|
140
|
+
'Number': EFWFormNumberInputFieldProps;
|
|
141
|
+
'Choice': EFWFormTagPickerFieldProps;
|
|
142
|
+
'Note': EFWFormTextAreaFieldProps;
|
|
143
|
+
'Boolean': EFWFormSwitchFieldProps;
|
|
144
|
+
'MultiChoice': EFWFormMultiChoiceFieldProps;
|
|
145
|
+
'Date': EFWFormDatePickerFieldProps;
|
|
146
|
+
'Attachments': EFWFormAttachmentFieldProps;
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Tipo genérico que resuelve las propiedades correctas para un tipo de campo específico.
|
|
150
|
+
*
|
|
151
|
+
* @template T - Tipo de campo (por defecto todos los tipos)
|
|
152
|
+
* @example
|
|
153
|
+
* type TextFieldProps = EFWFormFieldProps<'Text'>; // EFWFormInputFieldProps
|
|
154
|
+
* type AnyFieldProps = EFWFormFieldProps; // Union de todas las propiedades posibles
|
|
155
|
+
*/
|
|
156
|
+
export type EFWFormFieldProps<T extends EFWFormFieldType = EFWFormFieldType> = EFWFormFieldPropsMap[T];
|
|
157
|
+
/**
|
|
158
|
+
* Configuración para grid responsivo usando CSS auto-fit.
|
|
159
|
+
* Permite crear layouts que se adaptan automáticamente al espacio disponible.
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* const gridConfig: ResponsiveGridConfig = {
|
|
163
|
+
* autoFit: {
|
|
164
|
+
* minColumnWidth: "300px",
|
|
165
|
+
* maxColumns: 4
|
|
166
|
+
* }
|
|
167
|
+
* };
|
|
168
|
+
*/
|
|
169
|
+
export interface ResponsiveGridConfig {
|
|
170
|
+
autoFit: {
|
|
171
|
+
minColumnWidth: string;
|
|
172
|
+
maxColumns?: number;
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Tipo que permite especificar columnas de grid de forma fija o responsiva.
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* // Grid fijo de 3 columnas
|
|
180
|
+
* const fixedGrid: GridTemplateColumnsType = 3;
|
|
181
|
+
*
|
|
182
|
+
* // Grid responsivo
|
|
183
|
+
* const responsiveGrid: GridTemplateColumnsType = {
|
|
184
|
+
* autoFit: { minColumnWidth: "250px", maxColumns: 5 }
|
|
185
|
+
* };
|
|
186
|
+
*/
|
|
187
|
+
export type GridTemplateColumnsType = number | ResponsiveGridConfig;
|
|
188
|
+
/**
|
|
189
|
+
* Tipo utilitario que detecta si un tipo es una unión (union type).
|
|
190
|
+
* Se utiliza internamente para determinar si se debe aplicar tipado estricto o genérico.
|
|
191
|
+
*
|
|
192
|
+
* @template T - Tipo a evaluar
|
|
193
|
+
* @template U - Tipo de comparación (por defecto igual a T)
|
|
194
|
+
* @typedef {boolean} IsUnion
|
|
195
|
+
* @private
|
|
196
|
+
*/
|
|
197
|
+
type IsUnion<T, U = T> = (T extends any ? (U extends T ? 0 : 1) : never) extends 0 ? false : true;
|
|
198
|
+
/**
|
|
199
|
+
* Extrae los nombres de campos como tipos literales de un array de propiedades de campos.
|
|
200
|
+
*
|
|
201
|
+
* @template T - Array readonly de propiedades de campos
|
|
202
|
+
* @example
|
|
203
|
+
* type MyFields = readonly [
|
|
204
|
+
* { internalName: 'name', typeAsString: 'Text', id: '1' },
|
|
205
|
+
* { internalName: 'age', typeAsString: 'Number', id: '2' }
|
|
206
|
+
* ];
|
|
207
|
+
* type FieldNames = ExtractFieldNames<MyFields>; // 'name' | 'age'
|
|
208
|
+
*/
|
|
209
|
+
export type ExtractFieldNames<T extends readonly EFWFormFieldProps[]> = T[number]['internalName'];
|
|
210
|
+
/**
|
|
211
|
+
* Extrae el tipo de campo basándose en el nombre interno (internalName).
|
|
212
|
+
*
|
|
213
|
+
* @template T - Array readonly de propiedades de campos
|
|
214
|
+
* @template K - Nombre interno del campo
|
|
215
|
+
* @typedef {string} ExtractFieldType
|
|
216
|
+
* @example
|
|
217
|
+
* type NameFieldType = ExtractFieldType<MyFields, 'name'>; // 'Text'
|
|
218
|
+
* type AgeFieldType = ExtractFieldType<MyFields, 'age'>; // 'Number'
|
|
219
|
+
*/
|
|
220
|
+
export type ExtractFieldType<T extends readonly EFWFormFieldProps[], K extends string> = Extract<T[number], {
|
|
221
|
+
internalName: K;
|
|
222
|
+
}>['typeAsString'];
|
|
223
|
+
/**
|
|
224
|
+
* Obtiene el tipo de valor correcto para un campo específico.
|
|
225
|
+
*
|
|
226
|
+
* @template T - Array readonly de propiedades de campos
|
|
227
|
+
* @template K - Nombre interno del campo
|
|
228
|
+
* @example
|
|
229
|
+
* type NameValue = GetFieldValue<MyFields, 'name'>; // EFWInputFieldValue (string)
|
|
230
|
+
* type AgeValue = GetFieldValue<MyFields, 'age'>; // EFWNumberInputFieldValue (number)
|
|
231
|
+
*/
|
|
232
|
+
export type GetFieldValue<T extends readonly EFWFormFieldProps[], K extends string> = ExtractFieldType<T, K> extends keyof EFWFormFieldValueMap ? EFWFormFieldValueMap[ExtractFieldType<T, K>] : EFWFormFieldValue;
|
|
233
|
+
/**
|
|
234
|
+
* Obtiene el tipo de propiedades correcto para un campo específico.
|
|
235
|
+
*
|
|
236
|
+
* @template T - Array readonly de propiedades de campos
|
|
237
|
+
* @template K - Nombre interno del campo
|
|
238
|
+
* @example
|
|
239
|
+
* type NameProps = GetFieldProps<MyFields, 'name'>; // EFWFormInputFieldProps
|
|
240
|
+
* type AgeProps = GetFieldProps<MyFields, 'age'>; // EFWFormNumberInputFieldProps
|
|
241
|
+
*/
|
|
242
|
+
export type GetFieldProps<T extends readonly EFWFormFieldProps[], K extends string> = ExtractFieldType<T, K> extends keyof EFWFormFieldPropsMap ? EFWFormFieldPropsMap[ExtractFieldType<T, K>] : EFWFormFieldProps;
|
|
243
|
+
/**
|
|
244
|
+
* Crea un mapeo tipado de todos los valores del formulario.
|
|
245
|
+
* Las claves son los nombres internos de los campos y los valores son del tipo correcto para cada campo.
|
|
246
|
+
*
|
|
247
|
+
* @template T - Array readonly de propiedades de campos
|
|
248
|
+
* @example
|
|
249
|
+
* type MyFormValues = EFWFormValues<MyFields>;
|
|
250
|
+
* // Resultado: { name: string; age: number; }
|
|
251
|
+
*
|
|
252
|
+
* const formValues: MyFormValues = {
|
|
253
|
+
* name: "John Doe",
|
|
254
|
+
* age: 30
|
|
255
|
+
* };
|
|
256
|
+
*/
|
|
257
|
+
export type EFWFormValues<T extends readonly EFWFormFieldProps[]> = {
|
|
258
|
+
[K in ExtractFieldNames<T>]: GetFieldValue<T, K>;
|
|
259
|
+
};
|
|
260
|
+
/**
|
|
261
|
+
* Determina si un array de campos es genérico (sin tipado estricto) o específico.
|
|
262
|
+
* Se usa para aplicar diferentes estrategias de tipado.
|
|
263
|
+
*
|
|
264
|
+
* @template T - Array readonly de propiedades de campos
|
|
265
|
+
* @private
|
|
266
|
+
*/
|
|
267
|
+
type IsGenericFields<T extends readonly EFWFormFieldProps[]> = string extends ExtractFieldNames<T> ? true : false;
|
|
268
|
+
/**
|
|
269
|
+
* Define el tipo de actualización para campos del formulario.
|
|
270
|
+
* Incluye propiedades específicas para cada tipo de campo con nombres más semánticos.
|
|
271
|
+
*
|
|
272
|
+
* @template T - Array readonly de propiedades de campos
|
|
273
|
+
* @example
|
|
274
|
+
* // Para un campo de selección
|
|
275
|
+
* const choiceUpdate: EFWFormFieldUpdate<MyFields> = {
|
|
276
|
+
* selectedOptions: [{ id: '1', label: 'Option 1' }]
|
|
277
|
+
* };
|
|
278
|
+
*
|
|
279
|
+
* // Para un campo de fecha
|
|
280
|
+
* const dateUpdate: EFWFormFieldUpdate<MyFields> = {
|
|
281
|
+
* selectedDates: [new Date()]
|
|
282
|
+
* };
|
|
283
|
+
*/
|
|
284
|
+
export type EFWFormFieldUpdate<T extends readonly EFWFormFieldProps[] = EFWFormFieldProps[]> = {
|
|
285
|
+
[K in ExtractFieldNames<T>]: Partial<GetFieldProps<T, K>> & {
|
|
286
|
+
value?: GetFieldValue<T, K> extends EFWFormFieldValueMap['Text' | 'Number' | 'Boolean' | 'Note'] ? GetFieldValue<T, K> : never;
|
|
287
|
+
selectedOptions?: GetFieldValue<T, K> extends EFWFormFieldValueMap['Choice' | 'MultiChoice'] ? GetFieldValue<T, K> : never;
|
|
288
|
+
selectedDates?: GetFieldValue<T, K> extends EFWFormFieldValueMap['Date'] ? GetFieldValue<T, K> : never;
|
|
289
|
+
files?: GetFieldValue<T, K> extends EFWFormFieldValueMap['Attachments'] ? GetFieldValue<T, K> : never;
|
|
290
|
+
};
|
|
291
|
+
}[ExtractFieldNames<T>];
|
|
292
|
+
/**
|
|
293
|
+
* Función genérica para actualizar campos cuando no hay tipado fuerte.
|
|
294
|
+
* Se usa cuando el array de campos es genérico y no se conocen los tipos específicos.
|
|
295
|
+
*
|
|
296
|
+
* @template F - Tipo de campo específico (debe especificarse explícitamente)
|
|
297
|
+
* @example
|
|
298
|
+
* // Debe especificar el tipo explícitamente
|
|
299
|
+
* updateField<'Text'>(['field1', 'field2'], { value: 'nuevo valor' });
|
|
300
|
+
*/
|
|
301
|
+
export type GenericUpdateFieldFunctionArray = <F extends EFWFormFieldType = never>(internalNames: readonly string[], updates: Partial<EFWFormFieldPropsMap[F]>) => void;
|
|
302
|
+
/**
|
|
303
|
+
* Función estricta para actualizar campos cuando hay tipado fuerte.
|
|
304
|
+
* Todos los campos en el array deben ser del mismo tipo para garantizar type safety.
|
|
305
|
+
*
|
|
306
|
+
* @template T - Array readonly de propiedades de campos
|
|
307
|
+
* @template Arr - Array de nombres de campos (inferido)
|
|
308
|
+
* @template K - Nombres de campos específicos (inferido)
|
|
309
|
+
* @template FT - Tipo de campo (inferido)
|
|
310
|
+
*
|
|
311
|
+
* @example
|
|
312
|
+
* // ✓ Todos los campos son tipo 'Text'
|
|
313
|
+
* updateField(['name', 'description'], { value: 'nuevo texto' });
|
|
314
|
+
*
|
|
315
|
+
* // ✗ Error: 'name' es Text pero 'age' es Number (tipos diferentes)
|
|
316
|
+
* updateField(['name', 'age'], { value: 'algo' });
|
|
317
|
+
*/
|
|
318
|
+
export type StrictUpdateFieldFunctionArray<T extends readonly EFWFormFieldProps[]> = <Arr extends readonly ExtractFieldNames<T>[], K extends Arr[number], FT = ExtractFieldType<T, K>>(internalNames: Arr & (IsUnion<FT> extends true ? never : unknown), updates: Partial<GetFieldProps<T, K>>) => void;
|
|
319
|
+
/**
|
|
320
|
+
* Función de actualización tipada que se adapta según si los campos son genéricos o específicos.
|
|
321
|
+
*
|
|
322
|
+
* @template T - Array readonly de propiedades de campos
|
|
323
|
+
*/
|
|
324
|
+
export type EFWUpdateFieldFunction<T extends readonly EFWFormFieldProps[]> = IsGenericFields<T> extends true ? GenericUpdateFieldFunctionArray : StrictUpdateFieldFunctionArray<T>;
|
|
325
|
+
/**
|
|
326
|
+
* Función de lógica genérica que se ejecuta cuando cambia el valor de un campo.
|
|
327
|
+
* Se usa cuando los campos no tienen tipado específico.
|
|
328
|
+
*
|
|
329
|
+
* @template T - Array readonly de propiedades de campo
|
|
330
|
+
* @example
|
|
331
|
+
* const genericLogic: GenericFieldLogicFunction<MyFields> = (value, allValues, updateField) => {
|
|
332
|
+
* // Lógica genérica que funciona con cualquier tipo de valor
|
|
333
|
+
* console.log('Campo cambió:', value);
|
|
334
|
+
* };
|
|
335
|
+
*/
|
|
336
|
+
export type GenericFieldLogicFunction<T extends readonly EFWFormFieldProps[]> = (value: EFWFormFieldValue, allValues: EFWFormValues<T>, updateField: EFWUpdateFieldFunction<T>) => void;
|
|
337
|
+
/**
|
|
338
|
+
* Función de lógica específica tipada para un campo concreto.
|
|
339
|
+
* El valor está tipado específicamente según el tipo de campo.
|
|
340
|
+
*
|
|
341
|
+
* @template T - Array readonly de propiedades de campos
|
|
342
|
+
* @template K - Nombre interno del campo específico
|
|
343
|
+
* @typedef {Function} StrictFieldLogicFunction
|
|
344
|
+
* @example
|
|
345
|
+
* const nameLogic: StrictFieldLogicFunction<MyFields, 'name'> = (value, allValues, updateField) => {
|
|
346
|
+
* // value es específicamente string (tipo del campo 'name')
|
|
347
|
+
* if (value.length > 50) {
|
|
348
|
+
* updateField(['description'], { value: 'Nombre muy largo' });
|
|
349
|
+
* }
|
|
350
|
+
* };
|
|
351
|
+
*/
|
|
352
|
+
export type StrictFieldLogicFunction<T extends readonly EFWFormFieldProps[], K extends ExtractFieldNames<T>> = (value: GetFieldValue<T, K>, allValues: EFWFormValues<T>, updateField: EFWUpdateFieldFunction<T>) => void;
|
|
353
|
+
/**
|
|
354
|
+
* Configuración de lógica de campos que se adapta según el tipado.
|
|
355
|
+
* Para campos genéricos usa claves string, para campos específicos usa los nombres literales.
|
|
356
|
+
*
|
|
357
|
+
* @template T - Array readonly de propiedades de campos
|
|
358
|
+
*
|
|
359
|
+
* @example
|
|
360
|
+
* // Para campos tipados específicamente
|
|
361
|
+
* const typedLogic: EFWFieldLogic<MyFields> = {
|
|
362
|
+
* name: (value, allValues, updateField) => {
|
|
363
|
+
* // value es string, tipado automáticamente
|
|
364
|
+
* },
|
|
365
|
+
* age: (value, allValues, updateField) => {
|
|
366
|
+
* // value es number, tipado automáticamente
|
|
367
|
+
* }
|
|
368
|
+
* };
|
|
369
|
+
*
|
|
370
|
+
* // Para campos genéricos
|
|
371
|
+
* const genericLogic: EFWFieldLogic<EFWFormFieldProps[]> = {
|
|
372
|
+
* 'anyField': (value, allValues, updateField) => {
|
|
373
|
+
* // value es union de todos los tipos posibles
|
|
374
|
+
* }
|
|
375
|
+
* };
|
|
376
|
+
*/
|
|
377
|
+
export type EFWFieldLogic<T extends readonly EFWFormFieldProps[] = EFWFormFieldProps[]> = IsGenericFields<T> extends true ? Partial<Record<string, GenericFieldLogicFunction<T>>> : {
|
|
378
|
+
[K in ExtractFieldNames<T>]?: StrictFieldLogicFunction<T, K>;
|
|
379
|
+
};
|
|
380
|
+
/**
|
|
381
|
+
* Opciones para la función setValues que controla el comportamiento al actualizar valores.
|
|
382
|
+
*
|
|
383
|
+
* @interface EFWFormSetValuesOptions
|
|
384
|
+
* @example
|
|
385
|
+
* const options: EFWFormSetValuesOptions = {
|
|
386
|
+
* triggerOnChange: false, // No disparar onChange
|
|
387
|
+
* triggerFieldLogic: true, // Pero sí ejecutar fieldLogic
|
|
388
|
+
* overwriteAll: false // Solo actualizar campos especificados
|
|
389
|
+
* };
|
|
390
|
+
* formRef.current?.setValues({ name: 'Nuevo nombre' }, options);
|
|
391
|
+
*/
|
|
392
|
+
export interface EFWFormSetValuesOptions {
|
|
393
|
+
triggerOnChange?: boolean;
|
|
394
|
+
triggerFieldLogic?: boolean;
|
|
395
|
+
overwriteAll?: boolean;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Interfaz que define todos los métodos expuestos por el componente EFWForm.
|
|
399
|
+
* Estos métodos permiten control programático completo del formulario desde componentes padre.
|
|
400
|
+
*
|
|
401
|
+
* @template T - Array readonly de propiedades de campos
|
|
402
|
+
* @interface EFWFormMethods
|
|
403
|
+
*/
|
|
404
|
+
export interface EFWFormMethods<T extends readonly EFWFormFieldProps[] = EFWFormFieldProps[]> {
|
|
405
|
+
/**
|
|
406
|
+
* Obtiene una copia de todos los valores actuales del formulario.
|
|
407
|
+
*
|
|
408
|
+
* @returns {EFWFormValues<T>} Objeto con todos los valores tipados
|
|
409
|
+
* @example
|
|
410
|
+
* const currentValues = formRef.current?.getValues();
|
|
411
|
+
* console.log('Nombre actual:', currentValues?.name);
|
|
412
|
+
*/
|
|
413
|
+
getValues: () => EFWFormValues<T>;
|
|
414
|
+
/**
|
|
415
|
+
* Establece nuevos valores para campos específicos del formulario.
|
|
416
|
+
* Permite actualización parcial o completa con control fino del comportamiento.
|
|
417
|
+
*
|
|
418
|
+
* @param {Partial<EFWFormValues<T>>} newValues - Nuevos valores a establecer
|
|
419
|
+
* @param {EFWFormSetValuesOptions} [options] - Opciones de comportamiento
|
|
420
|
+
* @example
|
|
421
|
+
* // Actualización simple
|
|
422
|
+
* formRef.current?.setValues({ name: 'Juan', age: 25 });
|
|
423
|
+
*
|
|
424
|
+
* // Con opciones específicas
|
|
425
|
+
* formRef.current?.setValues(
|
|
426
|
+
* { name: 'María' },
|
|
427
|
+
* { triggerOnChange: false, triggerFieldLogic: true }
|
|
428
|
+
* );
|
|
429
|
+
*/
|
|
430
|
+
setValues: (newValues: Partial<EFWFormValues<T>>, options?: EFWFormSetValuesOptions) => void;
|
|
431
|
+
/**
|
|
432
|
+
* Restablece todos los valores del formulario a su estado inicial.
|
|
433
|
+
* Útil para formularios de "limpiar" o "resetear".
|
|
434
|
+
*
|
|
435
|
+
* @example
|
|
436
|
+
* // Botón de limpiar formulario
|
|
437
|
+
* const handleReset = () => {
|
|
438
|
+
* formRef.current?.resetValues();
|
|
439
|
+
* };
|
|
440
|
+
*/
|
|
441
|
+
resetValues: () => void;
|
|
442
|
+
/**
|
|
443
|
+
* Controla el estado de deshabilitación de campos específicos o todos los campos.
|
|
444
|
+
*
|
|
445
|
+
* @param {boolean} disabled - true para deshabilitar, false para habilitar
|
|
446
|
+
* @param {ExtractFieldNames<T>[]} [fieldKeys] - Campos específicos (opcional)
|
|
447
|
+
* @returns {ExtractFieldNames<T>[]} Lista de campos que fueron modificados
|
|
448
|
+
* @example
|
|
449
|
+
* // Deshabilitar todo el formulario
|
|
450
|
+
* formRef.current?.setDisabled(true);
|
|
451
|
+
*
|
|
452
|
+
* // Deshabilitar solo campos específicos
|
|
453
|
+
* const modifiedFields = formRef.current?.setDisabled(true, ['name', 'email']);
|
|
454
|
+
*/
|
|
455
|
+
setDisabled: (disabled: boolean, fieldKeys?: ExtractFieldNames<T>[]) => ExtractFieldNames<T>[];
|
|
456
|
+
/**
|
|
457
|
+
* Controla el estado de edición de campos específicos o todos los campos.
|
|
458
|
+
* Un campo no editable es de solo lectura pero visualmente diferente a uno deshabilitado.
|
|
459
|
+
*
|
|
460
|
+
* @param {boolean} editable - true para permitir edición, false para solo lectura
|
|
461
|
+
* @param {ExtractFieldNames<T>[]} [fieldKeys] - Campos específicos (opcional)
|
|
462
|
+
* @returns {ExtractFieldNames<T>[]} Lista de campos que fueron modificados
|
|
463
|
+
* @example
|
|
464
|
+
* // Hacer todo el formulario de solo lectura
|
|
465
|
+
* formRef.current?.setEditable(false);
|
|
466
|
+
*
|
|
467
|
+
* // Hacer editables solo ciertos campos
|
|
468
|
+
* formRef.current?.setEditable(true, ['description', 'notes']);
|
|
469
|
+
*/
|
|
470
|
+
setEditable: (editable: boolean, fieldKeys?: ExtractFieldNames<T>[]) => ExtractFieldNames<T>[];
|
|
471
|
+
/**
|
|
472
|
+
* Verifica si el formulario completo está en estado deshabilitado.
|
|
473
|
+
*
|
|
474
|
+
* @returns {boolean} true si está deshabilitado, false si no
|
|
475
|
+
* @example
|
|
476
|
+
* if (formRef.current?.isDisabled()) {
|
|
477
|
+
* console.log('El formulario está deshabilitado');
|
|
478
|
+
* }
|
|
479
|
+
*/
|
|
480
|
+
isDisabled: () => boolean;
|
|
481
|
+
/**
|
|
482
|
+
* Verifica si el formulario completo está en modo editable.
|
|
483
|
+
*
|
|
484
|
+
* @returns {boolean} true si es editable, false si es solo lectura
|
|
485
|
+
* @example
|
|
486
|
+
* const canEdit = formRef.current?.isEditable();
|
|
487
|
+
* if (!canEdit) {
|
|
488
|
+
* showReadOnlyMessage();
|
|
489
|
+
* }
|
|
490
|
+
*/
|
|
491
|
+
isEditable: () => boolean;
|
|
492
|
+
/**
|
|
493
|
+
* Ejecuta validación completa del formulario según las reglas definidas.
|
|
494
|
+
* Puede mostrar notificaciones de error opcionalmente.
|
|
495
|
+
*
|
|
496
|
+
* @param {boolean} [showErrorNotification=false] - Si mostrar notificaciones de error
|
|
497
|
+
* @returns {boolean} true si es válido, false si hay errores
|
|
498
|
+
* @example
|
|
499
|
+
* // Validar antes de enviar
|
|
500
|
+
* const handleSubmit = () => {
|
|
501
|
+
* if (formRef.current?.validateForm(true)) {
|
|
502
|
+
* // Proceder con envío
|
|
503
|
+
* submitForm(formRef.current.getValues());
|
|
504
|
+
* }
|
|
505
|
+
* };
|
|
506
|
+
*/
|
|
507
|
+
validateForm: (showErrorNotification?: boolean) => boolean;
|
|
508
|
+
/**
|
|
509
|
+
* Agrega un mensaje a la barra de mensajes del formulario.
|
|
510
|
+
* Útil para mostrar feedback, errores o información contextual.
|
|
511
|
+
*
|
|
512
|
+
* @param {EFWFormMessageBar} message - Objeto del mensaje a mostrar
|
|
513
|
+
* @param {'internal' | 'external'} [source='external'] - Origen del mensaje
|
|
514
|
+
* @example
|
|
515
|
+
* // Mostrar mensaje de éxito
|
|
516
|
+
* formRef.current?.addMessageBar({
|
|
517
|
+
* id: 'success-1',
|
|
518
|
+
* type: 'success',
|
|
519
|
+
* message: 'Datos guardados correctamente'
|
|
520
|
+
* });
|
|
521
|
+
*
|
|
522
|
+
* // Mostrar error de validación personalizada
|
|
523
|
+
* formRef.current?.addMessageBar({
|
|
524
|
+
* id: 'validation-error',
|
|
525
|
+
* type: 'error',
|
|
526
|
+
* message: 'La edad debe ser mayor a 18 años'
|
|
527
|
+
* }, 'internal');
|
|
528
|
+
*/
|
|
529
|
+
addMessageBar: (message: EFWFormMessageBar, source?: 'internal' | 'external') => void;
|
|
530
|
+
/**
|
|
531
|
+
* Elimina un mensaje específico de la barra de mensajes.
|
|
532
|
+
*
|
|
533
|
+
* @param {string | number} messageId - ID del mensaje a eliminar
|
|
534
|
+
* @example
|
|
535
|
+
* // Eliminar mensaje después de 5 segundos
|
|
536
|
+
* formRef.current?.addMessageBar({ id: 'temp-msg', type: 'info', message: 'Guardando...' });
|
|
537
|
+
* setTimeout(() => {
|
|
538
|
+
* formRef.current?.removeMessageBar('temp-msg');
|
|
539
|
+
* }, 5000);
|
|
540
|
+
*/
|
|
541
|
+
removeMessageBar: (messageId: string | number) => void;
|
|
542
|
+
/**
|
|
543
|
+
* Elimina todos los mensajes de la barra de mensajes del formulario.
|
|
544
|
+
* Útil para limpiar todas las notificaciones de una vez.
|
|
545
|
+
*
|
|
546
|
+
* @example
|
|
547
|
+
* // Limpiar todos los mensajes antes de una nueva operación
|
|
548
|
+
* const handleNewOperation = () => {
|
|
549
|
+
* formRef.current?.removeAllMessagesBar();
|
|
550
|
+
* // ... resto de la lógica
|
|
551
|
+
* };
|
|
552
|
+
*/
|
|
553
|
+
removeAllMessagesBar: () => void;
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Tipo que representa la referencia al componente EFWForm.
|
|
557
|
+
* Puede ser null si el componente no está montado o la referencia no está inicializada.
|
|
558
|
+
*
|
|
559
|
+
* @template T - Array readonly de propiedades de campos
|
|
560
|
+
* @typedef {EFWFormMethods<T> | null} EFWFormRef
|
|
561
|
+
* @example
|
|
562
|
+
* const formRef = useRef<EFWFormRef<MyFields>>(null);
|
|
563
|
+
*
|
|
564
|
+
* // Verificar si está disponible antes de usar
|
|
565
|
+
* if (formRef.current) {
|
|
566
|
+
* const values = formRef.current.getValues();
|
|
567
|
+
* }
|
|
568
|
+
*/
|
|
569
|
+
export type EFWFormRef<T extends readonly EFWFormFieldProps[] = EFWFormFieldProps[]> = EFWFormMethods<T> | null;
|
|
570
|
+
/**
|
|
571
|
+
* Interfaz que extiende EFWFormMethods con funcionalidades específicas del hook useFormController.
|
|
572
|
+
* Proporciona una forma reactiva de interactuar con el formulario desde componentes React.
|
|
573
|
+
*
|
|
574
|
+
* @template T - Array readonly de propiedades de campos
|
|
575
|
+
* @interface useFormController
|
|
576
|
+
* @extends {EFWFormMethods<T>}
|
|
577
|
+
*/
|
|
578
|
+
export interface UseFormController<T extends readonly EFWFormFieldProps[] = EFWFormFieldProps[]> extends EFWFormMethods<T> {
|
|
579
|
+
/**
|
|
580
|
+
* Referencia mutable que debe asignarse a la prop formRef del componente EFWForm.
|
|
581
|
+
* Esta referencia conecta el hook con la instancia del formulario.
|
|
582
|
+
*
|
|
583
|
+
* @type {React.MutableRefObject<EFWFormRef<T>>}
|
|
584
|
+
* @example
|
|
585
|
+
* const form = useFormController<MyFields>();
|
|
586
|
+
*
|
|
587
|
+
* return (
|
|
588
|
+
* <EFWForm
|
|
589
|
+
* formRef={form.formRef}
|
|
590
|
+
* fields={myFields}
|
|
591
|
+
* onValuesChange={form.onValuesChange}
|
|
592
|
+
* />
|
|
593
|
+
* );
|
|
594
|
+
*/
|
|
595
|
+
formRef: React.MutableRefObject<EFWFormRef<T>>;
|
|
596
|
+
/**
|
|
597
|
+
* Estado reactivo que contiene los valores actuales del formulario.
|
|
598
|
+
* Se actualiza automáticamente cuando cambian los valores mediante onValuesChange.
|
|
599
|
+
*
|
|
600
|
+
* @type {EFWFormValues<T>}
|
|
601
|
+
* @example
|
|
602
|
+
* const form = useFormController<MyFields>();
|
|
603
|
+
*
|
|
604
|
+
* // Los valores están siempre actualizados
|
|
605
|
+
* useEffect(() => {
|
|
606
|
+
* console.log('Nombre cambió a:', form.values.name);
|
|
607
|
+
* }, [form.values.name]);
|
|
608
|
+
*/
|
|
609
|
+
values: EFWFormValues<T>;
|
|
610
|
+
/**
|
|
611
|
+
* Callback que debe pasarse a la prop onValuesChange del componente EFWForm.
|
|
612
|
+
* Mantiene sincronizado el estado reactivo con los valores del formulario.
|
|
613
|
+
*
|
|
614
|
+
* @param {EFWFormValues<T>} newValues - Nuevos valores del formulario
|
|
615
|
+
* @example
|
|
616
|
+
* const form = useFormController<MyFields>();
|
|
617
|
+
*
|
|
618
|
+
* return (
|
|
619
|
+
* <EFWForm
|
|
620
|
+
* fields={myFields}
|
|
621
|
+
* onValuesChange={form.onValuesChange} // ← Conecta el estado reactivo
|
|
622
|
+
* />
|
|
623
|
+
* );
|
|
624
|
+
*/
|
|
625
|
+
onValuesChange: (newValues: EFWFormValues<T>) => void;
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Interfaz que define una sección del formulario para organizar campos en grupos lógicos.
|
|
629
|
+
* Las secciones permiten crear formularios más organizados y fáciles de navegar.
|
|
630
|
+
*
|
|
631
|
+
* @template T - Tipo específico de campo que contiene esta sección
|
|
632
|
+
* @interface EFWFormSection
|
|
633
|
+
*/
|
|
634
|
+
export interface EFWFormSection<T extends EFWFormFieldProps = EFWFormFieldProps> {
|
|
635
|
+
/**
|
|
636
|
+
* Título opcional de la sección, puede ser texto o JSX.
|
|
637
|
+
* Se muestra como encabezado de la sección.
|
|
638
|
+
*
|
|
639
|
+
* @type {string | React.ReactNode}
|
|
640
|
+
* @example
|
|
641
|
+
* // Título simple
|
|
642
|
+
* title: "Información Personal"
|
|
643
|
+
*
|
|
644
|
+
* // Título con JSX
|
|
645
|
+
* title: <h3 className="section-title">Información Personal</h3>
|
|
646
|
+
*/
|
|
647
|
+
title?: string | React.ReactNode;
|
|
648
|
+
/**
|
|
649
|
+
* Descripción opcional de la sección, puede ser texto o JSX.
|
|
650
|
+
* Proporciona contexto adicional sobre los campos de la sección.
|
|
651
|
+
*
|
|
652
|
+
* @type {string | React.ReactNode}
|
|
653
|
+
* @example
|
|
654
|
+
* description: "Complete los siguientes datos personales obligatorios"
|
|
655
|
+
*/
|
|
656
|
+
description?: string | React.ReactNode;
|
|
657
|
+
/**
|
|
658
|
+
* Array de campos que pertenecen a esta sección.
|
|
659
|
+
* Cada campo debe implementar las propiedades de EFWFormFieldProps.
|
|
660
|
+
*
|
|
661
|
+
* @type {T[]}
|
|
662
|
+
* @example
|
|
663
|
+
* fields: [
|
|
664
|
+
* { id: '1', typeAsString: 'Text', internalName: 'firstName', ... },
|
|
665
|
+
* { id: '2', typeAsString: 'Text', internalName: 'lastName', ... }
|
|
666
|
+
* ]
|
|
667
|
+
*/
|
|
668
|
+
fields: T[];
|
|
669
|
+
/**
|
|
670
|
+
* Configuración de columnas del grid para esta sección específica.
|
|
671
|
+
* Puede ser un número fijo de columnas o configuración responsiva.
|
|
672
|
+
*
|
|
673
|
+
* @type {GridTemplateColumnsType}
|
|
674
|
+
* @default 1
|
|
675
|
+
* @example
|
|
676
|
+
* // Grid fijo de 2 columnas
|
|
677
|
+
* gridTemplateColumns: 2
|
|
678
|
+
*
|
|
679
|
+
* // Grid responsivo
|
|
680
|
+
* gridTemplateColumns: {
|
|
681
|
+
* autoFit: { minColumnWidth: "300px", maxColumns: 3 }
|
|
682
|
+
* }
|
|
683
|
+
*/
|
|
684
|
+
gridTemplateColumns?: GridTemplateColumnsType;
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Interfaz base que define las propiedades comunes del componente EFWForm.
|
|
688
|
+
* Estas propiedades son compartidas tanto para formularios con fields como con sections.
|
|
689
|
+
*
|
|
690
|
+
* @template T - Array de propiedades de campos
|
|
691
|
+
* @interface EFWFormBaseProps
|
|
692
|
+
*/
|
|
693
|
+
export interface EFWFormBaseProps<T extends EFWFormFieldProps[] = EFWFormFieldProps[]> {
|
|
694
|
+
/**
|
|
695
|
+
* Estilos CSS inline opcionales para el contenedor principal del formulario.
|
|
696
|
+
*
|
|
697
|
+
* @type {React.CSSProperties}
|
|
698
|
+
* @example
|
|
699
|
+
* style={{ backgroundColor: '#f5f5f5', padding: '20px' }}
|
|
700
|
+
*/
|
|
701
|
+
style?: React.CSSProperties;
|
|
702
|
+
/**
|
|
703
|
+
* Clase CSS opcional para personalización adicional del formulario.
|
|
704
|
+
*
|
|
705
|
+
* @type {string}
|
|
706
|
+
* @example
|
|
707
|
+
* className="custom-form-container"
|
|
708
|
+
*/
|
|
709
|
+
className?: string;
|
|
710
|
+
/**
|
|
711
|
+
* Título principal del formulario, mostrado en la parte superior.
|
|
712
|
+
*
|
|
713
|
+
* @type {string | React.ReactNode}
|
|
714
|
+
* @example
|
|
715
|
+
* // Título simple
|
|
716
|
+
* title="Registro de Usuario"
|
|
717
|
+
*
|
|
718
|
+
* // Título con JSX
|
|
719
|
+
* title={<h1 className="form-title">Registro de Usuario</h1>}
|
|
720
|
+
*/
|
|
721
|
+
title?: string | React.ReactNode;
|
|
722
|
+
/**
|
|
723
|
+
* Descripción del formulario, mostrada debajo del título.
|
|
724
|
+
* Proporciona contexto sobre el propósito del formulario.
|
|
725
|
+
*
|
|
726
|
+
* @type {string | React.ReactNode}
|
|
727
|
+
* @example
|
|
728
|
+
* description="Complete todos los campos para crear su cuenta"
|
|
729
|
+
*/
|
|
730
|
+
description?: string | React.ReactNode;
|
|
731
|
+
/**
|
|
732
|
+
* Indica si el formulario es obligatorio para el flujo de la aplicación.
|
|
733
|
+
* Puede afectar validaciones y comportamiento de envío.
|
|
734
|
+
*
|
|
735
|
+
* @type {boolean}
|
|
736
|
+
* @default false
|
|
737
|
+
*/
|
|
738
|
+
required?: boolean;
|
|
739
|
+
/**
|
|
740
|
+
* Controla si los campos del formulario son editables.
|
|
741
|
+
* false convierte el formulario en modo de solo lectura.
|
|
742
|
+
*
|
|
743
|
+
* @type {boolean}
|
|
744
|
+
* @default true
|
|
745
|
+
* @example
|
|
746
|
+
* // Formulario de solo lectura para mostrar datos
|
|
747
|
+
* editable={false}
|
|
748
|
+
*/
|
|
749
|
+
editable?: boolean;
|
|
750
|
+
/**
|
|
751
|
+
* Controla si el formulario completo está deshabilitado.
|
|
752
|
+
* Los campos deshabilitados no son interactivos y tienen apariencia atenuada.
|
|
753
|
+
*
|
|
754
|
+
* @type {boolean}
|
|
755
|
+
* @default false
|
|
756
|
+
* @example
|
|
757
|
+
* // Deshabilitar durante carga
|
|
758
|
+
* disabled={isLoading}
|
|
759
|
+
*/
|
|
760
|
+
disabled?: boolean;
|
|
761
|
+
/**
|
|
762
|
+
* Controla la visibilidad del formulario completo.
|
|
763
|
+
* true oculta completamente el formulario del DOM.
|
|
764
|
+
*
|
|
765
|
+
* @type {boolean}
|
|
766
|
+
* @default false
|
|
767
|
+
* @example
|
|
768
|
+
* // Mostrar condicionalmente
|
|
769
|
+
* hidden={!showAdvancedOptions}
|
|
770
|
+
*/
|
|
771
|
+
hidden?: boolean;
|
|
772
|
+
/**
|
|
773
|
+
* Espaciado en píxeles entre columnas y filas del grid del formulario.
|
|
774
|
+
*
|
|
775
|
+
* @type {number}
|
|
776
|
+
* @default 16
|
|
777
|
+
* @example
|
|
778
|
+
* gridTemplateGap={24} // Más espaciado
|
|
779
|
+
*/
|
|
780
|
+
gridTemplateGap?: number;
|
|
781
|
+
/**
|
|
782
|
+
* Configuración de lógica personalizada para los campos del formulario.
|
|
783
|
+
* Permite definir comportamientos automáticos basados en cambios de valores.
|
|
784
|
+
*
|
|
785
|
+
* @type {EFWFieldLogic<T>}
|
|
786
|
+
* @example
|
|
787
|
+
* fieldLogic={{
|
|
788
|
+
* age: (value, allValues, updateField) => {
|
|
789
|
+
* if (value >= 18) {
|
|
790
|
+
* updateField(['canVote'], { value: true });
|
|
791
|
+
* }
|
|
792
|
+
* }
|
|
793
|
+
* }}
|
|
794
|
+
*/
|
|
795
|
+
fieldLogic?: EFWFieldLogic<T>;
|
|
796
|
+
/**
|
|
797
|
+
* Callback ejecutado cuando cualquier valor del formulario cambia.
|
|
798
|
+
* Recibe los valores completos actualizados.
|
|
799
|
+
*
|
|
800
|
+
* @type {(values: EFWFormValues<T>) => void}
|
|
801
|
+
* @deprecated Usar onValuesChange en su lugar
|
|
802
|
+
* @example
|
|
803
|
+
* onChange={(values) => {
|
|
804
|
+
* console.log('Formulario cambió:', values);
|
|
805
|
+
* }}
|
|
806
|
+
*/
|
|
807
|
+
onChange?: (values: EFWFormValues<T>) => void;
|
|
808
|
+
/**
|
|
809
|
+
* Callback ejecutado cuando cualquier valor del formulario cambia.
|
|
810
|
+
* Versión preferida y más clara que onChange.
|
|
811
|
+
*
|
|
812
|
+
* @type {(values: EFWFormValues<T>) => void}
|
|
813
|
+
* @example
|
|
814
|
+
* onValuesChange={(values) => {
|
|
815
|
+
* setFormState(values);
|
|
816
|
+
* validateInRealTime(values);
|
|
817
|
+
* }}
|
|
818
|
+
*/
|
|
819
|
+
onValuesChange?: (values: EFWFormValues<T>) => void;
|
|
820
|
+
/**
|
|
821
|
+
* Array opcional de mensajes para mostrar en la barra de mensajes del formulario.
|
|
822
|
+
* Útil para feedback, errores o información contextual.
|
|
823
|
+
*
|
|
824
|
+
* @type {EFWFormMessageBar[]}
|
|
825
|
+
* @example
|
|
826
|
+
* messages={[
|
|
827
|
+
* { id: 'info', type: 'info', message: 'Los campos con * son obligatorios' },
|
|
828
|
+
* { id: 'warning', type: 'warning', message: 'Revise los datos antes de enviar' }
|
|
829
|
+
* ]}
|
|
830
|
+
*/
|
|
831
|
+
messages?: EFWFormMessageBar[];
|
|
832
|
+
/**
|
|
833
|
+
* Referencia mutable para acceder a los métodos del formulario desde el componente padre.
|
|
834
|
+
*
|
|
835
|
+
* @type {MutableRefObject<EFWFormRef<T>>}
|
|
836
|
+
* @example
|
|
837
|
+
* const formRef = useRef<EFWFormRef<MyFields>>(null);
|
|
838
|
+
*
|
|
839
|
+
* const handleSubmit = () => {
|
|
840
|
+
* if (formRef.current?.validateForm()) {
|
|
841
|
+
* const values = formRef.current.getValues();
|
|
842
|
+
* submitForm(values);
|
|
843
|
+
* }
|
|
844
|
+
* };
|
|
845
|
+
*/
|
|
846
|
+
formRef?: MutableRefObject<EFWFormRef<T>>;
|
|
847
|
+
/**
|
|
848
|
+
* Contenido React opcional renderizado antes del título y descripción.
|
|
849
|
+
* Útil para logos, breadcrumbs o elementos de navegación.
|
|
850
|
+
*
|
|
851
|
+
* @type {React.ReactNode}
|
|
852
|
+
* @example
|
|
853
|
+
* header={
|
|
854
|
+
* <div className="form-header">
|
|
855
|
+
* <Logo />
|
|
856
|
+
* <Breadcrumbs />
|
|
857
|
+
* </div>
|
|
858
|
+
* }
|
|
859
|
+
*/
|
|
860
|
+
header?: React.ReactNode;
|
|
861
|
+
/**
|
|
862
|
+
* Contenido React opcional renderizado después de los campos pero antes de children.
|
|
863
|
+
* Ideal para botones de acción o información adicional.
|
|
864
|
+
*
|
|
865
|
+
* @type {React.ReactNode}
|
|
866
|
+
* @example
|
|
867
|
+
* footer={
|
|
868
|
+
* <div className="form-actions">
|
|
869
|
+
* <Button type="submit">Guardar</Button>
|
|
870
|
+
* <Button variant="secondary" onClick={handleCancel}>Cancelar</Button>
|
|
871
|
+
* </div>
|
|
872
|
+
* }
|
|
873
|
+
*/
|
|
874
|
+
footer?: React.ReactNode;
|
|
875
|
+
/**
|
|
876
|
+
* Valores iniciales para precargar el formulario.
|
|
877
|
+
* Útil para formularios de edición o valores por defecto.
|
|
878
|
+
*
|
|
879
|
+
* @type {Partial<EFWFormValues<T>>}
|
|
880
|
+
* @example
|
|
881
|
+
* initialValues={{
|
|
882
|
+
* name: 'John Doe',
|
|
883
|
+
* email: 'john@example.com',
|
|
884
|
+
* age: 30
|
|
885
|
+
* }}
|
|
886
|
+
*/
|
|
887
|
+
initialValues?: Partial<EFWFormValues<T>>;
|
|
888
|
+
/**
|
|
889
|
+
* Callback opcional ejecutado una vez al inicializar el formulario.
|
|
890
|
+
* Útil para configuraciones dinámicas como cargar opciones desde API.
|
|
891
|
+
* Soporta operaciones asíncronas.
|
|
892
|
+
*
|
|
893
|
+
* @type {(allValues: EFWFormValues<T>, updateField: EFWUpdateFieldFunction<T>) => void | Promise<void>}
|
|
894
|
+
* @example
|
|
895
|
+
* onInit={async (allValues, updateField) => {
|
|
896
|
+
* const options = await fetchOptionsFromAPI();
|
|
897
|
+
* updateField(['category'], { options });
|
|
898
|
+
* }}
|
|
899
|
+
*/
|
|
900
|
+
onInit?: (allValues: EFWFormValues<T>, updateField: EFWUpdateFieldFunction<T>) => void | Promise<void>;
|
|
901
|
+
/**
|
|
902
|
+
* Contenido React adicional renderizado al final del formulario.
|
|
903
|
+
* Permite extensibilidad completa del formulario.
|
|
904
|
+
*
|
|
905
|
+
* @type {React.ReactNode}
|
|
906
|
+
* @example
|
|
907
|
+
* children={
|
|
908
|
+
* <div className="additional-content">
|
|
909
|
+
* <Terms />
|
|
910
|
+
* <PrivacyNotice />
|
|
911
|
+
* </div>
|
|
912
|
+
* }
|
|
913
|
+
*/
|
|
914
|
+
children?: React.ReactNode;
|
|
915
|
+
}
|
|
916
|
+
/**
|
|
917
|
+
* Interfaz principal del componente EFWForm que combina propiedades base con
|
|
918
|
+
* configuración específica para fields o sections (mutuamente excluyentes).
|
|
919
|
+
*
|
|
920
|
+
* @template T - Array de propiedades de campos
|
|
921
|
+
* @interface EFWFormProps
|
|
922
|
+
* @extends {EFWFormBaseProps<T>}
|
|
923
|
+
*/
|
|
924
|
+
export interface EFWFormProps<T extends EFWFormFieldProps[] = EFWFormFieldProps[]> extends EFWFormBaseProps<T> {
|
|
925
|
+
/**
|
|
926
|
+
* Array de campos que componen el formulario.
|
|
927
|
+
* No se puede usar junto con la propiedad sections.
|
|
928
|
+
*
|
|
929
|
+
* @type {T}
|
|
930
|
+
* @example
|
|
931
|
+
* fields={[
|
|
932
|
+
* { id: '1', typeAsString: 'Text', internalName: 'name', label: 'Nombre' },
|
|
933
|
+
* { id: '2', typeAsString: 'Number', internalName: 'age', label: 'Edad' }
|
|
934
|
+
* ]}
|
|
935
|
+
*/
|
|
936
|
+
fields?: T;
|
|
937
|
+
/**
|
|
938
|
+
* Configuración de columnas del grid cuando se usa la propiedad fields.
|
|
939
|
+
* Solo disponible cuando NO se usan sections.
|
|
940
|
+
*
|
|
941
|
+
* @type {GridTemplateColumnsType}
|
|
942
|
+
* @default 1
|
|
943
|
+
* @example
|
|
944
|
+
* // Grid fijo de 3 columnas
|
|
945
|
+
* gridTemplateColumns={3}
|
|
946
|
+
*
|
|
947
|
+
* // Grid responsivo
|
|
948
|
+
* gridTemplateColumns={{
|
|
949
|
+
* autoFit: { minColumnWidth: "250px", maxColumns: 4 }
|
|
950
|
+
* }}
|
|
951
|
+
*/
|
|
952
|
+
gridTemplateColumns?: GridTemplateColumnsType;
|
|
953
|
+
/**
|
|
954
|
+
* Array de secciones para organizar campos en grupos lógicos.
|
|
955
|
+
* No se puede usar junto con la propiedad fields.
|
|
956
|
+
* Cada sección puede tener su propia configuración de grid.
|
|
957
|
+
*
|
|
958
|
+
* @type {EFWFormSection<T[number]>[]}
|
|
959
|
+
* @example
|
|
960
|
+
* sections={[
|
|
961
|
+
* {
|
|
962
|
+
* title: "Información Personal",
|
|
963
|
+
* description: "Datos básicos del usuario",
|
|
964
|
+
* gridTemplateColumns: 2,
|
|
965
|
+
* fields: [
|
|
966
|
+
* { id: '1', typeAsString: 'Text', internalName: 'firstName' },
|
|
967
|
+
* { id: '2', typeAsString: 'Text', internalName: 'lastName' }
|
|
968
|
+
* ]
|
|
969
|
+
* },
|
|
970
|
+
* {
|
|
971
|
+
* title: "Contacto",
|
|
972
|
+
* gridTemplateColumns: 1,
|
|
973
|
+
* fields: [
|
|
974
|
+
* { id: '3', typeAsString: 'Text', internalName: 'email' }
|
|
975
|
+
* ]
|
|
976
|
+
* }
|
|
977
|
+
* ]}
|
|
978
|
+
*/
|
|
979
|
+
sections?: EFWFormSection<T[number]>[];
|
|
980
|
+
}
|
|
981
|
+
export {};
|