@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,5 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Register built-in field types (UI components only)
|
|
3
|
+
*
|
|
4
|
+
* **Note for Consumers:**
|
|
5
|
+
* This function demonstrates the registration pattern. For your own custom field types,
|
|
6
|
+
* use `registerFieldType()` from `@donotdev/crud` instead. See SETUP_CRUD.md for examples.
|
|
3
7
|
*/
|
|
4
8
|
export declare function registerBuiltinFieldTypes(): void;
|
|
5
9
|
//# sourceMappingURL=builtinFieldTypes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtinFieldTypes.d.ts","sourceRoot":"","sources":["../src/builtinFieldTypes.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"builtinFieldTypes.d.ts","sourceRoot":"","sources":["../src/builtinFieldTypes.tsx"],"names":[],"mappings":"AAyKA;;;;;;GAMG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAyGhD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as s}from"react/jsx-runtime";import{
|
|
1
|
+
"use client";import{jsx as s}from"react/jsx-runtime";import{ControlledCheckboxField as g,ControlledComboboxField as u,ControlledDateField as m,ControlledDropdownField as F,ControlledFileField as f,ControlledMultiFileField as h,ControlledDocumentField as b,ControlledMultiDocumentField as x,ControlledGeoPointField as v,ControlledImageField as T,ControlledMapField as U,ControlledMultiDropdownField as w,ControlledMultiInputField as R,ControlledNumberField as y,ControlledPasswordField as M,ControlledPhoneField as k,ControlledRangeField as D,ControlledRadioField as A,ControlledTextField as d,ControlledTextareaField as B,ControlledRichTextField as I,ControlledTimestampField as P,ControlledAddressField as j,ControlledSwitchField as H,ControlledMultiImageField as S}from"./components/controlled";import{AvatarFieldComponent as G,BadgeFieldComponent as N,ButtonFieldComponent as p,HiddenFieldComponent as _,TextAreaComponent as q,RichTextComponent as z,TextFieldComponent as E}from"./components/form/fields";import{getFieldRegistry as J}from"./FieldRegistry";const K=e=>{const{name:t,value:o,onChange:r,error:n,t:i,config:l,...a}=e;return s(G,{config:l,value:o,onChange:r,error:!!n,helperText:n||void 0,t:i,...l.options,...a})},L=e=>{const{name:t,value:o,onChange:r,error:n,t:i,config:l,...a}=e;return s(N,{config:l,value:o,onChange:r,error:!!n,helperText:n||void 0,t:i,...l.options,...a})},O=e=>{const{name:t,label:o,onChange:r,config:n}=e;return s(p,{label:o||t,type:"submit",onClick:()=>r(void 0),...n.options})},Q=e=>{const{name:t,label:o,onChange:r,config:n}=e;return s(p,{label:o||t,type:"reset",onClick:()=>r(void 0),...n.options})},V=e=>{const{name:t,value:o}=e;return s(_,{name:t,value:o})},W=e=>{const{name:t,label:o,value:r,onChange:n,error:i,config:l}=e;return s(q,{label:o||t,value:r,onChange:n,error:i||void 0,...l.options})},X=e=>{const{name:t,label:o,value:r,onChange:n,error:i,config:l}=e;return s(z,{label:o||t,value:r,onChange:n,error:i||void 0,...l.options})},C=e=>{const{name:t,label:o,value:r,onChange:n,error:i,config:l}=e;return s(E,{label:o||t,value:r,onChange:n,error:i||void 0,...l.options})};let c=!1;function Y(){if(c)return;c=!0;const e=J();e.registerComponent("text",d,C),e.registerComponent("email",d,C),e.registerComponent("url",d,C),e.registerComponent("color",d,C),e.registerComponent("textarea",B,W),e.registerComponent("richtext",I,X),e.registerComponent("password",M),e.registerComponent("number",y),e.registerComponent("range",D),e.registerComponent("boolean",g),e.registerComponent("checkbox",g),e.registerComponent("switch",H),e.registerComponent("date",m),e.registerComponent("datetime-local",m),e.registerComponent("time",m),e.registerComponent("week",m),e.registerComponent("month",m),e.registerComponent("timestamp",P),e.registerComponent("file",f),e.registerComponent("files",h),e.registerComponent("document",b),e.registerComponent("documents",x),e.registerComponent("image",T),e.registerComponent("images",S),e.registerComponent("geopoint",v),e.registerComponent("address",j),e.registerComponent("map",U),e.registerComponent("array",R),e.registerComponent("select",F),e.registerComponent("combobox",u),e.registerComponent("multiselect",w),e.registerComponent("radio",A),e.registerComponent("tel",k),e.registerComponent("avatar",d,K),e.registerComponent("badge",d,L),e.registerComponent("hidden",d,V),e.registerComponent("submit",d,O),e.registerComponent("reset",d,Q)}Y();export{Y as registerBuiltinFieldTypes};
|
|
@@ -34,7 +34,7 @@ export interface CrudButtonProps<T = unknown> extends Omit<ActionButtonProps<T>,
|
|
|
34
34
|
*
|
|
35
35
|
* @example
|
|
36
36
|
* ```tsx
|
|
37
|
-
* const { delete: deleteItem } = useCrud(
|
|
37
|
+
* const { delete: deleteItem } = useCrud(itemEntity);
|
|
38
38
|
* const user = useAuth('user');
|
|
39
39
|
*
|
|
40
40
|
* <CrudButton
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CrudButton.d.ts","sourceRoot":"","sources":["../../src/components/CrudButton.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CrudButton.d.ts","sourceRoot":"","sources":["../../src/components/CrudButton.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,IAAI,CACxD,iBAAiB,CAAC,CAAC,CAAC,EACpB,UAAU,CACX;IACC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,iBAAS,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,EAC/B,YAAmB,EACnB,IAAI,EACJ,QAAgB,EAChB,QAAQ,EACR,GAAG,iBAAiB,EACrB,EAAE,eAAe,CAAC,CAAC,CAAC,2CAYpB;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as n}from"react/jsx-runtime";import{ActionButton as d}from"@donotdev/components";import{useCrudStore as l}from"../CrudStore";function a({requiresAuth:t=!0,user:e,disabled:r=!1,children:i,...o}){const s=l(u=>!!u.crudService);return n(d,{...o,disabled:r||!s||t&&!e,children:i})}var p=a;export{p as default};
|
|
@@ -1,24 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
* @fileoverview DisplayFieldRenderer component
|
|
3
|
-
* @description Renders field values as read-only display (not editable inputs)
|
|
4
|
-
* Used when editable=false or user doesn't have edit permissions
|
|
5
|
-
*
|
|
6
|
-
* @version 0.0.1
|
|
7
|
-
* @since 0.0.1
|
|
8
|
-
* @author AMBROISE PARK Consulting
|
|
9
|
-
*/
|
|
1
|
+
import type { FieldType, EntityField } from '@donotdev/core';
|
|
10
2
|
import type { ReactElement } from 'react';
|
|
11
|
-
import type { FieldConfig, FieldType } from '@donotdev/core';
|
|
12
3
|
export interface DisplayFieldRendererProps<T extends FieldType = FieldType> {
|
|
13
4
|
/** Field identifier */
|
|
14
5
|
name: string;
|
|
15
6
|
/** Field configuration */
|
|
16
|
-
config:
|
|
7
|
+
config: EntityField<T>;
|
|
17
8
|
/** Current field value */
|
|
18
9
|
value: any;
|
|
19
10
|
/** Translation function */
|
|
20
11
|
t: (key: string, options?: Record<string, any>) => string;
|
|
21
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Formats a value for display based on field type
|
|
15
|
+
*
|
|
16
|
+
* @param value - Field value to format
|
|
17
|
+
* @param config - Field configuration
|
|
18
|
+
* @param t - Translation function
|
|
19
|
+
* @param options - Formatting options
|
|
20
|
+
* @param options.compact - Use compact formatting (smaller images, plain spans for empty)
|
|
21
|
+
* @returns Formatted value as string or ReactElement
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatValue(value: any, config: EntityField, t: (key: string, options?: Record<string, any>) => string, options?: {
|
|
24
|
+
compact?: boolean;
|
|
25
|
+
}): string | ReactElement;
|
|
22
26
|
/**
|
|
23
27
|
* DisplayFieldRenderer - Renders a field value as read-only display
|
|
24
28
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DisplayFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/DisplayFieldRenderer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DisplayFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/DisplayFieldRenderer.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACxE,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,0BAA0B;IAC1B,KAAK,EAAE,GAAG,CAAC;IACX,2BAA2B;IAC3B,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CAC3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,WAAW,EACnB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,EACzD,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,MAAM,GAAG,YAAY,CAoYvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,EACpE,IAAI,EACJ,MAAM,EACN,KAAK,EACL,CAAC,GACF,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,YAAY,CAyC7C;AAED,eAAe,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
1
|
+
"use client";import{jsx as e,jsxs as o}from"react/jsx-runtime";import{Text as i,Stack as d}from"@donotdev/components";import{translateFieldLabel as y,translateLabel as g}from"../forms/utils";function b(r,c,l,m){const n=m?.compact??!1;if(r==null||r==="")return n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});switch(c.type){case"timestamp":case"date":case"datetime-local":try{const t=r instanceof Date?r:new Date(r);return c.type==="date"?t.toLocaleDateString():t.toLocaleString()}catch{return String(r)}case"boolean":case"checkbox":return r?"Yes":"No";case"number":case"range":return typeof r=="number"?r.toLocaleString():String(r);case"select":case"radio":const p=c.validation?.options;if(Array.isArray(p)){const a=p.find(s=>s.value===r)?.label;return a?g(a,l):String(r)}return String(r);case"multiselect":if(Array.isArray(r)){const t=c.validation?.options;if(Array.isArray(t))return r.map(s=>{const h=t.find(u=>u.value===s)?.label;return h?g(h,l):s}).join(", ")}return String(r);case"image":case"images":if(typeof r=="string")return e("img",{src:r,alt:c.label||"",style:{width:n?"40px":void 0,height:n?"40px":void 0,maxWidth:n?void 0:"200px",maxHeight:n?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}});if(Array.isArray(r)&&r.length>0){const t=r[0],a=typeof t=="object"&&t.thumbUrl?t.thumbUrl:t;return n?o("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[e("img",{src:a,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),r.length>1&&o("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",r.length-1]})]}):o(d,{direction:"row",gap:"tight",style:{flexWrap:"wrap"},children:[r.slice(0,4).map((s,f)=>{const h=typeof s=="object"&&s.thumbUrl?s.thumbUrl:s;return e("img",{src:h,alt:`${c.label} ${f+1}`,style:{width:"60px",height:"60px",objectFit:"cover",borderRadius:"var(--radius-sm)"}},f)}),r.length>4&&o(i,{variant:"muted",children:["+",r.length-4," more"]})]})}return n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"files":case"documents":return Array.isArray(r)?r.length===0?n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"}):e(d,{gap:"tight",children:r.map((t,a)=>o("a",{href:t.url||t,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[t.filename||`File ${a+1}`,t.size&&o(i,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(t.size/1024)," KB)"]})]},a))}):n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"file":case"document":if(r){const t=typeof r=="string"?r:r.url,a=typeof r=="string"?"View file":r.filename||"View file";return o("a",{href:t,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[a,typeof r=="object"&&r.size&&o("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(r.size/1024)," KB)"]})]})}return n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"reference":return String(r);case"geopoint":return r&&typeof r=="object"&&"lat"in r&&"lng"in r?`${r.lat.toFixed(6)}, ${r.lng.toFixed(6)}`:n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"address":return r&&typeof r=="object"&&"formatted_address"in r?r.formatted_address:String(r);case"map":if(r&&typeof r=="object"){const t=Object.entries(r);return t.length===0?n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"}):o(d,{direction:"column",gap:"tight",children:[t.slice(0,5).map(([a,s])=>o(i,{style:{fontSize:"var(--font-size-sm)"},children:[o("strong",{children:[a,":"]})," ",String(s)]},a)),t.length>5&&o(i,{variant:"muted",children:["+",t.length-5," more"]})]})}return n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"array":return Array.isArray(r)?r.length===0?n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"}):r.join(", "):n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});case"password":return"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";case"email":return e("a",{href:`mailto:${r}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:r});case"tel":return e("a",{href:`tel:${r}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:r});case"url":return e("a",{href:r,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:r});case"color":return o(d,{direction:"row",gap:"tight",align:"center",children:[e("div",{style:{width:"20px",height:"20px",backgroundColor:r,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),e(i,{children:r})]});case"textarea":case"text":return String(r);case"richtext":return r&&typeof r=="string"?n?r.replace(/<[^>]*>/g,"").trim()||e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e("div",{dangerouslySetInnerHTML:{__html:r},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):n?e("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):e(i,{variant:"muted",children:"\u2014"});default:return String(r)}}function x({name:r,config:c,value:l,t:m}){const n=b(l,c,m,{compact:!1}),p=y(r,c,m);return o(d,{direction:"row",align:"baseline",style:{marginBottom:"var(--gap-sm)",padding:"var(--gap-sm)",minHeight:"38px",alignItems:"center"},children:[o(i,{variant:"muted",style:{fontSize:"var(--font-size-sm)",fontWeight:500,minWidth:"fit-content",flexShrink:0},children:[p,":"]}),e("div",{style:{flex:1,display:"flex",alignItems:"center"},children:typeof n=="string"?e(i,{children:n}):n})]})}var w=x;export{x as DisplayFieldRenderer,w as default,b as formatValue};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Entity } from '@donotdev/core';
|
|
2
|
+
export interface EntityCardListProps {
|
|
3
|
+
/** The entity definition */
|
|
4
|
+
entity: Entity;
|
|
5
|
+
/** Optional view handler. If not provided, defaults to navigate(`/${entity.collection}/${id}`) */
|
|
6
|
+
onView?: (id: string) => void;
|
|
7
|
+
/** Grid columns (responsive) - defaults to [1, 2, 3, 4] */
|
|
8
|
+
cols?: number | [number, number, number, number];
|
|
9
|
+
/** Cache stale time is ms - defaults to 30 mins */
|
|
10
|
+
staleTime?: number;
|
|
11
|
+
/** Optional filter function to filter items client-side */
|
|
12
|
+
filter?: (item: any) => boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Entity Card List Component - Card grid view for public/user-facing browsing
|
|
16
|
+
*
|
|
17
|
+
* Features:
|
|
18
|
+
* - Responsive card grid layout
|
|
19
|
+
* - Image + key fields display
|
|
20
|
+
* - Click card to navigate to detail
|
|
21
|
+
* - Simple formatted text display (no boxes, just labels + values)
|
|
22
|
+
* - Empty state handling
|
|
23
|
+
* - Default routing: `/${entity.collection}/${id}` for view
|
|
24
|
+
*/
|
|
25
|
+
export declare function EntityCardList({ entity, onView, cols, staleTime, // 30 minutes default cache
|
|
26
|
+
filter, }: EntityCardListProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=EntityCardList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityCardList.d.ts","sourceRoot":"","sources":["../../src/components/EntityCardList.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,kGAAkG;IAClG,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC;CACjC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,MAAM,EACN,IAAmB,EACnB,SAA0B,EAAE,2BAA2B;AACvD,MAAM,GACP,EAAE,mBAAmB,2CAsKrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as l,jsxs as p}from"react/jsx-runtime";import{useMemo as d,useCallback as A}from"react";import{Grid as I,Card as T,Stack as h,Text as c,Spinner as U}from"@donotdev/components";import{useTranslation as k}from"@donotdev/core";import{useNavigate as D}from"@donotdev/ui";import{translateFieldLabel as O}from"../forms/utils";import{useCrudCardList as R}from"../useCrudCardList";import{formatValue as _}from"./DisplayFieldRenderer";function J({entity:r,onView:u,cols:w=[1,2,3,4],staleTime:L=1e3*60*30,filter:m}){const v=D(),{data:S,loading:y}=R(r,{staleTime:L}),f=S?.items||[],C=d(()=>m?f.filter(m):f,[f,m]),$=`entity-${r.name.toLowerCase()}`,{t:F}=k($),{t:b}=k("crud"),V=A(e=>{u?u(e):v(`/${r.collection}/${e}`)},[u,v,r.collection]),s=d(()=>{const e=r.listCardFields??r.listFields;return e&&e.length>0?e:Object.keys(r.fields).slice(0,4)},[r.listCardFields,r.listFields,r.fields]),o=d(()=>{const e=s.filter(a=>{const i=r.fields[a];return i?.type==="image"||i?.type==="images"});return e.length>0?e[0]:Object.keys(r.fields).filter(a=>{const i=r.fields[a];return i?.type==="image"||i?.type==="images"})[0]||null},[s,r.fields]),j=d(()=>s.filter(e=>e!==o),[s,o]);return y?l(U,{overlay:!0}):C.length===0?p(h,{align:"center",justify:"center",gap:"medium",style:{padding:"var(--gap-3xl)",textAlign:"center"},children:[l(c,{level:"h3",style:{color:"var(--muted-foreground)"},children:b("emptyState.title",{defaultValue:`No ${r.name.toLowerCase()} found`})}),l(c,{style:{color:"var(--muted-foreground)"},children:b("emptyState.description",{defaultValue:`No ${r.name.toLowerCase()} available at this time.`})})]}):l(I,{cols:w,gap:"medium",children:C.map(e=>{const t=o?e[o]:null,a=t?typeof t=="string"?t:t?.url||t?.thumbUrl||Array.isArray(t)&&t[0]?.url||t[0]?.thumbUrl||t[0]:null,i=j[0],x=i?e[i]:e.id;return l(T,{title:String(x||""),clickable:!0,onClick:()=>V(e.id),elevated:!0,children:p(h,{direction:"column",gap:"medium",children:[a&&l("div",{style:{width:"100%",aspectRatio:"16/9",borderRadius:"var(--radius-md)",overflow:"hidden",backgroundColor:"var(--muted)"},children:l("img",{src:a,alt:String(x||""),style:{width:"100%",height:"100%",objectFit:"cover"}})}),l(h,{direction:"column",gap:"tight",children:j.slice(1,4).map(n=>{const g=r.fields[n];return g?p("div",{children:[l(c,{level:"small",variant:"muted",children:O(n,g,F)}),l(c,{children:_(e[n],g,F,{compact:!0})})]},n):null})})]})},e.id)})})}export{J as EntityCardList};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Entity, UserRole } from '@donotdev/core';
|
|
2
|
+
export interface EntityDisplayRendererProps<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
3
|
+
/** Entity definition - pass the full entity from defineEntity() */
|
|
4
|
+
entity: Entity;
|
|
5
|
+
/** Entity ID to fetch. If not provided, will try to get from route params */
|
|
6
|
+
id?: string;
|
|
7
|
+
/** Translation function (optional - auto-generated if not provided) */
|
|
8
|
+
t?: (key: string, options?: Record<string, unknown>) => string;
|
|
9
|
+
/** Additional CSS classes */
|
|
10
|
+
className?: string;
|
|
11
|
+
/** Backend to use */
|
|
12
|
+
backend?: 'firestore' | 'functions';
|
|
13
|
+
/** Custom loading message */
|
|
14
|
+
loadingMessage?: string;
|
|
15
|
+
/** Custom not found message */
|
|
16
|
+
notFoundMessage?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Current viewer's role for visibility checks
|
|
19
|
+
* Used to determine which fields should be visible based on their visibility setting
|
|
20
|
+
* If not provided, defaults to 'guest' (most restrictive - shows only public fields)
|
|
21
|
+
* @default 'guest'
|
|
22
|
+
*/
|
|
23
|
+
viewerRole?: UserRole;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* EntityDisplayRenderer - Automatically fetches and displays entity data
|
|
27
|
+
*
|
|
28
|
+
* Features:
|
|
29
|
+
* - Automatic data fetching using useCrud
|
|
30
|
+
* - Loading state handling
|
|
31
|
+
* - Error handling
|
|
32
|
+
* - Automatic field rendering (respects visibility rules)
|
|
33
|
+
* - Full i18n support
|
|
34
|
+
* - No form/submit buttons - pure read-only display
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```tsx
|
|
38
|
+
* <EntityDisplayRenderer entity={carEntity} id={carId} />
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function EntityDisplayRenderer<T extends Record<string, unknown> = Record<string, unknown>>({ entity, id: providedId, t, className, backend, loadingMessage, notFoundMessage, viewerRole, }: EntityDisplayRendererProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
42
|
+
export default EntityDisplayRenderer;
|
|
43
|
+
//# sourceMappingURL=EntityDisplayRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityDisplayRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityDisplayRenderer.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAMvD,MAAM,WAAW,0BAA0B,CACzC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uEAAuE;IACvE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,OAAO,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC;CACvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,EACA,MAAM,EACN,EAAE,EAAE,UAAU,EACd,CAAC,EACD,SAAc,EACd,OAAqB,EACrB,cAAc,EACd,eAAe,EACf,UAAoB,GACrB,EAAE,0BAA0B,CAAC,CAAC,CAAC,2CA4N/B;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as i,jsxs as I}from"react/jsx-runtime";import{useEffect as M,useState as p,useMemo as b}from"react";import{Stack as y}from"@donotdev/components";import{useTranslation as A,isFieldVisible as P}from"@donotdev/core";import{LoadingContainerOverlay as R,useParams as T}from"@donotdev/ui";import{DisplayFieldRenderer as q}from"./DisplayFieldRenderer";import{useCrud as G}from"../useCrud";function H({entity:n,id:d,t:j,className:m="",backend:x="functions",loadingMessage:F,notFoundMessage:S,viewerRole:h="guest"}){const a=T(),u=b(()=>{if(d)return d;if(!a)return;const e=a.id;if(e)return Array.isArray(e)?e[0]:e;const r=a[n.collection];if(r)return Array.isArray(r)?r[0]:r},[d,a,n.collection]),{get:g,loading:w,data:k,error:C,isAvailable:v}=G(n,{backend:x}),[D,c]=p(!1),[L,s]=p(null),[O,f]=p(null),V=`entity-${n.name.toLowerCase()}`,{t:z}=A(V),{t:E}=A("crud"),_=j||z;M(()=>{if(!u){f(null),s(null),c(!1);return}if(!v||!g)return;let e=!1;return c(!0),s(null),g(u).then(r=>{e||(c(!1),r?(f(r),s(null)):(f(null),s(new Error("Entity not found"))))}).catch(r=>{e||(c(!1),s(r instanceof Error?r:new Error(String(r))),f(null))}),()=>{e=!0}},[u,g,v]);const o=k||O,l=C||L,$=w||D||!u,B=b(()=>o?Object.entries(n.fields).filter(([e,r])=>{if(!P(r.visibility,h)||r.visibility==="hidden")return!1;const t=o[e];return!(t==null||typeof t=="string"&&t.trim()===""||Array.isArray(t)&&t.length===0||typeof t=="object"&&!Array.isArray(t)&&t!==null&&Object.keys(t).length===0)}):[],[n.fields,h,o]);return $?i("div",{style:{position:"relative",width:"100%",gridColumn:"1 / -1",display:"contents"},className:m,children:i(R,{show:!0,backdrop:!0,backdropBlur:!0,message:{message:F||E("form.loading",{defaultValue:"Loading..."}),showSpinner:!0}})}):l||!o?i(y,{align:"center",justify:"center",gap:"medium",style:{padding:"var(--gap-3xl)",textAlign:"center"},className:m,children:I(y,{direction:"column",gap:"tight",children:[i("h3",{style:{color:"var(--muted-foreground)"},children:S||E("errors.notFound",{defaultValue:`${n.name} not found`})}),l&&i("p",{style:{color:"var(--destructive)",fontSize:"var(--font-size-sm)"},children:l instanceof Error?l.message:String(l)})]})}):i(y,{direction:"column",gap:"medium",className:m,children:B.map(([e,r])=>i(q,{name:e,config:r,value:o[e],t:_},e))})}var Y=H;export{H as EntityDisplayRenderer,Y as default};
|
|
@@ -11,8 +11,11 @@ interface EntityFormRendererProps<T extends Record<string, unknown> = Record<str
|
|
|
11
11
|
className?: string;
|
|
12
12
|
/** Submit button text */
|
|
13
13
|
submitText?: string;
|
|
14
|
-
/**
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Whether form data is loading (shows loading overlay)
|
|
16
|
+
* Use this when fetching existing entity data for edit mode
|
|
17
|
+
*/
|
|
18
|
+
loading?: boolean;
|
|
16
19
|
/** Initial form values */
|
|
17
20
|
defaultValues?: Partial<T>;
|
|
18
21
|
/** Submit button variant */
|
|
@@ -25,46 +28,38 @@ interface EntityFormRendererProps<T extends Record<string, unknown> = Record<str
|
|
|
25
28
|
onSecondarySubmit?: (data: T) => void | Promise<void>;
|
|
26
29
|
/**
|
|
27
30
|
* Current viewer's role for editability checks
|
|
28
|
-
*
|
|
29
|
-
* If not provided, auto-detected from current user's auth state
|
|
30
|
-
* Falls back to 'admin' if auth unavailable (assumes admin context for forms)
|
|
31
|
-
* NOTE: Visibility is handled by backend, not this prop
|
|
31
|
+
* @default 'admin'
|
|
32
32
|
*/
|
|
33
33
|
viewerRole?: ViewerRole;
|
|
34
34
|
/**
|
|
35
35
|
* Form operation type
|
|
36
|
-
*
|
|
37
|
-
* - 'edit': Shows all fields from defaultValues, technical fields are read-only
|
|
38
|
-
* @default 'create'
|
|
36
|
+
* @default 'create' (or 'edit' if defaultValues provided)
|
|
39
37
|
*/
|
|
40
38
|
operation?: 'create' | 'edit';
|
|
41
39
|
/**
|
|
42
40
|
* Enable auto-save to localStorage for crash recovery.
|
|
43
|
-
*
|
|
44
|
-
* Only works for create mode.
|
|
45
|
-
* @default true (auto-enabled for create forms)
|
|
41
|
+
* @default true for create mode
|
|
46
42
|
*/
|
|
47
43
|
autoSave?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Optional form ID for tracking loading state.
|
|
46
|
+
* If not provided, one will be generated automatically.
|
|
47
|
+
*/
|
|
48
|
+
formId?: string;
|
|
48
49
|
}
|
|
49
50
|
/**
|
|
50
|
-
* EntityFormRenderer -
|
|
51
|
-
*
|
|
52
|
-
* Security model:
|
|
53
|
-
* - VISIBILITY is handled by BACKEND (filterVisibleFields) - frontend trusts what it receives
|
|
54
|
-
* - EDITABILITY is handled by FRONTEND - determines input vs read-only display
|
|
51
|
+
* EntityFormRenderer - Dumb component that renders a form from entity definition.
|
|
55
52
|
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* -
|
|
59
|
-
* -
|
|
60
|
-
* -
|
|
61
|
-
* - Deferred file uploads (images uploaded on form submit)
|
|
62
|
-
* - Full i18n support
|
|
53
|
+
* All orchestration (uploads, validation, status tracking) is handled by useEntityForm.
|
|
54
|
+
* This component just:
|
|
55
|
+
* - Generates formId
|
|
56
|
+
* - Renders fields
|
|
57
|
+
* - Renders submit button with status from useEntityForm
|
|
63
58
|
*
|
|
64
|
-
* @version 0.0.
|
|
59
|
+
* @version 0.0.6
|
|
65
60
|
* @since 0.0.1
|
|
66
61
|
* @author AMBROISE PARK Consulting
|
|
67
62
|
*/
|
|
68
|
-
export declare function EntityFormRenderer<T extends Record<string, any> = any>(
|
|
63
|
+
export declare function EntityFormRenderer<T extends Record<string, any> = any>({ entity, onSubmit, t, className, submitText, loading, defaultValues, submitVariant, secondaryButtonText, secondaryButtonVariant, onSecondarySubmit, viewerRole, operation, autoSave, formId: externalFormId, }: EntityFormRendererProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
69
64
|
export default EntityFormRenderer;
|
|
70
65
|
//# sourceMappingURL=EntityFormRenderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityFormRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityFormRenderer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"EntityFormRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityFormRenderer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,UAAU,uBAAuB,CAC/B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,2BAA2B;IAC3B,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,4BAA4B;IAC5B,aAAa,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACzE,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+BAA+B;IAC/B,sBAAsB,CAAC,EACnB,SAAS,GACT,aAAa,GACb,SAAS,GACT,OAAO,GACP,MAAM,CAAC;IACX,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,EACtE,MAAM,EACN,QAAQ,EACR,CAAC,EACD,SAAc,EACd,UAAU,EACV,OAAe,EACf,aAAa,EACb,aAAyB,EACzB,mBAAmB,EACnB,sBAAkC,EAClC,iBAAiB,EACjB,UAAU,EACV,SAA6C,EAC7C,QAAiC,EACjC,MAAM,EAAE,cAAc,GACvB,EAAE,uBAAuB,CAAC,CAAC,CAAC,2CAoK5B;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -1,5 +1 @@
|
|
|
1
|
-
"use client";import{jsx as
|
|
2
|
-
${e.map(s=>`\u2022 ${s.field}: ${s.message}`).join(`
|
|
3
|
-
`)}`;g("root",{message:r})},E=async()=>{if(!F)return!0;try{return await F.uploadAll(),!0}catch(t){const e=t instanceof Error?t.message:"Upload failed";return g("root",{message:e}),!1}},w=t=>k(async e=>{try{const r=D(e);await t(r)}catch(r){const s=r instanceof Error?r.message:"An error occurred";g("root",{message:s})}},V),_=async t=>{t.preventDefault(),await E()&&w(N)()},R=async()=>{v&&await E()&&w(v)()},H=`entity-${m.name.toLowerCase()}`,{t:T}=J(H),C=n||T;return i(z,{...u,children:O("form",{onSubmit:_,noValidate:!0,className:x,style:{width:"100%",gridColumn:"1 / -1",display:"contents"},children:[a.root?.message&&i(G,{variant:"error",description:typeof a.root.message=="string"&&a.root.message.includes(`
|
|
4
|
-
`)?i(L,{as:"ul",gap:"tight",style:{listStyle:"disc",listStylePosition:"inside",margin:0,paddingLeft:"1em"},children:a.root.message.split(`
|
|
5
|
-
`).filter(t=>t.trim()).map((t,e)=>i("li",{children:t.replace(/^•\s*/,"")},e))}):a.root.message,style:{marginBottom:"var(--gap-md)",gridColumn:"1 / -1"}}),S.map(({name:t,config:e,editable:r})=>r?i(K,{name:t,config:e,control:P,errors:a,t:C},t):i(Q,{name:t,config:e,value:d?.[t],t:C},t)),j?O(L,{direction:"row",gap:"tight",style:{gridColumn:"1 / -1"},children:[i(y,{type:"submit",disabled:l||o,variant:h,className:"dndev-w-full",children:l||o?n?n("loading",{defaultValue:"Loading..."}):"Loading...":b||(n?n("submit",{defaultValue:"Submit"}):"Submit")}),i(y,{type:"button",onClick:R,disabled:l||o,variant:$,className:"dndev-w-full",children:l||o?n?n("loading",{defaultValue:"Loading..."}):"Loading...":j})]}):i(y,{type:"submit",disabled:l||o,variant:h,className:"dndev-w-full",style:{gridColumn:"1 / -1"},children:l||o?n?n("loading",{defaultValue:"Loading..."}):"Loading...":b||(n?n("submit",{defaultValue:"Submit"}):"Submit")})]})})}function ee(m){return i(X,{children:i(Z,{...m})})}var me=ee;export{ee as EntityFormRenderer,me as default};
|
|
1
|
+
"use client";import{jsx as o,Fragment as z,jsxs as m}from"react/jsx-runtime";import{useEffect as D,useId as q,useMemo as A}from"react";import{FormProvider as B}from"react-hook-form";import{Button as g,Stack as G,Spinner as H}from"@donotdev/components";import{useTranslation as F}from"@donotdev/core";import{DisplayFieldRenderer as J}from"./DisplayFieldRenderer";import{FormFieldRenderer as K}from"./FormFieldRenderer";import{UploadProvider as O}from"../contexts/UploadContext";import{useEntityForm as Q}from"../forms/hooks/useEntityForm";function V({entity:a,onSubmit:T,t:S,className:w="",submitText:u,loading:C=!1,defaultValues:e,submitVariant:p="primary",secondaryButtonText:d,secondaryButtonVariant:I="outline",onSecondarySubmit:c,viewerRole:k,operation:l=e?"edit":"create",autoSave:N=l==="create",formId:j}){const P=q(),f=j??`entity-form-${a.name}-${P}`,$=`entity-${a.name.toLowerCase()}`,{t:E}=F($),{t:v}=F("crud"),s=S||E,b=Q(a,{formId:f,operation:l,defaultValues:e,viewerRole:k,t:s,autoSave:N}),{control:R,handleSubmit:h,formState:{errors:_},fields:L,formStatus:n,uploadProgress:i,cleanup:x}=b;D(()=>x,[x]);const M=C||l==="edit"&&!e,r=A(()=>n==="uploading"?{loading:!0,loadingText:i<100?`Uploading ${Math.round(i)}%...`:"Processing...",progress:i}:n==="validating"?{loading:!0,loadingText:"Validating..."}:n==="submitting"?{loading:!0,loadingText:"Saving..."}:{loading:!1},[n,i]);return o(B,{...b,children:o(O,{formId:f,children:m("div",{style:{position:"relative",width:"100%",gridColumn:"1 / -1",display:"contents"},children:[M&&o(H,{overlay:!0}),m("form",{onSubmit:h(T),noValidate:!0,className:w,style:{width:"100%",gridColumn:"1 / -1",display:"contents"},children:[L.map(({name:t,config:y,editable:U})=>U?o(K,{name:t,config:y,control:R,errors:_,t:s},t):o(J,{name:t,config:y,value:e?.[t],t:s},t)),o(G,{direction:d?"row":"column",gap:"tight",style:{gridColumn:"1 / -1",position:"sticky",bottom:0,backgroundColor:"var(--background)",borderTop:"1px solid var(--border)",paddingTop:"var(--gap-md)",paddingBottom:"var(--gap-md)",zIndex:10,marginTop:"var(--gap-lg)"},children:d?m(z,{children:[o(g,{type:"submit",loading:r.loading,loadingText:r.loadingText,progress:r.progress,variant:p,className:"dndev-w-full",children:u||v("form.submit",{defaultValue:"Submit"})}),o(g,{type:"button",onClick:()=>c&&h(c)(),loading:r.loading,loadingText:r.loadingText,progress:r.progress,variant:I,className:"dndev-w-full",children:d})]}):o(g,{type:"submit",loading:r.loading,loadingText:r.loadingText,progress:r.progress,variant:p,className:"dndev-w-full",children:u||v("form.submit",{defaultValue:"Submit"})})})]})]})})})}var ir=V;export{V as EntityFormRenderer,ir as default};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Entity } from '@donotdev/core';
|
|
2
|
+
export interface EntityListProps {
|
|
3
|
+
/** The entity definition */
|
|
4
|
+
entity: Entity;
|
|
5
|
+
/** Current user role (for UI toggle only - backend enforces security) */
|
|
6
|
+
userRole?: string;
|
|
7
|
+
/** Optional edit handler. If not provided, defaults to navigate(`/${entity.collection}/${id}`) */
|
|
8
|
+
onEdit?: (id: string) => void;
|
|
9
|
+
/** Optional view handler (row click). If not provided, defaults to navigate(`/${entity.collection}/${id}`) */
|
|
10
|
+
onView?: (id: string) => void;
|
|
11
|
+
/** Fields to show as filters (array of field names) */
|
|
12
|
+
filterFields?: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Entity List Component - Table view for admin/internal operations
|
|
16
|
+
*
|
|
17
|
+
* Features:
|
|
18
|
+
* - Filters section (collapsible) with actions and filter inputs
|
|
19
|
+
* - Results section (collapsible) with DataTable
|
|
20
|
+
* - Excel-like table display with formatted values
|
|
21
|
+
* - Edit and Delete actions (admin only)
|
|
22
|
+
*/
|
|
23
|
+
export declare function EntityList({ entity, userRole, onEdit, onView, filterFields, }: EntityListProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=EntityList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityList.d.ts","sourceRoot":"","sources":["../../src/components/EntityList.tsx"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAU7C,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kGAAkG;IAClG,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,8GAA8G;IAC9G,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,QAAkB,EAClB,MAAM,EACN,MAAM,EACN,YAAiB,GAClB,EAAE,eAAe,2CAsVjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as i,jsxs as m,Fragment as K}from"react/jsx-runtime";import{RefreshCw as N,Plus as U,Trash2 as W,Edit as X,Search as Y}from"lucide-react";import{useMemo as y,useCallback as f,useState as I}from"react";import{DataTable as Z,Button as b,Stack as k,ActionButton as ee,Section as R,Input as _,Select as te}from"@donotdev/components";import{useTranslation as B}from"@donotdev/core";import{useNavigate as le}from"@donotdev/ui";import{translateFieldLabel as P}from"../forms/utils";import{useCrud as ae}from"../useCrud";import{useCrudList as ne}from"../useCrudList";import{formatValue as re}from"./DisplayFieldRenderer";function ve({entity:a,userRole:oe="guest",onEdit:w,onView:C,filterFields:h=[]}){const p=le(),{data:E,loading:v,mutate:x}=ne(a),{delete:j}=ae(a),{t}=B("crud"),L=E?.items||[],Q=`entity-${a.name.toLowerCase()}`,{t:c}=B(Q),[s,T]=I({}),[g,M]=I(""),q=f(async()=>{await x()},[x]),F=f(e=>{w?w(e):p(`/${a.collection}/${e}`)},[w,p,a.collection]),z=f(e=>{C?C(e):p(`/${a.collection}/${e}`)},[C,p,a.collection]),D=f(async e=>{await j(e)},[j]),V=f((e,o)=>{T(n=>({...n,[e]:o||void 0}))},[]),$=f(()=>{T({})},[]),O=y(()=>{let e=L;if(g){const o=g.toLowerCase();e=e.filter(n=>Object.values(n).some(l=>l==null?!1:String(l).toLowerCase().includes(o)))}return h.length>0&&Object.keys(s).length>0&&(e=e.filter(o=>Object.entries(s).every(([n,l])=>{if(!l)return!0;const r=o[n];if(r==null)return!1;const u=String(l).toLowerCase();return String(r).toLowerCase().includes(u)}))),e},[L,g,s,h.length]),G=y(()=>h.length===0?null:m(k,{direction:"row",wrap:"wrap",children:[h.map(e=>{const o=a.fields[e];if(!o)return null;const n=P(e,o,c),l=o.type||"text";if(l==="select"||l==="radio"){const r=o.validation?.options||[],u=Array.isArray(r)?r:typeof r=="function"?r():[];return i(te,{label:n,value:s[e]||"",onValueChange:d=>V(e,d),options:u.map(d=>({value:d.value,label:d.label})),placeholder:t("filter.selectPlaceholder",{defaultValue:"All"})},e)}return i(_,{label:n,value:s[e]||"",onChange:r=>V(e,r.target.value),placeholder:t("filter.placeholder",{defaultValue:"Filter..."})},e)}),Object.keys(s).length>0&&i(b,{variant:"outline",onClick:$,children:t("filter.clear",{defaultValue:"Clear Filters"})})]}),[h,a.fields,c,t,s,V,$]),H=y(()=>{const o=(a.listFields||Object.keys(a.fields)).map(n=>{const l=a.fields[n];if(!l)return null;const r=P(n,l,c),u=l.type||"text";return{key:n,title:r,dataIndex:n,sortable:!0,filterable:!0,align:u==="number"||u==="range"?"end":"start",render:(J,se)=>re(J,l,c,{compact:!0})}}).filter(Boolean);return o.unshift({key:"_actions",title:"",dataIndex:void 0,sortable:!1,filterable:!1,width:120,align:"center",render:(n,l)=>m(k,{direction:"row",gap:"tight",align:"center",justify:"center",children:[i(b,{variant:"outline",icon:X,onClick:r=>{r.stopPropagation(),F(l.id)},"aria-label":t("edit",{defaultValue:"Edit"})}),i(ee,{action:async()=>{await D(l.id)},confirmText:t("delete.confirm",{defaultValue:"Are you sure you want to delete this item?"}),confirmTitle:t("delete.title",{defaultValue:"Delete Item"}),loadingText:t("delete.loading",{defaultValue:"Deleting..."}),variant:"destructive",icon:W,"aria-label":t("delete",{defaultValue:"Delete"}),children:t("delete",{defaultValue:"Delete"})})]})}),o},[a,c,t,F,D]),A=c("name",{defaultValue:a.name}),S=O.length;return m(K,{children:[m(R,{title:t("filters.title",{entity:A,defaultValue:`Browse ${A} - Filters`}),collapsible:!0,defaultOpen:!0,children:[m(k,{direction:"row",gap:"tight",align:"center",className:"dndev-w-full",children:[i("div",{className:"dndev-flex-1",children:i(_,{placeholder:t("search.placeholder",{defaultValue:"Search..."}),value:g,onChange:e=>M(e.target.value),icon:Y,className:"dndev-w-full"})}),i(b,{icon:N,variant:"outline",onClick:q,disabled:v,display:"compact","aria-label":t("refresh",{defaultValue:"Refresh"})}),i(b,{icon:U,onClick:()=>p(`/${a.collection}/new`),display:"compact",children:t("addNew",{defaultValue:"Add New"})})]}),G]}),i(R,{title:v?t("results.title.fetching",{defaultValue:"Fetching..."}):t("results.title.count",{count:S,defaultValue:S===1?"Found 1 occurrence":`Found ${S} occurrences`}),collapsible:!0,defaultOpen:!0,children:i(Z,{data:O,columns:H,sortable:!0,filterable:!1,searchable:!1,pagination:!0,loading:v,onRowClick:e=>z(e.id)})})]})}export{ve as EntityList};
|
|
@@ -1,17 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
* @fileoverview FormFieldRenderer component
|
|
3
|
-
* @description Renders form fields using FieldRegistry - no switch statement
|
|
4
|
-
*
|
|
5
|
-
* @version 0.0.1
|
|
6
|
-
* @since 0.0.1
|
|
7
|
-
* @author AMBROISE PARK Consulting
|
|
8
|
-
*/
|
|
1
|
+
import type { EntityField, FieldType, ValueTypeForField } from '@donotdev/core';
|
|
9
2
|
import type { ReactElement } from 'react';
|
|
10
3
|
import type { Control, FieldValues } from 'react-hook-form';
|
|
11
|
-
import
|
|
4
|
+
import '../builtinFieldTypes';
|
|
12
5
|
interface FormFieldRendererBaseProps<T extends FieldType = FieldType> {
|
|
13
6
|
name: string;
|
|
14
|
-
config:
|
|
7
|
+
config: EntityField<T>;
|
|
15
8
|
t: (key: string, options?: Record<string, any>) => string;
|
|
16
9
|
}
|
|
17
10
|
interface UncontrolledProps<T extends FieldType> extends FormFieldRendererBaseProps<T> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/FormFieldRenderer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FormFieldRenderer.d.ts","sourceRoot":"","sources":["../../src/components/FormFieldRenderer.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAKhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM5D,OAAO,sBAAsB,CAAC;AAM9B,UAAU,0BAA0B,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;CAC3D;AAED,UAAU,iBAAiB,CACzB,CAAC,SAAS,SAAS,CACnB,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACrC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,UAAU,eAAe,CACvB,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,CAC9C,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,MAAM,sBAAsB,CAChC,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,IAC5C,iBAAiB,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAE5D;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,EACA,IAAI,EACJ,MAAM,EACN,CAAC,EACD,GAAG,KAAK,EACT,EAAE,sBAAsB,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,YAAY,CA2FxD;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{jsx as l}from"react/jsx-runtime";import{
|
|
1
|
+
"use client";import{jsx as l}from"react/jsx-runtime";import{handleError as f}from"@donotdev/core";import{getFieldRegistry as v}from"../FieldRegistry";import{ControlledTextField as F}from"./controlled";import{TextFieldComponent as T}from"./form/fields";import"../builtinFieldTypes";const h=v();function g({name:r,config:e,t,...o}){const a=s=>d=>{try{s(d)}catch(n){f(n,{userMessage:`Error updating field ${e.label||r}`,context:{fieldName:r,fieldType:e.type},severity:"warning"})}},i="control"in o&&o.control,p=e.type==="submit"||e.type==="reset";if(i&&!p){const{control:s,errors:d}=o,n={control:s,errors:d,fieldConfig:{...e,label:e.label||r},t,onChange:a(()=>{})},c=h.getControlledComponent(e.type);return c?l(c,{...n}):(f(new Error(`Unregistered field type: ${e.type}`),{userMessage:t("errors.unsupportedFieldType",{type:e.type}),context:{fieldName:r,fieldType:e.type},severity:"warning"}),l(F,{...n,fieldConfig:{...e,type:"text"}}))}const x=i&&p?{name:r,config:e,t,value:void 0,onChange:()=>{},error:void 0}:o,{value:u,onChange:b,error:y}=x,C=a(b),m=h.getUncontrolledComponent(e.type);return m?l(m,{name:r,label:e.label||r,value:u,onChange:C,error:y,t,config:e,...e.options}):l(T,{label:e.label||r,value:u,onChange:C,error:y||void 0,...e.options})}var P=g;export{g as FormFieldRenderer,P as default};
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* @fileoverview FormLayout component
|
|
3
|
-
* @description Enhanced form layout with modern UX features
|
|
4
|
-
*
|
|
5
|
-
* @version 0.0.1
|
|
6
|
-
* @since 0.0.1
|
|
7
|
-
* @author AMBROISE PARK Consulting
|
|
8
|
-
*/
|
|
9
|
-
import { type FormEventHandler, type ReactNode } from 'react';
|
|
1
|
+
import type { FormEventHandler, ReactNode } from 'react';
|
|
10
2
|
import type { UseFormReturn, FieldValues } from 'react-hook-form';
|
|
11
3
|
export interface FormDnDevLayoutProps<T extends FieldValues> {
|
|
12
4
|
/** The title of the form */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../src/components/FormLayout.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../src/components/FormLayout.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,WAAW;IACzD,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,QAAQ,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC5C,iCAAiC;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,sCAAsC;IACtC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC9B,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,QAAA,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,mIAaxC,oBAAoB,CAAC,CAAC,CAAC,4CA4GzB,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ControlledFieldProps } from '../types';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* ControlledAddressField - Explicit controlled component for address inputs
|
|
5
|
+
* NO ref forwarding - complex component handles its own refs
|
|
6
|
+
*/
|
|
7
|
+
export declare function ControlledAddressField(props: ControlledFieldProps): ReactElement;
|
|
8
|
+
//# sourceMappingURL=ControlledAddressField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledAddressField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledAddressField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAyBd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as l}from"react/jsx-runtime";import{Controller as f}from"react-hook-form";import{AddressFieldComponent as m}from"../../form/fields";import{convertValidationRules as u}from"../types";function h(s){const{control:a,errors:r,fieldConfig:n,t:d}=s,{name:e,label:c,validation:o}=n,t=(n.options||{}).fieldSpecific;return l(f,{name:e,control:a,rules:o?u(o):void 0,render:({field:i})=>l(m,{label:d(c),value:i.value??void 0,onChange:p=>i.onChange(p),error:!!r[e],helperText:r[e]?.message,required:o?.required,enableGoogleMaps:t?.enableGoogleMaps,extractDistrictCode:t?.extractDistrictCode})})}export{h as ControlledAddressField};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ControlledFieldProps } from '../types';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* ControlledDateField - Explicit controlled component for date inputs
|
|
5
|
+
* Forwards Controller's ref for focus/validation (simple input)
|
|
6
|
+
*/
|
|
7
|
+
export declare function ControlledDateField(props: ControlledFieldProps): ReactElement;
|
|
8
|
+
//# sourceMappingURL=ControlledDateField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledDateField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledDateField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAiCd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as n}from"react/jsx-runtime";import{Controller as p}from"react-hook-form";import{DateFieldComponent as f}from"../../form/fields";import{convertValidationRules as C}from"../types";function j(a){const{control:l,errors:r,fieldConfig:m,t:i}=a,{name:e,label:d,validation:o,type:s}=m,c={date:"date","datetime-local":"datetime-local",month:"month",time:"time",week:"week"}[s]||"date";return n(p,{name:e,control:l,rules:o?C(o):void 0,render:({field:t})=>n(f,{...t,label:i(d),value:t.value??null,onChange:u=>t.onChange(u),error:!!r[e],helperText:r[e]?.message,required:o?.required,mode:c})})}export{j as ControlledDateField};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ControlledFieldProps } from '../types';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* ControlledGeoPointField - Explicit controlled component for geographic coordinates
|
|
5
|
+
* NO ref forwarding - complex component handles its own refs
|
|
6
|
+
*/
|
|
7
|
+
export declare function ControlledGeoPointField(props: ControlledFieldProps): ReactElement;
|
|
8
|
+
//# sourceMappingURL=ControlledGeoPointField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledGeoPointField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledGeoPointField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAsCd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as a}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{GeoPointFieldComponent as p}from"../../form/fields";import{convertValidationRules as C}from"../types";function b(l){const{control:i,errors:t,fieldConfig:s,t:g}=l,{name:n,label:m,validation:o}=s;return a(u,{name:n,control:i,rules:o?C(o):void 0,render:({field:e})=>{const c=r=>{if("target"in r)try{const d=JSON.parse(r.target.value);e.onChange(d)}catch{e.onChange({lat:0,lng:0})}else e.onChange(r||{lat:0,lng:0})};return a(p,{label:g(m),value:e.value||{lat:0,lng:0},onChange:c,error:!!t[n],helperText:t[n]?.message,required:o?.required})}})}export{b as ControlledGeoPointField};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ControlledFieldProps } from '../types';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* ControlledMapField - Explicit controlled component for map data inputs
|
|
5
|
+
* NO ref forwarding - complex component handles its own refs
|
|
6
|
+
*/
|
|
7
|
+
export declare function ControlledMapField(props: ControlledFieldProps): ReactElement;
|
|
8
|
+
//# sourceMappingURL=ControlledMapField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledMapField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledMapField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAsCd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as a}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{MapFieldComponent as g}from"../../form/fields";import{convertValidationRules as C}from"../types";function b(l){const{control:i,errors:t,fieldConfig:s,t:m}=l,{name:r,label:c,validation:n}=s;return a(u,{name:r,control:i,rules:n?C(n):void 0,render:({field:e})=>{const p=o=>{if("target"in o)try{const d=JSON.parse(o.target.value);e.onChange(d)}catch{e.onChange({})}else e.onChange(o||{})};return a(g,{label:m(c),value:e.value||{},onChange:p,error:!!t[r],helperText:t[r]?.message,required:n?.required})}})}export{b as ControlledMapField};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ControlledFieldProps } from '../types';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* ControlledMultiInputField - Explicit controlled component for array of text inputs
|
|
5
|
+
* NO ref forwarding - complex component handles its own refs
|
|
6
|
+
*/
|
|
7
|
+
export declare function ControlledMultiInputField(props: ControlledFieldProps): ReactElement;
|
|
8
|
+
//# sourceMappingURL=ControlledMultiInputField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledMultiInputField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledMultiInputField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAoCd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as t}from"react/jsx-runtime";import{Controller as d}from"react-hook-form";import{MultiInputTextFieldComponent as C}from"../../form/fields";import{convertValidationRules as g}from"../types";function x(a){const{control:l,errors:h,fieldConfig:s,t:i}=a,{name:u,label:c,validation:e,options:m={}}=s;return t(d,{name:u,control:l,rules:e?g(e):void 0,render:({field:r})=>{const p=n=>{if(Array.isArray(n))r.onChange(n);else try{const o=JSON.parse(n.target.value);r.onChange(Array.isArray(o)?o:[])}catch{r.onChange([])}};return t(C,{label:i(c),value:Array.isArray(r.value)?r.value:[],onChange:p,required:e?.required,className:m.className})}})}export{x as ControlledMultiInputField};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ControlledFieldProps } from '../types';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* ControlledRichTextField - Explicit controlled component for rich text editor
|
|
5
|
+
* NO ref forwarding - complex component handles its own refs
|
|
6
|
+
*/
|
|
7
|
+
export declare function ControlledRichTextField(props: ControlledFieldProps): ReactElement;
|
|
8
|
+
//# sourceMappingURL=ControlledRichTextField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledRichTextField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/complex/ControlledRichTextField.tsx"],"names":[],"mappings":"AAOA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CAuBd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as t}from"react/jsx-runtime";import{Controller as u}from"react-hook-form";import{RichTextComponent as h}from"../../form/fields";import{convertValidationRules as f}from"../types";function R(a){const{control:i,errors:r,fieldConfig:s,t:m,placeholder:c}=a,{name:e,label:d,validation:o,options:l={}}=s;return t(u,{name:e,control:i,rules:o?f(o):void 0,render:({field:n})=>t(h,{label:m(d),value:n.value??"",onChange:p=>n.onChange(p),error:r[e]?.message,helperText:r[e]?.message,required:o?.required,placeholder:c||l.placeholder,className:l.className})})}export{R as ControlledRichTextField};
|