@donotdev/crud 0.0.9 → 0.0.11
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 +26 -8
- package/dist/CrudService.d.ts.map +1 -1
- package/dist/CrudService.js +1 -1
- package/dist/CrudStore.d.ts.map +1 -1
- package/dist/CrudStore.js +1 -1
- package/dist/adapters/FirestoreAdapter.d.ts +1 -1
- package/dist/adapters/FirestoreAdapter.d.ts.map +1 -1
- package/dist/adapters/FirestoreAdapter.js +1 -1
- package/dist/adapters/FunctionsAdapter.d.ts +1 -1
- package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
- package/dist/adapters/FunctionsAdapter.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/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 +2 -2
- package/dist/components/EntityDisplayRenderer.d.ts.map +1 -1
- package/dist/components/EntityDisplayRenderer.js +1 -1
- package/dist/components/EntityFilters.d.ts +19 -1
- package/dist/components/EntityFilters.d.ts.map +1 -1
- package/dist/components/EntityFilters.js +1 -1
- package/dist/components/FormFieldRenderer.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.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/ControlledDurationField.d.ts +7 -0
- package/dist/components/controlled/input/ControlledDurationField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledDurationField.js +1 -0
- package/dist/components/controlled/input/ControlledGdprConsentField.d.ts.map +1 -1
- package/dist/components/controlled/input/ControlledGdprConsentField.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/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/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/ControlledYearField.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/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/DurationFieldComponent.d.ts +42 -0
- package/dist/components/form/fields/DurationFieldComponent.d.ts.map +1 -0
- package/dist/components/form/fields/DurationFieldComponent.js +1 -0
- package/dist/components/form/fields/GdprConsentFieldComponent.d.ts +2 -2
- package/dist/components/form/fields/GdprConsentFieldComponent.d.ts.map +1 -1
- package/dist/components/form/fields/GdprConsentFieldComponent.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/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/index.d.ts +7 -0
- package/dist/components/form/fields/index.d.ts.map +1 -1
- package/dist/components/form/fields/index.js +1 -1
- package/dist/components/index.d.ts +3 -9
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/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/useEntityForm.d.ts.map +1 -1
- package/dist/forms/hooks/useEntityForm.js +1 -1
- package/dist/forms/types.d.ts +5 -3
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/utils/getFieldsForOperation.d.ts +2 -3
- package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
- package/dist/forms/utils/getFieldsForOperation.js +1 -1
- package/dist/forms/utils/isFieldEditable.d.ts +1 -1
- package/dist/forms/utils/isFieldEditable.d.ts.map +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/useRelatedItems.d.ts +37 -0
- package/dist/hooks/useRelatedItems.d.ts.map +1 -0
- package/dist/hooks/useRelatedItems.js +1 -0
- package/dist/index.d.ts +4 -3
- 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/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +60 -25
- package/dist/types.d.ts.map +1 -1
- 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 +3 -6
- 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 +12 -5
- package/dist/useCrudList.d.ts.map +1 -1
- package/dist/useCrudList.js +1 -1
- package/dist/utils/mergeWithOptimistic.d.ts +4 -5
- 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/package.json +15 -14
- package/dist/components/EntityCardList.d.ts +0 -29
- package/dist/components/EntityCardList.d.ts.map +0 -1
- package/dist/components/EntityCardList.js +0 -1
- package/dist/components/EntityList.d.ts +0 -30
- package/dist/components/EntityList.d.ts.map +0 -1
- package/dist/components/EntityList.js +0 -1
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Shared CRUD Types
|
|
3
|
-
* @description Types shared between CrudService and CrudStore
|
|
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
|
|
4
9
|
*
|
|
5
10
|
* @version 0.0.1
|
|
6
11
|
* @since 0.0.1
|
|
@@ -23,53 +28,76 @@ export type BackendType = 'functions' | 'firestore';
|
|
|
23
28
|
export type OptimisticStatus = 'pending' | 'confirmed' | 'failed';
|
|
24
29
|
/**
|
|
25
30
|
* Optimistic operation metadata
|
|
31
|
+
* Contains both original data (for rollback) and current data (for display)
|
|
26
32
|
*/
|
|
27
33
|
export interface OptimisticMeta {
|
|
28
34
|
tempId: string;
|
|
29
35
|
originalData: unknown | null;
|
|
36
|
+
/** Current optimistic data to display (the new/updated value) */
|
|
37
|
+
optimisticData: unknown;
|
|
30
38
|
status: OptimisticStatus;
|
|
31
39
|
operation: 'add' | 'update' | 'delete';
|
|
32
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
|
+
}
|
|
33
57
|
/**
|
|
34
58
|
* CRUD store state interface
|
|
59
|
+
* Note: No data field - TanStack Query owns data, CrudStore only tracks optimistic ops
|
|
35
60
|
*
|
|
36
|
-
* @version 0.0.
|
|
61
|
+
* @version 0.0.3
|
|
37
62
|
* @since 0.0.1
|
|
38
63
|
* @author AMBROISE PARK Consulting
|
|
39
64
|
*/
|
|
40
65
|
export interface CrudState {
|
|
41
66
|
backend: BackendType | null;
|
|
42
67
|
crudService: CrudServiceInterface | null;
|
|
68
|
+
/** Global flag to hide success toasts (set from app config) */
|
|
69
|
+
hideSuccessToasts: boolean;
|
|
43
70
|
collections: Record<string, {
|
|
44
71
|
loading: boolean;
|
|
45
72
|
error: Error | null;
|
|
46
|
-
data: Record<string, unknown>;
|
|
47
73
|
lastUpdated: number;
|
|
48
74
|
/** Optimistic operation metadata keyed by document id */
|
|
49
75
|
optimistic: Record<string, OptimisticMeta>;
|
|
76
|
+
/** UI state: filters and favorites toggle (persists across navigation) */
|
|
77
|
+
ui: CollectionUIState;
|
|
50
78
|
}>;
|
|
51
79
|
}
|
|
52
80
|
/**
|
|
53
81
|
* CRUD store actions interface
|
|
82
|
+
* Note: No setData/getData - TanStack Query owns data, CrudStore only tracks optimistic ops
|
|
54
83
|
*
|
|
55
|
-
* @version 0.0.
|
|
84
|
+
* @version 0.0.3
|
|
56
85
|
* @since 0.0.1
|
|
57
86
|
* @author AMBROISE PARK Consulting
|
|
58
87
|
*/
|
|
59
88
|
export interface CrudActions {
|
|
60
89
|
setCrudService: (service: CrudServiceInterface) => void;
|
|
61
90
|
setBackend: (backend: BackendType) => void;
|
|
91
|
+
/** Set global flag to hide success toasts (called from app bootstrap) */
|
|
92
|
+
setHideSuccessToasts: (hide: boolean) => void;
|
|
62
93
|
setLoading: (collection: string, loading: boolean) => void;
|
|
63
94
|
setError: (collection: string, error: Error | null) => void;
|
|
64
|
-
setData: (collection: string, id: string, data: unknown) => void;
|
|
65
|
-
/** Batch update multiple documents in a single state update (performance) */
|
|
66
|
-
setDataBatch: (collection: string, items: Array<{
|
|
67
|
-
id: string;
|
|
68
|
-
data: unknown;
|
|
69
|
-
}>) => void;
|
|
70
|
-
removeData: (collection: string, id: string) => void;
|
|
71
95
|
clearCollection: (collection: string) => void;
|
|
72
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;
|
|
73
101
|
/** Add item optimistically (before server confirms) */
|
|
74
102
|
addOptimistic: (collection: string, tempId: string, data: unknown) => void;
|
|
75
103
|
/** Confirm optimistic add - replace temp item with real item */
|
|
@@ -90,17 +118,12 @@ export interface CrudActions {
|
|
|
90
118
|
rejectDelete: (collection: string, id: string) => void;
|
|
91
119
|
getLoading: (collection: string) => boolean;
|
|
92
120
|
getError: (collection: string) => Error | null;
|
|
93
|
-
getData: (collection: string, id: string) => unknown | null;
|
|
94
121
|
/** Check if item is optimistic (not yet confirmed by server) */
|
|
95
122
|
isOptimistic: (collection: string, id: string) => boolean;
|
|
96
123
|
/** Get optimistic status for an item */
|
|
97
124
|
getOptimisticStatus: (collection: string, id: string) => OptimisticStatus | null;
|
|
98
|
-
/** Get
|
|
99
|
-
|
|
100
|
-
id: string;
|
|
101
|
-
data: unknown;
|
|
102
|
-
isOptimistic: boolean;
|
|
103
|
-
}>;
|
|
125
|
+
/** Get optimistic data for an item (for display during pending state) */
|
|
126
|
+
getOptimisticData: (collection: string, id: string) => unknown | null;
|
|
104
127
|
}
|
|
105
128
|
/**
|
|
106
129
|
* Store API type for CrudService - typed instead of any
|
|
@@ -118,6 +141,18 @@ export interface CacheOptions {
|
|
|
118
141
|
/** Custom stale time in ms (default: Infinity) */
|
|
119
142
|
staleTime?: number;
|
|
120
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
|
+
}
|
|
121
156
|
/**
|
|
122
157
|
* CRUD Service Interface
|
|
123
158
|
* Complete interface for CRUD operations with caching and optimistic updates
|
|
@@ -143,22 +178,22 @@ export interface CrudServiceInterface {
|
|
|
143
178
|
};
|
|
144
179
|
get<T>(collection: string, id: string, schema: dndevSchema<T>, options?: CacheOptions): Promise<T | null>;
|
|
145
180
|
query<T>(collection: string, options: QueryOptions, schema: dndevSchema<T>, cacheOptions?: CacheOptions, schemaType?: 'list' | 'listCard'): Promise<PaginatedQueryResult<T>>;
|
|
146
|
-
set<T>(collection: string, id: string, data: T, schema: dndevSchema<T
|
|
147
|
-
update<T>(collection: string, id: string, data: Partial<T
|
|
148
|
-
delete(collection: string, id: string): Promise<void>;
|
|
149
|
-
add<T>(collection: string, data: T, schema: dndevSchema<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>;
|
|
150
185
|
subscribe<T>(collection: string, id: string, callback: (data: T | null, error?: Error) => void, schema: dndevSchema<T>): () => void;
|
|
151
186
|
subscribeToCollection<T>(collection: string, options: QueryOptions, callback: (data: T[], error?: Error) => void, schema: dndevSchema<T>): () => void;
|
|
152
187
|
/** Add with optimistic update - shows item immediately, confirms/rolls back after server */
|
|
153
188
|
addOptimistic<T extends {
|
|
154
189
|
id?: string;
|
|
155
|
-
}>(collection: string, data: T, schema: dndevSchema<T
|
|
190
|
+
}>(collection: string, data: T, schema: dndevSchema<T>, options?: MutationOptions): Promise<T & {
|
|
156
191
|
id: string;
|
|
157
192
|
}>;
|
|
158
193
|
/** Update with optimistic update - shows change immediately, confirms/rolls back after server */
|
|
159
|
-
updateOptimistic<T>(collection: string, id: string, data: Partial<T>, schema: dndevSchema<T
|
|
194
|
+
updateOptimistic<T>(collection: string, id: string, data: Partial<T>, schema: dndevSchema<T>, options?: MutationOptions): Promise<T>;
|
|
160
195
|
/** Delete with optimistic update - hides item immediately, confirms/restores after server */
|
|
161
|
-
deleteOptimistic(collection: string, id: string): Promise<void>;
|
|
196
|
+
deleteOptimistic(collection: string, id: string, options?: MutationOptions): Promise<void>;
|
|
162
197
|
/** Invalidate all cached queries for a collection */
|
|
163
198
|
invalidateCollection(collection: string): Promise<void>;
|
|
164
199
|
/** Get the shared QueryClient instance from @donotdev/core */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 _,useCallback as J,useRef as z}from"react";import{useQuery as N}from"@donotdev/core";import{useCrudStore as U}from"./CrudStore";import{useCrud as D,getCrudServiceInstance as X,EMPTY_OPTIMISTIC as Z}from"./useCrud";import{mergeWithOptimistic as $}from"./utils/mergeWithOptimistic";import{injectScopeFilter as ee,getCurrentScopeValue as te}from"./utils/scopeUtils";function le(V,m,t,p={}){const j=p.enabled??!0,I=D("status"),c=I==="ready",E=D(V,p),{error:P,invalidate:M,_collection:a,_schemas:g,_cacheOptions:y,_scope:S}=E,q=U(e=>e.collections[a]?.optimistic||Z),v=z(new Map([[1,null]])),b=z(0),R=te(S),O=_(()=>{if(!c||!g)return null;const e=X();if(!e)return null;const f=m==="listCard"?g.listCard:g.list,u=ee(p.queryOptions,S);if(!t||t.mode==="client")return e.getListQueryOptions(a,u,f,y,m);const i=v.current,n=b.current,{page:d,pageSize:h}=t;let s,r;if(i.has(d))s=i.get(d)??void 0,r=h;else if(d>n&&i.has(n)){const o=d-n;s=i.get(n)??void 0,r=o*h}else s=void 0,r=d*h;return e.getListQueryOptions(a,{...u,limit:r,startAfterId:s},f,y,m)},[c,a,y,g?"hasSchema":"noSchema",m,t?.mode,t?.page,t?.pageSize,p.queryOptions,S?.provider,R]),{data:l,isLoading:K,isFetching:k,error:B,refetch:L}=N({queryKey:O?.queryKey??["crud",a,"disabled"],queryFn:O?.queryFn??(()=>Promise.resolve({items:[]})),staleTime:O?.staleTime,enabled:j&&!!O}),T=_(()=>{if(!l||!c)return{items:[],total:void 0};let e=l.items;if(t?.mode==="server"&&e.length>0){const s=v.current,r=b.current,{page:o,pageSize:C}=t,Y=e.length;if(Math.ceil(Y/C)>1||o>r){const A=s.has(o)?o:r+1;for(let F=A;F<=o;F++){const Q=(F-A+1)*C-1;if(Q<e.length){const H=e[Q];s.set(F+1,H.id)}}}l.lastVisible&&s.set(o+1,l.lastVisible),b.current=Math.max(r,o);const x=s.has(o)?0:(o-r-1)*C,G=x+C;e=e.slice(x,G)}const f=$(e,q),u=new Set(e.map(s=>s.id));let i=0,n=0;for(const[s,r]of Object.entries(q))r.operation==="add"&&!u.has(s)?i++:r.operation==="delete"&&u.has(s)&&n++;const h=(l.total??e.length)+i-n;return{items:f,total:t?h:void 0}},[l,q,c,t?.mode,t?.page,t?.pageSize]),w=J(async()=>{c&&(t?.mode==="server"&&(v.current=new Map([[1,null]]),b.current=0),await M(),await L())},[M,L,c,t?.mode]);if(!c){const e=async()=>{};return{status:I,data:{items:[],total:void 0},items:[],loading:!1,fetching:!1,error:P,mutate:e,refresh:e,isAvailable:!1}}const W=T?.items??[];return{status:I,data:T,items:W,loading:K,fetching:k,error:B??P,mutate:w,refresh:w,isAvailable:!0}}export{le as useBaseCrudList};
|
package/dist/useCrud.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { dndevSchema, Entity, FeatureStatus, OperationSchemas, CrudAPI } from '@donotdev/core';
|
|
1
|
+
import type { dndevSchema, Entity, FeatureStatus, OperationSchemas, CrudAPI, ScopeConfig } from '@donotdev/core';
|
|
2
2
|
import type { CrudServiceInterface, CacheOptions, BackendType } from './types';
|
|
3
3
|
export declare const EMPTY_DATA: Record<string, unknown>;
|
|
4
4
|
export declare const EMPTY_OPTIMISTIC: Record<string, unknown>;
|
|
@@ -16,9 +16,6 @@ export interface UseCrudOptions<T> {
|
|
|
16
16
|
/** Disable caching (bypass TanStack Query) */
|
|
17
17
|
noCache?: boolean;
|
|
18
18
|
}
|
|
19
|
-
/**
|
|
20
|
-
* CRUD API return type - Single Document & Actions
|
|
21
|
-
*/
|
|
22
19
|
/**
|
|
23
20
|
* CRUD API return type - Single Document & Actions
|
|
24
21
|
*/
|
|
@@ -29,8 +26,8 @@ export interface UseCrudReturn<T> extends CrudAPI<T> {
|
|
|
29
26
|
_schemas: OperationSchemas | undefined;
|
|
30
27
|
/** @internal Cache options */
|
|
31
28
|
_cacheOptions: CacheOptions;
|
|
32
|
-
/** @internal
|
|
33
|
-
|
|
29
|
+
/** @internal Scope configuration (for multi-tenancy) */
|
|
30
|
+
_scope: ScopeConfig | undefined;
|
|
34
31
|
}
|
|
35
32
|
/**
|
|
36
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
|
|
1
|
+
"use client";import{useEffect as Q,useMemo as w,useCallback as a}from"react";import{useFeatureConsent as V,FRAMEWORK_FEATURES as W,FEATURE_STATUS as h,handleError as Z,isClient as $,createSchemas as H,DEGRADED_CRUD_API as J}from"@donotdev/core";import{getCrudService as X}from"./CrudService";import{useCrudStore as l}from"./CrudStore";import{injectScope as F,injectScopeFilter as O}from"./utils/scopeUtils";const re={},ne={};let P=null,E=null,g=!1;function o(){return P}function ae(d,u={}){const S=V(W.CRUD),k=l(e=>e.crudService),T=S&&!k,p=S?T?h.INITIALIZING:h.READY:h.DEGRADED;if(d==="status")return p;const v=typeof d=="object"?d:u.entity,t=typeof d=="string"?d:d.collection,i=v?.scope,m=u.backend||"functions",b=u.noCache??!1,A=u.staleTime,f=w(()=>({noCache:b,staleTime:A}),[b,A]),s=w(()=>{if(u.schema){const e=u.schema;return{create:e,draft:e,update:e,get:e,list:e,listCard:e,delete:e}}if(v)return H(v)},[u.schema?"custom":v?.name,t]),x=l(e=>e.collections[t]?.loading||!1),C=l(e=>e.collections[t]?.error||null),M=null;Q(()=>{if(!$()||!S||!s)return;const{crudService:e,backend:r}=l.getState();e&&r===m||E||(E=(async()=>{try{const c=X();P=c,c.setStore(l),await c.initialize(m),g=!1,l.getState().setBackend(m),l.getState().setCrudService(c)}catch(c){g||(Z(c,{userMessage:"Failed to initialize CRUD service.",context:{backend:m,collection:t},severity:"error"}),g=!0)}finally{E=null}})())},[S,m,t,s?"hasSchema":"noSchema"]);const _=T||x,N=p===h.READY,z=a(async e=>{const r=o();return!r||!s?null:r.get(t,e,s.get,f)},[t,s?"hasSchema":"noSchema",f]),Y=a(async(e,r,c)=>{const n=o();if(!n||!s)return;const D=F(r,i),L=D?.status==="draft"?s.draft:s.create;await n.set(t,e,D,L,c)},[t,s?"hasSchema":"noSchema",i?.provider]),j=a(async(e,r,c)=>{const n=o();n&&await n.update(t,e,r,c)},[t]),q=a(async(e,r)=>{const c=o();c&&await c.delete(t,e,r)},[t]),G=a(async(e,r)=>{const c=o();if(!c||!s)return"";const n=F(e,i),U=n?.status==="draft"?s.draft:s.create;return c.add(t,n,U,r)},[t,s?"hasSchema":"noSchema",i?.provider]),B=a(async e=>{const r=o();if(!r||!s)return[];const c=O(e,i);return(await r.query(t,c,s.list,f)).items},[t,s?"hasSchema":"noSchema",f,i?.provider]),I=a((e,r)=>{const c=o();return!c||!s?()=>{}:c.subscribe(t,e,r,s.get)},[t,s?"hasSchema":"noSchema"]),R=a((e,r)=>{const c=o();return!c||!s?()=>{}:c.subscribeToCollection(t,e,r,s.list)},[t,s?"hasSchema":"noSchema"]),y=a(async()=>{const e=o();e&&await e.invalidateCollection(t)},[t]);return N?{status:h.READY,data:M,loading:_,error:C,get:z,set:Y,update:j,delete:q,add:G,query:B,subscribe:I,subscribeToCollection:R,invalidate:y,isAvailable:!0,_collection:t,_schemas:s,_cacheOptions:f,_scope:i}:{...J,status:p,loading:_,error:C,subscribe:I,subscribeToCollection:R,invalidate:y,_collection:t,_schemas:s,_cacheOptions:f,_scope:i}}export{re as EMPTY_DATA,ne as EMPTY_OPTIMISTIC,o as getCrudServiceInstance,ae 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 r}from"./useBaseCrudList";function l(t,a={}){const s={enabled:a.enabled,queryOptions:a.queryOptions,backend:a.backend,schema:a.schema,entity:a.entity,staleTime:a.staleTime,noCache:a.noCache},e=r(t,"listCard",null,s);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{l as useCrudCardList};
|
package/dist/useCrudList.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
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) */
|
|
@@ -18,6 +19,8 @@ export interface UseCrudListOptions<T> extends UseCrudOptions<T> {
|
|
|
18
19
|
page?: number;
|
|
19
20
|
/** Page size for server-side pagination (default: 10) */
|
|
20
21
|
pageSize?: number;
|
|
22
|
+
/** Where/orderBy/limit passed to list query (merged with pagination on server) */
|
|
23
|
+
queryOptions?: QueryOptions;
|
|
21
24
|
}
|
|
22
25
|
export interface UseCrudListReturn<T> {
|
|
23
26
|
status: FeatureStatus;
|
|
@@ -25,6 +28,8 @@ export interface UseCrudListReturn<T> {
|
|
|
25
28
|
items: T[];
|
|
26
29
|
total?: number;
|
|
27
30
|
} | null;
|
|
31
|
+
/** Convenience: items array (data?.items ?? []) */
|
|
32
|
+
items: T[];
|
|
28
33
|
/** True during initial fetch (show skeletons) */
|
|
29
34
|
loading: boolean;
|
|
30
35
|
/** True during background refetch (show subtle indicator) */
|
|
@@ -32,6 +37,8 @@ export interface UseCrudListReturn<T> {
|
|
|
32
37
|
error: Error | null;
|
|
33
38
|
/** Manual refresh function */
|
|
34
39
|
mutate: () => Promise<void>;
|
|
40
|
+
/** Alias for mutate (manual refresh) */
|
|
41
|
+
refresh: () => Promise<void>;
|
|
35
42
|
isAvailable: boolean;
|
|
36
43
|
}
|
|
37
44
|
/**
|
|
@@ -49,13 +56,13 @@ export interface UseCrudListReturn<T> {
|
|
|
49
56
|
*
|
|
50
57
|
* @example
|
|
51
58
|
* ```typescript
|
|
52
|
-
* const {
|
|
59
|
+
* const { items, loading, refresh } = useCrudList(carEntity);
|
|
53
60
|
*
|
|
54
61
|
* if (loading) return <Loader />;
|
|
55
62
|
*
|
|
56
63
|
* return (
|
|
57
64
|
* <ul>
|
|
58
|
-
* {
|
|
65
|
+
* {items.map(car => <li key={car.id}>{car.make}</li>)}
|
|
59
66
|
* </ul>
|
|
60
67
|
* );
|
|
61
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 r}from"./useBaseCrudList";function u(a,e={}){const n=e.pagination??"client",t=e.page??1,c=e.pageSize??10,i={mode:n,page:t,pageSize:c},s={enabled:e.enabled,queryOptions:e.queryOptions,backend:e.backend,schema:e.schema,entity:e.entity,staleTime:e.staleTime,noCache:e.noCache};return r(a,"list",i,s)}export{u as useCrudList};
|
|
@@ -2,7 +2,7 @@
|
|
|
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
|
*/
|
|
@@ -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,UAAU,CAAC;AAE/C,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function n(a,o){const e=[],s=new Set;for(const i of a){const t=o[i.id];t?.operation!=="delete"&&(t?.operation==="update"&&t.optimisticData?e.push(t.optimisticData):e.push(i),s.add(i.id))}for(const[i,t]of Object.entries(o))t.operation==="add"&&!s.has(i)&&t.optimisticData&&e.push(t.optimisticData);return e}export{n as mergeWithOptimistic};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ScopeConfig } from '@donotdev/core';
|
|
2
|
+
import type { QueryOptions } from '../CrudService';
|
|
3
|
+
/**
|
|
4
|
+
* Injects scope value into data object for create/update operations
|
|
5
|
+
*
|
|
6
|
+
* @param data - Original data
|
|
7
|
+
* @param scope - Scope configuration from entity
|
|
8
|
+
* @returns Data with scope value injected
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const scopedData = injectScope({ name: 'Acme' }, scope);
|
|
13
|
+
* // Result: { name: 'Acme', companyId: 'abc123' }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function injectScope<T>(data: T, scope: ScopeConfig | undefined): T;
|
|
17
|
+
/**
|
|
18
|
+
* Injects scope filter into query options for list/query operations
|
|
19
|
+
*
|
|
20
|
+
* @param queryOptions - Original query options
|
|
21
|
+
* @param scope - Scope configuration from entity
|
|
22
|
+
* @returns Query options with scope filter added
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const scopedOptions = injectScopeFilter({ orderBy: [{ field: 'name' }] }, scope);
|
|
27
|
+
* // Result: { orderBy: [...], where: [{ field: 'companyId', operator: '==', value: 'abc123' }] }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function injectScopeFilter(queryOptions: QueryOptions | undefined, scope: ScopeConfig | undefined): QueryOptions;
|
|
31
|
+
/**
|
|
32
|
+
* Gets current scope value for cache key generation
|
|
33
|
+
*
|
|
34
|
+
* @param scope - Scope configuration from entity
|
|
35
|
+
* @returns Scope value or null
|
|
36
|
+
*/
|
|
37
|
+
export declare function getCurrentScopeValue(scope: ScopeConfig | undefined): string | null;
|
|
38
|
+
//# sourceMappingURL=scopeUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopeUtils.d.ts","sourceRoot":"","sources":["../../src/utils/scopeUtils.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,CAAC,CAkBzE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,KAAK,EAAE,WAAW,GAAG,SAAS,GAC7B,YAAY,CA4Bd;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,GAAG,SAAS,GAC7B,MAAM,GAAG,IAAI,CAGf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getScopeValue as n}from"@donotdev/core";function c(e,o){if(!o)return e;const r=n(o.provider);return r?{...e,[o.field]:r}:e}function l(e,o){const r=e??{};if(!o)return r;const t=n(o.provider);if(!t)return r;const i={field:o.field,operator:"==",value:t};return{...r,where:r.where?[...r.where,i]:[i]}}function u(e){return e?n(e.provider):null}export{u as getCurrentScopeValue,c as injectScope,l as injectScopeFilter};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@donotdev/crud",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
17
|
"sideEffects": [
|
|
18
|
-
"./src/builtinFieldTypes.tsx"
|
|
18
|
+
"./src/builtinFieldTypes.tsx",
|
|
19
|
+
"./src/registerBuiltinFieldTypes.tsx"
|
|
19
20
|
],
|
|
20
21
|
"files": [
|
|
21
22
|
"dist",
|
|
@@ -52,22 +53,22 @@
|
|
|
52
53
|
"@dnd-kit/core": "^6.3.1",
|
|
53
54
|
"@dnd-kit/sortable": "^10.0.0",
|
|
54
55
|
"@dnd-kit/utilities": "^3.2.2",
|
|
55
|
-
"@donotdev/components": "^0.0.
|
|
56
|
-
"@donotdev/core": "^0.0.
|
|
56
|
+
"@donotdev/components": "^0.0.15",
|
|
57
|
+
"@donotdev/core": "^0.0.20",
|
|
57
58
|
"@hookform/resolvers": "^5.2.2",
|
|
58
59
|
"react-easy-crop": "^5.5.6"
|
|
59
60
|
},
|
|
60
61
|
"peerDependencies": {
|
|
61
|
-
"@donotdev/firebase": "^0.0.
|
|
62
|
-
"@tiptap/extension-placeholder": "^3.
|
|
63
|
-
"@tiptap/pm": "^3.
|
|
64
|
-
"@tiptap/react": "^3.
|
|
65
|
-
"@tiptap/starter-kit": "^3.
|
|
66
|
-
"firebase": "^12.
|
|
67
|
-
"lucide-react": "^0.
|
|
68
|
-
"react": "^19.2.
|
|
69
|
-
"react-dom": "^19.2.
|
|
70
|
-
"react-hook-form": "^7.71.
|
|
62
|
+
"@donotdev/firebase": "^0.0.8",
|
|
63
|
+
"@tiptap/extension-placeholder": "^3.19.0",
|
|
64
|
+
"@tiptap/pm": "^3.19.0",
|
|
65
|
+
"@tiptap/react": "^3.19.0",
|
|
66
|
+
"@tiptap/starter-kit": "^3.19.0",
|
|
67
|
+
"firebase": "^12.8.0",
|
|
68
|
+
"lucide-react": "^0.563.0",
|
|
69
|
+
"react": "^19.2.4",
|
|
70
|
+
"react-dom": "^19.2.4",
|
|
71
|
+
"react-hook-form": "^7.71.1",
|
|
71
72
|
"valibot": "^1.2.0"
|
|
72
73
|
},
|
|
73
74
|
"peerDependenciesMeta": {
|