@donotdev/crud 0.0.31 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +3 -3
- package/dist/CrudService.d.ts +13 -4
- package/dist/CrudService.d.ts.map +1 -1
- package/dist/CrudService.js +2 -2
- package/dist/CrudStore.d.ts +1 -1
- package/dist/CrudStore.d.ts.map +1 -1
- package/dist/CrudStore.js +1 -1
- package/dist/FieldRegistry.d.ts +2 -12
- package/dist/FieldRegistry.d.ts.map +1 -1
- package/dist/FieldRegistry.js +1 -1
- package/dist/adapters/FunctionsAdapter.d.ts +3 -3
- package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
- package/dist/adapters/FunctionsAdapter.js +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/builtinFieldTypes.d.ts +1 -1
- package/dist/components/CrudButton.d.ts +1 -0
- package/dist/components/CrudButton.d.ts.map +1 -1
- package/dist/components/CrudButton.js +1 -1
- package/dist/components/CrudCard.d.ts +1 -1
- package/dist/components/CrudCard.d.ts.map +1 -1
- package/dist/components/CrudCard.js +1 -1
- package/dist/components/DateFilter.js +1 -1
- package/dist/components/DisplayFieldRenderer.d.ts +2 -1
- package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
- package/dist/components/DisplayFieldRenderer.js +1 -1
- package/dist/components/DisplayThumbnail.d.ts +1 -9
- package/dist/components/DisplayThumbnail.d.ts.map +1 -1
- package/dist/components/DisplayThumbnail.js +1 -1
- package/dist/components/EntityFilters.d.ts +1 -0
- package/dist/components/EntityFilters.d.ts.map +1 -1
- package/dist/components/EntityFilters.js +1 -1
- package/dist/components/FormFieldRenderer.d.ts +1 -0
- package/dist/components/FormFieldRenderer.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.js +1 -1
- package/dist/components/FormLayout.d.ts +2 -1
- package/dist/components/FormLayout.d.ts.map +1 -1
- package/dist/components/FormLayout.js +1 -1
- package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
- 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/ControlledFieldArrayField.js +1 -1
- package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
- package/dist/components/controlled/complex/ControlledMapField.js +1 -1
- package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
- package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
- 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.js +1 -1
- package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
- package/dist/components/controlled/file/ControlledFileField.js +1 -1
- package/dist/components/controlled/file/ControlledImageField.js +1 -1
- package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
- package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
- package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
- package/dist/components/controlled/file/index.js +1 -1
- package/dist/components/controlled/index.js +1 -1
- package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
- package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
- package/dist/components/controlled/input/ControlledDurationField.js +1 -1
- package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
- package/dist/components/controlled/input/ControlledNumberField.js +1 -1
- package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
- package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
- package/dist/components/controlled/input/ControlledPriceField.js +1 -1
- package/dist/components/controlled/input/ControlledRangeField.js +1 -1
- package/dist/components/controlled/input/ControlledRatingField.js +1 -1
- package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
- package/dist/components/controlled/input/ControlledTextField.d.ts +5 -5
- 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.js +1 -1
- package/dist/components/controlled/input/index.js +1 -1
- package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
- package/dist/components/controlled/select/ControlledDropdownField.d.ts +2 -4
- 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 +2 -4
- 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 +2 -4
- 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/ControlledReferenceField.js +1 -1
- package/dist/components/controlled/select/ControlledYearField.js +1 -1
- package/dist/components/controlled/select/index.js +1 -1
- package/dist/components/controlled/types.js +1 -1
- package/dist/components/fields/display/AvatarFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
- package/dist/components/fields/display/BadgeFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
- package/dist/components/fields/display/ButtonFieldDisplay.d.ts +2 -2
- package/dist/components/fields/display/ButtonFieldDisplay.js +1 -1
- package/dist/components/fields/display/CheckboxFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
- package/dist/components/fields/display/DateFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/DateFieldDisplay.d.ts.map +1 -1
- package/dist/components/fields/display/DateFieldDisplay.js +1 -1
- package/dist/components/fields/display/DropdownDisplay.d.ts +1 -1
- package/dist/components/fields/display/DropdownDisplay.js +1 -1
- package/dist/components/fields/display/FileFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/FileFieldDisplay.js +1 -1
- package/dist/components/fields/display/GeoPointFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -1
- package/dist/components/fields/display/HiddenFieldDisplay.d.ts +2 -2
- package/dist/components/fields/display/HiddenFieldDisplay.js +1 -1
- package/dist/components/fields/display/ImageFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/ImageFieldDisplay.js +1 -1
- package/dist/components/fields/display/LinkFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
- package/dist/components/fields/display/MapFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/MapFieldDisplay.js +1 -1
- package/dist/components/fields/display/MultiDropdownDisplay.d.ts +1 -1
- package/dist/components/fields/display/MultiDropdownDisplay.js +1 -1
- package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -1
- package/dist/components/fields/display/NumberFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/NumberFieldDisplay.d.ts.map +1 -1
- package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
- package/dist/components/fields/display/PasswordFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
- package/dist/components/fields/display/PhoneNumberDisplay.d.ts +1 -1
- package/dist/components/fields/display/PhoneNumberDisplay.js +1 -1
- package/dist/components/fields/display/RadioFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/RadioFieldDisplay.js +1 -1
- package/dist/components/fields/display/RangeFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/RangeFieldDisplay.js +1 -1
- package/dist/components/fields/display/ReferenceFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
- package/dist/components/fields/display/RichTextDisplay.d.ts +1 -1
- package/dist/components/fields/display/RichTextDisplay.js +2 -2
- package/dist/components/fields/display/TextAreaDisplay.d.ts +1 -1
- package/dist/components/fields/display/TextAreaDisplay.js +1 -1
- package/dist/components/fields/display/TextFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/TextFieldDisplay.js +1 -1
- package/dist/components/fields/display/TimestampFieldDisplay.d.ts +1 -1
- package/dist/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -1
- package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
- package/dist/components/fields/display/index.d.ts +1 -1
- package/dist/components/fields/display/index.js +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/AvatarFieldComponent.js +1 -1
- package/dist/components/form/fields/BadgeFieldComponent.d.ts +2 -2
- 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 +1 -1
- package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
- package/dist/components/form/fields/ComboboxComponent.d.ts +1 -1
- package/dist/components/form/fields/ComboboxComponent.js +1 -1
- package/dist/components/form/fields/CurrencyFieldComponent.d.ts +1 -1
- 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 +3 -3
- 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.js +1 -1
- package/dist/components/form/fields/DropdownComponent.d.ts +1 -1
- package/dist/components/form/fields/DropdownComponent.js +1 -1
- package/dist/components/form/fields/DurationFieldComponent.js +1 -1
- package/dist/components/form/fields/FileFieldComponent.js +1 -1
- package/dist/components/form/fields/GdprConsentFieldComponent.d.ts +1 -1
- package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
- package/dist/components/form/fields/GeoPointFieldComponent.d.ts +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.js +1 -1
- 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.d.ts +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.d.ts +1 -1
- package/dist/components/form/fields/NumberFieldComponent.js +1 -1
- package/dist/components/form/fields/PasswordFieldComponent.d.ts +1 -1
- package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
- package/dist/components/form/fields/PhoneNumberComponent.d.ts +1 -1
- package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
- package/dist/components/form/fields/PriceFieldComponent.js +1 -1
- package/dist/components/form/fields/RadioFieldComponent.js +1 -1
- package/dist/components/form/fields/RangeFieldComponent.d.ts +1 -1
- package/dist/components/form/fields/RangeFieldComponent.js +1 -1
- package/dist/components/form/fields/RatingFieldComponent.d.ts +1 -1
- package/dist/components/form/fields/RatingFieldComponent.js +1 -1
- package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
- package/dist/components/form/fields/RichTextComponent.d.ts +1 -1
- package/dist/components/form/fields/RichTextComponent.js +1 -1
- package/dist/components/form/fields/SwitchFieldComponent.d.ts +1 -1
- package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
- package/dist/components/form/fields/TextAreaComponent.d.ts +1 -1
- package/dist/components/form/fields/TextAreaComponent.js +1 -1
- package/dist/components/form/fields/TextFieldComponent.d.ts +4 -4
- package/dist/components/form/fields/TextFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/TextFieldComponent.js +1 -1
- package/dist/components/form/fields/TimestampFieldComponent.d.ts +2 -2
- package/dist/components/form/fields/TimestampFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
- package/dist/components/form/fields/index.d.ts +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.js +2 -2
- package/dist/components/form/fields/types.d.ts +1 -1
- package/dist/components/form/index.d.ts +1 -1
- package/dist/components/form/internal/ImageViewerDialog.js +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.js +1 -1
- package/dist/contexts/UploadContext.d.ts +1 -0
- 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.map +1 -1
- package/dist/fieldTypeRegistry.js +1 -1
- package/dist/fieldTypeRegistry.store.d.ts.map +1 -1
- package/dist/fieldTypeRegistry.store.js +1 -1
- package/dist/fieldTypeRegistry.types.d.ts +4 -0
- package/dist/fieldTypeRegistry.types.d.ts.map +1 -1
- package/dist/forms/hooks/index.d.ts +1 -1
- package/dist/forms/hooks/index.js +1 -1
- package/dist/forms/hooks/useController.js +1 -1
- package/dist/forms/hooks/useEntityField.d.ts +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 +1 -1
- package/dist/forms/index.js +1 -1
- package/dist/forms/types.d.ts +12 -7
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/utils/buildInitialValues.d.ts.map +1 -1
- package/dist/forms/utils/buildInitialValues.js +1 -1
- package/dist/forms/utils/getFieldsForOperation.d.ts +2 -2
- 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 +1 -1
- package/dist/forms/utils/index.js +1 -1
- package/dist/forms/utils/isFieldEditable.d.ts +8 -2
- package/dist/forms/utils/isFieldEditable.d.ts.map +1 -1
- package/dist/forms/utils/isFieldEditable.js +1 -1
- package/dist/forms/utils/translateFieldLabel.d.ts +3 -3
- package/dist/forms/utils/translateFieldLabel.js +1 -1
- package/dist/forms/utils/validateEntity.d.ts +1 -1
- package/dist/forms/utils/validateEntity.js +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useCrudFilters.d.ts +2 -0
- package/dist/hooks/useCrudFilters.d.ts.map +1 -1
- package/dist/hooks/useCrudFilters.js +1 -1
- package/dist/hooks/useCrudPageSize.d.ts +29 -0
- package/dist/hooks/useCrudPageSize.d.ts.map +1 -0
- package/dist/hooks/useCrudPageSize.js +1 -0
- package/dist/hooks/useEntityFavorites.d.ts +2 -0
- package/dist/hooks/useEntityFavorites.d.ts.map +1 -1
- package/dist/hooks/useEntityFavorites.js +1 -1
- package/dist/hooks/useFieldConditions.js +1 -1
- package/dist/hooks/useFileUpload.d.ts.map +1 -1
- package/dist/hooks/useFileUpload.js +1 -1
- package/dist/hooks/useReferenceResolver.d.ts +1 -1
- package/dist/hooks/useReferenceResolver.d.ts.map +1 -1
- package/dist/hooks/useReferenceResolver.js +1 -1
- package/dist/hooks/useRelatedItems.d.ts +2 -0
- package/dist/hooks/useRelatedItems.d.ts.map +1 -1
- package/dist/hooks/useRelatedItems.js +1 -1
- package/dist/hooks/useUnsavedChangesWarning.js +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/registerBuiltinFieldTypes.d.ts.map +1 -1
- package/dist/registerBuiltinFieldTypes.js +1 -1
- package/dist/stores/FormStore.d.ts +2 -0
- package/dist/stores/FormStore.d.ts.map +1 -1
- package/dist/stores/FormStore.js +1 -1
- package/dist/stores/UploadStore.d.ts +9 -3
- package/dist/stores/UploadStore.d.ts.map +1 -1
- package/dist/stores/UploadStore.js +1 -1
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.js +1 -1
- package/dist/symbol-index.json +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +10 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/useBaseCrudList.js +1 -1
- package/dist/useCrud.d.ts +1 -0
- package/dist/useCrud.d.ts.map +1 -1
- package/dist/useCrud.js +1 -1
- package/dist/useCrudCardList.d.ts +5 -3
- package/dist/useCrudCardList.d.ts.map +1 -1
- package/dist/useCrudCardList.js +1 -1
- package/dist/useCrudList.d.ts +5 -3
- package/dist/useCrudList.d.ts.map +1 -1
- package/dist/useCrudList.js +1 -1
- package/dist/utils/clientListProcessing.d.ts +22 -3
- package/dist/utils/clientListProcessing.d.ts.map +1 -1
- package/dist/utils/clientListProcessing.js +1 -1
- package/dist/utils/collections.d.ts +6 -6
- package/dist/utils/collections.js +1 -1
- package/dist/utils/fileStorage.d.ts +2 -0
- package/dist/utils/fileStorage.d.ts.map +1 -1
- package/dist/utils/fileStorage.js +1 -1
- 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 +2 -0
- package/dist/utils/imageStorage.d.ts.map +1 -1
- package/dist/utils/imageStorage.js +1 -1
- package/dist/utils/imageUtils.d.ts +1 -1
- package/dist/utils/imageUtils.js +1 -1
- package/dist/utils/matchesFilter.d.ts.map +1 -1
- package/dist/utils/matchesFilter.js +1 -1
- package/dist/utils/mergeWithOptimistic.js +1 -1
- package/dist/utils/sanitizeHtml.d.ts +0 -5
- package/dist/utils/sanitizeHtml.d.ts.map +1 -1
- package/dist/utils/sanitizeHtml.js +1 -1
- package/dist/utils/scopeUtils.js +1 -1
- package/dist/utils/uploadValidation.d.ts +1 -1
- package/dist/utils/uploadValidation.js +1 -1
- package/dist/workflows/WorkflowPersistence.d.ts +1 -1
- package/dist/workflows/WorkflowPersistence.js +1 -1
- package/dist/workflows/defineWorkflow.d.ts +1 -1
- package/dist/workflows/index.d.ts +1 -1
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/useEntityWorkflow.js +1 -1
- package/guidelines/COMPONENTS.md +234 -0
- package/guidelines/CRUD.md +340 -0
- package/guidelines/GOTCHAS.md +46 -0
- package/package.json +7 -4
package/dist/types.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - CrudStore = only tracks optimistic metadata (optimisticData + originalData)
|
|
8
8
|
* - mergeWithOptimistic merges TanStack cache with optimistic data for display
|
|
9
9
|
*
|
|
10
|
-
* @version 0.0
|
|
10
|
+
* @version 0.1.0
|
|
11
11
|
* @since 0.0.1
|
|
12
12
|
* @author AMBROISE PARK Consulting
|
|
13
13
|
*/
|
|
@@ -20,6 +20,7 @@ export declare const OPTIMISTIC_STATUSES: {
|
|
|
20
20
|
readonly CONFIRMED: "confirmed";
|
|
21
21
|
readonly FAILED: "failed";
|
|
22
22
|
};
|
|
23
|
+
/** Union of optimistic operation status values: 'pending' | 'confirmed' | 'failed'. */
|
|
23
24
|
export type OptimisticStatus = (typeof OPTIMISTIC_STATUSES)[keyof typeof OPTIMISTIC_STATUSES];
|
|
24
25
|
/** Optimistic mutation operation kind */
|
|
25
26
|
export declare const CRUD_OPERATION: {
|
|
@@ -29,6 +30,7 @@ export declare const CRUD_OPERATION: {
|
|
|
29
30
|
readonly SET: "set";
|
|
30
31
|
readonly DELETE: "delete";
|
|
31
32
|
};
|
|
33
|
+
/** Union of CRUD mutation operation kinds: 'add' | 'update' | 'set' | 'delete'. */
|
|
32
34
|
export type CrudOperation = (typeof CRUD_OPERATION)[keyof typeof CRUD_OPERATION];
|
|
33
35
|
/**
|
|
34
36
|
* Optimistic operation metadata
|
|
@@ -60,12 +62,14 @@ export type FilterState = Record<string, string | string[] | {
|
|
|
60
62
|
export interface CollectionUIState {
|
|
61
63
|
filters: FilterState;
|
|
62
64
|
showFavoritesOnly: boolean;
|
|
65
|
+
/** Persisted items-per-page preference (survives navigation) */
|
|
66
|
+
pageSize?: number;
|
|
63
67
|
}
|
|
64
68
|
/**
|
|
65
69
|
* CRUD store state interface
|
|
66
70
|
* Note: No data field - TanStack Query owns data, CrudStore only tracks optimistic ops
|
|
67
71
|
*
|
|
68
|
-
* @version 0.0
|
|
72
|
+
* @version 0.1.0
|
|
69
73
|
* @since 0.0.1
|
|
70
74
|
* @author AMBROISE PARK Consulting
|
|
71
75
|
*/
|
|
@@ -87,7 +91,7 @@ export interface CrudState {
|
|
|
87
91
|
* CRUD store actions interface
|
|
88
92
|
* Note: No setData/getData - TanStack Query owns data, CrudStore only tracks optimistic ops
|
|
89
93
|
*
|
|
90
|
-
* @version 0.0
|
|
94
|
+
* @version 0.1.0
|
|
91
95
|
* @since 0.0.1
|
|
92
96
|
* @author AMBROISE PARK Consulting
|
|
93
97
|
*/
|
|
@@ -101,8 +105,10 @@ export interface CrudActions {
|
|
|
101
105
|
clearError: (collection: string) => void;
|
|
102
106
|
setFilters: (collection: string, filters: FilterState) => void;
|
|
103
107
|
setShowFavoritesOnly: (collection: string, show: boolean) => void;
|
|
108
|
+
setPageSize: (collection: string, pageSize: number) => void;
|
|
104
109
|
getFilters: (collection: string) => FilterState;
|
|
105
110
|
getShowFavoritesOnly: (collection: string) => boolean;
|
|
111
|
+
getPageSize: (collection: string) => number | undefined;
|
|
106
112
|
/** Add item optimistically (before server confirms) */
|
|
107
113
|
addOptimistic: (collection: string, tempId: string, data: unknown) => void;
|
|
108
114
|
/** Confirm optimistic add - replace temp item with real item */
|
|
@@ -162,7 +168,7 @@ export interface MutationOptions {
|
|
|
162
168
|
* CRUD Service Interface
|
|
163
169
|
* Complete interface for CRUD operations with caching and optimistic updates
|
|
164
170
|
*
|
|
165
|
-
* @version 0.0
|
|
171
|
+
* @version 0.1.0
|
|
166
172
|
* @since 0.0.1
|
|
167
173
|
* @author AMBROISE PARK Consulting
|
|
168
174
|
*/
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACf,MAAM,gBAAgB,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEjE,yCAAyC;AACzC,eAAO,MAAM,cAAc;;;IAGzB,0EAA0E;;;CAGlE,CAAC;AAEX,MAAM,MAAM,aAAa,GACvB,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,iEAAiE;IACjE,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAC9B,MAAM,EACN,MAAM,GAAG,MAAM,EAAE,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CACnD,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const e={PENDING:"pending",CONFIRMED:"confirmed",FAILED:"failed"},E={ADD:"add",UPDATE:"update",SET:"set",DELETE:"delete"};export{E as CRUD_OPERATION,e as OPTIMISTIC_STATUSES};
|
package/dist/useBaseCrudList.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useMemo as
|
|
1
|
+
import{useMemo as Q,useCallback as Z,useRef as R,useState as $,useEffect as ee}from"react";import{useQuery as te}from"@donotdev/core";import{useCrudStore as se}from"./CrudStore";import{CRUD_OPERATION as z}from"./types";import{useCrud as V,getCrudServiceInstance as re,EMPTY_OPTIMISTIC as oe}from"./useCrud";import{mergeWithOptimistic as ce}from"./utils/mergeWithOptimistic";import{injectScopeFilter as ie,getCurrentScopeValue as ne}from"./utils/scopeUtils";const ae=1e3;function Oe(j,f,s,g={}){const K=g.enabled??!0,b=V("status"),a=b==="ready",N=V(j,g),{error:E,invalidate:L,_collection:d,_schemas:O,_cacheOptions:S,_scope:T}=N,F=se(e=>e.collections[d]?.optimistic||oe),q=R(new Map([[1,null]])),y=R(0),[A,U]=$(!1),i=s?.mode==="auto"?A?"server":"client":s?.mode??"client",k=ne(T),I=Q(()=>{if(!a||!O)return null;const e=re();if(!e)return null;const h=f==="listCard"?O.listCard:O.list,n=ie(g.queryOptions,T);if(!s)return e.getListQueryOptions(d,n,h,S,f);if(i==="client"){const o=s.mode==="auto"&&!n?.limit?{...n,limit:ae}:n;return e.getListQueryOptions(d,o,h,S,f)}const l=q.current,u=y.current,{page:m,pageSize:p}=s;let t,r;if(l.has(m))t=l.get(m)??void 0,r=p;else if(m>u&&l.has(u)){const o=m-u;t=l.get(u)??void 0,r=o*p}else t=void 0,r=m*p;return e.getListQueryOptions(d,{...n,limit:r,startAfter:t},h,S,f)},[a,d,S,O?"hasSchema":"noSchema",f,i,s?.page,s?.pageSize,g.queryOptions,T?.provider,k]),{data:c,isLoading:B,isFetching:W,error:Y,refetch:M}=te({queryKey:I?.queryKey??["crud",d,"disabled"],queryFn:I?.queryFn??(()=>Promise.resolve({items:[]})),staleTime:I?.staleTime,enabled:K&&!!I});ee(()=>{s?.mode==="auto"&&!A&&c&&c.total!=null&&c.total>c.items.length&&U(!0)},[c,s?.mode,A]);const P=Q(()=>{if(!c||!a)return{items:[],total:void 0};let e=c.items;if(i==="server"&&s&&e.length>0){const t=q.current,r=y.current,{page:o,pageSize:v}=s,H=e.length;if(Math.ceil(H/v)>1||o>r){const w=t.has(o)?o:r+1;for(let C=w;C<=o;C++){const x=(C-w+1)*v-1;if(x<e.length){const X=e[x];t.set(C+1,X.id)}}}c.lastVisible&&t.set(o+1,c.lastVisible),y.current=Math.max(r,o);const _=t.has(o)?0:(o-r-1)*v,J=_+v;e=e.slice(_,J)}const h=ce(e,F),n=new Set(e.map(t=>t.id));let l=0,u=0;for(const[t,r]of Object.entries(F))r.operation===z.ADD&&!n.has(t)?l++:r.operation===z.DELETE&&n.has(t)&&u++;const p=(c.total??e.length)+l-u;return{items:h,total:p}},[c,F,a,i,s?.page,s?.pageSize]),D=Z(async()=>{a&&(i==="server"&&(q.current=new Map([[1,null]]),y.current=0),await L(),await M())},[L,M,a,i]);if(!a){const e=async()=>{};return{status:b,data:{items:[],total:void 0},items:[],loading:!0,fetching:!1,error:E,mutate:e,refresh:e,isAvailable:!1,effectiveMode:i}}const G=P?.items??[];return{status:b,data:P,items:G,loading:B,fetching:W,error:Y??E,mutate:D,refresh:D,isAvailable:!0,effectiveMode:i}}export{Oe as useBaseCrudList};
|
package/dist/useCrud.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export declare const EMPTY_OPTIMISTIC: Record<string, unknown>;
|
|
|
6
6
|
* Get the current CrudService instance (for use in callbacks)
|
|
7
7
|
*/
|
|
8
8
|
export declare function getCrudServiceInstance(): CrudServiceInterface | null;
|
|
9
|
+
/** Options for the {@link useCrud} hook. */
|
|
9
10
|
export interface UseCrudOptions<T> {
|
|
10
11
|
schema?: dndevSchema<T>;
|
|
11
12
|
/** Entity definition - auto-generates schema if schema not provided */
|
package/dist/useCrud.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCrud.d.ts","sourceRoot":"","sources":["../src/useCrud.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useCrud.d.ts","sourceRoot":"","sources":["../src/useCrud.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,WAAW,EAEZ,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EAEb,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;AAe5D;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,oBAAoB,GAAG,IAAI,CAEpE;AAMD,4CAA4C;AAC5C,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,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
|
|
1
|
+
"use client";import{useEffect as L,useMemo as y,useCallback as i}from"react";import{useFeatureConsent as W,FRAMEWORK_FEATURES as Q,FEATURE_STATUS as h,handleError as V,isClient as Z,createSchemas as $,DEGRADED_CRUD_API as B,getGlobalSingleton as H}from"@donotdev/core";import{getCrudService as J}from"./CrudService";import{useCrudStore as u}from"./CrudStore";import{injectScope as P,injectScopeFilter as X}from"./utils/scopeUtils";const re={},ce={};function N(){return H("crud-service",()=>({service:null,initPromise:null,errorNotified:!1}))}function o(){return N().service}function ne(l,d={}){const S=W(Q.CRUD),U=u(e=>e.crudService),g=S&&!U,p=S?g?h.INITIALIZING:h.READY:h.DEGRADED,m=l==="status",v=!m&&typeof l=="object"?l:d.entity,r=m?"__status__":typeof l=="string"?l:l.collection,a=v?.scope,_=d.noCache??!1,C=d.staleTime,f=y(()=>({noCache:_,staleTime:C}),[_,C]),s=y(()=>{if(!m){if(d.schema){const e=d.schema;return{create:e,draft:e,update:e,get:e,list:e,listCard:e,delete:e}}if(v)return $(v)}},[m,d.schema,v?.name,r]),w=u(e=>e.collections[r]?.loading||!1),E=u(e=>e.collections[r]?.error||null),F=null;L(()=>{if(!Z()||!S||!s)return;const{crudService:e}=u.getState(),t=N();e||t.service||t.initPromise||(t.initPromise=(async()=>{try{if(t.service||u.getState().crudService)return;const c=J();t.service=c,c.setStore(u),await c.initialize(),t.errorNotified=!1,u.getState().setCrudService(c)}catch(c){t.errorNotified||(V(c,{userMessage:"Failed to initialize CRUD service.",context:{collection:r},severity:"error"}),t.errorNotified=!0)}finally{t.initPromise=null}})())},[S,r,s?"hasSchema":"noSchema"]);const T=g||w,x=p===h.READY,M=i(async e=>{const t=o();return!t||!s?null:t.get(r,e,s.get,f)},[r,s?"hasSchema":"noSchema",f]),Y=i(async(e,t,c)=>{const n=o();if(!n||!s)return;const D=P(t,a),z=D?.status==="draft"?s.draft:s.create;await n.set(r,e,D,z,c)},[r,s?"hasSchema":"noSchema",a?.provider]),G=i(async(e,t,c)=>{const n=o();n&&await n.update(r,e,t,s?.update,c)},[r,s]),j=i(async(e,t)=>{const c=o();c&&await c.delete(r,e,t)},[r]),k=i(async(e,t)=>{const c=o();if(!c||!s)return"";const n=P(e,a),I=n?.status==="draft"?s.draft:s.create;return c.add(r,n,I,t)},[r,s?"hasSchema":"noSchema",a?.provider]),q=i(async e=>{const t=o();if(!t||!s)return[];const c=X(e,a);return(await t.query(r,c,s.list,f)).items},[r,s?"hasSchema":"noSchema",f,a?.provider]),A=i((e,t)=>{const c=o();return!c||!s?()=>{}:c.subscribe(r,e,t,s.get)},[r,s?"hasSchema":"noSchema"]),b=i((e,t)=>{const c=o();return!c||!s?()=>{}:c.subscribeToCollection(r,e,t,s.list)},[r,s?"hasSchema":"noSchema"]),R=i(async()=>{const e=o();e&&await e.invalidateCollection(r)},[r]);return m?p:x?{status:h.READY,data:F,loading:T,error:E,get:M,set:Y,update:G,delete:j,add:k,query:q,subscribe:A,subscribeToCollection:b,invalidate:R,isAvailable:!0,_collection:r,_schemas:s,_cacheOptions:f,_scope:a}:{...B,status:p,loading:T,error:E,subscribe:A,subscribeToCollection:b,invalidate:R,_collection:r,_schemas:s,_cacheOptions:f,_scope:a}}export{re as EMPTY_DATA,ce as EMPTY_OPTIMISTIC,o as getCrudServiceInstance,ne as useCrud};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Entity, FeatureStatus, QueryOptions } from '@donotdev/core';
|
|
2
2
|
import type { UseCrudOptions } from './useCrud';
|
|
3
|
-
import type { ClientSortConfig } from './utils/clientListProcessing';
|
|
3
|
+
import type { ClientSort, ClientSortConfig } from './utils/clientListProcessing';
|
|
4
|
+
/** Options for the {@link useCrudCardList} hook. */
|
|
4
5
|
export interface UseCrudCardListOptions<T> extends UseCrudOptions<T> {
|
|
5
6
|
/** Automatically fetch data on mount (default: true) */
|
|
6
7
|
enabled?: boolean;
|
|
@@ -8,9 +9,10 @@ export interface UseCrudCardListOptions<T> extends UseCrudOptions<T> {
|
|
|
8
9
|
queryOptions?: QueryOptions;
|
|
9
10
|
/** Client-side search query. Applied after filters. */
|
|
10
11
|
searchQuery?: string;
|
|
11
|
-
/** Client-side sort config. Defaults to entity.defaultSort.
|
|
12
|
-
clientSort?: ClientSortConfig | null;
|
|
12
|
+
/** Client-side sort: field config, comparator function, or null to disable. Defaults to entity.defaultSort. */
|
|
13
|
+
clientSort?: ClientSort<T> | ClientSortConfig | null;
|
|
13
14
|
}
|
|
15
|
+
/** Return type of the {@link useCrudCardList} hook. */
|
|
14
16
|
export interface UseCrudCardListReturn<T> {
|
|
15
17
|
status: FeatureStatus;
|
|
16
18
|
data: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCrudCardList.d.ts","sourceRoot":"","sources":["../src/useCrudCardList.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAa1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"useCrudCardList.d.ts","sourceRoot":"","sources":["../src/useCrudCardList.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAa1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEjF,oDAAoD;AACpD,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;IAC5B,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+GAA+G;IAC/G,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAAC;CACtD;AAED,uDAAuD;AACvD,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5B,4FAA4F;IAC5F,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,wEAAwE;IACxE,SAAS,EAAE,CAAC,EAAE,CAAC;IACf,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,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;;;;;;;;;;;;;;;;;;;;GAoBG;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,CAuE1B"}
|
package/dist/useCrudCardList.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useMemo as
|
|
1
|
+
import{useMemo as o}from"react";import{useCrudFilters as f}from"./hooks/useCrudFilters";import{useBaseCrudList as h}from"./useBaseCrudList";import{applyFilters as y,applySearch as g,applySort as p}from"./utils/clientListProcessing";function v(l,t={}){const u={enabled:t.enabled,queryOptions:t.queryOptions,schema:t.schema,entity:t.entity,staleTime:t.staleTime,noCache:t.noCache},e=h(l,"listCard",null,u),s=typeof l=="string"?null:l,c=s?.collection??l,{filters:a}=f({collection:c}),i=t.clientSort===null?null:t.clientSort??s?.defaultSort??null,{processed:n,filteredTotal:m}=o(()=>{let r=e.items;s&&Object.keys(a).length>0&&(r=y(r,a,s)),s&&t.searchQuery&&(r=g(r,t.searchQuery,s));const d=r.length;return i&&(r=p(r,i)),{processed:r,filteredTotal:d}},[e.items,a,t.searchQuery,i,s]);return{status:e.status,data:e.data?{items:e.data.items}:null,items:e.items,processed:n,filteredTotal:m,loading:e.loading,fetching:e.fetching,error:e.error,mutate:e.mutate,refresh:e.refresh,isAvailable:e.isAvailable}}export{v as useCrudCardList};
|
package/dist/useCrudList.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Entity, FeatureStatus } from '@donotdev/core';
|
|
2
2
|
import type { QueryOptions } from '@donotdev/core';
|
|
3
3
|
import type { UseCrudOptions } from './useCrud';
|
|
4
|
-
import type { ClientSortConfig } from './utils/clientListProcessing';
|
|
4
|
+
import type { ClientSort, ClientSortConfig } from './utils/clientListProcessing';
|
|
5
|
+
/** Options for the {@link useCrudList} hook. */
|
|
5
6
|
export interface UseCrudListOptions<T> extends UseCrudOptions<T> {
|
|
6
7
|
/** Automatically fetch data on mount (default: true) */
|
|
7
8
|
enabled?: boolean;
|
|
@@ -20,9 +21,10 @@ export interface UseCrudListOptions<T> extends UseCrudOptions<T> {
|
|
|
20
21
|
queryOptions?: QueryOptions;
|
|
21
22
|
/** Client-side search query. Applied after filters. */
|
|
22
23
|
searchQuery?: string;
|
|
23
|
-
/** Client-side sort config. Defaults to entity.defaultSort.
|
|
24
|
-
clientSort?: ClientSortConfig | null;
|
|
24
|
+
/** Client-side sort: field config, comparator function, or null to disable. Defaults to entity.defaultSort. */
|
|
25
|
+
clientSort?: ClientSort<T> | ClientSortConfig | null;
|
|
25
26
|
}
|
|
27
|
+
/** Return type of the {@link useCrudList} hook. */
|
|
26
28
|
export interface UseCrudListReturn<T> {
|
|
27
29
|
status: FeatureStatus;
|
|
28
30
|
data: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCrudList.d.ts","sourceRoot":"","sources":["../src/useCrudList.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAcnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"useCrudList.d.ts","sourceRoot":"","sources":["../src/useCrudList.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAcnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEjF,gDAAgD;AAChD,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAC9D,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+GAA+G;IAC/G,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAAC;CACtD;AAED,mDAAmD;AACnD,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,4FAA4F;IAC5F,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,wEAAwE;IACxE,SAAS,EAAE,CAAC,EAAE,CAAC;IACf,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,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;IACrB,6EAA6E;IAC7E,aAAa,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;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,CAwEtB"}
|
package/dist/useCrudList.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useMemo as h}from"react";import{useCrudFilters as
|
|
1
|
+
import{useMemo as h}from"react";import{useCrudFilters as y}from"./hooks/useCrudFilters";import{useBaseCrudList as S}from"./useBaseCrudList";import{applyFilters as b,applySearch as T,applySort as Q}from"./utils/clientListProcessing";function L(a,e={}){const n=e.pagination??"auto",u=e.page??1,i=e.pageSize??10,o={mode:n,page:u,pageSize:i},m={enabled:e.enabled,queryOptions:e.queryOptions,schema:e.schema,entity:e.entity,staleTime:e.staleTime,noCache:e.noCache},s=S(a,"list",o,m),r=typeof a=="string"?null:a,d=r?.collection??a,{filters:l}=y({collection:d}),c=e.clientSort===null?null:e.clientSort??r?.defaultSort??null,{processed:f,filteredTotal:p}=h(()=>{let t=s.items;r&&Object.keys(l).length>0&&(t=b(t,l,r)),r&&e.searchQuery&&(t=T(t,e.searchQuery,r));const g=t.length;return c&&(t=Q(t,c)),{processed:t,filteredTotal:g}},[s.items,l,e.searchQuery,c,r]);return{...s,processed:f,filteredTotal:p}}export{L as useCrudList};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @description Pure functions for filtering, searching, and sorting entity items.
|
|
4
4
|
* Used by useCrudList/useCrudCardList hooks and UI components.
|
|
5
5
|
*
|
|
6
|
-
* @version 0.0
|
|
6
|
+
* @version 0.1.0
|
|
7
7
|
* @since 0.0.1
|
|
8
8
|
* @author AMBROISE PARK Consulting
|
|
9
9
|
*/
|
|
@@ -21,6 +21,21 @@ export interface ClientSortConfig {
|
|
|
21
21
|
field: string;
|
|
22
22
|
direction?: 'asc' | 'desc';
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Client-side sort: field-based config or custom comparator function.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* // Field-based
|
|
30
|
+
* const sort: ClientSort = { field: 'price', direction: 'desc' };
|
|
31
|
+
*
|
|
32
|
+
* // Custom comparator (multi-key, status priority, etc.)
|
|
33
|
+
* const sort: ClientSort<Apartment> = (a, b) =>
|
|
34
|
+
* STATUS_PRIORITY[a.status] - STATUS_PRIORITY[b.status]
|
|
35
|
+
* || a.date.localeCompare(b.date);
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export type ClientSort<T = Record<string, unknown>> = ClientSortConfig | ((a: T, b: T) => number);
|
|
24
39
|
/**
|
|
25
40
|
* Apply filter state to items using entity field type metadata.
|
|
26
41
|
* Typically called automatically by `useCrudList`/`useCrudCardList` via `processed`.
|
|
@@ -65,18 +80,22 @@ export declare function getSearchableFields(entity: Entity): string[];
|
|
|
65
80
|
export declare function applySearch<T extends Record<string, any>>(items: T[], query: string, entity: Entity): T[];
|
|
66
81
|
/**
|
|
67
82
|
* Apply client-side sorting to items.
|
|
83
|
+
* Accepts a field-based config or a custom comparator function.
|
|
68
84
|
* Handles null/undefined values by sorting them last.
|
|
69
85
|
* Supports number, string, Date, and price ({ amount }) comparisons.
|
|
70
86
|
*
|
|
71
87
|
* @param items - Items to sort
|
|
72
|
-
* @param sort - Sort configuration (field + direction)
|
|
88
|
+
* @param sort - Sort configuration (field + direction) or comparator function
|
|
73
89
|
* @returns Sorted items (new array, original unchanged)
|
|
74
90
|
*
|
|
75
91
|
* @example
|
|
76
92
|
* ```typescript
|
|
77
93
|
* import { applySort } from '@donotdev/crud';
|
|
94
|
+
* // Field-based
|
|
78
95
|
* const sorted = applySort(items, { field: 'createdAt', direction: 'desc' });
|
|
96
|
+
* // Custom comparator
|
|
97
|
+
* const sorted = applySort(items, (a, b) => a.priority - b.priority);
|
|
79
98
|
* ```
|
|
80
99
|
*/
|
|
81
|
-
export declare function applySort<T extends Record<string, any>>(items: T[], sort:
|
|
100
|
+
export declare function applySort<T extends Record<string, any>>(items: T[], sort: ClientSort<T>): T[];
|
|
82
101
|
//# sourceMappingURL=clientListProcessing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientListProcessing.d.ts","sourceRoot":"","sources":["../../src/utils/clientListProcessing.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxD,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,GACb,CAAC,EAAE,CAWL;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAyB5D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvD,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,CAAC,EAAE,CA+BL;AAED
|
|
1
|
+
{"version":3,"file":"clientListProcessing.d.ts","sourceRoot":"","sources":["../../src/utils/clientListProcessing.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC9C,gBAAgB,GAChB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;AAE7B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxD,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,GACb,CAAC,EAAE,CAWL;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAyB5D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvD,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,CAAC,EAAE,CA+BL;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACrD,KAAK,EAAE,CAAC,EAAE,EACV,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAClB,CAAC,EAAE,CAwCL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{matchesFilter as u}from"./matchesFilter";import{getValueType as
|
|
1
|
+
import{matchesFilter as u}from"./matchesFilter";import{getValueType as c}from"../fieldTypeRegistry.store";function m(t,i,f){const l=Object.entries(i);return l.length===0?t:t.filter(r=>l.every(([o,s])=>{const n=f.fields[o]?.type||"text";return u(r[o],s,n)}))}function a(t){if(t.search?.fields&&t.search.fields.length>0)return t.search.fields;const i=new Set(["string"]),f=[];for(const[l,r]of Object.entries(t.fields)){if(r.visibility==="hidden"||r.visibility==="technical")continue;const o=c(r.type);o&&i.has(o)&&f.push(l)}return f}function h(t,i,f){if(!i||i.trim()==="")return t;const l=i.toLowerCase(),r=a(f);return r.length===0?t.filter(o=>Object.values(o).some(s=>s==null?!1:String(s).toLowerCase().includes(l))):t.filter(o=>r.some(s=>{const e=o[s];return e==null?!1:typeof e=="object"&&"formatted_address"in e?String(e.formatted_address).toLowerCase().includes(l):String(e).toLowerCase().includes(l)}))}function b(t,i){if(typeof i=="function")return[...t].sort(i);const{field:f,direction:l="asc"}=i,r=l==="desc"?-1:1;return[...t].sort((o,s)=>{const e=o[f],n=s[f];return e==null&&n==null?0:e==null?1:n==null?-1:typeof e=="number"&&typeof n=="number"?(e-n)*r:typeof e=="object"&&"amount"in e&&typeof n=="object"&&"amount"in n?(e.amount-n.amount)*r:e instanceof Date&&n instanceof Date?(e.getTime()-n.getTime())*r:String(e).localeCompare(String(n))*r})}export{m as applyFilters,h as applySearch,b as applySort,a as getSearchableFields};
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @fileoverview Collection utilities
|
|
3
3
|
* @description Utilities for working with collections and subcollections
|
|
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
|
*/
|
|
@@ -10,7 +10,7 @@ import type { dndevSchema } from '@donotdev/core';
|
|
|
10
10
|
/**
|
|
11
11
|
* Deterministic subcollection configuration
|
|
12
12
|
*
|
|
13
|
-
* @version 0.0
|
|
13
|
+
* @version 0.1.0
|
|
14
14
|
* @since 0.0.1
|
|
15
15
|
* @author AMBROISE PARK Consulting
|
|
16
16
|
*/
|
|
@@ -26,7 +26,7 @@ export interface DeterministicSubcollectionConfig<T> {
|
|
|
26
26
|
/**
|
|
27
27
|
* Append subcollection configuration
|
|
28
28
|
*
|
|
29
|
-
* @version 0.0
|
|
29
|
+
* @version 0.1.0
|
|
30
30
|
* @since 0.0.1
|
|
31
31
|
* @author AMBROISE PARK Consulting
|
|
32
32
|
*/
|
|
@@ -38,7 +38,7 @@ export interface AppendSubcollectionConfig<T> {
|
|
|
38
38
|
/**
|
|
39
39
|
* Load a deterministic range of items from a subcollection
|
|
40
40
|
*
|
|
41
|
-
* @version 0.0
|
|
41
|
+
* @version 0.1.0
|
|
42
42
|
* @since 0.0.1
|
|
43
43
|
* @author AMBROISE PARK Consulting
|
|
44
44
|
*/
|
|
@@ -46,7 +46,7 @@ export declare function loadDeterministicRange<T>(userId: string, config: Determ
|
|
|
46
46
|
/**
|
|
47
47
|
* Upsert a deterministic range of items in a subcollection
|
|
48
48
|
*
|
|
49
|
-
* @version 0.0
|
|
49
|
+
* @version 0.1.0
|
|
50
50
|
* @since 0.0.1
|
|
51
51
|
* @author AMBROISE PARK Consulting
|
|
52
52
|
*/
|
|
@@ -54,7 +54,7 @@ export declare function upsertDeterministic<T>(userId: string, config: Determini
|
|
|
54
54
|
/**
|
|
55
55
|
* Append an item to a subcollection
|
|
56
56
|
*
|
|
57
|
-
* @version 0.0
|
|
57
|
+
* @version 0.1.0
|
|
58
58
|
* @since 0.0.1
|
|
59
59
|
* @author AMBROISE PARK Consulting
|
|
60
60
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCrudService as
|
|
1
|
+
import{getCrudService as o}from"../CrudService";async function u(s,t){const e=o(),r=[],a=t.range?.start??1,n=t.range?.end??28;for(let c=a;c<=n;c++){const i=String(c),d=await e.get(t.path(s),i,t.schema);d&&r.push(d)}return r}async function m(s,t,e){const r=o();for(const a of e){const n=t.idOf(a);await r.set(t.path(s),n,a,t.schema)}}async function h(s,t,e){const r=o();if(t.idFrom){const a=t.idFrom(e);return r.set(t.path(s),a,e,t.schema)}return r.add(t.path(s),e,t.schema)}export{h as appendToCollection,u as loadDeterministicRange,m as upsertDeterministic};
|
|
@@ -18,6 +18,8 @@ export interface UploadFileOptions {
|
|
|
18
18
|
filename?: string;
|
|
19
19
|
/** Progress callback */
|
|
20
20
|
onProgress?: UploadProgressCallback;
|
|
21
|
+
/** AbortSignal to cancel the upload */
|
|
22
|
+
signal?: AbortSignal;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* Upload a file to storage with progress tracking.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileStorage.d.ts","sourceRoot":"","sources":["../../src/utils/fileStorage.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,iGAAiG;AACjG,KAAK,sBAAsB,GAAG,CAAC,QAAQ,EAAE;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,KAAK,IAAI,CAAC;AAEX,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,UAAU,CAAC,EAAE,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"fileStorage.d.ts","sourceRoot":"","sources":["../../src/utils/fileStorage.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,iGAAiG;AACjG,KAAK,sBAAsB,GAAG,CAAC,QAAQ,EAAE;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,KAAK,IAAI,CAAC;AAEX,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,uCAAuC;IACvC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAYD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CAkCpB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,EAAE,CAAC,CAgCtB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CA4CxE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAY/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAY/B,CAAC;AAEF;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{handleError as
|
|
1
|
+
"use client";import{handleError as d,getProvider as p}from"@donotdev/core";function x(e){return e.replace(/[^a-zA-Z0-9.-]/g,"_").replace(/_{2,}/g,"_").toLowerCase()}async function g(e,t={}){const{storagePath:r="uploads/files",filename:n,onProgress:s,signal:o}=t,a=Date.now(),c=x(e.name),i=n||`${a}_${c}`,l=`${r}/${i}`;try{return{url:(await p("storage").upload(e,{storagePath:r,filename:i,onProgress:s?f=>s({bytesTransferred:0,totalBytes:0,progress:f}):void 0,signal:o})).url,filename:e.name,size:e.size,mimeType:e.type,uploadedAt:new Date().toISOString()}}catch(u){throw d(u,{userMessage:"Failed to upload file",severity:"error",context:{filename:e.name,fileSize:e.size}})}}async function F(e,t={}){const r=[],n=e.reduce((o,a)=>o+a.size,0);let s=0;for(const o of e){if(t.signal?.aborted)throw new Error("Upload cancelled");const a=t.onProgress?i=>{const l=i.bytesTransferred/i.totalBytes*o.size;t.onProgress({bytesTransferred:s+l,totalBytes:n,progress:(s+l)/n*100})}:void 0,c=await g(o,{...t,onProgress:a});r.push(c),s+=o.size}return r}async function M(e){try{await p("storage").delete(e.url)}catch(t){throw d(t,{userMessage:"Failed to delete file",severity:"error",context:{url:e.url,filename:e.filename}}),t}}function P(){return`${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function h(e){const t=e.split(".");return t.length>1?t.pop().toLowerCase():""}function S(e,t){const r=t?h(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 E(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 m=["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"],w=[".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".txt",".md",".html",".csv"];function B(){return[...m,...w].join(",")}export{w as DOCUMENT_EXTENSIONS,m as DOCUMENT_MIME_TYPES,M as deleteFile,E as formatFileSize,P as generateFileId,B as getDocumentAcceptString,h as getFileExtension,S as getFileIcon,g as uploadFile,F as uploadFiles};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imageProcessing.d.ts","sourceRoot":"","sources":["../../src/utils/imageProcessing.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE;
|
|
1
|
+
{"version":3,"file":"imageProcessing.d.ts","sourceRoot":"","sources":["../../src/utils/imageProcessing.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE;AAiBD;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,cAAc,CAAC,CAyEzB;AAmHD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,YAAY,CAAC,EAAE,MAAM,GACpB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgBpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
async function
|
|
1
|
+
const F=new WeakMap;function W(e){return JSON.stringify({maxWidth:e.maxWidth,maxHeight:e.maxHeight,thumbWidth:e.thumbWidth,thumbHeight:e.thumbHeight,aspectRatio:e.aspectRatio,quality:e.quality,crop:e.crop})}async function H(e,h={}){const r=W(h),n=F.get(e);if(n?.has(r))return n.get(r);const{maxWidth:l=1920,maxHeight:t=1440,thumbWidth:i=300,thumbHeight:o=225,aspectRatio:c=4/3,quality:w=.85,crop:a}=h;return new Promise((u,d)=>{const s=new Image,f=new FileReader;f.onload=g=>{s.src=g.target?.result},f.onerror=()=>d(new Error("Failed to read file")),s.onload=async()=>{try{const{width:g,height:b}=E(a?a.width:s.width,a?a.height:s.height,l,t,c),v=await y(s,g,b,c,w,a),M=await y(s,i,o,c,.65,a),x={fullBlob:v,thumbBlob:M,width:g,height:b};let m=F.get(e);m||(m=new Map,F.set(e,m)),m.set(r,x),u(x)}catch(g){d(g)}},s.onerror=()=>d(new Error("Failed to load image")),f.readAsDataURL(e)})}function E(e,h,r,n,l){let t=e,i=h;t>r&&(i=r/t*i,t=r),i>n&&(t=n/i*t,i=n);const o=t/i;return Math.abs(o-l)>.01&&(o>l?i=t/l:t=i*l),{width:Math.round(t),height:Math.round(i)}}async function y(e,h,r,n,l,t){const i=document.createElement("canvas"),o=i.getContext("2d");if(!o)throw new Error("Failed to get canvas context");i.width=h,i.height=r,o.fillStyle="#FFFFFF",o.fillRect(0,0,h,r);let c,w,a,u;if(t)c=t.x,w=t.y,a=t.width,u=t.height;else{const d=e.width/e.height;a=e.width,u=e.height,c=0,w=0,d>n?(a=e.height*n,c=(e.width-a)/2):d<n&&(u=e.width/n,w=(e.height-u)/2)}return o.drawImage(e,c,w,a,u,0,0,h,r),new Promise((d,s)=>{i.toBlob(f=>{f?d(f):s(new Error("Failed to convert canvas to blob"))},"image/webp",l)})}function B(e,h){return e.type.startsWith("image/")?h&&e.size>h?{valid:!1,error:`File size exceeds ${(h/1048576).toFixed(1)}MB limit`}:{valid:!0}:{valid:!1,error:"File must be an image"}}export{H as processImage,B as validateImageFile};
|
|
@@ -18,6 +18,8 @@ export interface UploadImageOptions {
|
|
|
18
18
|
filename?: string;
|
|
19
19
|
/** Progress callback */
|
|
20
20
|
onProgress?: UploadProgressCallback;
|
|
21
|
+
/** AbortSignal to cancel the upload */
|
|
22
|
+
signal?: AbortSignal;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* Upload full and thumbnail images to storage with progress tracking.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imageStorage.d.ts","sourceRoot":"","sources":["../../src/utils/imageStorage.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,iGAAiG;AACjG,KAAK,sBAAsB,GAAG,CAAC,QAAQ,EAAE;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,KAAK,IAAI,CAAC;AAEX,YAAY,EAAE,OAAO,EAAE,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,UAAU,CAAC,EAAE,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"imageStorage.d.ts","sourceRoot":"","sources":["../../src/utils/imageStorage.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,iGAAiG;AACjG,KAAK,sBAAsB,GAAG,CAAC,QAAQ,EAAE;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,KAAK,IAAI,CAAC;AAEX,YAAY,EAAE,OAAO,EAAE,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,uCAAuC;IACvC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAYD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,IAAI,EACd,SAAS,EAAE,IAAI,EACf,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,OAAO,CAAC,CA0ElB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAcjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{handleError as
|
|
1
|
+
import{handleError as $,getProvider as m}from"@donotdev/core";function U(e){return e.replace(/[^a-zA-Z0-9.-]/g,"_").replace(/_{2,}/g,"_").toLowerCase()}async function x(e,t,r,f={}){const{storagePath:a="uploads/images",filename:g,onProgress:o,signal:n}=f,w=Date.now(),l=(g||`${w}_${U(r)}`).replace(/\.[^/.]+$/,""),p=`${a}/${l}_full.webp`,y=`${a}/${l}_thumb.webp`;try{const u=new File([e],`${l}_full.webp`,{type:"image/webp"}),s=new File([t],`${l}_thumb.webp`,{type:"image/webp"});let h,b;const c=m("storage"),d=await c.upload(u,{storagePath:a,filename:`${l}_full.webp`,onProgress:o?i=>o({bytesTransferred:0,totalBytes:0,progress:i*.5}):void 0,signal:n});if(h=d.url,n?.aborted){try{await c.delete(d.url)}catch{}throw new Error("Upload cancelled")}return b=(await c.upload(s,{storagePath:a,filename:`${l}_thumb.webp`,onProgress:o?i=>o({bytesTransferred:0,totalBytes:0,progress:50+i*.5}):void 0,signal:n})).url,{fullUrl:h,thumbUrl:b}}catch(u){try{const s=m("storage");await s.delete(p).catch(()=>{}),await s.delete(y).catch(()=>{})}catch{}throw u}}async function E(e){try{const t=m("storage"),r=[t.delete(e.fullUrl)];e.thumbUrl&&r.push(t.delete(e.thumbUrl)),await Promise.all(r)}catch(t){throw $(t,{userMessage:"Failed to delete image",severity:"error",context:{fullUrl:e.fullUrl,thumbUrl:e.thumbUrl}}),t}}export{E as deleteImage,x 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(o=>o.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,o=new FileReader;o.onload=n=>{if(!n.target?.result){r(new Error("Failed to read file"));return}a.src=n.target.result},o.onerror=()=>r(new Error("Failed to read file")),a.onload=()=>{const n=document.createElement("canvas"),i=n.getContext("2d");if(!i){r(new Error("Failed to get canvas context"));return}n.width=a.height,n.height=a.width,i.translate(n.width/2,n.height/2),i.rotate(Math.PI/2),i.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")),o.readAsDataURL(e)})}class f{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 g(e,t){return e.filter(r=>r.hash===t)}function p(){return`img_${Date.now()}_${Math.random().toString(36).slice(2,11)}`}export{f as UndoRedoManager,h as createPreviewURL,g as findDuplicatesByHash,d as generateFileHash,p as generateImageId,u as revokePreviewURL,l as rotateImage90};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matchesFilter.d.ts","sourceRoot":"","sources":["../../src/utils/matchesFilter.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,GAAG,EAEd,WAAW,EACP,MAAM,GACN;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,MAAM,EAAE,GACR;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B;IACE,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvC,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAErC,SAAS,EAAE,MAAM,GAChB,OAAO,
|
|
1
|
+
{"version":3,"file":"matchesFilter.d.ts","sourceRoot":"","sources":["../../src/utils/matchesFilter.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,GAAG,EAEd,WAAW,EACP,MAAM,GACN;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,MAAM,EAAE,GACR;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B;IACE,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvC,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAErC,SAAS,EAAE,MAAM,GAChB,OAAO,CA8VT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getFilterType as
|
|
1
|
+
import{getFilterType as w}from"../fieldTypeRegistry.store";function T(n,t,s){if(!t)return!0;if(Array.isArray(t)){if(t.length===0)return!0;if(!(w(s)==="range"&&(s==="date"||s==="datetime-local"||s==="timestamp")))return t.some(r=>{if(typeof r=="object"&&"date"in r){const e=r.date;if(n==null)return!1;const f=n instanceof Date?n:new Date(n);return isNaN(f.getTime())?!1:f.toISOString().split("T")[0]===e}return String(n)===String(r)});if(n==null)return!1;const d=n instanceof Date?n:new Date(n);if(isNaN(d.getTime()))return!1;const D=d.toISOString().split("T")[0];return t.some(r=>typeof r=="string"?D===r:typeof r=="object"&&"date"in r?D===r.date:!1)}if(typeof t=="object"&&"date"in t&&!("min"in t)&&!Array.isArray(t)){if(!(w(s)==="range"&&(s==="date"||s==="datetime-local"||s==="timestamp")))return!1;const d=t.date;if(!d)return!0;if(n==null)return!1;const D=n instanceof Date?n.toISOString().split("T")[0]:new Date(n).toISOString().split("T")[0];if((s==="datetime-local"||s==="timestamp")&&t.time){const r=n instanceof Date?n.toISOString().slice(11,16):new Date(n).toISOString().slice(11,16);return D===d&&r===t.time}return D===d}if(typeof t=="object"&&"min"in t){const i=w(s);if(!i)return!0;const c=i==="range"&&(s==="date"||s==="datetime-local"||s==="timestamp"),d=i==="range"&&!c,D=s==="price",r=D&&n!=null&&typeof n=="object"?Number(n.amount):d&&n!=null?typeof n=="number"?n:Number(n):NaN;if(d||D){if(typeof t.min=="object"&&t.min!==null&&"date"in t.min)return!1;const e=t,f=typeof e.min=="string"&&e.min!=="",p=typeof e.max=="string"&&e.max!=="";return f&&!p?n==null||isNaN(r)?!1:r>=Number(e.min):!f&&p?n==null?!0:isNaN(r)?!1:r<=Number(e.max):f&&p?n==null||isNaN(r)?!1:r>=Number(e.min)&&r<=Number(e.max):!0}if(c){if(typeof t.min=="object"&&t.min!==null&&"date"in t.min&&!("min"in t.min)){const o=t,N=o.min,a=o.max,m=N?.date&&N.date!=="",b=a?.date&&a.date!=="";if(m&&!b){if(n==null)return!1;const g=n instanceof Date?n:new Date(n);if(isNaN(g.getTime()))return!1;const u=new Date(N.date+(N.time?`T${N.time}:00`:"T00:00:00"));return g>=u}if(!m&&b&&a){if(n==null)return!0;const g=n instanceof Date?n:new Date(n);if(isNaN(g.getTime()))return!1;const u=new Date(a.date+(a.time?`T${a.time}:00`:"T23:59:59"));return g<=u}if(m&&b&&a){if(n==null)return!1;const g=n instanceof Date?n:new Date(n);if(isNaN(g.getTime()))return!1;const u=new Date(N.date+(N.time?`T${N.time}:00`:"T00:00:00")),y=new Date(a.date+(a.time?`T${a.time}:00`:"T23:59:59"));return g>=u&&g<=y}return!0}const e=t,f=typeof e.min=="string"&&e.min!=="",p=typeof e.max=="string"&&e.max!=="";if(f&&!p){if(n==null)return!1;const o=n instanceof Date?n:new Date(n);return isNaN(o.getTime())?!1:o>=new Date(e.min)}if(!f&&p){if(n==null)return!0;const o=n instanceof Date?n:new Date(n);return isNaN(o.getTime())?!1:o<=new Date(e.max)}if(f&&p){if(n==null)return!1;const o=n instanceof Date?n:new Date(n);return isNaN(o.getTime())?!1:o>=new Date(e.min)&&o<=new Date(e.max)}return!0}}if(typeof t=="string"&&w(s)==="rating"){if(n==null)return!1;const i=Number(t),c=typeof n=="number"?n:Number(n);return isNaN(i)||isNaN(c)?!1:c>=i}const S=w(s);if(!S)return!0;if(S==="address")return n==null?!1:typeof n=="object"&&"formatted_address"in n?String(n.formatted_address).toLowerCase().includes(String(t).toLowerCase()):!1;if(S==="multiselect"){if(!Array.isArray(n)||n.length===0)return!1;const i=String(t).toLowerCase();return n.some(c=>String(c).toLowerCase().includes(i))}return n==null?!1:String(n).toLowerCase().includes(String(t).toLowerCase())}export{T as matchesFilter};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CRUD_OPERATION as
|
|
1
|
+
import{CRUD_OPERATION as e}from"../types";function r(a,s){const o=[],n=new Set;for(const i of a){const t=s[i.id];t?.operation!==e.DELETE&&(t?.operation===e.UPDATE&&t.optimisticData?o.push(t.optimisticData):o.push(i),n.add(i.id))}for(const[i,t]of Object.entries(s))t.operation===e.ADD&&!n.has(i)&&t.optimisticData&&o.push(t.optimisticData);return o}export{r as mergeWithOptimistic};
|