@donotdev/crud 0.0.6 → 0.0.7
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/README.md +18 -2
- package/dist/CrudService.d.ts +91 -8
- package/dist/CrudService.d.ts.map +1 -1
- package/dist/CrudService.js +1 -1
- package/dist/CrudStore.d.ts +45 -2
- package/dist/CrudStore.d.ts.map +1 -1
- package/dist/CrudStore.js +1 -1
- package/dist/FieldRegistry.d.ts +56 -20
- package/dist/FieldRegistry.d.ts.map +1 -1
- package/dist/FieldRegistry.js +1 -1
- package/dist/adapters/FirestoreAdapter.d.ts +4 -4
- package/dist/adapters/FirestoreAdapter.d.ts.map +1 -1
- package/dist/adapters/FirestoreAdapter.js +1 -1
- package/dist/adapters/FunctionsAdapter.d.ts +3 -2
- package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
- package/dist/adapters/FunctionsAdapter.js +1 -1
- package/dist/builtinFieldTypes.d.ts +4 -0
- package/dist/builtinFieldTypes.d.ts.map +1 -1
- package/dist/builtinFieldTypes.js +1 -1
- package/dist/components/CrudButton.d.ts +1 -1
- package/dist/components/CrudButton.d.ts.map +1 -1
- package/dist/components/CrudButton.js +1 -1
- package/dist/components/DisplayFieldRenderer.d.ts +15 -11
- package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
- package/dist/components/DisplayFieldRenderer.js +1 -1
- package/dist/components/EntityCardList.d.ts +27 -0
- package/dist/components/EntityCardList.d.ts.map +1 -0
- package/dist/components/EntityCardList.js +1 -0
- package/dist/components/EntityDisplayRenderer.d.ts +43 -0
- package/dist/components/EntityDisplayRenderer.d.ts.map +1 -0
- package/dist/components/EntityDisplayRenderer.js +1 -0
- package/dist/components/EntityFormRenderer.d.ts +21 -26
- package/dist/components/EntityFormRenderer.d.ts.map +1 -1
- package/dist/components/EntityFormRenderer.js +1 -5
- package/dist/components/EntityList.d.ts +24 -0
- package/dist/components/EntityList.d.ts.map +1 -0
- package/dist/components/EntityList.js +1 -0
- package/dist/components/FormFieldRenderer.d.ts +3 -10
- package/dist/components/FormFieldRenderer.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.js +1 -1
- package/dist/components/FormLayout.d.ts +1 -9
- package/dist/components/FormLayout.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledAddressField.d.ts +8 -0
- package/dist/components/controlled/complex/ControlledAddressField.d.ts.map +1 -0
- package/dist/components/controlled/complex/ControlledAddressField.js +1 -0
- package/dist/components/controlled/complex/ControlledDateField.d.ts +8 -0
- package/dist/components/controlled/complex/ControlledDateField.d.ts.map +1 -0
- package/dist/components/controlled/complex/ControlledDateField.js +1 -0
- package/dist/components/controlled/complex/ControlledGeoPointField.d.ts +8 -0
- package/dist/components/controlled/complex/ControlledGeoPointField.d.ts.map +1 -0
- package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -0
- package/dist/components/controlled/complex/ControlledMapField.d.ts +8 -0
- package/dist/components/controlled/complex/ControlledMapField.d.ts.map +1 -0
- package/dist/components/controlled/complex/ControlledMapField.js +1 -0
- package/dist/components/controlled/complex/ControlledMultiInputField.d.ts +8 -0
- package/dist/components/controlled/complex/ControlledMultiInputField.d.ts.map +1 -0
- package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -0
- package/dist/components/controlled/complex/ControlledRichTextField.d.ts +8 -0
- package/dist/components/controlled/complex/ControlledRichTextField.d.ts.map +1 -0
- package/dist/components/controlled/complex/ControlledRichTextField.js +1 -0
- package/dist/components/controlled/complex/ControlledTimestampField.d.ts +8 -0
- package/dist/components/controlled/complex/ControlledTimestampField.d.ts.map +1 -0
- package/dist/components/controlled/complex/ControlledTimestampField.js +1 -0
- package/dist/components/controlled/complex/index.d.ts +8 -0
- package/dist/components/controlled/complex/index.d.ts.map +1 -0
- package/dist/components/controlled/complex/index.js +1 -0
- package/dist/components/controlled/file/ControlledDocumentField.d.ts +8 -0
- package/dist/components/controlled/file/ControlledDocumentField.d.ts.map +1 -0
- package/dist/components/controlled/file/ControlledDocumentField.js +1 -0
- package/dist/components/controlled/file/ControlledFileField.d.ts +8 -0
- package/dist/components/controlled/file/ControlledFileField.d.ts.map +1 -0
- package/dist/components/controlled/file/ControlledFileField.js +1 -0
- package/dist/components/controlled/file/ControlledImageField.d.ts +8 -0
- package/dist/components/controlled/file/ControlledImageField.d.ts.map +1 -0
- package/dist/components/controlled/file/ControlledImageField.js +1 -0
- package/dist/components/controlled/file/ControlledMultiDocumentField.d.ts +8 -0
- package/dist/components/controlled/file/ControlledMultiDocumentField.d.ts.map +1 -0
- package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -0
- package/dist/components/controlled/file/ControlledMultiFileField.d.ts +8 -0
- package/dist/components/controlled/file/ControlledMultiFileField.d.ts.map +1 -0
- package/dist/components/controlled/file/ControlledMultiFileField.js +1 -0
- package/dist/components/controlled/file/ControlledMultiImageField.d.ts +8 -0
- package/dist/components/controlled/file/ControlledMultiImageField.d.ts.map +1 -0
- package/dist/components/controlled/file/ControlledMultiImageField.js +1 -0
- package/dist/components/controlled/file/index.d.ts +7 -0
- package/dist/components/controlled/file/index.d.ts.map +1 -0
- package/dist/components/controlled/file/index.js +1 -0
- package/dist/components/controlled/index.d.ts +12 -0
- package/dist/components/controlled/index.d.ts.map +1 -0
- package/dist/components/controlled/index.js +1 -0
- package/dist/components/controlled/input/ControlledCheckboxField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledCheckboxField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledCheckboxField.js +1 -0
- package/dist/components/controlled/input/ControlledNumberField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledNumberField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledNumberField.js +1 -0
- package/dist/components/controlled/input/ControlledPasswordField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledPasswordField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledPasswordField.js +1 -0
- package/dist/components/controlled/input/ControlledPhoneField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledPhoneField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledPhoneField.js +1 -0
- package/dist/components/controlled/input/ControlledRangeField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledRangeField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledRangeField.js +1 -0
- package/dist/components/controlled/input/ControlledSwitchField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledSwitchField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledSwitchField.js +1 -0
- package/dist/components/controlled/input/ControlledTextField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledTextField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledTextField.js +1 -0
- package/dist/components/controlled/input/ControlledTextareaField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledTextareaField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledTextareaField.js +1 -0
- package/dist/components/controlled/input/index.d.ts +9 -0
- package/dist/components/controlled/input/index.d.ts.map +1 -0
- package/dist/components/controlled/input/index.js +1 -0
- package/dist/components/controlled/select/ControlledComboboxField.d.ts +9 -0
- package/dist/components/controlled/select/ControlledComboboxField.d.ts.map +1 -0
- package/dist/components/controlled/select/ControlledComboboxField.js +1 -0
- package/dist/components/controlled/select/ControlledDropdownField.d.ts +9 -0
- package/dist/components/controlled/select/ControlledDropdownField.d.ts.map +1 -0
- package/dist/components/controlled/select/ControlledDropdownField.js +1 -0
- package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts +9 -0
- package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts.map +1 -0
- package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -0
- package/dist/components/controlled/select/ControlledRadioField.d.ts +9 -0
- package/dist/components/controlled/select/ControlledRadioField.d.ts.map +1 -0
- package/dist/components/controlled/select/ControlledRadioField.js +1 -0
- package/dist/components/controlled/select/index.d.ts +5 -0
- package/dist/components/controlled/select/index.d.ts.map +1 -0
- package/dist/components/controlled/select/index.js +1 -0
- package/dist/components/controlled/types.d.ts +23 -0
- package/dist/components/controlled/types.d.ts.map +1 -0
- package/dist/components/controlled/types.js +1 -0
- package/dist/components/form/fields/AddressFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/AddressFieldComponent.js +1 -1
- package/dist/components/form/fields/AvatarFieldComponent.d.ts +2 -2
- package/dist/components/form/fields/BadgeFieldComponent.d.ts +2 -2
- package/dist/components/form/fields/ButtonFieldComponent.d.ts +1 -9
- package/dist/components/form/fields/ButtonFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
- package/dist/components/form/fields/ComboboxComponent.d.ts.map +1 -1
- package/dist/components/form/fields/CurrencyFieldComponent.d.ts +1 -9
- package/dist/components/form/fields/CurrencyFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
- package/dist/components/form/fields/DateFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/DateFieldComponent.js +1 -1
- package/dist/components/form/fields/DocumentFieldComponent.d.ts +47 -0
- package/dist/components/form/fields/DocumentFieldComponent.d.ts.map +1 -0
- package/dist/components/form/fields/DocumentFieldComponent.js +1 -0
- package/dist/components/form/fields/DropdownComponent.d.ts.map +1 -1
- package/dist/components/form/fields/DropdownComponent.js +1 -1
- package/dist/components/form/fields/FileFieldComponent.d.ts +31 -15
- package/dist/components/form/fields/FileFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/FileFieldComponent.js +1 -1
- package/dist/components/form/fields/GeoPointFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
- package/dist/components/form/fields/HiddenFieldComponent.d.ts +1 -1
- package/dist/components/form/fields/HiddenFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
- package/dist/components/form/fields/ImageFieldComponent.d.ts +8 -14
- package/dist/components/form/fields/ImageFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/ImageFieldComponent.js +1 -1
- package/dist/components/form/fields/MapFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/MapFieldComponent.js +1 -1
- package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
- package/dist/components/form/fields/MultiInputTextFieldComponent.d.ts +1 -9
- package/dist/components/form/fields/MultiInputTextFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
- package/dist/components/form/fields/NumberFieldComponent.d.ts +2 -0
- package/dist/components/form/fields/NumberFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/NumberFieldComponent.js +1 -1
- package/dist/components/form/fields/PasswordFieldComponent.d.ts +1 -9
- package/dist/components/form/fields/PasswordFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/PhoneNumberComponent.d.ts +1 -9
- package/dist/components/form/fields/PhoneNumberComponent.d.ts.map +1 -1
- package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
- package/dist/components/form/fields/RadioFieldComponent.d.ts +1 -9
- package/dist/components/form/fields/RadioFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/ReferenceFieldComponent.d.ts +33 -12
- package/dist/components/form/fields/ReferenceFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
- package/dist/components/form/fields/RichTextComponent.d.ts +32 -0
- package/dist/components/form/fields/RichTextComponent.d.ts.map +1 -0
- package/dist/components/form/fields/RichTextComponent.js +1 -0
- package/dist/components/form/fields/SwitchFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/TextAreaComponent.d.ts +1 -9
- package/dist/components/form/fields/TextAreaComponent.d.ts.map +1 -1
- package/dist/components/form/fields/TextAreaComponent.js +1 -1
- package/dist/components/form/fields/TextFieldComponent.d.ts +1 -9
- package/dist/components/form/fields/TextFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/index.d.ts +4 -2
- package/dist/components/form/fields/index.d.ts.map +1 -1
- package/dist/components/form/fields/index.js +1 -1
- package/dist/components/form/fields/internal/TiptapEditor.d.ts +13 -0
- package/dist/components/form/fields/internal/TiptapEditor.d.ts.map +1 -0
- package/dist/components/form/fields/internal/TiptapEditor.js +52 -0
- package/dist/components/form/index.d.ts +10 -0
- package/dist/components/form/index.d.ts.map +1 -0
- package/dist/components/form/index.js +1 -0
- package/dist/components/form/internal/ImageViewerDialog.d.ts +1 -1
- package/dist/components/form/internal/ImageViewerDialog.d.ts.map +1 -1
- package/dist/components/index.d.ts +8 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/contexts/UploadContext.d.ts +16 -0
- package/dist/contexts/UploadContext.d.ts.map +1 -0
- package/dist/contexts/UploadContext.js +1 -0
- package/dist/contexts/index.d.ts +3 -0
- package/dist/contexts/index.d.ts.map +1 -0
- package/dist/contexts/index.js +1 -0
- package/dist/forms/hooks/index.d.ts +2 -0
- package/dist/forms/hooks/index.d.ts.map +1 -1
- package/dist/forms/hooks/index.js +1 -1
- package/dist/forms/hooks/useController.d.ts +29 -0
- package/dist/forms/hooks/useController.d.ts.map +1 -0
- package/dist/forms/hooks/useController.js +1 -0
- package/dist/forms/hooks/useEntityField.d.ts.map +1 -1
- package/dist/forms/hooks/useEntityField.js +1 -1
- package/dist/forms/hooks/useEntityForm.d.ts +8 -76
- package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
- package/dist/forms/hooks/useEntityForm.js +1 -1
- package/dist/forms/index.d.ts +6 -4
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -1
- package/dist/forms/types.d.ts +31 -5
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/utils/getFieldsForOperation.d.ts +5 -5
- package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
- package/dist/forms/utils/getFieldsForOperation.js +1 -1
- package/dist/forms/utils/index.d.ts +9 -5
- package/dist/forms/utils/index.d.ts.map +1 -1
- package/dist/forms/utils/index.js +1 -1
- package/dist/forms/utils/isFieldEditable.d.ts +0 -8
- package/dist/forms/utils/isFieldEditable.d.ts.map +1 -1
- package/dist/forms/utils/optionHelpers.d.ts +54 -0
- package/dist/forms/utils/optionHelpers.d.ts.map +1 -0
- package/dist/forms/utils/optionHelpers.js +1 -0
- package/dist/forms/utils/translateFieldLabel.d.ts +70 -0
- package/dist/forms/utils/translateFieldLabel.d.ts.map +1 -0
- package/dist/forms/utils/translateFieldLabel.js +1 -0
- package/dist/forms/utils/validateEntity.d.ts +5 -2
- package/dist/forms/utils/validateEntity.d.ts.map +1 -1
- package/dist/forms/utils/validateEntity.js +1 -1
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFileUpload.d.ts +67 -0
- package/dist/hooks/useFileUpload.d.ts.map +1 -0
- package/dist/hooks/useFileUpload.js +1 -0
- package/dist/index.d.ts +15 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/stores/FormStore.d.ts +78 -0
- package/dist/stores/FormStore.d.ts.map +1 -0
- package/dist/stores/FormStore.js +1 -0
- package/dist/stores/UploadStore.d.ts +105 -0
- package/dist/stores/UploadStore.d.ts.map +1 -0
- package/dist/stores/UploadStore.js +1 -0
- package/dist/stores/index.d.ts +11 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/useCrud.d.ts +32 -74
- package/dist/useCrud.d.ts.map +1 -1
- package/dist/useCrud.js +1 -1
- package/dist/useCrudCardList.d.ts +62 -0
- package/dist/useCrudCardList.d.ts.map +1 -0
- package/dist/useCrudCardList.js +1 -0
- package/dist/useCrudList.d.ts +61 -0
- package/dist/useCrudList.d.ts.map +1 -0
- package/dist/useCrudList.js +1 -0
- package/dist/utils/fileStorage.d.ts +58 -0
- package/dist/utils/fileStorage.d.ts.map +1 -0
- package/dist/utils/fileStorage.js +1 -0
- package/dist/utils/imageProcessing.d.ts +1 -1
- package/dist/utils/imageProcessing.d.ts.map +1 -1
- package/dist/utils/imageProcessing.js +1 -1
- package/dist/utils/imageStorage.d.ts +1 -10
- package/dist/utils/imageStorage.d.ts.map +1 -1
- package/dist/utils/imageStorage.js +1 -1
- package/dist/utils/mergeWithOptimistic.d.ts +27 -0
- package/dist/utils/mergeWithOptimistic.d.ts.map +1 -0
- package/dist/utils/mergeWithOptimistic.js +1 -0
- package/dist/utils/uploadValidation.d.ts +37 -0
- package/dist/utils/uploadValidation.d.ts.map +1 -0
- package/dist/utils/uploadValidation.js +1 -0
- package/package.json +22 -5
- package/dist/components/ControlledFields.d.ts +0 -49
- package/dist/components/ControlledFields.d.ts.map +0 -1
- package/dist/components/ControlledFields.js +0 -1
- package/dist/context/FormUploadContext.d.ts +0 -36
- package/dist/context/FormUploadContext.d.ts.map +0 -1
- package/dist/context/FormUploadContext.js +0 -1
- package/dist/context/index.d.ts +0 -2
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/index.js +0 -1
- package/dist/forms/utils/createEntitySchema.d.ts +0 -53
- package/dist/forms/utils/createEntitySchema.d.ts.map +0 -1
- package/dist/forms/utils/createEntitySchema.js +0 -1
- package/dist/forms/utils/normalizeToFieldConfig.d.ts +0 -47
- package/dist/forms/utils/normalizeToFieldConfig.d.ts.map +0 -1
- package/dist/forms/utils/normalizeToFieldConfig.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboboxComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/ComboboxComponent.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ComboboxComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/ComboboxComponent.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACpE,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,QAAA,MAAM,iBAAiB,EAAE,aAAa,CAAC,sBAAsB,CA6F5D,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* @fileoverview Currency Field Component
|
|
3
|
-
* @description Currency input with locale-aware formatting and currency symbol
|
|
4
|
-
*
|
|
5
|
-
* @version 0.0.1
|
|
6
|
-
* @since 0.0.1
|
|
7
|
-
* @author AMBROISE PARK Consulting
|
|
8
|
-
*/
|
|
9
|
-
import { type ChangeEvent, type ComponentType } from 'react';
|
|
1
|
+
import type { ChangeEvent, ComponentType } from 'react';
|
|
10
2
|
export interface CurrencyFieldComponentProps {
|
|
11
3
|
/** Field label */
|
|
12
4
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurrencyFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/CurrencyFieldComponent.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CurrencyFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/CurrencyFieldComponent.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,2BAA2B;IAC1C,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACzD,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,QAAA,MAAM,sBAAsB,EAAE,aAAa,CAAC,2BAA2B,CAyHtE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as n,jsxs as
|
|
1
|
+
import{jsx as n,jsxs as f}from"react/jsx-runtime";import{useState as N,useEffect as V,useId as j}from"react";import{Input as E,FloatingLabel as I,Stack as z}from"@donotdev/components";const L=({label:m,value:r,onChange:g,currency:a="EUR",locale:y,error:s,helperText:l,required:v=!1,disabled:i=!1,placeholder:h})=>{const c=j(),b=y||(typeof navigator<"u"?navigator.language:"en-US"),d=e=>e==null||isNaN(e)?"":(e/100).toFixed(2),x=e=>{if(!e||e.trim()==="")return null;const t=e.replace(/[^\d.,\-]/g,"").replace(",","."),o=parseFloat(t);return isNaN(o)?null:Math.round(o*100)},[S,u]=N(d(r));V(()=>{u(d(r))},[r]);const C=e=>{const t=e.target.value;u(t);const F={target:{value:x(t)}};g(F)},p=(()=>{try{return new Intl.NumberFormat(b,{style:"currency",currency:a,currencyDisplay:"symbol"}).formatToParts(0).find(e=>e.type==="currency")?.value||a}catch{return a}})();return f(z,{gap:"tight",children:[n(I,{htmlFor:c,label:m,disabled:i,required:v,children:f("div",{style:{position:"relative"},children:[n("span",{style:{position:"absolute",left:"var(--gap-md)",top:"50%",transform:"translateY(-50%)",color:"var(--muted-foreground)",pointerEvents:"none",zIndex:1},children:p}),n(E,{id:c,type:"text",inputMode:"decimal",value:S,onChange:C,disabled:i,placeholder:h||"0.00","data-variant":s?"destructive":void 0,style:{paddingLeft:`calc(var(--gap-md) + ${p.length*.6}em + var(--gap-sm))`}})]})}),l&&n("p",{style:{fontSize:"var(--font-size-xs)",color:s?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:l})]})};var k=L;export{k as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/DateFieldComponent.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oDAAoD;IACpD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7D,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,QAAA,MAAM,kBAAkB,EAAE,aAAa,CAAC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"DateFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/DateFieldComponent.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oDAAoD;IACpD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7D,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,QAAA,MAAM,kBAAkB,EAAE,aAAa,CAAC,uBAAuB,CAgE9D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as l,jsxs as S}from"react/jsx-runtime";import{Input as d,Stack as p}from"@donotdev/components";const m=({label:r,value:i,onChange:s,error:o,helperText:n,mode:e="date",required:g,...c})=>{const f=t=>{const u=t.target.value?new Date(t.target.value).toISOString():null;s(u)};let a="";if(i){const t=new Date(i);e==="date"?a=t.toISOString().split("T")[0]||"":e==="datetime-local"?a=t.toISOString().slice(0,16)||"":e==="month"?a=t.toISOString().slice(0,7):e==="time"?a=t.toISOString().slice(11,16):e==="week"&&(a=t.toISOString().split("T")[0]||"")}return S(p,{gap:"tight",children:[l(d,{label:r,type:e,value:a,onChange:f,required:g,className:"dndev-w-full",...c}),n&&l("p",{style:{fontSize:"var(--font-size-xs)",color:o?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:n})]})};var O=m;export{O as default};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { FileAsset } from '../../../utils/fileStorage';
|
|
2
|
+
export interface DocumentMetadata {
|
|
3
|
+
id: string;
|
|
4
|
+
file: File;
|
|
5
|
+
uploadProgress: number | null;
|
|
6
|
+
uploaded: FileAsset | null;
|
|
7
|
+
error: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface DocumentFieldComponentProps {
|
|
10
|
+
/** Field name (for upload registration) */
|
|
11
|
+
name?: string;
|
|
12
|
+
/** Field label */
|
|
13
|
+
label: string;
|
|
14
|
+
/** Current value - FileAsset for single, FileAsset[] for multiple */
|
|
15
|
+
value?: FileAsset | FileAsset[] | null;
|
|
16
|
+
/** Change handler */
|
|
17
|
+
onChange: (value: FileAsset | FileAsset[] | null) => void;
|
|
18
|
+
/** Error state */
|
|
19
|
+
error?: boolean;
|
|
20
|
+
/** Helper text */
|
|
21
|
+
helperText?: string;
|
|
22
|
+
/** Multiple files mode */
|
|
23
|
+
multiple?: boolean;
|
|
24
|
+
/** Maximum number of files (multiple mode only) */
|
|
25
|
+
maxFiles?: number;
|
|
26
|
+
/** Maximum file size in bytes (default: 25MB for documents) */
|
|
27
|
+
maxSize?: number;
|
|
28
|
+
/** Firebase Storage path (default: 'uploads/documents') */
|
|
29
|
+
storagePath?: string;
|
|
30
|
+
/** Whether the field is required */
|
|
31
|
+
required?: boolean;
|
|
32
|
+
/** Enable PDF preview */
|
|
33
|
+
enablePreview?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface DocumentFieldComponentRef {
|
|
36
|
+
/** Trigger upload of all pending documents */
|
|
37
|
+
upload: () => Promise<void>;
|
|
38
|
+
/** Get current documents metadata */
|
|
39
|
+
getDocuments: () => DocumentMetadata[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* DocumentFieldComponent - Document-specific upload with Firebase Storage
|
|
43
|
+
* Features: Restricted to document types, PDF preview, deferred upload
|
|
44
|
+
*/
|
|
45
|
+
declare const DocumentFieldComponent: import("react").ForwardRefExoticComponent<DocumentFieldComponentProps & import("react").RefAttributes<DocumentFieldComponentRef>>;
|
|
46
|
+
export default DocumentFieldComponent;
|
|
47
|
+
//# sourceMappingURL=DocumentFieldComponent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/DocumentFieldComponent.tsx"],"names":[],"mappings":"AAwDA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC;IACvC,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1D,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,qCAAqC;IACrC,YAAY,EAAE,MAAM,gBAAgB,EAAE,CAAC;CACxC;AA2CD;;;GAGG;AACH,QAAA,MAAM,sBAAsB,mIAmhB3B,CAAC;AAIF,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as n,jsxs as l,Fragment as ae}from"react/jsx-runtime";import{Upload as ie,X as se,FileText as P,FileSpreadsheet as le,File as de,Loader2 as ce,Eye as ue}from"lucide-react";import{useCallback as w,useState as M,useRef as F,useEffect as W,useImperativeHandle as pe,forwardRef as me}from"react";import{Button as G,BUTTON_VARIANT as V,Text as g,Stack as x,Progress as fe,Dialog as ge,DialogContent as ve,DialogHeader as he,DialogTitle as ye}from"@donotdev/components";import{handleError as D,useTranslation as we}from"@donotdev/core";import{useUploadContext as xe}from"../../../contexts/UploadContext";import{useUploadStore as Te}from"../../../stores/UploadStore";import{uploadFile as be,deleteFile as Pe,generateFileId as X,getFileIcon as Fe,formatFileSize as De,getDocumentAcceptString as Ne}from"../../../utils/fileStorage";function ke({type:f,className:c}){switch(f){case"pdf":return n(P,{className:c,style:{color:"var(--destructive)"}});case"doc":return n(P,{className:c,style:{color:"var(--primary)"}});case"xls":return n(le,{className:c,style:{color:"var(--success)"}});case"ppt":return n(P,{className:c,style:{color:"var(--warning)"}});case"text":case"html":return n(P,{className:c});default:return n(de,{className:c})}}const q=me(({name:f,label:c,value:v,onChange:N,error:k,helperText:R,multiple:p=!1,maxFiles:A=10,maxSize:C=25*1024*1024,storagePath:L="uploads/documents",required:K,enablePreview:H=!0},J)=>{const{t:Q}=we("dndev"),s=Q,h=xe(),I=Te(),O=!!h,[i,u]=M([]),[j,S]=M(!1),[U,_]=M(null),y=F(null),z=F(!1),T=F(void 0),Y=Ne(),b=w(e=>{const r=e.filter(t=>t.uploaded&&!t.error).map(t=>t.uploaded);N(p?r:r[0]||null)},[p,N]);W(()=>{if(z.current){z.current=!1;return}if(v){const e=[];(Array.isArray(v)?v:[v]).forEach(t=>{t.url&&e.push({id:X(),file:new File([],t.filename),uploadProgress:null,uploaded:t,error:null})}),u(e)}else u([])},[v]);const Z=w(async()=>{const e=i.filter(r=>!r.uploaded&&!r.error&&r.uploadProgress===null);if(e.length!==0){u(r=>r.map(t=>e.some(a=>a.id===t.id)?{...t,uploadProgress:0}:t));for(const r of e)try{const t=await be(r.file,{storagePath:L,onProgress:a=>{u(o=>o.map(d=>d.id===r.id?{...d,uploadProgress:a.progress}:d))}});u(a=>{const o=a.map(d=>d.id===r.id?{...d,uploaded:t,uploadProgress:100,error:null}:d);return queueMicrotask(()=>b(o)),o})}catch{u(a=>a.map(o=>o.id===r.id?{...o,error:"Upload failed",uploadProgress:null}:o))}}},[i,L,b]);T.current=Z,W(()=>{if(!(!h||!f))return I.registerUpload(h,f,async e=>{await T.current?.()}),()=>{I.unregisterUpload(h,f)}},[h,f,I]),pe(J,()=>({upload:async()=>{await T.current?.()},getDocuments:()=>B.current||[]}),[]);const B=F(i);B.current=i;const $=e=>{const r=[".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".txt",".md",".html",".csv"],t="."+e.name.split(".").pop()?.toLowerCase();return r.includes(t)},E=w(e=>{const t=(p?A:1)-i.length;if(t<=0){D(new Error("Maximum documents reached"),{userMessage:s("document.errors.maxFiles",{max:A}),severity:"warning",showNotification:!0});return}const a=e.slice(0,t),o=[],d=(C/(1024*1024)).toFixed(0);for(const m of a){if(!$(m)){D(new Error("Invalid document type"),{userMessage:s("document.errors.invalidType",{fileName:m.name}),severity:"warning",showNotification:!0});continue}if(m.size>C){D(new Error("Document too large"),{userMessage:s("document.errors.exceedsSize",{fileName:m.name,size:d}),severity:"warning",showNotification:!0});continue}o.push({id:X(),file:m,uploadProgress:null,uploaded:null,error:null})}o.length!==0&&(u(m=>p?[...m,...o]:o),O||setTimeout(()=>T.current?.(),0))},[i,p,A,C,s,O]),ee=e=>{const r=Array.from(e.target.files||[]);r.length>0&&E(r),y.current&&(y.current.value="")},re=w(e=>{e.preventDefault(),S(!1);const r=Array.from(e.dataTransfer.files);E(r)},[E]),te=w(async e=>{const r=i[e];if(r)try{r.uploaded&&await Pe(r.uploaded);const t=i.filter((a,o)=>o!==e);z.current=!0,u(t),setTimeout(()=>b(t),0)}catch(t){D(t,{userMessage:s("document.delete.failed"),severity:"error",showNotification:!0})}},[i,b,s]),ne=e=>{e.uploaded?.url&&e.uploaded.mimeType==="application/pdf"&&_(e.uploaded.url)},oe=p||i.length===0;return l(ae,{children:[l(x,{gap:"tight",children:[l(g,{level:"body",align:"start",children:[c,K?"*":""]}),oe&&l("div",{role:"button",tabIndex:0,"aria-label":s("document.upload.ariaLabel"),className:"dndev-surface","data-variant":k?"destructive":"default",style:{border:"var(--border-width) dashed",borderColor:j?"var(--primary)":k?"var(--destructive)":"var(--border)",borderRadius:"var(--radius-lg)",padding:"var(--gap-lg)",backgroundColor:j?"color-mix(in oklab, var(--primary) 5%, transparent)":"var(--surface)",transition:"border-color var(--dur-fast), background-color var(--dur-fast)",cursor:"pointer",outline:"none"},onDragOver:e=>{e.preventDefault(),S(!0)},onDragLeave:()=>S(!1),onDrop:re,onClick:()=>y.current?.click(),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),y.current?.click())},children:[n("input",{ref:y,type:"file",accept:Y,multiple:p,style:{display:"none"},onChange:ee}),l(x,{align:"center",justify:"center",gap:"medium",children:[n(ie,{className:"dndev-size-lg",style:{color:"var(--muted-foreground)"}}),n(g,{as:"p",variant:"muted",level:"small",align:"center",children:s("document.upload.hint")}),n(g,{as:"p",variant:"muted",level:"caption",align:"center",children:"PDF, Word, Excel, PowerPoint, TXT, Markdown, HTML"})]})]}),i.length>0&&n(x,{gap:"tight",children:i.map((e,r)=>{const t=Fe(e.uploaded?.mimeType||e.file.type,e.file.name),a=e.uploadProgress!==null&&e.uploadProgress<100,o=e.uploaded?.mimeType==="application/pdf"||e.file.name.toLowerCase().endsWith(".pdf");return l("div",{className:"dndev-surface","data-variant":"muted",style:{padding:"var(--gap-md)",borderRadius:"var(--radius-md)",display:"flex",alignItems:"center",gap:"var(--gap-md)"},children:[n(ke,{type:t,className:"dndev-size-md"}),l(x,{gap:"none",style:{flex:1,minWidth:0},children:[n(g,{level:"small",style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.file.name}),l(g,{level:"caption",variant:"muted",children:[De(e.uploaded?.size||e.file.size),e.error&&l("span",{style:{color:"var(--destructive)"},children:[" ","\xB7 ",e.error]})]}),a&&n(fe,{value:e.uploadProgress||0,max:100,style:{marginTop:"var(--gap-xs)"}})]}),l(x,{direction:"row",gap:"tight",children:[H&&o&&e.uploaded&&n(G,{variant:V.GHOST,onClick:()=>ne(e),"aria-label":s("document.preview.ariaLabel"),children:n(ue,{className:"dndev-size-sm"})}),a?n(ce,{className:"dndev-size-sm",style:{animation:"spin 1s linear infinite"}}):n(G,{variant:V.GHOST,onClick:()=>te(r),"aria-label":s("document.delete.ariaLabel"),children:n(se,{className:"dndev-size-sm"})})]})]},e.id)})}),R&&n(g,{level:"caption",variant:k?"destructive":"muted",style:{marginTop:"var(--gap-xs)"},children:R})]}),H&&U&&n(ge,{open:!!U,onOpenChange:()=>_(null),children:l(ve,{style:{maxWidth:"90vw",maxHeight:"90vh",width:"900px",height:"80vh"},children:[n(he,{children:n(ye,{children:s("document.preview.title")})}),n("iframe",{src:U,style:{width:"100%",height:"100%",border:"none",borderRadius:"var(--radius-md)"},title:"PDF Preview"})]})})]})});q.displayName="DocumentFieldComponent";var Re=q;export{Re as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/DropdownComponent.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,wBAAwB;IACxB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACpE,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,iBAAiB,EAAE,aAAa,CAAC,sBAAsB,
|
|
1
|
+
{"version":3,"file":"DropdownComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/DropdownComponent.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,wBAAwB;IACxB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACpE,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,iBAAiB,EAAE,aAAa,CAAC,sBAAsB,CAuD5D,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as o,jsxs as p}from"react/jsx-runtime";import{Select as g,Stack as m}from"@donotdev/components";import{useTranslation as
|
|
1
|
+
import{jsx as o,jsxs as p}from"react/jsx-runtime";import{Select as g,Stack as m}from"@donotdev/components";import{useTranslation as f}from"@donotdev/core";const h=({label:r,value:n,options:s,error:l,helperText:t,onChange:a,onBlur:i,required:c})=>{const{t:d}=f("dndev"),u=n!=null?String(n):"";return p(m,{gap:"tight",children:[o(g,{label:r,value:u,onValueChange:e=>{a&&a({target:{value:e}})},onOpenChange:e=>!e&&i?.(),placeholder:d("actions.select","Select"),required:c,options:s.map(e=>({value:String(e.value),label:e.label}))}),t&&o("p",{style:{fontSize:"var(--font-size-xs)",color:l?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:t})]})};var C=h;export{C as default};
|
|
@@ -1,31 +1,47 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { FileAsset } from '../../../utils/fileStorage';
|
|
2
|
+
export interface FileMetadata {
|
|
3
|
+
id: string;
|
|
4
|
+
file: File;
|
|
5
|
+
uploadProgress: number | null;
|
|
6
|
+
uploaded: FileAsset | null;
|
|
7
|
+
error: string | null;
|
|
8
|
+
}
|
|
2
9
|
export interface FileFieldComponentProps {
|
|
10
|
+
/** Field name (for upload registration) */
|
|
11
|
+
name?: string;
|
|
3
12
|
/** Field label */
|
|
4
13
|
label: string;
|
|
5
|
-
/** Current
|
|
6
|
-
value?:
|
|
7
|
-
/** Change handler
|
|
8
|
-
onChange: (
|
|
14
|
+
/** Current value - FileAsset for single, FileAsset[] for multiple */
|
|
15
|
+
value?: FileAsset | FileAsset[] | null;
|
|
16
|
+
/** Change handler */
|
|
17
|
+
onChange: (value: FileAsset | FileAsset[] | null) => void;
|
|
9
18
|
/** Error state */
|
|
10
19
|
error?: boolean;
|
|
11
20
|
/** Helper text */
|
|
12
21
|
helperText?: string;
|
|
13
|
-
/**
|
|
22
|
+
/** Accept attribute for file input (MIME types or extensions) */
|
|
14
23
|
accept?: string;
|
|
15
|
-
/**
|
|
16
|
-
maxSize?: number;
|
|
17
|
-
/** Whether multiple files are allowed */
|
|
24
|
+
/** Multiple files mode */
|
|
18
25
|
multiple?: boolean;
|
|
26
|
+
/** Maximum number of files (multiple mode only) */
|
|
27
|
+
maxFiles?: number;
|
|
28
|
+
/** Maximum file size in bytes (default: 50MB) */
|
|
29
|
+
maxSize?: number;
|
|
30
|
+
/** Firebase Storage path (default: 'uploads/files') */
|
|
31
|
+
storagePath?: string;
|
|
19
32
|
/** Whether the field is required */
|
|
20
33
|
required?: boolean;
|
|
21
34
|
}
|
|
35
|
+
export interface FileFieldComponentRef {
|
|
36
|
+
/** Trigger upload of all pending files */
|
|
37
|
+
upload: () => Promise<void>;
|
|
38
|
+
/** Get current files metadata */
|
|
39
|
+
getFiles: () => FileMetadata[];
|
|
40
|
+
}
|
|
22
41
|
/**
|
|
23
|
-
* FileFieldComponent
|
|
24
|
-
*
|
|
25
|
-
* @version 0.0.1
|
|
26
|
-
* @since 0.0.1
|
|
27
|
-
* @author AMBROISE PARK Consulting
|
|
42
|
+
* FileFieldComponent - Generic file upload with Firebase Storage
|
|
43
|
+
* Features: Deferred upload, progress indicator, multiple files, drag-and-drop
|
|
28
44
|
*/
|
|
29
|
-
declare const FileFieldComponent:
|
|
45
|
+
declare const FileFieldComponent: import("react").ForwardRefExoticComponent<FileFieldComponentProps & import("react").RefAttributes<FileFieldComponentRef>>;
|
|
30
46
|
export default FileFieldComponent;
|
|
31
47
|
//# sourceMappingURL=FileFieldComponent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/FileFieldComponent.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FileFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/FileFieldComponent.tsx"],"names":[],"mappings":"AAwDA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC;IACvC,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1D,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,iCAAiC;IACjC,QAAQ,EAAE,MAAM,YAAY,EAAE,CAAC;CAChC;AAmDD;;;GAGG;AACH,QAAA,MAAM,kBAAkB,2HAgcvB,CAAC;AAIF,eAAe,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as s,jsxs as p}from"react/jsx-runtime";import{Upload as Z,X as $,File as ee,Loader2 as re,FileText as C,FileSpreadsheet as oe,FileImage as se,FileVideo as ae,FileAudio as te,FileArchive as le,FileCode as ne}from"lucide-react";import{useCallback as y,useState as O,useRef as b,useEffect as _,useImperativeHandle as ie,forwardRef as de}from"react";import{Button as ue,BUTTON_VARIANT as ce,Text as F,Stack as P,Progress as pe}from"@donotdev/components";import{handleError as M,useTranslation as fe}from"@donotdev/core";import{useUploadContext as ge}from"../../../contexts/UploadContext";import{useUploadStore as me}from"../../../stores/UploadStore";import{uploadFile as ve,deleteFile as he,generateFileId as H,getFileIcon as ye,formatFileSize as Fe}from"../../../utils/fileStorage";function we({type:f,className:n}){switch(f){case"pdf":return s(C,{className:n,style:{color:"var(--destructive)"}});case"doc":return s(C,{className:n,style:{color:"var(--primary)"}});case"xls":return s(oe,{className:n,style:{color:"var(--success)"}});case"ppt":return s(C,{className:n,style:{color:"var(--warning)"}});case"image":return s(se,{className:n});case"video":return s(ae,{className:n});case"audio":return s(te,{className:n});case"archive":return s(le,{className:n});case"html":case"text":return s(ne,{className:n});default:return s(ee,{className:n})}}const D=de(({name:f,label:n,value:g,onChange:T,error:A,helperText:R,accept:V,multiple:d=!1,maxFiles:N=10,maxSize:k=50*1024*1024,storagePath:E="uploads/files",required:q},G)=>{const{t:K}=fe("dndev"),i=K,m=ge(),I=me(),j=!!m,[t,c]=O([]),[L,U]=O(!1),v=b(null),S=b(!1),w=b(void 0),x=y(e=>{const r=e.filter(o=>o.uploaded&&!o.error).map(o=>o.uploaded);T(d?r:r[0]||null)},[d,T]);_(()=>{if(S.current){S.current=!1;return}if(g){const e=[];(Array.isArray(g)?g:[g]).forEach(o=>{o.url&&e.push({id:H(),file:new File([],o.filename),uploadProgress:null,uploaded:o,error:null})}),c(e)}else c([])},[g]);const W=y(async()=>{const e=t.filter(r=>!r.uploaded&&!r.error&&r.uploadProgress===null);if(e.length!==0){c(r=>r.map(o=>e.some(l=>l.id===o.id)?{...o,uploadProgress:0}:o));for(const r of e)try{const o=await ve(r.file,{storagePath:E,onProgress:l=>{c(a=>a.map(u=>u.id===r.id?{...u,uploadProgress:l.progress}:u))}});c(l=>{const a=l.map(u=>u.id===r.id?{...u,uploaded:o,uploadProgress:100,error:null}:u);return queueMicrotask(()=>x(a)),a})}catch{c(l=>l.map(a=>a.id===r.id?{...a,error:"Upload failed",uploadProgress:null}:a))}}},[t,E,x]);w.current=W,_(()=>{if(!(!m||!f))return I.registerUpload(m,f,async e=>{await w.current?.()}),()=>{I.unregisterUpload(m,f)}},[m,f,I]),ie(G,()=>({upload:async()=>{await w.current?.()},getFiles:()=>B.current||[]}),[]);const B=b(t);B.current=t;const z=y(e=>{const o=(d?N:1)-t.length;if(o<=0){M(new Error("Maximum files reached"),{userMessage:i("file.errors.maxFiles",{max:N}),severity:"warning",showNotification:!0});return}const l=e.slice(0,o),a=[],u=(k/(1024*1024)).toFixed(0);for(const h of l){if(h.size>k){M(new Error("File too large"),{userMessage:i("file.errors.exceedsSize",{fileName:h.name,size:u}),severity:"warning",showNotification:!0});continue}a.push({id:H(),file:h,uploadProgress:null,uploaded:null,error:null})}a.length!==0&&(c(h=>d?[...h,...a]:a),j||setTimeout(()=>w.current?.(),0))},[t,d,N,k,i,j]),X=e=>{const r=Array.from(e.target.files||[]);r.length>0&&z(r),v.current&&(v.current.value="")},J=y(e=>{e.preventDefault(),U(!1);const r=Array.from(e.dataTransfer.files);z(r)},[z]),Q=y(async e=>{const r=t[e];if(r)try{r.uploaded&&await he(r.uploaded);const o=t.filter((l,a)=>a!==e);S.current=!0,c(o),setTimeout(()=>x(o),0)}catch(o){M(o,{userMessage:i("file.delete.failed"),severity:"error",showNotification:!0})}},[t,x,i]),Y=d||t.length===0,xe=t.some(e=>!e.uploaded&&!e.error&&e.uploadProgress===null);return p(P,{gap:"tight",children:[p(F,{level:"body",align:"start",children:[n,q?"*":""]}),Y&&p("div",{role:"button",tabIndex:0,"aria-label":i(d?"file.upload.ariaLabelMultiple":"file.upload.ariaLabelSingle"),className:"dndev-surface","data-variant":A?"destructive":"default",style:{border:"var(--border-width) dashed",borderColor:L?"var(--primary)":A?"var(--destructive)":"var(--border)",borderRadius:"var(--radius-lg)",padding:"var(--gap-lg)",backgroundColor:L?"color-mix(in oklab, var(--primary) 5%, transparent)":"var(--surface)",transition:"border-color var(--dur-fast), background-color var(--dur-fast)",cursor:"pointer",outline:"none"},onDragOver:e=>{e.preventDefault(),U(!0)},onDragLeave:()=>U(!1),onDrop:J,onClick:()=>v.current?.click(),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),v.current?.click())},children:[s("input",{ref:v,type:"file",accept:V,multiple:d,style:{display:"none"},onChange:X}),p(P,{align:"center",justify:"center",gap:"medium",children:[s(Z,{className:"dndev-size-lg",style:{color:"var(--muted-foreground)"}}),s(F,{as:"p",variant:"muted",level:"small",align:"center",children:i(d?"file.upload.dragDropMultiple":"file.upload.dragDropSingle")})]})]}),t.length>0&&s(P,{gap:"tight",children:t.map((e,r)=>{const o=ye(e.uploaded?.mimeType||e.file.type,e.file.name),l=e.uploadProgress!==null&&e.uploadProgress<100,a=e.uploaded&&!e.error;return p("div",{className:"dndev-surface","data-variant":"muted",style:{padding:"var(--gap-md)",borderRadius:"var(--radius-md)",display:"flex",alignItems:"center",gap:"var(--gap-md)"},children:[s(we,{type:o,className:"dndev-size-md"}),p(P,{gap:"none",style:{flex:1,minWidth:0},children:[s(F,{level:"small",style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.file.name}),p(F,{level:"caption",variant:"muted",children:[Fe(e.uploaded?.size||e.file.size),e.error&&p("span",{style:{color:"var(--destructive)"},children:[" ","\xB7 ",e.error]})]}),l&&s(pe,{value:e.uploadProgress||0,max:100,style:{marginTop:"var(--gap-xs)"}})]}),l?s(re,{className:"dndev-size-sm",style:{animation:"spin 1s linear infinite"}}):s(ue,{variant:ce.GHOST,onClick:()=>Q(r),"aria-label":i("file.delete.ariaLabel"),children:s($,{className:"dndev-size-sm"})})]},e.id)})}),R&&s(F,{level:"caption",variant:A?"destructive":"muted",style:{marginTop:"var(--gap-xs)"},children:R})]})});D.displayName="FileFieldComponent";var ze=D;export{ze as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeoPointFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/GeoPointFieldComponent.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,2BAA2B;IAC1C,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpE,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,QAAA,MAAM,sBAAsB,EAAE,aAAa,CAAC,2BAA2B,
|
|
1
|
+
{"version":3,"file":"GeoPointFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/GeoPointFieldComponent.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,2BAA2B;IAC1C,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpE,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,QAAA,MAAM,sBAAsB,EAAE,aAAa,CAAC,2BAA2B,CAsFtE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as n,jsxs as c}from"react/jsx-runtime";import{Label as h,Input as g,Stack as u}from"@donotdev/components";const y=({label:m,value:e={lat:0,lng:0},onChange:l,error:a,helperText:r,disabled:d,required:f})=>{const v=i=>{const t=parseFloat(i.target.value)||0;if(t>=-90&&t<=90){const s={...e,lat:t},o={target:{value:JSON.stringify(s)}};l(o)}},p=i=>{const t=parseFloat(i.target.value)||0;if(t>=-180&&t<=180){const s={...e,lng:t},o={target:{value:JSON.stringify(s)}};l(o)}};return c(u,{gap:"tight",children:[n(h,{required:f,style:{display:"block",fontSize:"var(--font-size-sm)",fontWeight:500},children:m}),c(u,{direction:"row",gap:"medium",children:[n(g,{label:"Latitude",type:"number",value:e.lat,onChange:v,min:"-90",max:"90",step:"0.000001",disabled:d,"data-variant":a?"destructive":void 0,className:"dndev-w-full"}),n(g,{label:"Longitude",type:"number",value:e.lng,onChange:p,min:"-180",max:"180",step:"0.000001",disabled:d,"data-variant":a?"destructive":void 0,className:"dndev-w-full"})]}),r&&n("p",{style:{fontSize:"var(--font-size-xs)",color:a?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:r})]})};var L=y;export{L as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HiddenFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/HiddenFieldComponent.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"HiddenFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/HiddenFieldComponent.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,QAAA,MAAM,oBAAoB,EAAE,aAAa,CAAC,yBAAyB,CAKlE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as t}from"react/jsx-runtime";const d=({name:e,value:n})=>t("input",{type:"hidden",name:e,value:n});var i=d;export{i as default};
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { type ComponentType } from 'react';
|
|
2
1
|
import type { Picture } from '@donotdev/types';
|
|
3
|
-
import { type ImageMetadata } from '../../../utils/imageUtils';
|
|
4
2
|
export interface ImageFieldComponentProps {
|
|
5
3
|
/** Field name (for upload registration) */
|
|
6
4
|
name?: string;
|
|
@@ -18,25 +16,21 @@ export interface ImageFieldComponentProps {
|
|
|
18
16
|
multiple?: boolean;
|
|
19
17
|
/** Maximum number of images (multiple mode only) */
|
|
20
18
|
maxFiles?: number;
|
|
21
|
-
/** Maximum file size in bytes
|
|
19
|
+
/** Maximum file size in bytes (default: 10MB) */
|
|
22
20
|
maxSize?: number;
|
|
23
21
|
/** Firebase Storage path (default: 'uploads/images') */
|
|
24
22
|
storagePath?: string;
|
|
25
|
-
/** Entity ID for hash deduplication scope (same entity only) */
|
|
26
|
-
entityId?: string;
|
|
27
23
|
/** Whether the field is required */
|
|
28
24
|
required?: boolean;
|
|
29
|
-
/** Translation function */
|
|
30
|
-
t?: (key: string, options?: Record<string, any>) => string;
|
|
31
25
|
}
|
|
32
26
|
export interface ImageFieldComponentRef {
|
|
33
|
-
/** Trigger upload of all pending images */
|
|
34
27
|
upload: () => Promise<void>;
|
|
35
|
-
|
|
36
|
-
getImages: () => ImageMetadata[];
|
|
28
|
+
focus: () => void;
|
|
37
29
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
30
|
+
/**
|
|
31
|
+
* ImageFieldComponent - Image upload with deferred uploads via useFileUpload hook
|
|
32
|
+
* Gets formId from UploadContext - no prop drilling needed
|
|
33
|
+
*/
|
|
34
|
+
declare const ImageFieldComponent: import("react").ForwardRefExoticComponent<ImageFieldComponentProps & import("react").RefAttributes<ImageFieldComponentRef>>;
|
|
35
|
+
export default ImageFieldComponent;
|
|
42
36
|
//# sourceMappingURL=ImageFieldComponent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/ImageFieldComponent.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ImageFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/ImageFieldComponent.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAW/C,MAAM,WAAW,wBAAwB;IACvC,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;IACnC,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACtD,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;GAGG;AACH,QAAA,MAAM,mBAAmB,6HAsMvB,CAAC;AAIH,eAAe,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsxs as f,jsx as l,Fragment as Me}from"react/jsx-runtime";import{Upload as ze,X as ne,Loader2 as Ae,GripVertical as Fe,Undo2 as Te,Redo2 as Ce}from"lucide-react";import{useCallback as m,useState as y,useRef as k,useEffect as F,useImperativeHandle as xe,forwardRef as Ee}from"react";import{Button as ie,BUTTON_VARIANT as se,Text as b,Stack as I,Progress as Se}from"@donotdev/components";import{ImageViewerDialog as je}from"../internal/ImageViewerDialog";import{handleError as D,useTranslation as Oe}from"@donotdev/core";import{useFormUpload as $e}from"../../../context/FormUploadContext";import{processImage as We}from"../../../utils/imageProcessing";import{uploadImage as Be,deleteImage as He}from"../../../utils/imageStorage";import{generateFileHash as Ke,createPreviewURL as le,revokePreviewURL as G,rotateImage90 as _e,UndoRedoManager as Ve,findDuplicatesByHash as Ge,generateImageId as de}from"../../../utils/imageUtils";const ce=Ee(({name:T,label:L,value:P,onChange:j,error:O,helperText:X,multiple:d=!1,maxFiles:C=10,maxSize:N=10*1024*1024,storagePath:q="uploads/images",entityId:Xe,required:ue,t:pe},ge)=>{const{t:fe}=Oe("dndev"),o=pe||fe,x=$e(),[s,u]=y([]),[J,$]=y(!1),[M,Q]=y(null),[R,Y]=y(null),[Z,ee]=y(null),[me,re]=y(null),[ve,W]=y(!1),[he,B]=y(0),ae=k(null),z=k(null),h=k(new Ve),E=k(new Map),H=k(!1),v=m(e=>{const r=e.filter(a=>a.uploaded&&!a.error).map(a=>a.uploaded);j(d?r:r[0]||null)},[d,j]),ye=m((e,r)=>{u(a=>{const t=[...a];return t[e]&&(t[e]={...t[e],...r},setTimeout(()=>v(t),0)),t})},[v]);F(()=>{if(H.current){H.current=!1;return}if(P){const e=[];(Array.isArray(P)?P:[P]).forEach(a=>{a.fullUrl&&e.push({id:de(),file:new File([],"existing"),previewURL:a.thumbUrl||a.fullUrl,hash:"",rotation:0,uploadProgress:null,uploaded:a,error:null})}),u(e)}else u([])},[P]);const K=k(new Set);F(()=>{K.current.clear(),s.forEach(e=>{e.previewURL.startsWith("blob:")&&K.current.add(e.previewURL)})},[s]),F(()=>()=>{K.current.forEach(e=>{G(e)})},[]),xe(ge,()=>({upload:async()=>{await _()},getImages:()=>s}),[s]);const _=m(async()=>{const e=s.filter(t=>!t.uploaded&&!t.error&&t.uploadProgress===null);if(e.length===0)return;u(t=>t.map(i=>e.some(n=>n.id===i.id)?{...i,uploadProgress:0}:i));const r=e.map(async t=>{try{const{fullBlob:i,thumbBlob:n}=await We(t.file),p=await Be(i,n,t.file.name,{storagePath:q,onProgress:w=>{u(c=>c.map(g=>g.id===t.id?{...g,uploadProgress:w.progress}:g))}});return{id:t.id,picture:p,error:null}}catch(i){return D(i,{userMessage:o("image.upload.failed",{fileName:t.file.name}),severity:"error",context:{fileName:t.file.name,fileSize:t.file.size}}),{id:t.id,picture:null,error:"Upload failed"}}}),a=await Promise.all(r);u(t=>{const i=t.map(n=>{const p=a.find(w=>w.id===n.id);return p?{...n,uploaded:p.picture,uploadProgress:p.picture?100:null,error:p.error}:n});return setTimeout(()=>v(i),0),i})},[s,q,v]);F(()=>{if(!(!x||!T))return x.registerUpload(T,_),()=>{x.unregisterUpload(T)}},[x,T,_]);const A=m(async e=>{const a=(d?C:1)-s.length;if(a<=0){const c=d?o("image.errors.maxFiles",{max:C}):o("image.errors.singleOnly");D(new Error(c),{userMessage:c,severity:"warning",showNotification:!0});return}const t=e.slice(0,a),i=[],n=(N/(1024*1024)).toFixed(0);for(const c of t){if(!c.type.startsWith("image/")){const g=o("image.errors.notImage",{fileName:c.name});D(new Error(g),{userMessage:g,severity:"warning",showNotification:!0});continue}if(c.size>N){const g=o("image.errors.exceedsSize",{fileName:c.name,size:n});D(new Error(g),{userMessage:g,severity:"warning",showNotification:!0});continue}i.push(c)}if(i.length===0)return;const p=[],w=[];for(const c of i){const g=await Ke(c);if(Ge(s,g).length>0){w.push(c.name);continue}const Ne=le(c);p.push({id:de(),file:c,previewURL:Ne,hash:g,rotation:0,uploadProgress:null,uploaded:null,error:null})}w.length>0&&(ee(o("image.warnings.duplicates",{files:w.join(", ")})),setTimeout(()=>ee(null),5e3)),p.length!==0&&(h.current.push({type:"add",images:p}),u(c=>d?[...c,...p]:p))},[s,d,C,N,o]),be=e=>{const r=Array.from(e.target.files||[]);r.length>0&&A(r),z.current&&(z.current.value="")},we=m(e=>{e.preventDefault(),$(!1);const r=Array.from(e.dataTransfer.files);A(r)},[A]),V=m(e=>{const r=e.clipboardData?.items;if(!r)return;const a=[];for(let t=0;t<r.length;t++){const i=r[t];if(i&&i.type.startsWith("image/")){const n=i.getAsFile();n&&a.push(n)}}a.length>0&&A(a)},[A]);F(()=>{const e=ae.current;if(e)return e.addEventListener("paste",V),()=>e.removeEventListener("paste",V)},[V]);const S=m(async e=>{const r=s[e];if(r){h.current.push({type:"remove",indices:[e]});try{r.uploaded&&r.uploaded.fullUrl&&await He(r.uploaded),r.previewURL.startsWith("blob:")&&G(r.previewURL);const a=s.filter((t,i)=>i!==e);H.current=!0,u(a),setTimeout(()=>{v(a)},0)}catch(a){D(a,{userMessage:o("image.delete.failed"),severity:"error",showNotification:!0,context:{imageId:r.id}})}}},[s,v,o]),U=m(async e=>{const r=s[e];if(r)try{const a=await _e(r.file),t=le(a);r.previewURL.startsWith("blob:")&&G(r.previewURL),h.current.push({type:"rotate",index:e}),u(i=>{const n=[...i];return n[e]={...r,file:a,previewURL:t,rotation:(r.rotation+1)%4},n})}catch(a){D(a,{userMessage:o("image.rotate.failed"),severity:"error",showNotification:!0,context:{imageId:r.id,fileName:r.file.name}})}},[s,o]),Ie=e=>{d&&Y(e)},Re=(e,r)=>{d&&(e.preventDefault(),Q(r))},Ue=()=>{R!==null&&M!==null&&R!==M&&(h.current.push({type:"reorder",from:R,to:M}),u(e=>{const r=[...e],a=r[R];return a?(r.splice(R,1),r.splice(M,0,a),setTimeout(()=>v(r),0),r):e})),Y(null),Q(null)},ke=m(()=>{const e=h.current.undo();e&&(e.type==="add"?u(r=>{const a=new Set(e.images.map(i=>i.id)),t=r.filter(i=>!a.has(i.id));return setTimeout(()=>v(t),0),t}):e.type==="remove"||(e.type==="reorder"?u(r=>{const a=[...r],t=a[e.to];return t&&(a.splice(e.to,1),a.splice(e.from,0,t),setTimeout(()=>v(a),0)),a}):e.type==="rotate"&&(U(e.index),U(e.index),U(e.index))))},[v,U]),De=m(()=>{h.current.redo()},[]),Le=m((e,r)=>{switch(e.key){case"Delete":case"Backspace":e.preventDefault(),S(r);break;case"r":case"R":(e.ctrlKey||e.metaKey)&&(e.preventDefault(),U(r));break;case"ArrowLeft":if(d&&r>0){e.preventDefault();const a=s[r-1];a?.id&&E.current.get(a.id)?.focus()}break;case"ArrowRight":if(d&&r<s.length-1){e.preventDefault();const a=s[r+1];a?.id&&E.current.get(a.id)?.focus()}break}},[s,d,S,U]),Pe=d||s.length===0,qe=s.some(e=>!e.uploaded&&!e.error&&e.uploadProgress===null),te=h.current.canUndo(),oe=h.current.canRedo();return f(I,{gap:"tight",children:[f(I,{direction:"row",justify:"between",align:"center",children:[f(b,{level:"body",align:"start",children:[L,ue?"*":""]}),(te||oe)&&f(I,{direction:"row",children:[l(ie,{variant:se.GHOST,onClick:ke,disabled:!te,"aria-label":o("image.undo.ariaLabel"),title:o("image.undo.title"),children:l(Te,{className:"dndev-size-sm"})}),l(ie,{variant:se.GHOST,onClick:De,disabled:!oe,"aria-label":o("image.redo.ariaLabel"),title:o("image.redo.title"),children:l(Ce,{className:"dndev-size-sm"})})]})]}),Z&&l(b,{as:"div",role:"alert","aria-live":"polite",variant:"warning",level:"small",style:{padding:"var(--gap-sm)",borderRadius:"var(--radius-md)"},children:Z}),Pe&&f("div",{ref:ae,role:"button",tabIndex:0,"aria-label":o(d?"image.upload.ariaLabelMultiple":"image.upload.ariaLabelSingle"),"aria-describedby":`image-field-helper-${L}`,className:"dndev-surface","data-variant":O?"destructive":"default",style:{border:"var(--border-width) dashed",borderColor:J?"var(--primary)":O?"var(--destructive)":"var(--border)",borderRadius:"var(--radius-lg)",padding:"var(--gap-lg)",backgroundColor:J?"color-mix(in oklab, var(--primary) 5%, transparent)":"var(--surface)",transition:"border-color var(--dur-fast), background-color var(--dur-fast)",cursor:"pointer",outline:"none"},onDragOver:e=>{e.preventDefault(),$(!0)},onDragLeave:()=>$(!1),onDrop:we,onClick:()=>z.current?.click(),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),z.current?.click())},children:[l("input",{id:`image-field-${L}`,ref:z,type:"file",accept:"image/*",multiple:d,style:{display:"none"},onChange:be,"aria-label":o(d?"image.upload.selectAriaLabelMultiple":"image.upload.selectAriaLabelSingle")}),f(I,{align:"center",justify:"center",gap:"medium",children:[l(ze,{className:"dndev-size-lg",style:{color:"var(--muted-foreground)"},"aria-hidden":"true"}),f(b,{as:"p",variant:"muted",level:"small",align:"center",children:[o(d?"image.upload.dropzoneMultiple":"image.upload.dropzoneSingle"),l("br",{}),l(b,{as:"span",variant:"muted",level:"small",children:d?o("image.upload.maxFiles",{max:C,size:(N/(1024*1024)).toFixed(0)}):o("image.upload.maxSize",{size:(N/(1024*1024)).toFixed(0)})})]})]})]}),s.length>0&&l("div",{role:"list","aria-label":d?o("image.upload.uploadedMultiple",{count:s.length}):o("image.upload.uploadedSingle",{count:s.length}),style:{display:"flex",flexWrap:"wrap",gap:"var(--gap-md)"},children:s.map((e,r)=>{const a=e.uploadProgress!==null&&e.uploadProgress<100,t=e.uploaded!==null,i=!!e.previewURL;return l("div",{ref:n=>{n?E.current.set(e.id,n):E.current.delete(e.id)},role:"listitem",tabIndex:0,draggable:!a&&d,onDragStart:()=>Ie(r),onDragOver:n=>Re(n,r),onDragEnd:Ue,onKeyDown:n=>{(n.key==="Enter"||n.key===" ")&&(n.preventDefault(),B(r),W(!0)),Le(n,r)},onFocus:()=>re(r),onBlur:()=>re(null),onClick:()=>{B(r),W(!0)},"aria-label":`Image ${r+1}${e.uploaded?" (uploaded)":" (pending upload)"}`,style:{position:"relative",width:"calc(var(--touch-target) * 2.5)",height:"calc(var(--touch-target) * 2.5)",borderRadius:"var(--radius-md)",border:M===r?"var(--border-width) solid var(--primary)":me===r?"var(--border-width) solid var(--ring)":"calc(var(--border-width) / 2) solid var(--border)",overflow:"hidden",backgroundColor:"var(--surface)",cursor:a?"default":"pointer",opacity:R===r?"var(--opacity-muted)":"1",transition:"opacity var(--dur-fast), border-color var(--dur-fast)",outline:"none"},children:a?f(I,{align:"center",justify:"center",style:{width:"100%",height:"100%"},direction:"column",gap:"tight",children:[l(Ae,{className:"dndev-size-lg",style:{animation:"spin 1s linear infinite",color:"var(--primary)"},"aria-hidden":"true"}),l(Se,{value:e.uploadProgress||0,style:{width:"80%"},"aria-label":o("image.upload.progress",{progress:Math.round(e.uploadProgress||0)})}),f(b,{variant:"muted",level:"small",children:[Math.round(e.uploadProgress||0),"%"]})]}):e.error?f(I,{align:"center",justify:"center",style:{width:"100%",height:"100%",padding:"var(--gap-sm)"},direction:"column",children:[l(ne,{className:"dndev-size-md",style:{color:"var(--destructive)"},"aria-hidden":"true"}),l(b,{variant:"destructive",level:"small",align:"center",children:e.error})]}):f(Me,{children:[i&&l("img",{src:e.previewURL,alt:e.file.name||o("image.alt.upload",{index:r+1}),loading:"lazy",decoding:"async",fetchPriority:"low",style:{width:"100%",height:"100%",objectFit:"cover",transform:`rotate(${e.rotation*90}deg)`,aspectRatio:"1 / 1"},"aria-label":`${L} ${r+1}${d?` of ${s.length}`:""}${e.uploaded?" (uploaded)":" (pending upload)"}`}),d&&l("div",{style:{position:"absolute",top:"var(--gap-sm)",left:"var(--gap-sm)",opacity:"var(--opacity-strong)",cursor:"grab"},"aria-label":o("image.reorder.ariaLabel"),onClick:n=>n.stopPropagation(),children:l(Fe,{className:"dndev-size-sm",style:{color:"var(--background)"},"aria-hidden":"true"})}),l(I,{direction:"row",style:{position:"absolute",top:"var(--gap-sm)",right:"var(--gap-sm)"},children:l("button",{type:"button",onClick:n=>{n.stopPropagation(),S(r)},"aria-label":o("image.delete.ariaLabel",{index:r+1}),title:o("image.delete.title"),style:{padding:"var(--gap-sm)",minWidth:"auto",background:"color-mix(in oklab, var(--foreground) 50%, transparent)",border:"none",borderRadius:"var(--radius-sm)",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center"},children:l(ne,{className:"dndev-size-sm",style:{color:"var(--background)"},"aria-hidden":"true"})})}),!t&&l("div",{style:{position:"absolute",bottom:"var(--gap-sm)",left:"var(--gap-sm)",right:"var(--gap-sm)",padding:"var(--gap-sm)",background:"color-mix(in oklab, var(--foreground) 70%, transparent)",color:"var(--background)",textAlign:"center",borderRadius:"var(--radius-sm)"},children:l(b,{variant:"muted",level:"small",align:"center",children:o("image.upload.pending")})})]})},e.id)})}),X&&l(b,{as:"p",id:`image-field-helper-${L}`,variant:O?"destructive":"muted",level:"small",style:{marginTop:"var(--gap-sm)"},children:X}),s.length>0&&l(je,{images:s,selectedIndex:he,open:ve,onClose:()=>W(!1),onUpdate:ye,onDelete:S,onNavigate:e=>B(e),multiple:d})]})});ce.displayName="ImageFieldComponent";var dr=ce;export{dr as default};
|
|
1
|
+
"use client";import{jsxs as t,jsx as r,Fragment as T}from"react/jsx-runtime";import{Upload as U,X as m,Loader2 as z}from"lucide-react";import{forwardRef as P,useCallback as S,useImperativeHandle as V,useRef as B}from"react";import{Text as i,Stack as d,Progress as L}from"@donotdev/components";import{useTranslation as M}from"@donotdev/core";import{useFileUpload as G}from"../../../hooks/useFileUpload";import{processImage as H}from"../../../utils/imageProcessing";import{uploadImage as K}from"../../../utils/imageStorage";const N=["image/*"],h=P(({name:v="image",label:f,value:y,onChange:b,error:u,helperText:p,multiple:l=!1,maxFiles:w=10,maxSize:k=10*1024*1024,storagePath:s="uploads/images",required:x},F)=>{const{t:n}=M("crud"),o=B(null),C=S(async(e,a)=>{const{fullBlob:A,thumbBlob:_}=await H(e);return K(A,_,e.name,{storagePath:s,onProgress:E=>a(E.progress)})},[s]),{files:c,addFiles:g,removeFile:D}=G({name:v,value:y,onChange:b,multiple:l,maxFiles:w,maxSize:k,accept:N,storagePath:s,uploadFn:C}),I=e=>{const a=Array.from(e.target.files||[]);a.length>0&&g(a),o.current&&(o.current.value="")},j=e=>{e.preventDefault(),g(Array.from(e.dataTransfer.files))},R=l||c.length===0;return V(F,()=>({upload:async()=>{},focus:()=>{o.current?.focus()}}),[]),t(d,{gap:"tight",children:[t(i,{level:"body",align:"start",children:[f,x&&"*"]}),R&&t("div",{role:"button",tabIndex:0,onClick:()=>o.current?.click(),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&o.current?.click()},onDragOver:e=>e.preventDefault(),onDrop:j,style:{border:`var(--border-width) dashed ${u?"var(--destructive)":"var(--border)"}`,borderRadius:"var(--radius-lg)",padding:"var(--gap-lg)",backgroundColor:"var(--surface)",cursor:"pointer",textAlign:"center"},children:[r("input",{ref:o,type:"file",accept:"image/*",multiple:l,style:{display:"none"},onChange:I}),t(d,{align:"center",gap:"medium",children:[r(U,{style:{color:"var(--muted-foreground)"}}),r(i,{variant:"muted",level:"small",children:l?n("image.upload.dropzoneMultiple",{defaultValue:"Drop images here or click to upload"}):n("image.upload.dropzoneSingle",{defaultValue:"Drop image here or click to upload"})})]})]}),c.length>0&&r("div",{style:{display:"flex",flexWrap:"wrap",gap:"var(--gap-md)"},children:c.map(e=>{const a=e.progress!==null&&e.progress<100;return r("div",{style:{position:"relative",width:100,height:100,borderRadius:"var(--radius-md)",border:"var(--border-width) solid var(--border)",overflow:"hidden",backgroundColor:"var(--surface)"},children:a?t(d,{align:"center",justify:"center",style:{width:"100%",height:"100%"},children:[r(z,{style:{animation:"spin 1s linear infinite"}}),r(L,{value:e.progress||0,style:{width:"80%"}})]}):e.error?t(d,{align:"center",justify:"center",style:{width:"100%",height:"100%"},children:[r(m,{style:{color:"var(--destructive)"}}),r(i,{variant:"destructive",level:"small",children:e.error})]}):t(T,{children:[r("img",{src:e.previewURL,alt:n("image.alt.upload",{index:1}),style:{width:"100%",height:"100%",objectFit:"cover"}}),r("button",{type:"button",onClick:()=>D(e.id),style:{position:"absolute",top:4,right:4,padding:4,background:"rgba(0,0,0,0.5)",border:"none",borderRadius:"var(--radius-sm)",cursor:"pointer",display:"flex"},children:r(m,{style:{color:"white",width:16,height:16}})}),!e.uploaded&&r("div",{style:{position:"absolute",bottom:0,left:0,right:0,padding:4,background:"rgba(0,0,0,0.7)",textAlign:"center"},children:r(i,{variant:"muted",level:"small",style:{color:"white"},children:n("image.upload.pending",{defaultValue:"Pending"})})})]})},e.id)})}),p&&r(i,{variant:u?"destructive":"muted",level:"small",children:p})]})});h.displayName="ImageFieldComponent";var Z=h;export{Z as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/MapFieldComponent.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,EAAE,CACR,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,gBAAgB,CAAC,KACvD,IAAI,CAAC;IACV,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,iBAAiB,EAAE,aAAa,CAAC,sBAAsB,
|
|
1
|
+
{"version":3,"file":"MapFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/MapFieldComponent.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,EAAE,CACR,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,gBAAgB,CAAC,KACvD,IAAI,CAAC;IACV,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,iBAAiB,EAAE,aAAa,CAAC,sBAAsB,CA0E5D,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as e,jsxs as n}from"react/jsx-runtime";import{Input as p,Stack as u}from"@donotdev/components";import{useTranslation as m}from"@donotdev/core";const f=({label:s,value:d={},onChange:a,error:t,helperText:r,required:i})=>{const{t:l}=m("dndev");return n(u,{gap:"tight",children:[n("div",{className:"dndev-surface","data-variant":t?"destructive":"default",style:{border:"1px solid",borderColor:t?"var(--destructive)":"var(--input)",borderRadius:"var(--radius-lg)",padding:"var(--gap-md)"},children:[e("p",{style:{fontSize:"var(--font-size-sm)",color:"var(--muted-foreground)",marginBottom:"var(--gap-md)"},children:"Map component placeholder"}),e(p,{label:s,type:"text",required:i,className:"dndev-w-full",placeholder:l("form.enterLocationData","Enter location data (JSON)"),value:JSON.stringify(d),onChange:c=>{try{const o=JSON.parse(c.target.value),v={target:{value:JSON.stringify(o)}};a(v)}catch{a({target:{value:"{}"}})}}})]}),r&&e("p",{style:{fontSize:"var(--font-size-xs)",color:t?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:r})]})};var x=f;export{x as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as t,jsxs as c}from"react/jsx-runtime";import{
|
|
1
|
+
import{jsx as t,jsxs as c}from"react/jsx-runtime";import{X as C}from"lucide-react";import{useMemo as z,useId as E}from"react";import{Combobox as I,Badge as V,BADGE_VARIANT as j,Button as w,BUTTON_VARIANT as B,Stack as d}from"@donotdev/components";import{useTranslation as R}from"@donotdev/core";const T=({label:g,value:o=[],options:s,error:h,helperText:a,onChange:u,onBlur:f,required:v,className:y})=>{const{t:m}=R("dndev"),p=E(),b=z(()=>s.map(e=>({value:String(e.value),label:e.label})),[s]),N=e=>{const n=Array.isArray(e)?e:[e],r={target:{value:JSON.stringify(n)}};u(r)},S=e=>{e||f?.()},A=e=>{const n=o.filter(l=>l!==e),r={target:{value:JSON.stringify(n)}};u(r)},i=!!h,O=`${p}-error`,x=`${p}-helper`;return c(d,{gap:"tight",className:y,children:[o.length>0&&t(d,{direction:"row",wrap:"wrap",gap:"medium",children:o.map((e,n)=>{const r=s.find(l=>String(l.value)===e)?.label||e;return c(V,{variant:j.SECONDARY,className:"dndev-gap-sm",children:[r,t(w,{type:"button",variant:B.GHOST,style:{padding:0,height:"auto"},onClick:()=>A(e),children:t(C,{className:"dndev-size-md"})})]},n)})}),t(I,{label:g,value:o,onValueChange:N,onOpenChange:S,placeholder:m("actions.selectOptions","Select options..."),emptyMessage:m("messages.noResults","No results found"),options:b,multiple:!0,required:v,variant:i?"destructive":void 0}),i&&c(d,{id:O,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[t("span",{children:"\u26A0"}),a]}),a&&!i&&t("p",{id:x,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:a})]})};var $=T;export{$ as default};
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* @fileoverview MultiInputTextFieldComponent
|
|
3
|
-
* @description Multi-input text field component for form inputs
|
|
4
|
-
*
|
|
5
|
-
* @version 0.0.1
|
|
6
|
-
* @since 0.0.1
|
|
7
|
-
* @author AMBROISE PARK Consulting
|
|
8
|
-
*/
|
|
9
|
-
import { type ChangeEvent, type ComponentType } from 'react';
|
|
1
|
+
import type { ChangeEvent, ComponentType } from 'react';
|
|
10
2
|
export interface MultiInputTextFieldComponentProps {
|
|
11
3
|
/** Label for the input field */
|
|
12
4
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiInputTextFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/MultiInputTextFieldComponent.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MultiInputTextFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/MultiInputTextFieldComponent.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,iCAAiC;IAChD,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,sEAAsE;IACtE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpE,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,4BAA4B,EAAE,aAAa,CAC/C,iCAAiC,CAiFlC,CAAC;AAEF,eAAe,4BAA4B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as a,jsxs as d}from"react/jsx-runtime";import{useState as y}from"react";import{Input as h,Button as x,Stack as i}from"@donotdev/components";import{useTranslation as b}from"@donotdev/core";const w=({label:m,value:o=[],onChange:l,className:c,required:p})=>{const{t:s}=b("dndev"),[n,u]=y(""),g=()=>{if(n.trim()){const e=[...o,n.trim()],t={target:{value:JSON.stringify(e)}};l(t),u("")}},f=e=>{const t=o.filter((S,v)=>v!==e),r={target:{value:JSON.stringify(t)}};l(r)};return d(i,{gap:"medium",className:c,children:[d(i,{direction:"row",align:"end",gap:"medium",children:[a(h,{label:m,type:"text",value:n,onChange:e=>u(e.target.value),required:p,className:"dndev-flex-1",placeholder:s("form.typeAndPressAdd","Type and press Add...")}),a(x,{type:"button",onClick:g,disabled:!n.trim(),children:s("form.add","Add")})]}),a(i,{direction:"row",wrap:"wrap",gap:"medium",children:o.map((e,t)=>d("span",{className:"dndev-surface","data-variant":"muted",style:{display:"inline-flex",alignItems:"center",gap:"var(--gap-sm)",padding:"var(--gap-sm) var(--gap-md)",fontSize:"var(--font-size-sm)",fontWeight:500,borderRadius:"var(--radius-lg)"},children:[e,a("button",{type:"button",onClick:()=>f(t),style:{color:"var(--muted-foreground)",marginInlineStart:"var(--gap-sm)"},onMouseEnter:r=>{r.currentTarget.style.color="var(--foreground)"},onMouseLeave:r=>{r.currentTarget.style.color="var(--muted-foreground)"},"aria-label":`${s("form.remove","Remove")} ${e}`,children:"\xD7"})]},t))})]})};var j=w;export{j as default};
|
|
@@ -22,6 +22,8 @@ export interface NumberFieldComponentProps {
|
|
|
22
22
|
required?: boolean;
|
|
23
23
|
/** Optional className */
|
|
24
24
|
className?: string;
|
|
25
|
+
/** Input mask type: 'currency' (commas + 2 decimals), 'mileage' (commas, no decimals), or 'number' (no formatting) */
|
|
26
|
+
mask?: 'currency' | 'mileage' | 'number';
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
29
|
* NumberFieldComponent renders a styled number input with validation.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/NumberFieldComponent.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"NumberFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/NumberFieldComponent.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,yBAAyB;IACxC,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACzD,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sHAAsH;IACtH,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,oBAAoB,EAAE,aAAa,CAAC,yBAAyB,CAqJlE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as g,jsxs as z}from"react/jsx-runtime";import{useState as C,useEffect as E,useCallback as y}from"react";import{Input as I,cn as M,Stack as T}from"@donotdev/components";import{useTranslation as _}from"@donotdev/core";const q=({label:S,value:u,onChange:i,error:d,helperText:m,min:b,max:x,step:N,disabled:l,required:F,className:V,mask:r="number",...h})=>{const{i18n:j}=_(),a=j?.language||(typeof navigator<"u"?navigator.language:"en-US"),s=y(e=>e==null||isNaN(e)?"":r==="currency"?e.toLocaleString(a,{minimumFractionDigits:2,maximumFractionDigits:2}):r==="mileage"?Math.round(e).toLocaleString(a):e.toString(),[r,a]),v=y(e=>{if(!e||e.trim()==="")return null;const t=new Intl.NumberFormat(a).formatToParts(1234.56),D=t.find(c=>c.type==="group")?.value||",",L=t.find(c=>c.type==="decimal")?.value||".";let o=e.replace(new RegExp(`\\${D}`,"g"),"");o=o.replace(L,"."),o=o.replace(/[^\d.\-]/g,"");const p=parseFloat(o);return isNaN(p)?null:p},[a]),[w,f]=C(()=>s(u));return E(()=>{f(s(u))},[u,s]),z(T,{gap:"tight",children:[g(I,{type:r==="number"?"number":"text",inputMode:r==="number"?void 0:"decimal",label:S,value:w,onChange:e=>{const n=e.target.value;if(f(n),r==="number"){const t=parseFloat(n);isNaN(t)?i(e):i({...e,target:{...e.target,value:t.toString()}})}else{const t=v(n);t!==null?i({...e,target:{...e.target,value:t.toString()}}):n===""&&i({...e,target:{...e.target,value:""}})}},min:b,max:x,step:N,disabled:l,required:F,className:M("dndev-w-full",V),"data-variant":d?"destructive":void 0,style:{opacity:l?"var(--opacity-muted)":void 0,cursor:l?"not-allowed":void 0},...h}),m&&g("p",{style:{fontSize:"var(--font-size-xs)",color:d?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:m})]})};var G=q;export{G as default};
|
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Password Field Component
|
|
3
|
-
* @description Renders a password input with label, error, and helper text. Form field component for password inputs in CRUD forms.
|
|
4
|
-
*
|
|
5
|
-
* @version 0.0.1
|
|
6
|
-
* @since 0.0.1
|
|
7
|
-
* @author AMBROISE PARK Consulting
|
|
8
|
-
*/
|
|
9
|
-
import { type ChangeEvent, type ComponentProps, type ComponentType } from 'react';
|
|
10
1
|
import { PasswordInput } from '@donotdev/components';
|
|
2
|
+
import type { ChangeEvent, ComponentProps, ComponentType } from 'react';
|
|
11
3
|
export interface PasswordFieldComponentProps extends Omit<ComponentProps<typeof PasswordInput>, 'value' | 'onChange'> {
|
|
12
4
|
/** Field label */
|
|
13
5
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/PasswordFieldComponent.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PasswordFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/PasswordFieldComponent.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExE,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CACvD,cAAc,CAAC,OAAO,aAAa,CAAC,EACpC,OAAO,GAAG,UAAU,CACrB;IACC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,EAAE,CACR,KAAK,EAAE,WAAW,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,KACvD,IAAI,CAAC;IACV,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,sBAAsB,EAAE,aAAa,CAAC,2BAA2B,CAqCtE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* @fileoverview Phone Number Component
|
|
3
|
-
* @description Single phone number input with country code selector and flag. Form field component for phone number inputs in CRUD forms.
|
|
4
|
-
*
|
|
5
|
-
* @version 0.0.1
|
|
6
|
-
* @since 0.0.1
|
|
7
|
-
* @author AMBROISE PARK Consulting
|
|
8
|
-
*/
|
|
9
|
-
import { type ChangeEvent, type ComponentType } from 'react';
|
|
1
|
+
import type { ChangeEvent, ComponentType } from 'react';
|
|
10
2
|
export interface PhoneNumberComponentProps {
|
|
11
3
|
/** Field label */
|
|
12
4
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhoneNumberComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/PhoneNumberComponent.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PhoneNumberComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/PhoneNumberComponent.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,yBAAyB;IACxC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACzD,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,QAAA,MAAM,oBAAoB,EAAE,aAAa,CAAC,yBAAyB,CAiOlE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as t,jsxs as
|
|
1
|
+
"use client";import{jsx as t,jsxs as l}from"react/jsx-runtime";import{useState as B,useMemo as m,useEffect as L,useId as M}from"react";import{Input as W,FloatingLabel as k,Button as F,BUTTON_VARIANT as O,DropdownMenu as U,Stack as p}from"@donotdev/components";import{Flag as I,COUNTRIES as N}from"@donotdev/core";const _=({label:V,value:d="",onChange:R,error:x,helperText:g,required:w=!1,disabled:b=!1,defaultCountry:S="FR",showFlags:z=!0,preferredCountries:c,countries:h})=>{const i=M(),f=m(()=>h&&h.length>0?h.map(e=>N.find(n=>n.code===e)).filter(e=>e!==void 0):Array.from(N),[h]),a=m(()=>{if(!c||c.length===0)return f;const e=c.map(o=>f.find(y=>y.code===o)).filter(o=>o!==void 0),n=f.filter(o=>!c.includes(o.code));return[...e,...n]},[f,c]),s=m(()=>a.find(e=>e.code===S)||a[0]||N[0],[S,a]),{country:C,phoneNumber:T}=m(()=>{if(!d)return{country:s,phoneNumber:""};const e=a.find(n=>d.startsWith(n.dialCode));return e?{country:e,phoneNumber:d.slice(e.dialCode.length).trim()}:d.startsWith("+")?{country:s,phoneNumber:d}:{country:s,phoneNumber:d}},[d,s,a]),[r,E]=B(s);L(()=>{C.code!==r.code&&E(C)},[C,r.code]);const v=T,$=e=>{E(e);const o={target:{value:e.dialCode+(v?" "+v:"")}};R(o)},j=e=>{const n=e.target.value,y={target:{value:r.dialCode+(n?" "+n:"")}};R(y)},A=a.map(e=>({label:e.dialCode,onClick:()=>$(e),checked:e.code===r.code,children:z?l(p,{direction:"row",align:"center",gap:"tight",children:[t(I,{code:e.flagCode,title:e.name}),t("span",{children:e.dialCode}),t("span",{style:{color:"var(--muted-foreground)",fontSize:"var(--font-size-xs)"},children:e.name})]}):l("span",{children:[e.dialCode," ",e.name]})})),u=!!x;return l(p,{gap:"tight",children:[t(k,{htmlFor:i,label:V,disabled:b,required:w,children:l("div",{style:{position:"relative",display:"flex",gap:"var(--gap-sm)"},children:[t(U,{trigger:t(F,{type:"button",variant:O.OUTLINE,disabled:b,style:{minWidth:"fit-content",padding:"0 var(--gap-md)",borderRight:"none",borderTopRightRadius:0,borderBottomRightRadius:0},"aria-label":`Country code: ${r.dialCode}`,children:l(p,{direction:"row",align:"center",gap:"tight",children:[z&&t(I,{code:r.flagCode,title:r.name}),t("span",{children:r.dialCode})]})}),items:A,contentWidth:"16rem"}),t(W,{id:i,type:"tel",inputMode:"tel",value:v,onChange:j,disabled:b,placeholder:"6 12 34 56 78","data-variant":u?"destructive":void 0,style:{flex:1,borderTopLeftRadius:0,borderBottomLeftRadius:0},"aria-describedby":u?`${i}-error`:g?`${i}-helper`:void 0,"aria-invalid":u})]})}),u&&l(p,{id:`${i}-error`,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[t("span",{children:"\u26A0"}),x]}),g&&!u&&t("p",{id:`${i}-helper`,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:g})]})};var H=_;export{H as default};
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* @fileoverview RadioFieldComponent
|
|
3
|
-
* @description Radio field component for form inputs
|
|
4
|
-
*
|
|
5
|
-
* @version 0.0.1
|
|
6
|
-
* @since 0.0.1
|
|
7
|
-
* @author AMBROISE PARK Consulting
|
|
8
|
-
*/
|
|
9
|
-
import { type RadioOption } from '@donotdev/components';
|
|
1
|
+
import type { RadioOption } from '@donotdev/components';
|
|
10
2
|
import type { ChangeEvent, ComponentType } from 'react';
|
|
11
3
|
export interface RadioFieldComponentProps {
|
|
12
4
|
/** Field label */
|