@donotdev/crud 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CrudService.d.ts +30 -60
- package/dist/CrudService.d.ts.map +1 -1
- package/dist/CrudService.js +1 -1
- package/dist/CrudStore.d.ts +1 -94
- package/dist/CrudStore.d.ts.map +1 -1
- package/dist/CrudStore.js +1 -1
- package/dist/FieldRegistry.js +1 -1
- package/dist/adapters/FirestoreAdapter.d.ts +3 -1
- package/dist/adapters/FirestoreAdapter.d.ts.map +1 -1
- package/dist/adapters/FirestoreAdapter.js +1 -1
- package/dist/adapters/FunctionsAdapter.d.ts +8 -1
- package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
- package/dist/adapters/FunctionsAdapter.js +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/builtinFieldTypes.d.ts +17 -4
- package/dist/builtinFieldTypes.d.ts.map +1 -1
- package/dist/builtinFieldTypes.js +1 -1
- package/dist/components/CrudButton.js +1 -1
- package/dist/components/DisplayFieldRenderer.d.ts +2 -0
- package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
- package/dist/components/DisplayFieldRenderer.js +1 -1
- package/dist/components/EntityDisplayRenderer.d.ts +3 -3
- package/dist/components/EntityDisplayRenderer.d.ts.map +1 -1
- package/dist/components/EntityDisplayRenderer.js +1 -1
- package/dist/components/EntityFilters.d.ts +61 -0
- package/dist/components/EntityFilters.d.ts.map +1 -0
- package/dist/components/EntityFilters.js +1 -0
- package/dist/components/EntityFormRenderer.d.ts +22 -1
- package/dist/components/EntityFormRenderer.d.ts.map +1 -1
- package/dist/components/EntityFormRenderer.js +1 -1
- package/dist/components/FormFieldRenderer.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.js +1 -1
- package/dist/components/FormLayout.js +1 -1
- package/dist/components/controlled/complex/ControlledAddressField.d.ts +3 -0
- package/dist/components/controlled/complex/ControlledAddressField.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
- package/dist/components/controlled/complex/ControlledDateField.d.ts +3 -0
- package/dist/components/controlled/complex/ControlledDateField.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledDateField.js +1 -1
- package/dist/components/controlled/complex/ControlledGeoPointField.d.ts +3 -0
- package/dist/components/controlled/complex/ControlledGeoPointField.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
- package/dist/components/controlled/complex/ControlledMapField.d.ts +3 -0
- package/dist/components/controlled/complex/ControlledMapField.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledMapField.js +1 -1
- package/dist/components/controlled/complex/ControlledMultiInputField.d.ts +3 -0
- package/dist/components/controlled/complex/ControlledMultiInputField.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
- package/dist/components/controlled/complex/ControlledRichTextField.d.ts +3 -0
- package/dist/components/controlled/complex/ControlledRichTextField.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
- package/dist/components/controlled/complex/ControlledTimestampField.d.ts +3 -0
- package/dist/components/controlled/complex/ControlledTimestampField.d.ts.map +1 -1
- package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
- package/dist/components/controlled/complex/index.d.ts.map +1 -1
- package/dist/components/controlled/complex/index.js +1 -1
- package/dist/components/controlled/file/ControlledDocumentField.d.ts +3 -0
- package/dist/components/controlled/file/ControlledDocumentField.d.ts.map +1 -1
- package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
- package/dist/components/controlled/file/ControlledFileField.d.ts +3 -0
- package/dist/components/controlled/file/ControlledFileField.d.ts.map +1 -1
- package/dist/components/controlled/file/ControlledFileField.js +1 -1
- package/dist/components/controlled/file/ControlledImageField.d.ts +3 -0
- package/dist/components/controlled/file/ControlledImageField.d.ts.map +1 -1
- package/dist/components/controlled/file/ControlledImageField.js +1 -1
- package/dist/components/controlled/file/ControlledMultiDocumentField.d.ts +3 -0
- package/dist/components/controlled/file/ControlledMultiDocumentField.d.ts.map +1 -1
- package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
- package/dist/components/controlled/file/ControlledMultiFileField.d.ts +3 -0
- package/dist/components/controlled/file/ControlledMultiFileField.d.ts.map +1 -1
- package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
- package/dist/components/controlled/file/ControlledMultiImageField.d.ts +3 -0
- package/dist/components/controlled/file/ControlledMultiImageField.d.ts.map +1 -1
- package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
- package/dist/components/controlled/file/index.d.ts.map +1 -1
- package/dist/components/controlled/file/index.js +1 -1
- package/dist/components/controlled/index.d.ts +4 -0
- package/dist/components/controlled/index.d.ts.map +1 -1
- package/dist/components/controlled/index.js +1 -1
- package/dist/components/controlled/input/ControlledCheckboxField.d.ts +3 -0
- package/dist/components/controlled/input/ControlledCheckboxField.d.ts.map +1 -1
- package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
- package/dist/components/controlled/input/ControlledCurrencyField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledCurrencyField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledCurrencyField.js +1 -0
- package/dist/components/controlled/input/ControlledGdprConsentField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledGdprConsentField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -0
- package/dist/components/controlled/input/ControlledNumberField.d.ts +3 -0
- package/dist/components/controlled/input/ControlledNumberField.d.ts.map +1 -1
- package/dist/components/controlled/input/ControlledNumberField.js +1 -1
- package/dist/components/controlled/input/ControlledPasswordField.d.ts +3 -0
- package/dist/components/controlled/input/ControlledPasswordField.d.ts.map +1 -1
- package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
- package/dist/components/controlled/input/ControlledPhoneField.d.ts +3 -0
- package/dist/components/controlled/input/ControlledPhoneField.d.ts.map +1 -1
- package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
- package/dist/components/controlled/input/ControlledPriceField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledPriceField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledPriceField.js +1 -0
- package/dist/components/controlled/input/ControlledRangeField.d.ts +3 -0
- package/dist/components/controlled/input/ControlledRangeField.d.ts.map +1 -1
- package/dist/components/controlled/input/ControlledRangeField.js +1 -1
- package/dist/components/controlled/input/ControlledRatingField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledRatingField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledRatingField.js +1 -0
- package/dist/components/controlled/input/ControlledSwitchField.d.ts +3 -0
- package/dist/components/controlled/input/ControlledSwitchField.d.ts.map +1 -1
- package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
- package/dist/components/controlled/input/ControlledTextField.d.ts +3 -0
- package/dist/components/controlled/input/ControlledTextField.d.ts.map +1 -1
- package/dist/components/controlled/input/ControlledTextField.js +1 -1
- package/dist/components/controlled/input/ControlledTextareaField.d.ts +3 -0
- package/dist/components/controlled/input/ControlledTextareaField.d.ts.map +1 -1
- package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
- package/dist/components/controlled/input/index.d.ts +4 -0
- package/dist/components/controlled/input/index.d.ts.map +1 -1
- package/dist/components/controlled/input/index.js +1 -1
- package/dist/components/controlled/select/ControlledComboboxField.d.ts +4 -0
- package/dist/components/controlled/select/ControlledComboboxField.d.ts.map +1 -1
- package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
- package/dist/components/controlled/select/ControlledDropdownField.d.ts +4 -0
- package/dist/components/controlled/select/ControlledDropdownField.d.ts.map +1 -1
- package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
- package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts +4 -0
- package/dist/components/controlled/select/ControlledMultiDropdownField.d.ts.map +1 -1
- package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
- package/dist/components/controlled/select/ControlledRadioField.d.ts +4 -0
- package/dist/components/controlled/select/ControlledRadioField.d.ts.map +1 -1
- package/dist/components/controlled/select/ControlledRadioField.js +1 -1
- package/dist/components/controlled/select/ControlledYearField.d.ts +9 -0
- package/dist/components/controlled/select/ControlledYearField.d.ts.map +1 -0
- package/dist/components/controlled/select/ControlledYearField.js +1 -0
- package/dist/components/controlled/select/index.d.ts +1 -0
- package/dist/components/controlled/select/index.d.ts.map +1 -1
- package/dist/components/controlled/select/index.js +1 -1
- package/dist/components/controlled/types.d.ts +6 -0
- package/dist/components/controlled/types.d.ts.map +1 -1
- package/dist/components/controlled/types.js +1 -1
- package/dist/components/fields/display/AvatarFieldDisplay.d.ts +23 -0
- package/dist/components/fields/display/AvatarFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/AvatarFieldDisplay.js +1 -0
- package/dist/components/fields/display/BadgeFieldDisplay.d.ts +21 -0
- package/dist/components/fields/display/BadgeFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/BadgeFieldDisplay.js +1 -0
- package/dist/components/fields/display/ButtonFieldDisplay.d.ts +29 -0
- package/dist/components/fields/display/ButtonFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/ButtonFieldDisplay.js +1 -0
- package/dist/components/fields/display/CheckboxFieldDisplay.d.ts +21 -0
- package/dist/components/fields/display/CheckboxFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -0
- package/dist/components/fields/display/DateFieldDisplay.d.ts +24 -0
- package/dist/components/fields/display/DateFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/DateFieldDisplay.js +1 -0
- package/dist/components/fields/display/DropdownDisplay.d.ts +21 -0
- package/dist/components/fields/display/DropdownDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/DropdownDisplay.js +1 -0
- package/dist/components/fields/display/FileFieldDisplay.d.ts +21 -0
- package/dist/components/fields/display/FileFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/FileFieldDisplay.js +1 -0
- package/dist/components/fields/display/GeoPointFieldDisplay.d.ts +25 -0
- package/dist/components/fields/display/GeoPointFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -0
- package/dist/components/fields/display/HiddenFieldDisplay.d.ts +30 -0
- package/dist/components/fields/display/HiddenFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/HiddenFieldDisplay.js +1 -0
- package/dist/components/fields/display/ImageFieldDisplay.d.ts +24 -0
- package/dist/components/fields/display/ImageFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/ImageFieldDisplay.js +1 -0
- package/dist/components/fields/display/LinkFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/LinkFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/LinkFieldDisplay.js +1 -0
- package/dist/components/fields/display/MapFieldDisplay.d.ts +25 -0
- package/dist/components/fields/display/MapFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/MapFieldDisplay.js +1 -0
- package/dist/components/fields/display/MultiDropdownDisplay.d.ts +22 -0
- package/dist/components/fields/display/MultiDropdownDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/MultiDropdownDisplay.js +1 -0
- package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -0
- package/dist/components/fields/display/NumberFieldDisplay.d.ts +24 -0
- package/dist/components/fields/display/NumberFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/NumberFieldDisplay.js +1 -0
- package/dist/components/fields/display/PasswordFieldDisplay.d.ts +24 -0
- package/dist/components/fields/display/PasswordFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/PasswordFieldDisplay.js +1 -0
- package/dist/components/fields/display/PhoneNumberDisplay.d.ts +22 -0
- package/dist/components/fields/display/PhoneNumberDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/PhoneNumberDisplay.js +1 -0
- package/dist/components/fields/display/RadioFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/RadioFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/RadioFieldDisplay.js +1 -0
- package/dist/components/fields/display/RangeFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/RangeFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/RangeFieldDisplay.js +1 -0
- package/dist/components/fields/display/ReferenceFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/ReferenceFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -0
- package/dist/components/fields/display/RichTextDisplay.d.ts +25 -0
- package/dist/components/fields/display/RichTextDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/RichTextDisplay.js +61 -0
- package/dist/components/fields/display/TextAreaDisplay.d.ts +22 -0
- package/dist/components/fields/display/TextAreaDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/TextAreaDisplay.js +1 -0
- package/dist/components/fields/display/TextFieldDisplay.d.ts +42 -0
- package/dist/components/fields/display/TextFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/TextFieldDisplay.js +1 -0
- package/dist/components/fields/display/TimestampFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/TimestampFieldDisplay.js +1 -0
- package/dist/components/fields/display/index.d.ts +32 -0
- package/dist/components/fields/display/index.d.ts.map +1 -0
- package/dist/components/fields/display/index.js +1 -0
- package/dist/components/form/fields/AddressFieldComponent.js +1 -1
- package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
- package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
- package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
- package/dist/components/form/fields/CheckboxFieldComponent.d.ts +3 -3
- package/dist/components/form/fields/CheckboxFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
- package/dist/components/form/fields/ComboboxComponent.d.ts +6 -0
- package/dist/components/form/fields/ComboboxComponent.d.ts.map +1 -1
- package/dist/components/form/fields/ComboboxComponent.js +1 -1
- package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
- package/dist/components/form/fields/DateFieldComponent.js +1 -1
- package/dist/components/form/fields/DocumentFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
- package/dist/components/form/fields/DropdownComponent.js +1 -1
- 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/GdprConsentFieldComponent.d.ts +26 -0
- package/dist/components/form/fields/GdprConsentFieldComponent.d.ts.map +1 -0
- package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -0
- package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
- package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
- package/dist/components/form/fields/ImageFieldComponent.d.ts +3 -2
- 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.js +1 -1
- package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
- package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
- package/dist/components/form/fields/NumberFieldComponent.js +1 -1
- package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
- 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/PriceFieldComponent.d.ts +34 -0
- package/dist/components/form/fields/PriceFieldComponent.d.ts.map +1 -0
- package/dist/components/form/fields/PriceFieldComponent.js +1 -0
- package/dist/components/form/fields/RadioFieldComponent.js +1 -1
- package/dist/components/form/fields/RangeFieldComponent.js +1 -1
- package/dist/components/form/fields/RatingFieldComponent.d.ts +37 -0
- package/dist/components/form/fields/RatingFieldComponent.d.ts.map +1 -0
- package/dist/components/form/fields/RatingFieldComponent.js +1 -0
- package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
- package/dist/components/form/fields/RichTextComponent.d.ts +2 -21
- package/dist/components/form/fields/RichTextComponent.d.ts.map +1 -1
- package/dist/components/form/fields/RichTextComponent.js +1 -1
- package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
- 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.js +1 -1
- package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
- package/dist/components/form/fields/index.d.ts +7 -1
- 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 +1 -1
- package/dist/components/form/fields/internal/TiptapEditor.d.ts.map +1 -1
- package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
- package/dist/components/form/fields/types.d.ts +33 -0
- package/dist/components/form/fields/types.d.ts.map +1 -0
- package/dist/components/form/fields/types.js +0 -0
- package/dist/components/form/internal/ImageViewerDialog.d.ts +2 -1
- package/dist/components/form/internal/ImageViewerDialog.d.ts.map +1 -1
- package/dist/components/form/internal/ImageViewerDialog.js +1 -1
- package/dist/components/index.d.ts +4 -8
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/contexts/UploadContext.d.ts.map +1 -1
- package/dist/contexts/UploadContext.js +1 -1
- package/dist/contexts/index.js +1 -1
- package/dist/fieldTypeRegistry.d.ts +92 -0
- package/dist/fieldTypeRegistry.d.ts.map +1 -0
- package/dist/fieldTypeRegistry.js +1 -0
- package/dist/forms/hooks/index.js +1 -1
- package/dist/forms/hooks/useController.js +1 -1
- package/dist/forms/hooks/useEntityField.js +1 -1
- package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
- package/dist/forms/hooks/useEntityForm.js +1 -1
- package/dist/forms/index.d.ts +2 -2
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -1
- package/dist/forms/types.d.ts +15 -0
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/utils/getFieldsForOperation.js +1 -1
- package/dist/forms/utils/index.d.ts +0 -2
- package/dist/forms/utils/index.d.ts.map +1 -1
- package/dist/forms/utils/index.js +1 -1
- package/dist/forms/utils/isFieldEditable.js +1 -1
- package/dist/forms/utils/translateFieldLabel.js +1 -1
- package/dist/forms/utils/validateEntity.js +1 -1
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useEntityFavorites.d.ts +53 -0
- package/dist/hooks/useEntityFavorites.d.ts.map +1 -0
- package/dist/hooks/useEntityFavorites.js +1 -0
- package/dist/hooks/useFileUpload.d.ts.map +1 -1
- package/dist/hooks/useFileUpload.js +1 -1
- package/dist/hooks/useFormNavigationGuard.d.ts +34 -0
- package/dist/hooks/useFormNavigationGuard.d.ts.map +1 -0
- package/dist/hooks/useFormNavigationGuard.js +1 -0
- package/dist/hooks/useRelatedItems.d.ts +37 -0
- package/dist/hooks/useRelatedItems.d.ts.map +1 -0
- package/dist/hooks/useRelatedItems.js +1 -0
- package/dist/hooks/useUnsavedChangesWarning.d.ts +51 -0
- package/dist/hooks/useUnsavedChangesWarning.d.ts.map +1 -0
- package/dist/hooks/useUnsavedChangesWarning.js +1 -0
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/registerBuiltinFieldTypes.d.ts +6 -0
- package/dist/registerBuiltinFieldTypes.d.ts.map +1 -0
- package/dist/registerBuiltinFieldTypes.js +1 -0
- package/dist/stores/FormStore.d.ts +17 -0
- package/dist/stores/FormStore.d.ts.map +1 -1
- package/dist/stores/FormStore.js +1 -1
- package/dist/stores/UploadStore.js +1 -1
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.d.ts.map +1 -1
- package/dist/stores/index.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +202 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +0 -0
- package/dist/useBaseCrudList.d.ts +53 -0
- package/dist/useBaseCrudList.d.ts.map +1 -0
- package/dist/useBaseCrudList.js +1 -0
- package/dist/useCrud.d.ts +4 -8
- package/dist/useCrud.d.ts.map +1 -1
- package/dist/useCrud.js +1 -1
- package/dist/useCrudCardList.d.ts +10 -4
- package/dist/useCrudCardList.d.ts.map +1 -1
- package/dist/useCrudCardList.js +1 -1
- package/dist/useCrudList.d.ts +19 -5
- package/dist/useCrudList.d.ts.map +1 -1
- package/dist/useCrudList.js +1 -1
- package/dist/utils/collections.js +1 -1
- package/dist/utils/fileStorage.js +1 -1
- package/dist/utils/imageProcessing.js +1 -1
- package/dist/utils/imageStorage.js +1 -1
- package/dist/utils/imageUtils.js +1 -1
- package/dist/utils/mergeWithOptimistic.d.ts +5 -6
- package/dist/utils/mergeWithOptimistic.d.ts.map +1 -1
- package/dist/utils/mergeWithOptimistic.js +1 -1
- package/dist/utils/scopeUtils.d.ts +38 -0
- package/dist/utils/scopeUtils.d.ts.map +1 -0
- package/dist/utils/scopeUtils.js +1 -0
- package/dist/utils/uploadValidation.d.ts.map +1 -1
- package/dist/utils/uploadValidation.js +1 -1
- package/package.json +24 -17
- package/dist/components/EntityCardList.d.ts +0 -27
- package/dist/components/EntityCardList.d.ts.map +0 -1
- package/dist/components/EntityCardList.js +0 -1
- package/dist/components/EntityList.d.ts +0 -24
- package/dist/components/EntityList.d.ts.map +0 -1
- package/dist/components/EntityList.js +0 -1
- package/dist/forms/utils/optionHelpers.d.ts +0 -54
- package/dist/forms/utils/optionHelpers.d.ts.map +0 -1
- package/dist/forms/utils/optionHelpers.js +0 -1
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared CRUD Types
|
|
3
|
+
* @description Types shared between CrudService and CrudStore.
|
|
4
|
+
*
|
|
5
|
+
* **Architecture:**
|
|
6
|
+
* - TanStack Query = single source of truth for data
|
|
7
|
+
* - CrudStore = only tracks optimistic metadata (optimisticData + originalData)
|
|
8
|
+
* - mergeWithOptimistic merges TanStack cache with optimistic data for display
|
|
9
|
+
*
|
|
10
|
+
* @version 0.0.1
|
|
11
|
+
* @since 0.0.1
|
|
12
|
+
* @author AMBROISE PARK Consulting
|
|
13
|
+
*/
|
|
14
|
+
import type { dndevSchema, QueryClient } from '@donotdev/core';
|
|
15
|
+
import type { QueryOptions } from './adapters/FirestoreAdapter';
|
|
16
|
+
import type { PaginatedQueryResult } from './adapters/FunctionsAdapter';
|
|
17
|
+
/**
|
|
18
|
+
* Backend type for CRUD operations
|
|
19
|
+
*
|
|
20
|
+
* @version 0.0.1
|
|
21
|
+
* @since 0.0.1
|
|
22
|
+
* @author AMBROISE PARK Consulting
|
|
23
|
+
*/
|
|
24
|
+
export type BackendType = 'functions' | 'firestore';
|
|
25
|
+
/**
|
|
26
|
+
* Optimistic operation status
|
|
27
|
+
*/
|
|
28
|
+
export type OptimisticStatus = 'pending' | 'confirmed' | 'failed';
|
|
29
|
+
/**
|
|
30
|
+
* Optimistic operation metadata
|
|
31
|
+
* Contains both original data (for rollback) and current data (for display)
|
|
32
|
+
*/
|
|
33
|
+
export interface OptimisticMeta {
|
|
34
|
+
tempId: string;
|
|
35
|
+
originalData: unknown | null;
|
|
36
|
+
/** Current optimistic data to display (the new/updated value) */
|
|
37
|
+
optimisticData: unknown;
|
|
38
|
+
status: OptimisticStatus;
|
|
39
|
+
operation: 'add' | 'update' | 'delete';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Filter state type for list views
|
|
43
|
+
* Persists across navigation within CrudStore
|
|
44
|
+
*/
|
|
45
|
+
export type FilterState = Record<string, string | {
|
|
46
|
+
min?: string;
|
|
47
|
+
max?: string;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Collection UI state (filters, favorites toggle)
|
|
51
|
+
* Persists across navigation
|
|
52
|
+
*/
|
|
53
|
+
export interface CollectionUIState {
|
|
54
|
+
filters: FilterState;
|
|
55
|
+
showFavoritesOnly: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* CRUD store state interface
|
|
59
|
+
* Note: No data field - TanStack Query owns data, CrudStore only tracks optimistic ops
|
|
60
|
+
*
|
|
61
|
+
* @version 0.0.3
|
|
62
|
+
* @since 0.0.1
|
|
63
|
+
* @author AMBROISE PARK Consulting
|
|
64
|
+
*/
|
|
65
|
+
export interface CrudState {
|
|
66
|
+
backend: BackendType | null;
|
|
67
|
+
crudService: CrudServiceInterface | null;
|
|
68
|
+
/** Global flag to hide success toasts (set from app config) */
|
|
69
|
+
hideSuccessToasts: boolean;
|
|
70
|
+
collections: Record<string, {
|
|
71
|
+
loading: boolean;
|
|
72
|
+
error: Error | null;
|
|
73
|
+
lastUpdated: number;
|
|
74
|
+
/** Optimistic operation metadata keyed by document id */
|
|
75
|
+
optimistic: Record<string, OptimisticMeta>;
|
|
76
|
+
/** UI state: filters and favorites toggle (persists across navigation) */
|
|
77
|
+
ui: CollectionUIState;
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* CRUD store actions interface
|
|
82
|
+
* Note: No setData/getData - TanStack Query owns data, CrudStore only tracks optimistic ops
|
|
83
|
+
*
|
|
84
|
+
* @version 0.0.3
|
|
85
|
+
* @since 0.0.1
|
|
86
|
+
* @author AMBROISE PARK Consulting
|
|
87
|
+
*/
|
|
88
|
+
export interface CrudActions {
|
|
89
|
+
setCrudService: (service: CrudServiceInterface) => void;
|
|
90
|
+
setBackend: (backend: BackendType) => void;
|
|
91
|
+
/** Set global flag to hide success toasts (called from app bootstrap) */
|
|
92
|
+
setHideSuccessToasts: (hide: boolean) => void;
|
|
93
|
+
setLoading: (collection: string, loading: boolean) => void;
|
|
94
|
+
setError: (collection: string, error: Error | null) => void;
|
|
95
|
+
clearCollection: (collection: string) => void;
|
|
96
|
+
clearError: (collection: string) => void;
|
|
97
|
+
setFilters: (collection: string, filters: FilterState) => void;
|
|
98
|
+
setShowFavoritesOnly: (collection: string, show: boolean) => void;
|
|
99
|
+
getFilters: (collection: string) => FilterState;
|
|
100
|
+
getShowFavoritesOnly: (collection: string) => boolean;
|
|
101
|
+
/** Add item optimistically (before server confirms) */
|
|
102
|
+
addOptimistic: (collection: string, tempId: string, data: unknown) => void;
|
|
103
|
+
/** Confirm optimistic add - replace temp item with real item */
|
|
104
|
+
confirmOptimistic: (collection: string, tempId: string, realId: string, realData: unknown) => void;
|
|
105
|
+
/** Reject optimistic add - remove temp item */
|
|
106
|
+
rejectOptimistic: (collection: string, tempId: string) => void;
|
|
107
|
+
/** Update item optimistically */
|
|
108
|
+
updateOptimistic: (collection: string, id: string, data: unknown, originalData: unknown) => void;
|
|
109
|
+
/** Confirm optimistic update */
|
|
110
|
+
confirmUpdate: (collection: string, id: string) => void;
|
|
111
|
+
/** Reject optimistic update - restore original data */
|
|
112
|
+
rejectUpdate: (collection: string, id: string) => void;
|
|
113
|
+
/** Delete item optimistically (hide but keep for rollback) */
|
|
114
|
+
deleteOptimistic: (collection: string, id: string, originalData: unknown) => void;
|
|
115
|
+
/** Confirm optimistic delete - remove completely */
|
|
116
|
+
confirmDelete: (collection: string, id: string) => void;
|
|
117
|
+
/** Reject optimistic delete - restore item */
|
|
118
|
+
rejectDelete: (collection: string, id: string) => void;
|
|
119
|
+
getLoading: (collection: string) => boolean;
|
|
120
|
+
getError: (collection: string) => Error | null;
|
|
121
|
+
/** Check if item is optimistic (not yet confirmed by server) */
|
|
122
|
+
isOptimistic: (collection: string, id: string) => boolean;
|
|
123
|
+
/** Get optimistic status for an item */
|
|
124
|
+
getOptimisticStatus: (collection: string, id: string) => OptimisticStatus | null;
|
|
125
|
+
/** Get optimistic data for an item (for display during pending state) */
|
|
126
|
+
getOptimisticData: (collection: string, id: string) => unknown | null;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Store API type for CrudService - typed instead of any
|
|
130
|
+
* Used by CrudService to type the store it receives
|
|
131
|
+
*/
|
|
132
|
+
export type CrudStoreApi = {
|
|
133
|
+
getState: () => CrudState & CrudActions;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Cache options for read operations
|
|
137
|
+
*/
|
|
138
|
+
export interface CacheOptions {
|
|
139
|
+
/** Bypass cache and fetch directly from adapter */
|
|
140
|
+
noCache?: boolean;
|
|
141
|
+
/** Custom stale time in ms (default: Infinity) */
|
|
142
|
+
staleTime?: number;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Options for mutation operations (add, update, delete, set)
|
|
146
|
+
*/
|
|
147
|
+
export interface MutationOptions {
|
|
148
|
+
/**
|
|
149
|
+
* Override success toast behavior for this operation
|
|
150
|
+
* - true: always show toast
|
|
151
|
+
* - false: never show toast
|
|
152
|
+
* - undefined: use global setting (hideSuccessToasts)
|
|
153
|
+
*/
|
|
154
|
+
showSuccessToast?: boolean;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* CRUD Service Interface
|
|
158
|
+
* Complete interface for CRUD operations with caching and optimistic updates
|
|
159
|
+
*
|
|
160
|
+
* @version 0.0.4
|
|
161
|
+
* @since 0.0.1
|
|
162
|
+
* @author AMBROISE PARK Consulting
|
|
163
|
+
*/
|
|
164
|
+
export interface CrudServiceInterface {
|
|
165
|
+
initialize(backend: BackendType): Promise<void>;
|
|
166
|
+
setStore(store: CrudStoreApi): void;
|
|
167
|
+
/** Schema accepts unknown since OperationSchemas stores dndevSchema<unknown>. T is for return type. */
|
|
168
|
+
getListQueryOptions<T>(collection: string, queryOptions: QueryOptions, schema: dndevSchema<unknown>, cacheOptions?: CacheOptions, schemaType?: 'list' | 'listCard'): {
|
|
169
|
+
queryKey: readonly string[];
|
|
170
|
+
queryFn: () => Promise<PaginatedQueryResult<T>>;
|
|
171
|
+
staleTime: number;
|
|
172
|
+
};
|
|
173
|
+
/** Schema accepts unknown since OperationSchemas stores dndevSchema<unknown>. T is for return type. */
|
|
174
|
+
getDocQueryOptions<T>(collection: string, id: string, schema: dndevSchema<unknown>, cacheOptions?: CacheOptions): {
|
|
175
|
+
queryKey: readonly string[];
|
|
176
|
+
queryFn: () => Promise<T | null>;
|
|
177
|
+
staleTime: number;
|
|
178
|
+
};
|
|
179
|
+
get<T>(collection: string, id: string, schema: dndevSchema<T>, options?: CacheOptions): Promise<T | null>;
|
|
180
|
+
query<T>(collection: string, options: QueryOptions, schema: dndevSchema<T>, cacheOptions?: CacheOptions, schemaType?: 'list' | 'listCard'): Promise<PaginatedQueryResult<T>>;
|
|
181
|
+
set<T>(collection: string, id: string, data: T, schema: dndevSchema<T>, options?: MutationOptions): Promise<void>;
|
|
182
|
+
update<T>(collection: string, id: string, data: Partial<T>, options?: MutationOptions): Promise<void>;
|
|
183
|
+
delete(collection: string, id: string, options?: MutationOptions): Promise<void>;
|
|
184
|
+
add<T>(collection: string, data: T, schema: dndevSchema<T>, options?: MutationOptions): Promise<string>;
|
|
185
|
+
subscribe<T>(collection: string, id: string, callback: (data: T | null, error?: Error) => void, schema: dndevSchema<T>): () => void;
|
|
186
|
+
subscribeToCollection<T>(collection: string, options: QueryOptions, callback: (data: T[], error?: Error) => void, schema: dndevSchema<T>): () => void;
|
|
187
|
+
/** Add with optimistic update - shows item immediately, confirms/rolls back after server */
|
|
188
|
+
addOptimistic<T extends {
|
|
189
|
+
id?: string;
|
|
190
|
+
}>(collection: string, data: T, schema: dndevSchema<T>, options?: MutationOptions): Promise<T & {
|
|
191
|
+
id: string;
|
|
192
|
+
}>;
|
|
193
|
+
/** Update with optimistic update - shows change immediately, confirms/rolls back after server */
|
|
194
|
+
updateOptimistic<T>(collection: string, id: string, data: Partial<T>, schema: dndevSchema<T>, options?: MutationOptions): Promise<T>;
|
|
195
|
+
/** Delete with optimistic update - hides item immediately, confirms/restores after server */
|
|
196
|
+
deleteOptimistic(collection: string, id: string, options?: MutationOptions): Promise<void>;
|
|
197
|
+
/** Invalidate all cached queries for a collection */
|
|
198
|
+
invalidateCollection(collection: string): Promise<void>;
|
|
199
|
+
/** Get the shared QueryClient instance from @donotdev/core */
|
|
200
|
+
getQueryClient(): QueryClient;
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
File without changes
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Entity, FeatureStatus } from '@donotdev/core';
|
|
2
|
+
import type { QueryOptions } from './CrudService';
|
|
3
|
+
import type { UseCrudOptions } from './useCrud';
|
|
4
|
+
/** Schema type determines which schema to use */
|
|
5
|
+
export type ListSchemaType = 'list' | 'listCard';
|
|
6
|
+
/** Pagination configuration */
|
|
7
|
+
export interface PaginationConfig {
|
|
8
|
+
/** Pagination mode: 'client' fetches all, 'server' fetches per page */
|
|
9
|
+
mode: 'client' | 'server';
|
|
10
|
+
/** Page number for server-side pagination (1-indexed) */
|
|
11
|
+
page: number;
|
|
12
|
+
/** Page size for server-side pagination */
|
|
13
|
+
pageSize: number;
|
|
14
|
+
}
|
|
15
|
+
/** Base options for list hooks */
|
|
16
|
+
export interface UseBaseCrudListOptions<T> extends UseCrudOptions<T> {
|
|
17
|
+
/** Automatically fetch data on mount (default: true) */
|
|
18
|
+
enabled?: boolean;
|
|
19
|
+
/** Where/orderBy/limit passed to query */
|
|
20
|
+
queryOptions?: QueryOptions;
|
|
21
|
+
}
|
|
22
|
+
/** Base return type for list hooks */
|
|
23
|
+
export interface UseBaseCrudListReturn<T> {
|
|
24
|
+
status: FeatureStatus;
|
|
25
|
+
data: {
|
|
26
|
+
items: T[];
|
|
27
|
+
total?: number;
|
|
28
|
+
} | null;
|
|
29
|
+
/** Convenience: items array (data?.items ?? []) */
|
|
30
|
+
items: T[];
|
|
31
|
+
/** True during initial fetch (show skeletons) */
|
|
32
|
+
loading: boolean;
|
|
33
|
+
/** True during background refetch (show subtle indicator) */
|
|
34
|
+
fetching: boolean;
|
|
35
|
+
error: Error | null;
|
|
36
|
+
/** Manual refresh function */
|
|
37
|
+
mutate: () => Promise<void>;
|
|
38
|
+
/** Alias for mutate (manual refresh) */
|
|
39
|
+
refresh: () => Promise<void>;
|
|
40
|
+
isAvailable: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Internal base hook for list operations
|
|
44
|
+
* Used by useCrudList and useCrudCardList
|
|
45
|
+
*
|
|
46
|
+
* @internal Not exported to consumers
|
|
47
|
+
*/
|
|
48
|
+
export declare function useBaseCrudList<T extends {
|
|
49
|
+
id: string;
|
|
50
|
+
} = {
|
|
51
|
+
id: string;
|
|
52
|
+
}>(entityOrCollection: Entity | string, schemaType: ListSchemaType, pagination: PaginationConfig | null, options?: UseBaseCrudListOptions<T>): UseBaseCrudListReturn<T>;
|
|
53
|
+
//# sourceMappingURL=useBaseCrudList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBaseCrudList.d.ts","sourceRoot":"","sources":["../src/useBaseCrudList.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAe,MAAM,gBAAgB,CAAC;AAOzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKhD,iDAAiD;AACjD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,CAAC;AAEjD,+BAA+B;AAC/B,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,kCAAkC;AAClC,MAAM,WAAW,sBAAsB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAClE,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,sCAAsC;AACtC,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5C,mDAAmD;IACnD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,wCAAwC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACvE,kBAAkB,EAAE,MAAM,GAAG,MAAM,EACnC,UAAU,EAAE,cAAc,EAC1B,UAAU,EAAE,gBAAgB,GAAG,IAAI,EACnC,OAAO,GAAE,sBAAsB,CAAC,CAAC,CAAM,GACtC,qBAAqB,CAAC,CAAC,CAAC,CAwO1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useMemo as P,useCallback as H,useRef as Q}from"react";import{useQuery as J}from"@donotdev/core";import{useCrudStore as N}from"./CrudStore";import{useCrud as j,getCrudServiceInstance as U,EMPTY_OPTIMISTIC as X}from"./useCrud";import{mergeWithOptimistic as Z}from"./utils/mergeWithOptimistic";import{injectScopeFilter as $,getCurrentScopeValue as ee}from"./utils/scopeUtils";function te(x,f,t,p={}){const K=p.enabled??!0,b=j("status"),a=b==="ready",V=j(x,p),{error:w,invalidate:I,_collection:d,_schemas:g,_cacheOptions:C,_scope:O}=V,M=N(e=>e.collections[d]?.optimistic||X),q=Q(new Map([[1,null]])),h=Q(0),k=ee(O),v=P(()=>{if(!a||!g)return null;const e=U();if(!e)return null;const y=f==="listCard"?g.listCard:g.list,m=$(p.queryOptions,O);if(!t||t.mode==="client")return e.getListQueryOptions(d,m,y,C,f);const o=q.current,n=h.current,{page:l,pageSize:s}=t;let i,r;if(o.has(l))i=o.get(l)??void 0,r=s;else if(l>n&&o.has(n)){const u=l-n;i=o.get(n)??void 0,r=u*s}else i=void 0,r=l*s;return e.getListQueryOptions(d,{...m,limit:r,startAfterId:i},y,C,f)},[a,d,C,g?"hasSchema":"noSchema",f,t?.mode,t?.page,t?.pageSize,p.queryOptions,O?.provider,k]),{data:c,isLoading:B,isFetching:E,error:R,refetch:T}=J({queryKey:v?.queryKey??["crud",d,"disabled"],queryFn:v?.queryFn??(()=>Promise.resolve({items:[]})),staleTime:v?.staleTime,enabled:K&&!!v}),_=P(()=>{if(!c||!a)return{items:[],total:void 0};let e=c.items;if(t?.mode==="server"&&e.length>0){const s=q.current,i=h.current,{page:r,pageSize:u}=t,Y=e.length;if(Math.ceil(Y/u)>1||r>i){const L=s.has(r)?r:i+1;for(let S=L;S<=r;S++){const A=(S-L+1)*u-1;if(A<e.length){const G=e[A];s.set(S+1,G.id)}}}c.lastVisible&&s.set(r+1,c.lastVisible),h.current=Math.max(i,r);const F=s.has(r)?0:(r-i-1)*u,D=F+u;e=e.slice(F,D)}const y=Z(e,M),m=new Set(e.map(s=>s.id));let o=0,n=0;for(const[s,i]of Object.entries(M))i.operation==="add"&&!m.has(s)?o++:i.operation==="delete"&&m.has(s)&&n++;const l=(c.total??e.length)+o-n;return{items:y,total:t?l:void 0}},[c,M,a,t?.mode,t?.page,t?.pageSize]),z=H(async()=>{a&&(t?.mode==="server"&&(q.current=new Map([[1,null]]),h.current=0),await I(),await T())},[I,T,a,t?.mode]);if(!a){const e=async()=>{};return{status:b,data:{items:[],total:void 0},items:[],loading:!1,fetching:!1,error:w,mutate:e,refresh:e,isAvailable:!1}}const W=_?.items??[];return{status:b,data:_,items:W,loading:B,fetching:E,error:R??w,mutate:z,refresh:z,isAvailable:!0}}export{te as useBaseCrudList};
|
package/dist/useCrud.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { dndevSchema, Entity, FeatureStatus, OperationSchemas, CrudAPI } from '@donotdev/core';
|
|
2
|
-
import type { CrudServiceInterface, CacheOptions } from './
|
|
3
|
-
import type { BackendType } from './CrudStore';
|
|
1
|
+
import type { dndevSchema, Entity, FeatureStatus, OperationSchemas, CrudAPI, ScopeConfig } from '@donotdev/core';
|
|
2
|
+
import type { CrudServiceInterface, CacheOptions, BackendType } from './types';
|
|
4
3
|
export declare const EMPTY_DATA: Record<string, unknown>;
|
|
5
4
|
export declare const EMPTY_OPTIMISTIC: Record<string, unknown>;
|
|
6
5
|
/**
|
|
@@ -17,9 +16,6 @@ export interface UseCrudOptions<T> {
|
|
|
17
16
|
/** Disable caching (bypass TanStack Query) */
|
|
18
17
|
noCache?: boolean;
|
|
19
18
|
}
|
|
20
|
-
/**
|
|
21
|
-
* CRUD API return type - Single Document & Actions
|
|
22
|
-
*/
|
|
23
19
|
/**
|
|
24
20
|
* CRUD API return type - Single Document & Actions
|
|
25
21
|
*/
|
|
@@ -30,8 +26,8 @@ export interface UseCrudReturn<T> extends CrudAPI<T> {
|
|
|
30
26
|
_schemas: OperationSchemas | undefined;
|
|
31
27
|
/** @internal Cache options */
|
|
32
28
|
_cacheOptions: CacheOptions;
|
|
33
|
-
/** @internal
|
|
34
|
-
|
|
29
|
+
/** @internal Scope configuration (for multi-tenancy) */
|
|
30
|
+
_scope: ScopeConfig | undefined;
|
|
35
31
|
}
|
|
36
32
|
/**
|
|
37
33
|
* React hook for CRUD Actions & Single Documents
|
package/dist/useCrud.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCrud.d.ts","sourceRoot":"","sources":["../src/useCrud.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,aAAa,EACb,gBAAgB,EAChB,OAAO,
|
|
1
|
+
{"version":3,"file":"useCrud.d.ts","sourceRoot":"","sources":["../src/useCrud.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAOxB,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EACZ,WAAW,EAEZ,MAAM,SAAS,CAAC;AAKjB,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,CAAC;AACtD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,CAAC;AAM5D;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,oBAAoB,GAAG,IAAI,CAEpE;AAMD,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IAElD,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,8BAA8B;IAC9B,aAAa,EAAE,YAAY,CAAC;IAC5B,wDAAwD;IACxD,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;CACjC;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAAC;AACtD,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B,aAAa,CAAC,CAAC,CAAC,CAAC;AACpB,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EACjC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B,aAAa,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/useCrud.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useEffect as B,useMemo as
|
|
1
|
+
"use client";import{useEffect as B,useMemo as w,useCallback as r}from"react";import{useFeatureConsent as L,FRAMEWORK_FEATURES as W,FEATURE_STATUS as S,handleError as Z,isClient as H,createSchemas as J,DEGRADED_CRUD_API as K}from"@donotdev/core";import{getCrudService as Q}from"./CrudService";import{useCrudStore as u}from"./CrudStore";import{injectScope as F,injectScopeFilter as V}from"./utils/scopeUtils";const X={},$={};let M=null,y=null,E=!1;function n(){return M}function ee(m,l={}){const f=L(W.CRUD),U=u(e=>e.crudService),g=f&&!U,b=f?g?S.INITIALIZING:S.READY:S.DEGRADED;if(m==="status")return b;const p=typeof m=="object"?m:l.entity,t=typeof m=="string"?m:m.collection,o=p?.scope,h=l.backend||"functions",T=l.noCache??!1,v=l.staleTime,d=w(()=>({noCache:T,staleTime:v}),[T,v]),a=w(()=>{if(l.schema){const e=l.schema;return{create:e,draft:e,update:e,get:e,list:e,listCard:e,delete:e}}if(p)return J(p)},[l.schema?"custom":p?.name,t]),k=u(e=>e.collections[t]?.loading||!1),A=u(e=>e.collections[t]?.error||null),Y=null;B(()=>{if(!H()||!f||!a)return;const{crudService:e,backend:c}=u.getState();e&&c===h||y||(y=(async()=>{try{const s=Q();M=s,s.setStore(u),await s.initialize(h),E=!1,u.getState().setBackend(h),u.getState().setCrudService(s)}catch(s){E||(Z(s,{userMessage:"Failed to initialize CRUD service.",context:{backend:h,collection:t},severity:"error"}),E=!0)}finally{y=null}})())},[f,h,t,a?"hasSchema":"noSchema"]);const _=g||k,O=b===S.READY,P=r(async e=>{const c=n();return!c||!a?null:c.get(t,e,a.get,d)},[t,a?"hasSchema":"noSchema",d]),j=r(async(e,c,s)=>{const i=n();if(!i||!a)return;const C=F(c,o),N=C?.status==="draft"?a.draft:a.create;await i.set(t,e,C,N,s)},[t,a?"hasSchema":"noSchema",o?.provider]),G=r(async(e,c,s)=>{const i=n();i&&await i.update(t,e,c,s)},[t]),q=r(async(e,c)=>{const s=n();s&&await s.delete(t,e,c)},[t]),x=r(async(e,c)=>{const s=n();if(!s||!a)return"";const i=F(e,o),C=i?.status==="draft"?a.draft:a.create;return s.add(t,i,C,c)},[t,a?"hasSchema":"noSchema",o?.provider]),z=r(async e=>{const c=n();if(!c||!a)return[];const s=V(e,o);return(await c.query(t,s,a.list,d)).items},[t,a?"hasSchema":"noSchema",d,o?.provider]),D=r((e,c)=>{const s=n();return!s||!a?()=>{}:s.subscribe(t,e,c,a.get)},[t,a?"hasSchema":"noSchema"]),R=r((e,c)=>{const s=n();return!s||!a?()=>{}:s.subscribeToCollection(t,e,c,a.list)},[t,a?"hasSchema":"noSchema"]),I=r(async()=>{const e=n();e&&await e.invalidateCollection(t)},[t]);return O?{status:S.READY,data:Y,loading:_,error:A,get:P,set:j,update:G,delete:q,add:x,query:z,subscribe:D,subscribeToCollection:R,invalidate:I,isAvailable:!0,_collection:t,_schemas:a,_cacheOptions:d,_scope:o}:{...K,status:b,loading:_,error:A,subscribe:D,subscribeToCollection:R,invalidate:I,_collection:t,_schemas:a,_cacheOptions:d,_scope:o}}export{X as EMPTY_DATA,$ as EMPTY_OPTIMISTIC,n as getCrudServiceInstance,ee as useCrud};
|
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview useCrudCardList Hook - Optimized Card List Management
|
|
3
3
|
* @description Specialized hook for fetching lists of entities optimized for card views.
|
|
4
|
-
* Uses TanStack Query for reactive loading states.
|
|
5
4
|
* Fetches only the fields defined in `listCardFields` (or `listFields`) to reduce payload size.
|
|
6
5
|
*
|
|
7
|
-
* @version 0.
|
|
6
|
+
* @version 0.0.10
|
|
8
7
|
* @since 0.0.1
|
|
9
8
|
* @author AMBROISE PARK Consulting
|
|
10
9
|
*/
|
|
11
10
|
import type { Entity, FeatureStatus } from '@donotdev/core';
|
|
11
|
+
import type { QueryOptions } from './CrudService';
|
|
12
12
|
import type { UseCrudOptions } from './useCrud';
|
|
13
13
|
export interface UseCrudCardListOptions<T> extends UseCrudOptions<T> {
|
|
14
14
|
/** Automatically fetch data on mount (default: true) */
|
|
15
15
|
enabled?: boolean;
|
|
16
|
+
/** Where/orderBy/limit passed to listCard query */
|
|
17
|
+
queryOptions?: QueryOptions;
|
|
16
18
|
}
|
|
17
19
|
export interface UseCrudCardListReturn<T> {
|
|
18
20
|
status: FeatureStatus;
|
|
19
21
|
data: {
|
|
20
22
|
items: T[];
|
|
21
23
|
} | null;
|
|
24
|
+
/** Convenience: items array (data?.items ?? []) */
|
|
25
|
+
items: T[];
|
|
22
26
|
/** True during initial fetch (show skeletons) */
|
|
23
27
|
loading: boolean;
|
|
24
28
|
/** True during background refetch (show subtle indicator) */
|
|
@@ -26,6 +30,8 @@ export interface UseCrudCardListReturn<T> {
|
|
|
26
30
|
error: Error | null;
|
|
27
31
|
/** Manual refresh function */
|
|
28
32
|
mutate: () => Promise<void>;
|
|
33
|
+
/** Alias for mutate (manual refresh) */
|
|
34
|
+
refresh: () => Promise<void>;
|
|
29
35
|
isAvailable: boolean;
|
|
30
36
|
}
|
|
31
37
|
/**
|
|
@@ -43,13 +49,13 @@ export interface UseCrudCardListReturn<T> {
|
|
|
43
49
|
*
|
|
44
50
|
* @example
|
|
45
51
|
* ```typescript
|
|
46
|
-
* const {
|
|
52
|
+
* const { items, loading, refresh } = useCrudCardList(carEntity);
|
|
47
53
|
*
|
|
48
54
|
* if (loading) return <Skeletons />;
|
|
49
55
|
*
|
|
50
56
|
* return (
|
|
51
57
|
* <Grid>
|
|
52
|
-
* {
|
|
58
|
+
* {items.map(car => <Card key={car.id} title={car.make} />)}
|
|
53
59
|
* </Grid>
|
|
54
60
|
* );
|
|
55
61
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCrudCardList.d.ts","sourceRoot":"","sources":["../src/useCrudCardList.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useCrudCardList.d.ts","sourceRoot":"","sources":["../src/useCrudCardList.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,WAAW,sBAAsB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAClE,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5B,mDAAmD;IACnD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,wCAAwC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACvE,kBAAkB,EAAE,MAAM,GAAG,MAAM,EACnC,OAAO,GAAE,sBAAsB,CAAC,CAAC,CAAM,GACtC,qBAAqB,CAAC,CAAC,CAAC,CAgC1B"}
|
package/dist/useCrudCardList.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{useBaseCrudList as i}from"./useBaseCrudList";function r(s,t={}){const a={enabled:t.enabled,queryOptions:t.queryOptions,backend:t.backend,schema:t.schema,entity:t.entity,staleTime:t.staleTime,noCache:t.noCache},e=i(s,"listCard",null,a);return{status:e.status,data:e.data?{items:e.data.items}:null,items:e.items,loading:e.loading,fetching:e.fetching,error:e.error,mutate:e.mutate,refresh:e.refresh,isAvailable:e.isAvailable}}export{r as useCrudCardList};
|
package/dist/useCrudList.d.ts
CHANGED
|
@@ -1,23 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview useCrudList Hook - Collection Management
|
|
2
|
+
* @fileoverview useCrudList Hook - Collection Management with Pagination
|
|
3
3
|
* @description Specialized hook for fetching and managing lists of entities.
|
|
4
|
-
*
|
|
4
|
+
* Supports both client-side and server-side pagination.
|
|
5
5
|
*
|
|
6
|
-
* @version 0.
|
|
6
|
+
* @version 0.0.10
|
|
7
7
|
* @since 0.0.1
|
|
8
8
|
* @author AMBROISE PARK Consulting
|
|
9
9
|
*/
|
|
10
10
|
import type { Entity, FeatureStatus } from '@donotdev/core';
|
|
11
|
+
import type { QueryOptions } from './CrudService';
|
|
11
12
|
import type { UseCrudOptions } from './useCrud';
|
|
12
13
|
export interface UseCrudListOptions<T> extends UseCrudOptions<T> {
|
|
13
14
|
/** Automatically fetch data on mount (default: true) */
|
|
14
15
|
enabled?: boolean;
|
|
16
|
+
/** Pagination mode: 'client' (default) fetches all, 'server' fetches per page */
|
|
17
|
+
pagination?: 'client' | 'server';
|
|
18
|
+
/** Page number for server-side pagination (1-indexed, default: 1) */
|
|
19
|
+
page?: number;
|
|
20
|
+
/** Page size for server-side pagination (default: 10) */
|
|
21
|
+
pageSize?: number;
|
|
22
|
+
/** Where/orderBy/limit passed to list query (merged with pagination on server) */
|
|
23
|
+
queryOptions?: QueryOptions;
|
|
15
24
|
}
|
|
16
25
|
export interface UseCrudListReturn<T> {
|
|
17
26
|
status: FeatureStatus;
|
|
18
27
|
data: {
|
|
19
28
|
items: T[];
|
|
29
|
+
total?: number;
|
|
20
30
|
} | null;
|
|
31
|
+
/** Convenience: items array (data?.items ?? []) */
|
|
32
|
+
items: T[];
|
|
21
33
|
/** True during initial fetch (show skeletons) */
|
|
22
34
|
loading: boolean;
|
|
23
35
|
/** True during background refetch (show subtle indicator) */
|
|
@@ -25,6 +37,8 @@ export interface UseCrudListReturn<T> {
|
|
|
25
37
|
error: Error | null;
|
|
26
38
|
/** Manual refresh function */
|
|
27
39
|
mutate: () => Promise<void>;
|
|
40
|
+
/** Alias for mutate (manual refresh) */
|
|
41
|
+
refresh: () => Promise<void>;
|
|
28
42
|
isAvailable: boolean;
|
|
29
43
|
}
|
|
30
44
|
/**
|
|
@@ -42,13 +56,13 @@ export interface UseCrudListReturn<T> {
|
|
|
42
56
|
*
|
|
43
57
|
* @example
|
|
44
58
|
* ```typescript
|
|
45
|
-
* const {
|
|
59
|
+
* const { items, loading, refresh } = useCrudList(carEntity);
|
|
46
60
|
*
|
|
47
61
|
* if (loading) return <Loader />;
|
|
48
62
|
*
|
|
49
63
|
* return (
|
|
50
64
|
* <ul>
|
|
51
|
-
* {
|
|
65
|
+
* {items.map(car => <li key={car.id}>{car.make}</li>)}
|
|
52
66
|
* </ul>
|
|
53
67
|
* );
|
|
54
68
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCrudList.d.ts","sourceRoot":"","sources":["../src/useCrudList.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useCrudList.d.ts","sourceRoot":"","sources":["../src/useCrudList.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAO5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAC9D,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iFAAiF;IACjF,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5C,mDAAmD;IACnD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,wCAAwC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACnE,kBAAkB,EAAE,MAAM,GAAG,MAAM,EACnC,OAAO,GAAE,kBAAkB,CAAC,CAAC,CAAM,GAClC,iBAAiB,CAAC,CAAC,CAAC,CA6BtB"}
|
package/dist/useCrudList.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{useBaseCrudList as c}from"./useBaseCrudList";function r(a,e={}){const t=e.pagination??"client",n=e.page??1,i=e.pageSize??10,s={mode:t,page:n,pageSize:i},o={enabled:e.enabled,queryOptions:e.queryOptions,backend:e.backend,schema:e.schema,entity:e.entity,staleTime:e.staleTime,noCache:e.noCache};return c(a,"list",s,o)}export{r as useCrudList};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCrudService as
|
|
1
|
+
import{getCrudService as c}from"../CrudService";async function d(r,n){const a=c(),e=[],t=n.range?.start??1,s=n.range?.end??28;for(let o=t;o<=s;o++){const m=String(o),i=await a.get(n.path(r),m,n.schema);i&&e.push(i)}return e}async function h(r,n,a){const e=c();for(const t of a){const s=n.idOf(t);await e.set(n.path(r),s,t,n.schema)}}async function p(r,n,a){const e=c();if(n.idFrom){const t=n.idFrom(a);return e.set(n.path(r),t,a,n.schema)}return e.add(n.path(r),a,n.schema)}export{p as appendToCollection,d as loadDeterministicRange,h as upsertDeterministic};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{handleError as p}from"@donotdev/core";import{uploadFileResumable as
|
|
1
|
+
"use client";import{handleError as p}from"@donotdev/core";import{uploadFileResumable as x,deleteFileByUrl as h}from"@donotdev/firebase";function g(e){return e.replace(/[^a-zA-Z0-9.-]/g,"_").replace(/_{2,}/g,"_").toLowerCase()}async function u(e,t={}){const{storagePath:r="uploads/files",filename:n,onProgress:o}=t,s=Date.now(),i=g(e.name),c=n||`${s}_${i}`,l=`${r}/${c}`;try{const{promise:a}=x(e,{basePath:r,filename:c,onProgress:o,metadata:{contentType:e.type}});return{url:(await a).url,filename:e.name,size:e.size,mimeType:e.type,uploadedAt:new Date().toISOString()}}catch(a){throw p(a,{userMessage:"Failed to upload file",severity:"error",context:{filename:e.name,fileSize:e.size}})}}async function w(e,t={}){const r=[],n=e.reduce((s,i)=>s+i.size,0);let o=0;for(const s of e){const i=t.onProgress?l=>{const a=l.bytesTransferred/l.totalBytes*s.size;t.onProgress({bytesTransferred:o+a,totalBytes:n,progress:(o+a)/n*100})}:void 0,c=await u(s,{...t,onProgress:i});r.push(c),o+=s.size}return r}async function y(e){try{await h(e.url)}catch(t){throw p(t,{userMessage:"Failed to delete file",severity:"error",context:{url:e.url,filename:e.filename}}),t}}function v(){return`${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function d(e){const t=e.split(".");return t.length>1?t.pop().toLowerCase():""}function F(e,t){const r=t?d(t):"";if(e){if(e.startsWith("image/"))return"image";if(e.startsWith("video/"))return"video";if(e.startsWith("audio/"))return"audio";if(e==="application/pdf")return"pdf";if(e.includes("word")||e.includes("document"))return"doc";if(e.includes("excel")||e.includes("spreadsheet"))return"xls";if(e.includes("powerpoint")||e.includes("presentation"))return"ppt"}switch(r){case"pdf":return"pdf";case"doc":case"docx":return"doc";case"xls":case"xlsx":case"csv":return"xls";case"ppt":case"pptx":return"ppt";case"md":case"txt":return"text";case"html":case"htm":return"html";case"zip":case"rar":case"7z":return"archive";default:return"file"}}function M(e){if(e===0)return"0 B";const t=1024,r=["B","KB","MB","GB"],n=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/Math.pow(t,n)).toFixed(1))} ${r[n]}`}const f=["application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.ms-powerpoint","application/vnd.openxmlformats-officedocument.presentationml.presentation","text/plain","text/markdown","text/html","text/csv"],m=[".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".txt",".md",".html",".csv"];function z(){return[...f,...m].join(",")}export{m as DOCUMENT_EXTENSIONS,f as DOCUMENT_MIME_TYPES,y as deleteFile,M as formatFileSize,v as generateFileId,z as getDocumentAcceptString,d as getFileExtension,F as getFileIcon,u as uploadFile,w as uploadFiles};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
async function
|
|
1
|
+
async function v(t,r={}){const{maxWidth:n=1920,maxHeight:o=1440,thumbWidth:d=300,thumbHeight:i=225,aspectRatio:e=4/3,quality:l=.85,transparentBackground:s=!0,crop:h}=r;return new Promise((u,c)=>{const a=new Image,g=new FileReader;g.onload=w=>{a.src=w.target?.result},g.onerror=()=>c(new Error("Failed to read file")),a.onload=async()=>{try{const{width:w,height:m}=x(h?h.width:a.width,h?h.height:a.height,n,o,e),b=await F(a,w,m,e,l,s,h),f=await F(a,d,i,e,.65,s,h);u({fullBlob:b,thumbBlob:f,width:w,height:m})}catch(w){c(w)}},a.onerror=()=>c(new Error("Failed to load image")),g.readAsDataURL(t)})}function x(t,r,n,o,d){let i=t,e=r;i>n&&(e=n/i*e,i=n),e>o&&(i=o/e*i,e=o);const l=i/e;return Math.abs(l-d)>.01&&(l>d?e=i/d:i=e*d),{width:Math.round(i),height:Math.round(e)}}async function F(t,r,n,o,d,i,e){const l=document.createElement("canvas"),s=l.getContext("2d");if(!s)throw new Error("Failed to get canvas context");l.width=r,l.height=n,i?s.clearRect(0,0,r,n):(s.fillStyle="#FFFFFF",s.fillRect(0,0,r,n));let h,u,c,a;if(e)h=e.x,u=e.y,c=e.width,a=e.height;else{const g=t.width/t.height;c=t.width,a=t.height,h=0,u=0,g>o?(c=t.height*o,h=(t.width-c)/2):g<o&&(a=t.width/o,u=(t.height-a)/2)}return s.drawImage(t,h,u,c,a,0,0,r,n),new Promise((g,w)=>{l.toBlob(m=>{m?g(m):w(new Error("Failed to convert canvas to blob"))},"image/webp",d)})}function y(t,r){return t.type.startsWith("image/")?r&&t.size>r?{valid:!1,error:`File size exceeds ${(r/1048576).toFixed(1)}MB limit`}:{valid:!0}:{valid:!1,error:"File must be an image"}}export{v as processImage,y as validateImageFile};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{handleError as
|
|
1
|
+
import{handleError as P}from"@donotdev/core";import{uploadFileResumable as u,deleteFileByUrl as n,getFileUrl as c}from"@donotdev/firebase";function F(e){return e.replace(/[^a-zA-Z0-9.-]/g,"_").replace(/_{2,}/g,"_").toLowerCase()}async function T(e,r,m,b={}){const{storagePath:l="uploads/images",filename:w,onProgress:s}=b,g=Date.now(),t=(w||`${g}_${F(m)}`).replace(/\.[^/.]+$/,""),f=`${l}/${t}_full.webp`,h=`${l}/${t}_thumb.webp`;try{const p=s?a=>{s({bytesTransferred:a.bytesTransferred,totalBytes:a.totalBytes*2,progress:a.progress*.5})}:void 0,o=new File([e],`${t}_full.webp`,{type:"image/webp"}),{promise:i}=u(o,{basePath:l,filename:`${t}_full.webp`,onProgress:p,metadata:{contentType:"image/webp"}}),y=(await i).url,d=s?a=>{s({bytesTransferred:a.bytesTransferred+e.size,totalBytes:e.size+r.size,progress:50+a.progress*.5})}:void 0,$=new File([r],`${t}_thumb.webp`,{type:"image/webp"}),{promise:U}=u($,{basePath:l,filename:`${t}_thumb.webp`,onProgress:d,metadata:{contentType:"image/webp"}}),_=(await U).url;return{fullUrl:y,thumbUrl:_}}catch(p){try{const o=await c(f).catch(()=>null),i=await c(h).catch(()=>null);o&&await n(o).catch(()=>{}),i&&await n(i).catch(()=>{})}catch{}throw p}}async function z(e){try{await Promise.all([n(e.fullUrl),n(e.thumbUrl)])}catch(r){throw P(r,{userMessage:"Failed to delete image",severity:"error",context:{fullUrl:e.fullUrl,thumbUrl:e.thumbUrl}}),r}}export{z as deleteImage,T as uploadImage};
|
package/dist/utils/imageUtils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
async function d(e){const t=await e.arrayBuffer(),r=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(r)).map(
|
|
1
|
+
async function d(e){const t=await e.arrayBuffer(),r=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(r)).map(a=>a.toString(16).padStart(2,"0")).join("")}function h(e){return URL.createObjectURL(e)}function u(e){e.startsWith("blob:")&&URL.revokeObjectURL(e)}async function l(e){return new Promise((t,r)=>{const a=new Image,i=new FileReader;i.onload=n=>{if(!n.target?.result){r(new Error("Failed to read file"));return}a.src=n.target.result},i.onerror=()=>r(new Error("Failed to read file")),a.onload=()=>{const n=document.createElement("canvas"),o=n.getContext("2d");if(!o){r(new Error("Failed to get canvas context"));return}n.width=a.height,n.height=a.width,o.translate(n.width/2,n.height/2),o.rotate(Math.PI/2),o.drawImage(a,-a.width/2,-a.height/2),n.toBlob(s=>{if(s){const c=new File([s],e.name,{type:e.type,lastModified:Date.now()});t(c)}else r(new Error("Failed to create blob from canvas"))},e.type,.95)},a.onerror=()=>r(new Error("Failed to load image")),i.readAsDataURL(e)})}class g{undoStack=[];redoStack=[];maxStackSize=50;push(t){this.undoStack.push(t),this.undoStack.length>this.maxStackSize&&this.undoStack.shift(),this.redoStack=[]}undo(){const t=this.undoStack.pop();return t?(this.redoStack.push(t),t):null}redo(){const t=this.redoStack.pop();return t?(this.undoStack.push(t),t):null}canUndo(){return this.undoStack.length>0}canRedo(){return this.redoStack.length>0}clear(){this.undoStack=[],this.redoStack=[]}}function S(e,t){return e.filter(r=>r.hash===t)}function w(){return`img_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}export{g as UndoRedoManager,h as createPreviewURL,S as findDuplicatesByHash,d as generateFileHash,w as generateImageId,u as revokePreviewURL,l as rotateImage90};
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* @fileoverview Optimistic merge utility
|
|
3
3
|
* @description Merges TanStack Query results with optimistic operations from store
|
|
4
4
|
*
|
|
5
|
-
* @version 0.0
|
|
5
|
+
* @version 0.1.0
|
|
6
6
|
* @since 0.0.1
|
|
7
7
|
* @author AMBROISE PARK Consulting
|
|
8
8
|
*/
|
|
9
|
-
import type { OptimisticMeta } from '../
|
|
9
|
+
import type { OptimisticMeta } from '../types';
|
|
10
10
|
interface WithId {
|
|
11
11
|
id: string;
|
|
12
12
|
[key: string]: unknown;
|
|
@@ -14,14 +14,13 @@ interface WithId {
|
|
|
14
14
|
/**
|
|
15
15
|
* Merge query results with optimistic operations.
|
|
16
16
|
* - Filter out items marked for deletion
|
|
17
|
-
* - Apply optimistic updates
|
|
17
|
+
* - Apply optimistic updates from metadata
|
|
18
18
|
* - Append optimistic adds (temp IDs)
|
|
19
19
|
*
|
|
20
20
|
* @param queryData - Data from TanStack Query cache
|
|
21
|
-
* @param optimistic - Optimistic operation metadata from store
|
|
22
|
-
* @param storeData - Current store data (for optimistic values)
|
|
21
|
+
* @param optimistic - Optimistic operation metadata from store (contains optimisticData)
|
|
23
22
|
* @returns Merged array with optimistic changes applied
|
|
24
23
|
*/
|
|
25
|
-
export declare function mergeWithOptimistic<T extends WithId>(queryData: T[], optimistic: Record<string, OptimisticMeta
|
|
24
|
+
export declare function mergeWithOptimistic<T extends WithId>(queryData: T[], optimistic: Record<string, OptimisticMeta>): T[];
|
|
26
25
|
export {};
|
|
27
26
|
//# sourceMappingURL=mergeWithOptimistic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeWithOptimistic.d.ts","sourceRoot":"","sources":["../../src/utils/mergeWithOptimistic.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"mergeWithOptimistic.d.ts","sourceRoot":"","sources":["../../src/utils/mergeWithOptimistic.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,SAAS,EAAE,CAAC,EAAE,EACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GACzC,CAAC,EAAE,CA4BL"}
|