@donotdev/crud 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CrudService.d.ts +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/FieldRegistry.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/adapters/index.js +1 -1
- package/dist/builtinFieldTypes.d.ts +17 -4
- package/dist/builtinFieldTypes.d.ts.map +1 -1
- package/dist/builtinFieldTypes.js +1 -1
- package/dist/components/CrudButton.js +1 -1
- package/dist/components/DisplayFieldRenderer.d.ts +2 -0
- package/dist/components/DisplayFieldRenderer.d.ts.map +1 -1
- package/dist/components/DisplayFieldRenderer.js +1 -1
- package/dist/components/EntityDisplayRenderer.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/EntityFormRenderer.js +1 -1
- package/dist/components/FormFieldRenderer.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.js +1 -1
- package/dist/components/FormLayout.js +1 -1
- package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
- package/dist/components/controlled/complex/ControlledDateField.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.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.d.ts +8 -0
- package/dist/components/controlled/input/ControlledCurrencyField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledCurrencyField.js +1 -0
- package/dist/components/controlled/input/ControlledGdprConsentField.d.ts.map +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.d.ts +8 -0
- package/dist/components/controlled/input/ControlledPriceField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledPriceField.js +1 -0
- package/dist/components/controlled/input/ControlledRangeField.js +1 -1
- package/dist/components/controlled/input/ControlledRatingField.d.ts +8 -0
- package/dist/components/controlled/input/ControlledRatingField.d.ts.map +1 -0
- package/dist/components/controlled/input/ControlledRatingField.js +1 -0
- package/dist/components/controlled/input/ControlledSwitchField.js +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.d.ts +3 -0
- package/dist/components/controlled/input/index.d.ts.map +1 -1
- package/dist/components/controlled/input/index.js +1 -1
- package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
- package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
- package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
- package/dist/components/controlled/select/ControlledRadioField.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 +23 -0
- package/dist/components/fields/display/AvatarFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/AvatarFieldDisplay.js +1 -0
- package/dist/components/fields/display/BadgeFieldDisplay.d.ts +21 -0
- package/dist/components/fields/display/BadgeFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/BadgeFieldDisplay.js +1 -0
- package/dist/components/fields/display/ButtonFieldDisplay.d.ts +29 -0
- package/dist/components/fields/display/ButtonFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/ButtonFieldDisplay.js +1 -0
- package/dist/components/fields/display/CheckboxFieldDisplay.d.ts +21 -0
- package/dist/components/fields/display/CheckboxFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -0
- package/dist/components/fields/display/DateFieldDisplay.d.ts +24 -0
- package/dist/components/fields/display/DateFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/DateFieldDisplay.js +1 -0
- package/dist/components/fields/display/DropdownDisplay.d.ts +21 -0
- package/dist/components/fields/display/DropdownDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/DropdownDisplay.js +1 -0
- package/dist/components/fields/display/FileFieldDisplay.d.ts +21 -0
- package/dist/components/fields/display/FileFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/FileFieldDisplay.js +1 -0
- package/dist/components/fields/display/GeoPointFieldDisplay.d.ts +25 -0
- package/dist/components/fields/display/GeoPointFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -0
- package/dist/components/fields/display/HiddenFieldDisplay.d.ts +30 -0
- package/dist/components/fields/display/HiddenFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/HiddenFieldDisplay.js +1 -0
- package/dist/components/fields/display/ImageFieldDisplay.d.ts +24 -0
- package/dist/components/fields/display/ImageFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/ImageFieldDisplay.js +1 -0
- package/dist/components/fields/display/LinkFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/LinkFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/LinkFieldDisplay.js +1 -0
- package/dist/components/fields/display/MapFieldDisplay.d.ts +25 -0
- package/dist/components/fields/display/MapFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/MapFieldDisplay.js +1 -0
- package/dist/components/fields/display/MultiDropdownDisplay.d.ts +22 -0
- package/dist/components/fields/display/MultiDropdownDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/MultiDropdownDisplay.js +1 -0
- package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -0
- package/dist/components/fields/display/NumberFieldDisplay.d.ts +24 -0
- package/dist/components/fields/display/NumberFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/NumberFieldDisplay.js +1 -0
- package/dist/components/fields/display/PasswordFieldDisplay.d.ts +24 -0
- package/dist/components/fields/display/PasswordFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/PasswordFieldDisplay.js +1 -0
- package/dist/components/fields/display/PhoneNumberDisplay.d.ts +22 -0
- package/dist/components/fields/display/PhoneNumberDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/PhoneNumberDisplay.js +1 -0
- package/dist/components/fields/display/RadioFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/RadioFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/RadioFieldDisplay.js +1 -0
- package/dist/components/fields/display/RangeFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/RangeFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/RangeFieldDisplay.js +1 -0
- package/dist/components/fields/display/ReferenceFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/ReferenceFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -0
- package/dist/components/fields/display/RichTextDisplay.d.ts +25 -0
- package/dist/components/fields/display/RichTextDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/RichTextDisplay.js +61 -0
- package/dist/components/fields/display/TextAreaDisplay.d.ts +22 -0
- package/dist/components/fields/display/TextAreaDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/TextAreaDisplay.js +1 -0
- package/dist/components/fields/display/TextFieldDisplay.d.ts +42 -0
- package/dist/components/fields/display/TextFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/TextFieldDisplay.js +1 -0
- package/dist/components/fields/display/TimestampFieldDisplay.d.ts +22 -0
- package/dist/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -0
- package/dist/components/fields/display/TimestampFieldDisplay.js +1 -0
- package/dist/components/fields/display/index.d.ts +32 -0
- package/dist/components/fields/display/index.d.ts.map +1 -0
- package/dist/components/fields/display/index.js +1 -0
- package/dist/components/form/fields/AddressFieldComponent.js +1 -1
- package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
- package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
- package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
- package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
- package/dist/components/form/fields/ComboboxComponent.d.ts +6 -0
- package/dist/components/form/fields/ComboboxComponent.d.ts.map +1 -1
- package/dist/components/form/fields/ComboboxComponent.js +1 -1
- package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
- package/dist/components/form/fields/DateFieldComponent.js +1 -1
- package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
- package/dist/components/form/fields/DropdownComponent.js +1 -1
- package/dist/components/form/fields/FileFieldComponent.js +1 -1
- 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/GeoPointFieldComponent.js +1 -1
- package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
- package/dist/components/form/fields/ImageFieldComponent.js +1 -1
- package/dist/components/form/fields/MapFieldComponent.js +1 -1
- package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
- package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
- package/dist/components/form/fields/NumberFieldComponent.js +1 -1
- package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
- package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
- package/dist/components/form/fields/PriceFieldComponent.d.ts +34 -0
- package/dist/components/form/fields/PriceFieldComponent.d.ts.map +1 -0
- package/dist/components/form/fields/PriceFieldComponent.js +1 -0
- package/dist/components/form/fields/RadioFieldComponent.js +1 -1
- package/dist/components/form/fields/RangeFieldComponent.js +1 -1
- package/dist/components/form/fields/RatingFieldComponent.d.ts +37 -0
- package/dist/components/form/fields/RatingFieldComponent.d.ts.map +1 -0
- package/dist/components/form/fields/RatingFieldComponent.js +1 -0
- package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
- package/dist/components/form/fields/RichTextComponent.js +1 -1
- package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
- package/dist/components/form/fields/TextAreaComponent.js +1 -1
- package/dist/components/form/fields/TextFieldComponent.js +1 -1
- package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
- package/dist/components/form/fields/index.d.ts +4 -0
- package/dist/components/form/fields/index.d.ts.map +1 -1
- package/dist/components/form/fields/index.js +1 -1
- package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
- package/dist/components/form/internal/ImageViewerDialog.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/contexts/UploadContext.js +1 -1
- package/dist/contexts/index.js +1 -1
- package/dist/fieldTypeRegistry.d.ts +92 -0
- package/dist/fieldTypeRegistry.d.ts.map +1 -0
- package/dist/fieldTypeRegistry.js +1 -0
- package/dist/forms/hooks/index.js +1 -1
- package/dist/forms/hooks/useController.js +1 -1
- package/dist/forms/hooks/useEntityField.js +1 -1
- package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
- package/dist/forms/hooks/useEntityForm.js +1 -1
- package/dist/forms/index.js +1 -1
- package/dist/forms/utils/getFieldsForOperation.js +1 -1
- package/dist/forms/utils/index.js +1 -1
- package/dist/forms/utils/isFieldEditable.js +1 -1
- package/dist/forms/utils/translateFieldLabel.js +1 -1
- package/dist/forms/utils/validateEntity.js +1 -1
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useEntityFavorites.d.ts +53 -0
- package/dist/hooks/useEntityFavorites.d.ts.map +1 -0
- package/dist/hooks/useEntityFavorites.js +1 -0
- package/dist/hooks/useFileUpload.js +1 -1
- package/dist/hooks/useFormNavigationGuard.js +1 -1
- package/dist/hooks/useRelatedItems.d.ts +37 -0
- package/dist/hooks/useRelatedItems.d.ts.map +1 -0
- package/dist/hooks/useRelatedItems.js +1 -0
- package/dist/hooks/useUnsavedChangesWarning.js +1 -1
- 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/stores/FormStore.js +1 -1
- package/dist/stores/UploadStore.js +1 -1
- package/dist/stores/index.js +1 -1
- 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/collections.js +1 -1
- package/dist/utils/fileStorage.js +1 -1
- package/dist/utils/imageProcessing.js +1 -1
- package/dist/utils/imageStorage.js +1 -1
- package/dist/utils/imageUtils.js +1 -1
- package/dist/utils/mergeWithOptimistic.d.ts +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/dist/utils/uploadValidation.js +1 -1
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isFieldEditable as
|
|
1
|
+
import{isFieldEditable as a}from"./isFieldEditable";import{getFieldsForOperation as t}from"./getFieldsForOperation";import{validateEntity as e}from"./validateEntity";import{translateFieldLabel as i,translateLabel as l}from"./translateFieldLabel";export{t as getFieldsForOperation,a as isFieldEditable,i as translateFieldLabel,l as translateLabel,e as validateEntity};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasRoleAccess as t,USER_ROLES as
|
|
1
|
+
import{hasRoleAccess as t,USER_ROLES as o}from"@donotdev/core";function s(e,a,i){return e===void 0||e===!0?!0:e===!1?!1:e==="admin"?t(a,o.ADMIN):e==="create-only"?i==="create":!0}export{s as isFieldEditable};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function t(e,n){if(typeof e=="string"&&e.includes(":")){const r=e.split(":"),s=r[1]??e,a=r[0];return n(s,{ns:a})}return n(e)}function l(e,n,r){const s=n?.label||e;return t(s,r)}export{l as translateFieldLabel,t as translateLabel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as o from"valibot";import{createSchemas as
|
|
1
|
+
import*as o from"valibot";import{createSchemas as m}from"@donotdev/core";function i(t,r,c="create"){const e=m(t),u={create:e.create,draft:e.draft,update:e.update,full:e.get}[c],s=o.safeParse(u,r);return s.success?{success:!0,data:s.output}:{success:!1,issues:s.issues.map(a=>({path:a.path?.map(p=>p.key).join(".")||"",message:a.message}))}}export{i as validateEntity};
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
export { useFileUpload } from './useFileUpload';
|
|
2
2
|
export type { FileMetadata, UseFileUploadOptions } from './useFileUpload';
|
|
3
|
+
export { useUnsavedChangesWarning, useConfirmNavigation, } from './useUnsavedChangesWarning';
|
|
4
|
+
export { useEntityFavorites } from './useEntityFavorites';
|
|
5
|
+
export type { UseEntityFavoritesOptions, UseEntityFavoritesReturn, } from './useEntityFavorites';
|
|
6
|
+
export { useRelatedItems } from './useRelatedItems';
|
|
7
|
+
export type { UseRelatedItemsOptions, UseRelatedItemsReturn, } from './useRelatedItems';
|
|
3
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EACL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EACV,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useFileUpload as
|
|
1
|
+
import{useFileUpload as s}from"./useFileUpload";import{useUnsavedChangesWarning as a,useConfirmNavigation as e}from"./useUnsavedChangesWarning";import{useEntityFavorites as i}from"./useEntityFavorites";import{useRelatedItems as o}from"./useRelatedItems";export{e as useConfirmNavigation,i as useEntityFavorites,s as useFileUpload,o as useRelatedItems,a as useUnsavedChangesWarning};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface UseEntityFavoritesOptions {
|
|
2
|
+
/** Storage key (default: 'entity-favorites') */
|
|
3
|
+
storageKey?: string;
|
|
4
|
+
/** Entity collection name (e.g., 'cars', 'products') - used to namespace favorites */
|
|
5
|
+
collection?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface UseEntityFavoritesReturn {
|
|
8
|
+
/** Array of favorited entity IDs */
|
|
9
|
+
favorites: string[];
|
|
10
|
+
/** Check if an entity is favorited */
|
|
11
|
+
isFavorite: (id: string) => boolean;
|
|
12
|
+
/** Toggle favorite status for an entity */
|
|
13
|
+
toggleFavorite: (id: string) => void;
|
|
14
|
+
/** Add entity to favorites */
|
|
15
|
+
addFavorite: (id: string) => void;
|
|
16
|
+
/** Remove entity from favorites */
|
|
17
|
+
removeFavorite: (id: string) => void;
|
|
18
|
+
/** Clear all favorites */
|
|
19
|
+
clearFavorites: () => void;
|
|
20
|
+
/** Filter function for use with EntityCardList/EntityList (from @donotdev/ui) filter prop */
|
|
21
|
+
favoritesFilter: (item: {
|
|
22
|
+
id: string;
|
|
23
|
+
}) => boolean;
|
|
24
|
+
/** Whether favorites are loaded from localStorage */
|
|
25
|
+
isLoaded: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Hook for managing entity favorites
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // In detail page
|
|
33
|
+
* const { isFavorite, toggleFavorite } = useEntityFavorites({ collection: 'cars' });
|
|
34
|
+
*
|
|
35
|
+
* <Button onClick={() => toggleFavorite(carId)}>
|
|
36
|
+
* {isFavorite(carId) ? 'Saved' : 'Save'}
|
|
37
|
+
* </Button>
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* // In list page with filter (EntityCardList from @donotdev/ui)
|
|
43
|
+
* const { favoritesFilter } = useEntityFavorites({ collection: 'cars' });
|
|
44
|
+
* const [showFavoritesOnly, setShowFavoritesOnly] = useState(false);
|
|
45
|
+
*
|
|
46
|
+
* <EntityCardList
|
|
47
|
+
* entity={carEntity}
|
|
48
|
+
* filter={showFavoritesOnly ? favoritesFilter : undefined}
|
|
49
|
+
* />
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function useEntityFavorites(options?: UseEntityFavoritesOptions): UseEntityFavoritesReturn;
|
|
53
|
+
//# sourceMappingURL=useEntityFavorites.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEntityFavorites.d.ts","sourceRoot":"","sources":["../../src/hooks/useEntityFavorites.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,yBAAyB;IACxC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,oCAAoC;IACpC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sCAAsC;IACtC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,2CAA2C;IAC3C,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,8BAA8B;IAC9B,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,mCAAmC;IACnC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0BAA0B;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,6FAA6F;IAC7F,eAAe,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;IACnD,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CA8E1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useCallback as o}from"react";import{useLocalStorage as p}from"@donotdev/core";function y(s={}){const{storageKey:l,collection:u="entities"}=s,d=l||`favorites-${u}`,{value:t,setValue:a,isLoaded:c}=p(d,{defaultValue:[]}),v=o(e=>t.includes(e),[t]),n=o(e=>{a(i=>i.includes(e)?i.filter(r=>r!==e):[...i,e])},[a]),f=o(e=>{a(i=>i.includes(e)?i:[...i,e])},[a]),F=o(e=>{a(i=>i.filter(r=>r!==e))},[a]),m=o(()=>{a([])},[a]),g=o(e=>t.includes(e.id),[t]);return{favorites:t,isFavorite:v,toggleFavorite:n,addFavorite:f,removeFavorite:F,clearFavorites:m,favoritesFilter:g,isLoaded:c}}export{y as useEntityFavorites};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useState as
|
|
1
|
+
"use client";import{useState as J,useCallback as w,useEffect as A,useRef as v,startTransition as q}from"react";import{handleError as C}from"@donotdev/core";import{useUploadContext as G}from"../contexts/UploadContext";import{useUploadStore as N}from"../stores/UploadStore";let P=0;function W(s){if(s){const u=s.split("/").pop()?.split("?")[0];if(u)return`file-${u}`}P+=1;const a=typeof performance<"u"?performance.now():Date.now(),d=Math.random().toString(36).slice(2,11);return`file-${P}-${a}-${d}`}function H(s){return URL.createObjectURL(s)}function k(s){s.startsWith("blob:")&&URL.revokeObjectURL(s)}function K(s,a,d){return a.length>0&&!a.some(u=>{if(u.endsWith("/*")){const y=u.slice(0,-2);return s.type.startsWith(y)}return s.type===u})?{valid:!1,error:`File type ${s.type} not accepted`}:s.size>d?{valid:!1,error:`File exceeds ${(d/1048576).toFixed(0)}MB limit`}:{valid:!0}}function Q({name:s,value:a,onChange:d,multiple:u=!1,maxFiles:y=10,maxSize:$=10*1024*1024,accept:x=[],storagePath:V="uploads",uploadFn:g}){const h=G(),U=!!h,[f,c]=J([]),R=v(!1),E=v(null),F=v(a),L=v([]);A(()=>{if(R.current){R.current=!1;return}const e=a?JSON.stringify((Array.isArray(a)?a:[a]).map(n=>n.fullUrl).filter(Boolean)):null;e!==E.current&&(E.current=e,F.current=a,q(()=>{if(a){const n=(Array.isArray(a)?a:[a]).filter(i=>i.fullUrl).map((i,r)=>({id:`${W(i.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:i.thumbUrl||i.fullUrl,progress:100,uploaded:i,error:null}));c(n)}else c([])}))},[a]),A(()=>{L.current=f},[f]),A(()=>()=>{L.current.forEach(e=>k(e.previewURL))},[]);const p=w((e,n=!1)=>{const i=(n?e.filter(l=>!l.error):e.filter(l=>l.uploaded&&!l.error)).map(l=>l.uploaded?l.uploaded:n&&U?{fullUrl:l.previewURL,thumbUrl:l.previewURL}:null).filter(l=>l!==null);let r;u?r=i.length>0?i:null:r=i[0]||null;const t=F.current;(()=>{if(!r&&!t)return!1;if(!r||!t)return!0;if(u&&Array.isArray(r)&&Array.isArray(t)){if(r.length!==t.length)return!0;const l=r.map(m=>m.fullUrl).join(","),o=t.map(m=>m.fullUrl).join(",");return l!==o}return!u&&!Array.isArray(r)&&!Array.isArray(t)?r.fullUrl!==t.fullUrl:!0})()&&(R.current=!0,F.current=r,d(r))},[u,d,U]),b=w(async()=>{if(!g)return;let e=[];if(c(i=>(e=i.filter(r=>!r.uploaded&&!r.error),e.length===0?i:i.map(r=>e.some(t=>t.id===r.id)?{...r,progress:0}:r))),e.length===0)return;const n=await Promise.allSettled(e.map(async i=>{try{const r=await g(i.file,t=>{c(l=>l.map(o=>o.id===i.id?{...o,progress:t}:o))});return{id:i.id,picture:r,error:null}}catch(r){const t=r instanceof Error?r.message:"Upload failed";return{id:i.id,picture:null,error:t}}}));c(i=>{const r=i.map(t=>{const l=n.find(o=>o.status==="fulfilled"&&o.value.id===t.id);if(l&&l.status==="fulfilled"){const o=l.value;return{...t,uploaded:o.picture,progress:o.picture?100:null,error:o.error}}return t});return p(r,!1),r})},[g,p]),M=v(b);M.current=b;const S=N(e=>e.registerUpload),j=N(e=>e.unregisterUpload);A(()=>{if(!(!h||!s))return S(h,s,async()=>{await M.current()},()=>L.current.some(e=>!e.uploaded&&!e.error)),()=>{j(h,s)}},[h,s,S,j]);const O=w(async e=>{if(g){c(n=>n.map(i=>i.id===e.id?{...i,progress:0}:i));try{const n=await g(e.file,i=>{c(r=>r.map(t=>t.id===e.id?{...t,progress:i}:t))});c(i=>{const r=i.map(t=>t.id===e.id?{...t,uploaded:n,progress:100,error:null}:t);return p(r,!1),r})}catch(n){const i=n instanceof Error?n.message:"Upload failed";c(r=>r.map(t=>t.id===e.id?{...t,error:i,progress:null}:t))}}},[g,p]),B=w(e=>{c(n=>{const i=(u?y:1)-n.length;if(i<=0)return C(new Error("Maximum files reached"),{userMessage:u?`Maximum ${y} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),n;const r=e.slice(0,i),t=[];for(const o of r){const m=K(o,x,$);if(!m.valid){C(new Error(m.error),{userMessage:m.error,severity:"warning",showNotification:!0});continue}t.push({id:W(),file:o,previewURL:H(o),progress:null,uploaded:null,error:null})}if(t.length===0)return n;const l=u?[...n,...t]:t;return U?setTimeout(()=>{p(l,!0)},0):t.forEach(o=>O(o)),l})},[u,y,x,$,U,O,p]),D=w(e=>{c(n=>{const i=n.find(t=>t.id===e);i&&k(i.previewURL);const r=n.filter(t=>t.id!==e);return p(r,!1),r})},[p]),T=f.some(e=>!e.uploaded&&!e.error),z=f.some(e=>e.progress!==null&&e.progress<100),I=f.length>0?f.reduce((e,n)=>e+(n.progress??0),0)/f.length:0;return{files:f,addFiles:B,removeFile:D,hasPending:T,isUploading:z,progress:I,formId:h,isDeferred:U}}export{Q as useFileUpload};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useEffect as
|
|
1
|
+
"use client";import{useEffect as i}from"react";import{isClient as n}from"@donotdev/core";import{useFormStore as s}from"../stores";function u({enabled:e=!0,message:o="You have unsaved changes. Are you sure you want to leave?"}={}){const r=s(a=>a.hasDirtyForms());i(()=>{if(!e||!r||!n())return;const a=t=>(t.preventDefault(),t.returnValue=o,o);return window.addEventListener("beforeunload",a),()=>{window.removeEventListener("beforeunload",a)}},[e,r,o])}async function m(e="You have unsaved changes. Discard them?"){return!n()||!s.getState().hasDirtyForms()?!0:window.confirm(e)}var d=u;export{m as checkFormNavigation,d as default,u as useFormNavigationGuard};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Entity } from '@donotdev/core';
|
|
2
|
+
export interface UseRelatedItemsOptions {
|
|
3
|
+
/** Maximum number of related items to return (default: 3) */
|
|
4
|
+
limit?: number;
|
|
5
|
+
/** Tolerance for numeric field matching as percentage (default: 0.2 = 20%) */
|
|
6
|
+
tolerance?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface UseRelatedItemsReturn<T> {
|
|
9
|
+
/** Array of related items */
|
|
10
|
+
items: T[];
|
|
11
|
+
/** Whether any related items were found */
|
|
12
|
+
hasItems: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* useRelatedItems - Finds related items based on matching field criteria
|
|
16
|
+
*
|
|
17
|
+
* Matching logic by field type:
|
|
18
|
+
* - String/select fields: exact match
|
|
19
|
+
* - Number fields: within ±tolerance% of current value
|
|
20
|
+
*
|
|
21
|
+
* Items are matched if they satisfy ANY of the specified fields (OR logic).
|
|
22
|
+
* Current item is automatically excluded.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* const { items: relatedCars } = useRelatedItems(
|
|
27
|
+
* carEntity,
|
|
28
|
+
* currentCar,
|
|
29
|
+
* allCars,
|
|
30
|
+
* ['make', 'price'],
|
|
31
|
+
* { limit: 3, tolerance: 0.2 }
|
|
32
|
+
* );
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function useRelatedItems<T extends Record<string, any>>(entity: Entity, currentItem: T | null | undefined, allItems: T[] | null | undefined, matchFields: string[], options?: UseRelatedItemsOptions): UseRelatedItemsReturn<T>;
|
|
36
|
+
export default useRelatedItems;
|
|
37
|
+
//# sourceMappingURL=useRelatedItems.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRelatedItems.d.ts","sourceRoot":"","sources":["../../src/hooks/useRelatedItems.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,6BAA6B;IAC7B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3D,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACjC,QAAQ,EAAE,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,EAChC,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAAC,CAAC,CAAC,CAwD1B;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{useMemo as g}from"react";function h(u,e,t,s,N={}){const{limit:o=3,tolerance:m=.2}=N,c=g(()=>{if(!e||!t||t.length===0||s.length===0)return[];const p=e.id;return t.filter(f=>f.id===p?!1:s.some(n=>{const r=u.fields[n];if(!r)return!1;const i=e[n],a=f[n];if(i==null||a==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const l=Number(i),d=Number(a);if(isNaN(l)||isNaN(d))return!1;const b=Math.abs(l*m);return Math.abs(d-l)<=b}return String(i)===String(a)})).slice(0,o)},[e,t,s,u.fields,o,m]);return{items:c,hasItems:c.length>0}}var y=h;export{y as default,h as useRelatedItems};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{useEffect as
|
|
1
|
+
"use client";import{useEffect as u,useCallback as i}from"react";import{isClient as r}from"@donotdev/core";function t({isDirty:e,enabled:a=!0,message:n="You have unsaved changes. Are you sure you want to leave?",onBeforeNavigate:v}){u(()=>{if(!a||!e||!r())return;const s=o=>(o.preventDefault(),o.returnValue=n,n);return window.addEventListener("beforeunload",s),()=>{window.removeEventListener("beforeunload",s)}},[e,a,n])}function f(e,a="You have unsaved changes. Discard them?"){return i(async()=>e?r()?window.confirm(a):!1:!0,[e,a])}var d=t;export{d as default,f as useConfirmNavigation,t as useUnsavedChangesWarning};
|
package/dist/index.d.ts
CHANGED
|
@@ -14,15 +14,16 @@ export * from './stores';
|
|
|
14
14
|
export { getCrudService } from './CrudService';
|
|
15
15
|
export type { QueryOptions } from './CrudService';
|
|
16
16
|
export { useCrudStore } from './CrudStore';
|
|
17
|
-
export type { CrudServiceInterface, CrudState, CrudActions, BackendType, OptimisticStatus, OptimisticMeta, CrudStoreApi, CacheOptions, } from './types';
|
|
17
|
+
export type { CrudServiceInterface, CrudState, CrudActions, BackendType, OptimisticStatus, OptimisticMeta, CrudStoreApi, CacheOptions, MutationOptions, FilterState, CollectionUIState, } from './types';
|
|
18
18
|
export { loadDeterministicRange, upsertDeterministic, appendToCollection, } from './utils/collections';
|
|
19
19
|
export { getFieldRegistry, registerFieldType, isFieldTypeRegistered, type FieldTypeRegistration, type ControlledFieldProps, type UncontrolledFieldProps, } from './FieldRegistry';
|
|
20
|
+
export { registerBuiltinFieldType, getFieldTypeMetadata, getFilterType, getDisplayFormatter, isFilterable, getValueType, clearFieldTypeRegistry, type FieldTypeMetadata, type FilterType, type ValueType, type DisplayFormatter, type ComponentRegistration, } from './fieldTypeRegistry';
|
|
20
21
|
export { registerBuiltinFieldTypes } from './builtinFieldTypes';
|
|
21
22
|
export { useEntityForm, useEntityField, useController, isFieldEditable, getFieldsForOperation, validateEntity, translateFieldLabel, translateLabel, } from './forms';
|
|
22
23
|
export type { ViewerRole, RenderableField, GetFieldsForOperationOptions, EntityFieldsInput, SchemaOperation, ValidationIssue, ValidationResult, InferEntityData, InferEntityInput, InferEntityOutput, UseEntityFormOptions, EntityFormReturn, EntityFieldReturn, UseControllerProps, UseControllerReturn, ControllerRenderProps, ControllerFieldState, } from './forms';
|
|
23
24
|
export { UploadProvider, useUploadContext } from './contexts';
|
|
24
25
|
export type { UploadProviderProps } from './contexts';
|
|
25
|
-
export { useFileUpload } from './hooks';
|
|
26
|
-
export type { FileMetadata, UseFileUploadOptions } from './hooks';
|
|
26
|
+
export { useFileUpload, useUnsavedChangesWarning, useConfirmNavigation, useEntityFavorites, useRelatedItems, } from './hooks';
|
|
27
|
+
export type { FileMetadata, UseFileUploadOptions, UseEntityFavoritesOptions, UseEntityFavoritesReturn, UseRelatedItemsOptions, UseRelatedItemsReturn, } from './hooks';
|
|
27
28
|
export { isStorageUrl, validatePicture, checkForBlobUrls, hasBlobUrls, } from './utils/uploadValidation';
|
|
28
29
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAGH,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,cAAc,CAAC;AAG7B,cAAc,UAAU,CAAC;AAGzB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,YAAY,EACV,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAGH,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,cAAc,CAAC;AAG7B,cAAc,UAAU,CAAC;AAGzB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,YAAY,EACV,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAEL,aAAa,EACb,cAAc,EACd,aAAa,EAEb,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,UAAU,EACV,eAAe,EACf,4BAA4B,EAC5B,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{getCrudService as
|
|
1
|
+
export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{getCrudService as e}from"./CrudService";import{useCrudStore as s}from"./CrudStore";import{loadDeterministicRange as a,upsertDeterministic as t,appendToCollection as i}from"./utils/collections";import{getFieldRegistry as r,registerFieldType as l,isFieldTypeRegistered as o}from"./FieldRegistry";import{registerBuiltinFieldType as d,getFieldTypeMetadata as p,getFilterType as n,getDisplayFormatter as F,isFilterable as m,getValueType as g,clearFieldTypeRegistry as u}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as y}from"./builtinFieldTypes";import{useEntityForm as f,useEntityField as T,useController as c,isFieldEditable as v,getFieldsForOperation as C,validateEntity as U,translateFieldLabel as b,translateLabel as E}from"./forms";import{UploadProvider as R,useUploadContext as x}from"./contexts";import{useFileUpload as B,useUnsavedChangesWarning as h,useConfirmNavigation as S,useEntityFavorites as D,useRelatedItems as L}from"./hooks";import{isStorageUrl as P,validatePicture as k,checkForBlobUrls as I,hasBlobUrls as M}from"./utils/uploadValidation";export{R as UploadProvider,i as appendToCollection,I as checkForBlobUrls,u as clearFieldTypeRegistry,e as getCrudService,F as getDisplayFormatter,r as getFieldRegistry,p as getFieldTypeMetadata,C as getFieldsForOperation,n as getFilterType,g as getValueType,M as hasBlobUrls,v as isFieldEditable,o as isFieldTypeRegistered,m as isFilterable,P as isStorageUrl,a as loadDeterministicRange,d as registerBuiltinFieldType,y as registerBuiltinFieldTypes,l as registerFieldType,b as translateFieldLabel,E as translateLabel,t as upsertDeterministic,S as useConfirmNavigation,c as useController,s as useCrudStore,D as useEntityFavorites,T as useEntityField,f as useEntityForm,B as useFileUpload,L as useRelatedItems,h as useUnsavedChangesWarning,x as useUploadContext,U as validateEntity,k as validatePicture};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registerBuiltinFieldTypes.d.ts","sourceRoot":"","sources":["../src/registerBuiltinFieldTypes.tsx"],"names":[],"mappings":"AAkuBA;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAmqBnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{jsx as s,jsxs as u}from"react/jsx-runtime";import{Text as m,Stack as g,ImageGallery as I,Rating as $}from"@donotdev/components";import{formatCurrency as T}from"@donotdev/core";import{ControlledCheckboxField as w,ControlledComboboxField as M,ControlledDateField as b,ControlledDropdownField as R,ControlledFileField as N,ControlledMultiFileField as P,ControlledDocumentField as V,ControlledMultiDocumentField as _,ControlledGeoPointField as B,ControlledImageField as E,ControlledMapField as U,ControlledMultiDropdownField as H,ControlledMultiInputField as K,ControlledNumberField as Y,ControlledPasswordField as G,ControlledPhoneField as O,ControlledRangeField as W,ControlledRatingField as q,ControlledRadioField as J,ControlledYearField as Q,ControlledTextField as y,ControlledTextareaField as X,ControlledRichTextField as Z,ControlledTimestampField as ee,ControlledAddressField as te,ControlledSwitchField as re,ControlledMultiImageField as le,ControlledGdprConsentField as ne,ControlledCurrencyField as oe,ControlledPriceField as ae}from"./components/controlled";import{AvatarFieldComponent as ie,BadgeFieldComponent as ce,ButtonFieldComponent as k,HiddenFieldComponent as se,TextAreaComponent as pe,RichTextComponent as de,TextFieldComponent as F}from"./components/form/fields";import{registerBuiltinFieldType as a}from"./fieldTypeRegistry";import{translateLabel as f}from"./forms/utils";function p(e){return e?s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s(m,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,l,n,t)=>{const r=t?.compact??!1;return e==null||e===""?p(r):String(e)},month:(e,l,n,t)=>{const r=t?.compact??!1;return e==null||e===""?p(r):String(e)},boolean:(e,l,n)=>e?"Yes":"No",checkbox:(e,l,n)=>e?"Yes":"No",switch:(e,l,n)=>{const t=l.options?.fieldSpecific;if(t){const r=t.uncheckedValue??!1,o=t.checkedValue??!0;if(e===o&&t.checkedLabel)return f(t.checkedLabel,n);if(e===r&&t.uncheckedLabel)return f(t.uncheckedLabel,n)}return e?"Yes":"No"},year:(e,l,n)=>String(e),number:(e,l,n)=>typeof e=="number"?e.toLocaleString():String(e),currency:(e,l,n)=>{if(e==null||isNaN(e))return"";const t=(l.options||{}).fieldSpecific?.currency||"EUR";return T(e,t)},price:(e,l,n,t)=>{const r=t?.compact??!1,o=t?.asString??!1,i=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(i==null||typeof i!="object")return p(r);const d=i.amount;if(d==null||isNaN(d))return p(r);const C=i.currency||"EUR",z=i.vatIncluded??!0,v=i.discountPercent??0,D=v>0?d*(1-v/100):d,h=z?` ${n("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(v>0){const L=T(d,C),x=T(D,C),S=` ${n("crud:price.discountPercent",{percent:Math.round(v),defaultValue:"-{{percent}}%"})}`;return o?`${x}${h}${S}`:r?u(m,{variant:"success",weight:"bold",children:[x,h,S]}):u(g,{direction:"column",gap:"tight",align:"end",children:[s(m,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:L}),u(m,{variant:"success",weight:"bold",children:[x,h]})]})}return`${T(d,C)}${h}`},range:(e,l,n)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null)return p(r);const o=typeof e=="number"?e:parseFloat(e);if(isNaN(o))return p(r);const i=l.validation?.max??5;return s($,{value:o,max:i,readonly:!0,"aria-label":`${o} out of ${i} stars`})},select:(e,l,n)=>{const t=l.validation?.options;if(Array.isArray(t)){const r=t.find(o=>o.value===e)?.label;return r?f(r,n):String(e)}return String(e)},radio:(e,l,n)=>{const t=l.validation?.options;if(Array.isArray(t)){const r=t.find(o=>o.value===e)?.label;return r?f(r,n):String(e)}return String(e)},combobox:(e,l,n)=>{const t=l.validation?.options;if(Array.isArray(t)){const r=t.find(o=>o.value===e)?.label;return r?f(r,n):String(e)}return String(e)},multiselect:(e,l,n)=>{if(Array.isArray(e)){const t=l.validation?.options;if(Array.isArray(t))return e.map(r=>{const o=t.find(i=>i.value===r)?.label;return o?f(o,n):r}).join(", ")}return String(e)},image:(e,l,n,t)=>{const r=t?.compact??!1;return e==null||e===""?p(r):typeof e=="string"?s("img",{src:e,alt:l.label||"",style:{width:r?"40px":void 0,height:r?"40px":void 0,maxWidth:r?void 0:"200px",maxHeight:r?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):p(r)},images:(e,l,n,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return p(r);const o=e[0],i=typeof o=="object"&&o.thumbUrl?o.thumbUrl:o;return r?u("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[s("img",{src:i,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&u("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):s(I,{images:e,altPrefix:l.label||"Image"})},files:(e,l,n,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?p(r):s(g,{gap:"tight",children:e.map((o,i)=>u("a",{href:o.url||o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[o.filename||`File ${i+1}`,o.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},i))})},documents:(e,l,n,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?p(r):s(g,{gap:"tight",children:e.map((o,i)=>u("a",{href:o.url||o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[o.filename||`File ${i+1}`,o.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},i))})},file:(e,l,n,t)=>{const r=t?.compact??!1;if(!e)return p(r);const o=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[i,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,l,n,t)=>{const r=t?.compact??!1;if(!e)return p(r);const o=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[i,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,l,n)=>String(e),geopoint:(e,l,n,t)=>{const r=t?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:p(r)},address:(e,l,n)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,l,n,t)=>{const r=t?.compact??!1;if(e&&typeof e=="object"){const o=Object.entries(e);return o.length===0?p(r):u(g,{direction:"column",gap:"tight",children:[o.slice(0,5).map(([i,d])=>u(m,{style:{fontSize:"var(--font-size-sm)"},children:[u("strong",{children:[i,":"]})," ",String(d)]},i)),o.length>5&&u(m,{variant:"muted",children:["+",o.length-5," more"]})]})}return p(r)},array:(e,l,n,t)=>{const r=t?.compact??!1;return Array.isArray(e)?e.length===0?p(r):e.join(", "):p(r)},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,l,n)=>s("a",{href:`mailto:${e}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:e}),tel:(e,l,n)=>s("a",{href:`tel:${e}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:e}),url:(e,l,n)=>s("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,l,n)=>u(g,{direction:"row",gap:"tight",align:"center",children:[s("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),s(m,{children:e})]}),textarea:(e,l,n)=>String(e),text:(e,l,n)=>String(e),richtext:(e,l,n,t)=>{const r=t?.compact??!1;return e&&typeof e=="string"?r?e.replace(/<[^>]*>/g,"").trim()||s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s("div",{dangerouslySetInnerHTML:{__html:e},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):p(r)}};function ue(e){return e.type==="avatar"}function ye(e){return e.type==="badge"}let A=!1;function j(){A||(A=!0,a({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,...o.options})}}}),a({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,type:"email",...o.options})}}}),a({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,type:"url",...o.options})}}}),a({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,type:"color",...o.options})}}}),a({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:X,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(pe,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,...o.options})}}}),a({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:Z,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(de,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,...o.options})}}}),a({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:G}}),a({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:O}}),a({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:Y}}),a({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:oe}}),a({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:ae}}),a({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:W}}),a({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:Q}}),a({type:"rating",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.rating,components:{controlled:q}}),a({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:w}}),a({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:w}}),a({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",components:{controlled:ne}}),a({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:re}}),a({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:b}}),a({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:b}}),a({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:b}}),a({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:b}}),a({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:b}}),a({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:ee}}),a({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:N}}),a({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:P}}),a({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:V}}),a({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:_}}),a({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:E}}),a({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:le}}),a({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:B}}),a({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:te}}),a({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:U}}),a({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:K}}),a({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:R}}),a({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:M}}),a({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:H}}),a({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:J}}),a({type:"reference",filterable:!0,filterType:"text",valueType:"string",components:{controlled:y}}),a({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:l,value:n}=e;return s(se,{name:l,value:typeof n=="string"?n:""})}}}),a({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,error:t,config:r,t:o}=e;if(!ue(r))throw new Error("Invalid config type for avatar field");return s(ie,{config:r,value:typeof l=="string"?l:"",onChange:i=>{n(i)},error:!!t,helperText:t||void 0,t:o,...r.options})}}}),a({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,error:t,config:r,t:o}=e;if(!ye(r))throw new Error("Invalid config type for badge field");return s(ce,{config:r,value:typeof l=="string"?l:"",onChange:i=>{n(i)},error:!!t,helperText:t||void 0,t:o,...r.options})}}}),a({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:l,label:n,config:t}=e;return s(k,{label:n||l,type:"submit",onClick:()=>{},...t.options})}}}),a({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:l,label:n,config:t}=e;return s(k,{label:n||l,type:"reset",onClick:()=>{},...t.options})}}}))}j();export{j as registerAllBuiltinFieldTypes};
|
package/dist/stores/FormStore.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{createDoNotDevStore as i}from"@donotdev/core";const m={status:"idle",error:null,uploadProgress:0,isDirty:!1},
|
|
1
|
+
"use client";import{createDoNotDevStore as i}from"@donotdev/core";const m={status:"idle",error:null,uploadProgress:0,isDirty:!1},a=i({name:"form-store",createStore:(t,e)=>({forms:{},startSubmit:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(s,r)=>{t(o=>{const u=o.forms[s]||m;return{forms:{...o.forms,[s]:{...u,status:"uploading",uploadProgress:Math.min(100,Math.max(0,r))}}}})},setValidating:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"validating",uploadProgress:100}}}})},setSubmitting:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"submitting"}}}})},setSuccess:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"success",error:null}}}}),setTimeout(()=>{e().reset(s)},1500)},setError:(s,r)=>{t(o=>{const u=o.forms[s]||m;return{forms:{...o.forms,[s]:{...u,status:"error",error:r}}}})},reset:s=>{t(r=>({forms:{...r.forms,[s]:{...m}}}))},setIsDirty:(s,r)=>{t(o=>{const u=o.forms[s]||m;return{forms:{...o.forms,[s]:{...u,isDirty:r}}}})},hasDirtyForms:()=>{const s=e().forms;return Object.values(s).some(r=>r.isDirty)},getDirtyFormIds:()=>{const s=e().forms;return Object.entries(s).filter(([r,o])=>o.isDirty).map(([r])=>r)},cleanup:s=>{t(r=>{const{[s]:o,...u}=r.forms;return{forms:u}})},getStatus:s=>e().forms[s]?.status??"idle",isLoading:s=>{const r=e().forms[s]?.status??"idle";return r==="uploading"||r==="validating"||r==="submitting"},getUploadProgress:s=>e().forms[s]?.uploadProgress??0,getError:s=>e().forms[s]?.error??null,getIsDirty:s=>e().forms[s]?.isDirty??!1})}),n=t=>a(e=>e.forms[t]?.status??"idle"),f=t=>a(e=>{const s=e.forms[t]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"}),l=t=>a(e=>e.forms[t]?.uploadProgress??0),g=t=>a(e=>e.forms[t]?.error??null),d=t=>a(e=>e.forms[t]?.isDirty??!1),c=()=>a(t=>t.hasDirtyForms());export{g as useFormError,d as useFormIsDirty,f as useFormLoading,n as useFormStatus,a as useFormStore,c as useHasDirtyForms,l as useUploadProgress};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{createDoNotDevStore as
|
|
1
|
+
"use client";import{createDoNotDevStore as y}from"@donotdev/core";const g={status:"idle",progress:0,error:null},d=y({name:"upload-store",createStore:(a,n)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(t,e,o,r)=>{a(s=>({uploadFunctions:{...s.uploadFunctions,[t]:{...s.uploadFunctions[t]||{},[e]:o}},checkPendingFunctions:{...s.checkPendingFunctions,[t]:{...s.checkPendingFunctions[t]||{},[e]:r||(()=>!1)}}}))},unregisterUpload:(t,e)=>{a(o=>{const r=o.uploadFunctions[t],s=o.checkPendingFunctions[t];if(!r)return o;const{[e]:u,...p}=r,{[e]:l,...m}=s||{},{[e]:F,...c}=o.retryAttempts[t]||{};return{uploadFunctions:{...o.uploadFunctions,[t]:p},checkPendingFunctions:{...o.checkPendingFunctions,[t]:m},retryAttempts:{...o.retryAttempts,[t]:c}}})},startUpload:(t,e)=>{a(o=>({uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(t,e,o)=>{a(r=>{const s=r.uploads[t]?.[e]||g;return{uploads:{...r.uploads,[t]:{...r.uploads[t]||{},[e]:{...s,progress:Math.min(100,Math.max(0,o))}}}}})},completeUpload:(t,e)=>{a(o=>{const r=o.uploads[t]?.[e]||g;return{uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{...r,status:"complete",progress:100}}}}})},failUpload:(t,e,o)=>{a(r=>{const s=r.uploads[t]?.[e]||g;return{uploads:{...r.uploads,[t]:{...r.uploads[t]||{},[e]:{...s,status:"error",error:o}}}}})},resetUpload:(t,e)=>{a(o=>({uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{...g}}}}))},resetForm:t=>{a(e=>({uploads:{...e.uploads,[t]:{}}}))},cleanup:t=>{a(e=>{const{[t]:o,...r}=e.uploads,{[t]:s,...u}=e.uploadFunctions;return{uploads:r,uploadFunctions:u}})},uploadAll:async t=>{const e=n().uploadFunctions[t];if(!e)return;const o=Object.entries(e);if(o.length===0)return;const r=async(s,u,p=1)=>{n().startUpload(t,s);try{await u(l=>{n().setProgress(t,s,l)}),n().completeUpload(t,s),a(l=>({retryAttempts:{...l.retryAttempts,[t]:{...l.retryAttempts[t]||{},[s]:0}}}))}catch(l){const m=l instanceof Error?l.message:"Upload failed",F=n().maxRetries,c=n().retryAttempts[t]?.[s]||0;if(c<F){a(i=>({retryAttempts:{...i.retryAttempts,[t]:{...i.retryAttempts[t]||{},[s]:c+1}}}));const h=n().retryDelay*Math.pow(2,p-1);return await new Promise(i=>setTimeout(i,h)),r(s,u,p+1)}else throw n().failUpload(t,s,m),l}};await Promise.all(o.map(async([s,u])=>{await r(s,u)}))},hasPendingUploads:t=>{const e=n(),o=e.uploadFunctions[t],r=e.checkPendingFunctions[t];return o?Object.entries(o).some(([s,u])=>{const p=r?.[s];return p?p():!0}):!1},getStatus:(t,e)=>n().uploads[t]?.[e]?.status??"idle",getProgress:(t,e)=>n().uploads[t]?.[e]?.progress??0,getTotalProgress:t=>{const e=n().uploads[t];if(!e)return 100;const o=Object.values(e);if(o.length===0)return 100;const r=o.reduce((s,u)=>s+u.progress,0);return Math.round(r/o.length)},isUploading:t=>{const e=n().uploads[t];return e?Object.values(e).some(o=>o.status==="uploading"):!1},getError:(t,e)=>n().uploads[t]?.[e]?.error??null})}),P=a=>d(n=>{const t=n.uploads[a];if(!t)return 100;const e=Object.values(t);if(e.length===0)return 100;const o=e.reduce((r,s)=>r+s.progress,0);return Math.round(o/e.length)}),U=a=>d(n=>{const t=n.uploads[a];return t?Object.values(t).some(e=>e.status==="uploading"):!1}),f=(a,n)=>d(t=>t.uploads[a]?.[n]?.progress??0),A=(a,n)=>d(t=>t.uploads[a]?.[n]?.status??"idle");export{f as useFieldProgress,A as useFieldUploadStatus,U as useIsUploading,P as useTotalProgress,d as useUploadStore};
|
package/dist/stores/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useFormStore as
|
|
1
|
+
import{useFormStore as s,useFormStatus as a,useFormLoading as r,useUploadProgress as o,useFormError as e,useFormIsDirty as u,useHasDirtyForms as t}from"./FormStore";import{useUploadStore as m,useTotalProgress as F,useIsUploading as i,useFieldProgress as l,useFieldUploadStatus as d}from"./UploadStore";export{l as useFieldProgress,d as useFieldUploadStatus,e as useFormError,u as useFormIsDirty,r as useFormLoading,a as useFormStatus,s as useFormStore,t as useHasDirtyForms,i as useIsUploading,F as useTotalProgress,o as useUploadProgress,m as useUploadStore};
|