@donotdev/crud 0.0.12 → 0.0.14

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.
Files changed (164) hide show
  1. package/dist/CrudService.js +1 -1
  2. package/dist/CrudStore.js +1 -1
  3. package/dist/FieldRegistry.js +1 -1
  4. package/dist/adapters/FirestoreAdapter.js +1 -1
  5. package/dist/adapters/FunctionsAdapter.js +1 -1
  6. package/dist/adapters/index.js +1 -1
  7. package/dist/components/CrudButton.js +1 -1
  8. package/dist/components/DateFilter.d.ts +30 -0
  9. package/dist/components/DateFilter.d.ts.map +1 -0
  10. package/dist/components/DateFilter.js +1 -0
  11. package/dist/components/DisplayFieldRenderer.js +1 -1
  12. package/dist/components/EntityDisplayRenderer.js +1 -1
  13. package/dist/components/EntityFilters.d.ts +28 -15
  14. package/dist/components/EntityFilters.d.ts.map +1 -1
  15. package/dist/components/EntityFilters.js +1 -1
  16. package/dist/components/FormFieldRenderer.js +1 -1
  17. package/dist/components/FormLayout.js +1 -1
  18. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  19. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  20. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  21. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  22. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  23. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  24. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  25. package/dist/components/controlled/complex/index.js +1 -1
  26. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  27. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  28. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  29. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  30. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  31. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  32. package/dist/components/controlled/file/index.js +1 -1
  33. package/dist/components/controlled/index.js +1 -1
  34. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  35. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
  36. package/dist/components/controlled/input/ControlledDurationField.js +1 -1
  37. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  38. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  39. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  40. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  41. package/dist/components/controlled/input/ControlledPriceField.js +1 -1
  42. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  43. package/dist/components/controlled/input/ControlledRatingField.js +1 -1
  44. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  45. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  46. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  47. package/dist/components/controlled/input/index.js +1 -1
  48. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  49. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  50. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  51. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  52. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  53. package/dist/components/controlled/select/index.js +1 -1
  54. package/dist/components/controlled/types.js +1 -1
  55. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
  56. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
  57. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -1
  58. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
  59. package/dist/components/fields/display/DateFieldDisplay.js +1 -1
  60. package/dist/components/fields/display/DropdownDisplay.js +1 -1
  61. package/dist/components/fields/display/FileFieldDisplay.js +1 -1
  62. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -1
  63. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -1
  64. package/dist/components/fields/display/ImageFieldDisplay.js +1 -1
  65. package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
  66. package/dist/components/fields/display/MapFieldDisplay.js +1 -1
  67. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -1
  68. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -1
  69. package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
  70. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
  71. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -1
  72. package/dist/components/fields/display/RadioFieldDisplay.js +1 -1
  73. package/dist/components/fields/display/RangeFieldDisplay.js +1 -1
  74. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
  75. package/dist/components/fields/display/RichTextDisplay.js +2 -2
  76. package/dist/components/fields/display/TextAreaDisplay.js +1 -1
  77. package/dist/components/fields/display/TextFieldDisplay.js +1 -1
  78. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
  79. package/dist/components/fields/display/index.js +1 -1
  80. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  81. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  82. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  83. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  84. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  85. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  86. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  87. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  88. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  89. package/dist/components/form/fields/DropdownComponent.js +1 -1
  90. package/dist/components/form/fields/DurationFieldComponent.d.ts.map +1 -1
  91. package/dist/components/form/fields/DurationFieldComponent.js +1 -1
  92. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  93. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  94. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  95. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  96. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  97. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  98. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  99. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  100. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  101. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  102. package/dist/components/form/fields/PhoneNumberComponent.d.ts.map +1 -1
  103. package/dist/components/form/fields/PriceFieldComponent.js +1 -1
  104. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  105. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  106. package/dist/components/form/fields/RatingFieldComponent.js +1 -1
  107. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  108. package/dist/components/form/fields/RichTextComponent.js +1 -1
  109. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  110. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  111. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  112. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  113. package/dist/components/form/fields/index.js +1 -1
  114. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  115. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  116. package/dist/components/index.js +1 -1
  117. package/dist/contexts/UploadContext.js +1 -1
  118. package/dist/contexts/index.js +1 -1
  119. package/dist/fieldTypeRegistry.js +1 -1
  120. package/dist/forms/hooks/index.js +1 -1
  121. package/dist/forms/hooks/useController.js +1 -1
  122. package/dist/forms/hooks/useEntityField.js +1 -1
  123. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  124. package/dist/forms/index.js +1 -1
  125. package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
  126. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  127. package/dist/forms/utils/index.js +1 -1
  128. package/dist/forms/utils/isFieldEditable.js +1 -1
  129. package/dist/forms/utils/translateFieldLabel.d.ts.map +1 -1
  130. package/dist/forms/utils/validateEntity.js +1 -1
  131. package/dist/hooks/index.d.ts +2 -0
  132. package/dist/hooks/index.d.ts.map +1 -1
  133. package/dist/hooks/index.js +1 -1
  134. package/dist/hooks/useCrudFilters.d.ts +32 -0
  135. package/dist/hooks/useCrudFilters.d.ts.map +1 -0
  136. package/dist/hooks/useCrudFilters.js +1 -0
  137. package/dist/hooks/useEntityFavorites.js +1 -1
  138. package/dist/hooks/useFileUpload.js +1 -1
  139. package/dist/hooks/useFormNavigationGuard.js +1 -1
  140. package/dist/hooks/useRelatedItems.js +1 -1
  141. package/dist/hooks/useUnsavedChangesWarning.js +1 -1
  142. package/dist/index.d.ts +2 -2
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +1 -1
  145. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -1
  146. package/dist/stores/FormStore.js +1 -1
  147. package/dist/stores/UploadStore.js +1 -1
  148. package/dist/stores/index.js +1 -1
  149. package/dist/tsconfig.tsbuildinfo +1 -1
  150. package/dist/types.d.ts +4 -1
  151. package/dist/types.d.ts.map +1 -1
  152. package/dist/useBaseCrudList.js +1 -1
  153. package/dist/useCrud.js +1 -1
  154. package/dist/useCrudCardList.js +1 -1
  155. package/dist/useCrudList.js +1 -1
  156. package/dist/utils/collections.js +1 -1
  157. package/dist/utils/fileStorage.js +1 -1
  158. package/dist/utils/imageProcessing.js +1 -1
  159. package/dist/utils/imageStorage.js +1 -1
  160. package/dist/utils/imageUtils.js +1 -1
  161. package/dist/utils/mergeWithOptimistic.js +1 -1
  162. package/dist/utils/scopeUtils.js +1 -1
  163. package/dist/utils/uploadValidation.js +1 -1
  164. package/package.json +3 -3
@@ -1 +1 @@
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
+ import{isFieldEditable as r}from"./isFieldEditable";import{getFieldsForOperation as o}from"./getFieldsForOperation";import{validateEntity as i}from"./validateEntity";import{translateFieldLabel as p,translateLabel as f}from"./translateFieldLabel";export{o as getFieldsForOperation,r as isFieldEditable,p as translateFieldLabel,f as translateLabel,i as validateEntity};
@@ -1 +1 @@
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
+ import{hasRoleAccess as t,USER_ROLES as u}from"@donotdev/core";function i(r,e,n){return r===void 0||r===!0?!0:r===!1?!1:r==="admin"?t(e,u.ADMIN):r==="create-only"?n==="create":!0}export{i as isFieldEditable};
@@ -1 +1 @@
1
- {"version":3,"file":"translateFieldLabel.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/translateFieldLabel.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,GACxD,MAAM,CA6BR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EACjE,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,EAClC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,GACxD,MAAM,CAGR"}
1
+ {"version":3,"file":"translateFieldLabel.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/translateFieldLabel.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,GACxD,MAAM,CAgCR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EACjE,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,EAClC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,GACxD,MAAM,CAGR"}
@@ -1 +1 @@
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};
1
+ import*as o from"valibot";import{createSchemas as p}from"@donotdev/core";function h(a,c,r="create"){const s=p(a),u={create:s.create,draft:s.draft,update:s.update,full:s.get}[r],e=o.safeParse(u,c);return e.success?{success:!0,data:e.output}:{success:!1,issues:e.issues.map(t=>({path:t.path?.map(m=>m.key).join(".")||"",message:t.message}))}}export{h as validateEntity};
@@ -3,6 +3,8 @@ export type { FileMetadata, UseFileUploadOptions } from './useFileUpload';
3
3
  export { useUnsavedChangesWarning, useConfirmNavigation, } from './useUnsavedChangesWarning';
4
4
  export { useEntityFavorites } from './useEntityFavorites';
5
5
  export type { UseEntityFavoritesOptions, UseEntityFavoritesReturn, } from './useEntityFavorites';
6
+ export { useCrudFilters } from './useCrudFilters';
7
+ export type { UseCrudFiltersOptions, UseCrudFiltersReturn, } from './useCrudFilters';
6
8
  export { useRelatedItems } from './useRelatedItems';
7
9
  export type { UseRelatedItemsOptions, UseRelatedItemsReturn, } from './useRelatedItems';
8
10
  //# 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;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"}
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,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC"}
@@ -1 +1 @@
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};
1
+ import{useFileUpload as o}from"./useFileUpload";import{useUnsavedChangesWarning as s,useConfirmNavigation as a}from"./useUnsavedChangesWarning";import{useEntityFavorites as m}from"./useEntityFavorites";import{useCrudFilters as u}from"./useCrudFilters";import{useRelatedItems as p}from"./useRelatedItems";export{a as useConfirmNavigation,u as useCrudFilters,m as useEntityFavorites,o as useFileUpload,p as useRelatedItems,s as useUnsavedChangesWarning};
@@ -0,0 +1,32 @@
1
+ import type { FilterState } from '../types';
2
+ export interface UseCrudFiltersOptions {
3
+ /** Entity collection name (e.g., 'cars', 'products') */
4
+ collection: string;
5
+ }
6
+ export interface UseCrudFiltersReturn {
7
+ /** Current filter state */
8
+ filters: FilterState;
9
+ /** Update filters */
10
+ setFilters: (filters: FilterState) => void;
11
+ /** Whether favorites-only toggle is enabled */
12
+ showFavoritesOnly: boolean;
13
+ /** Toggle favorites-only filter */
14
+ setShowFavoritesOnly: (show: boolean) => void;
15
+ }
16
+ /**
17
+ * Hook for managing collection filters from CrudStore
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const { filters, setFilters } = useCrudFilters({ collection: 'cars' });
22
+ *
23
+ * <EntityFilters
24
+ * entity={carEntity}
25
+ * data={data}
26
+ * filters={filters}
27
+ * onFiltersChange={setFilters}
28
+ * />
29
+ * ```
30
+ */
31
+ export declare function useCrudFilters(options: UseCrudFiltersOptions): UseCrudFiltersReturn;
32
+ //# sourceMappingURL=useCrudFilters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCrudFilters.d.ts","sourceRoot":"","sources":["../../src/hooks/useCrudFilters.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,qBAAqB;IACpC,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,2BAA2B;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,qBAAqB;IACrB,UAAU,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAC3C,+CAA+C;IAC/C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mCAAmC;IACnC,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,qBAAqB,GAC7B,oBAAoB,CAsCtB"}
@@ -0,0 +1 @@
1
+ import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";function f(r){const{collection:e}=r,l={},i=s(t=>t.collections[e]?.ui?.filters??l),n=o(t=>{s.getState().setFilters(e,t)},[e]),c=s(t=>t.collections[e]?.ui?.showFavoritesOnly??!1),a=o(t=>{s.getState().setShowFavoritesOnly(e,t)},[e]);return{filters:i,setFilters:n,showFavoritesOnly:c,setShowFavoritesOnly:a}}export{f as useCrudFilters};
@@ -1 +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
+ import{useCallback as r}from"react";import{useLocalStorage as y}from"@donotdev/core";function V(n={}){const{storageKey:a,collection:c="entities"}=n,u=a||`favorites-${c}`,{value:s,setValue:o,isLoaded:l}=y(u,{defaultValue:[]}),f=r(t=>s.includes(t),[s]),v=r(t=>{o(e=>e.includes(t)?e.filter(i=>i!==t):[...e,t])},[o]),F=r(t=>{o(e=>e.includes(t)?e:[...e,t])},[o]),d=r(t=>{o(e=>e.filter(i=>i!==t))},[o]),m=r(()=>{o([])},[o]),g=r(t=>s.includes(t.id),[s]);return{favorites:s,isFavorite:f,toggleFavorite:v,addFavorite:F,removeFavorite:d,clearFavorites:m,favoritesFilter:g,isLoaded:l}}export{V as useEntityFavorites};
@@ -1 +1 @@
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
+ "use client";import{useState as G,useCallback as R,useEffect as v,useRef as A,startTransition as H}from"react";import{handleError as j}from"@donotdev/core";import{useUploadContext as K}from"../contexts/UploadContext";import{useUploadStore as k}from"../stores/UploadStore";let B=0;function M(l){if(l){const d=l.split("/").pop()?.split("?")[0];if(d)return`file-${d}`}B+=1;const u=typeof performance<"u"?performance.now():Date.now(),g=Math.random().toString(36).slice(2,11);return`file-${B}-${u}-${g}`}function Q(l){return URL.createObjectURL(l)}function V(l){l.startsWith("blob:")&&URL.revokeObjectURL(l)}function X(l,u,g){return u.length>0&&!u.some(m=>{if(m.endsWith("/*")){const L=m.slice(0,-2);return l.type.startsWith(L)}return l.type===m})?{valid:!1,error:`File type ${l.type} not accepted`}:l.size>g?{valid:!1,error:`File exceeds ${(g/1048576).toFixed(0)}MB limit`}:{valid:!0}}function er({name:l,value:u,onChange:g,multiple:d=!1,maxFiles:m=10,maxSize:L=10*1024*1024,accept:x=[],storagePath:Y="uploads",uploadFn:U}){const h=K(),w=!!h,[f,c]=G([]),E=A(!1),P=A(null),F=A(u),$=A([]);v(()=>{if(E.current){E.current=!1;return}const e=u?JSON.stringify((Array.isArray(u)?u:[u]).map(s=>s.fullUrl).filter(Boolean)):null;e!==P.current&&(P.current=e,F.current=u,H(()=>{if(u){const n=(Array.isArray(u)?u:[u]).filter(t=>t.fullUrl).map((t,r)=>({id:`${M(t.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:t.thumbUrl||t.fullUrl,progress:100,uploaded:t,error:null}));c(n)}else c([])}))},[u]),v(()=>{$.current=f},[f]),v(()=>()=>{$.current.forEach(e=>V(e.previewURL))},[]);const p=R((e,s=!1)=>{const t=(s?e.filter(i=>!i.error):e.filter(i=>i.uploaded&&!i.error)).map(i=>i.uploaded?i.uploaded:s&&w?{fullUrl:i.previewURL,thumbUrl:i.previewURL}:null).filter(i=>i!==null);let r;d?r=t.length>0?t:null:r=t[0]||null;const o=F.current;(()=>{if(!r&&!o)return!1;if(!r||!o)return!0;if(d&&Array.isArray(r)&&Array.isArray(o)){if(r.length!==o.length)return!0;const i=r.map(b=>b.fullUrl).join(","),y=o.map(b=>b.fullUrl).join(",");return i!==y}return!d&&!Array.isArray(r)&&!Array.isArray(o)?r.fullUrl!==o.fullUrl:!0})()&&(E.current=!0,F.current=r,g(r))},[d,g,w]),S=R(async()=>{if(!U)return;let e=[];if(c(n=>(e=n.filter(t=>!t.uploaded&&!t.error),e.length===0?n:n.map(t=>e.some(r=>r.id===t.id)?{...t,progress:0}:t))),e.length===0)return;const s=await Promise.allSettled(e.map(async n=>{try{const t=await U(n.file,r=>{c(o=>o.map(a=>a.id===n.id?{...a,progress:r}:a))});return{id:n.id,picture:t,error:null}}catch(t){const r=t instanceof Error?t.message:"Upload failed";return{id:n.id,picture:null,error:r}}}));c(n=>{const t=n.map(r=>{const o=s.find(a=>a.status==="fulfilled"&&a.value.id===r.id);if(o&&o.status==="fulfilled"){const a=o.value;return{...r,uploaded:a.picture,progress:a.picture?100:null,error:a.error}}return r});return p(t,!1),t})},[U,p]),C=A(S);C.current=S;const I=k(e=>e.registerUpload),N=k(e=>e.unregisterUpload);v(()=>{if(!(!h||!l))return I(h,l,async()=>{await C.current()},()=>$.current.some(e=>!e.uploaded&&!e.error)),()=>{N(h,l)}},[h,l,I,N]);const T=R(async e=>{if(U){c(s=>s.map(n=>n.id===e.id?{...n,progress:0}:n));try{const s=await U(e.file,n=>{c(t=>t.map(r=>r.id===e.id?{...r,progress:n}:r))});c(n=>{const t=n.map(r=>r.id===e.id?{...r,uploaded:s,progress:100,error:null}:r);return p(t,!1),t})}catch(s){const n=s instanceof Error?s.message:"Upload failed";c(t=>t.map(r=>r.id===e.id?{...r,error:n,progress:null}:r))}}},[U,p]),D=R(e=>{c(s=>{const t=(d?m:1)-s.length;if(t<=0)return j(new Error("Maximum files reached"),{userMessage:d?`Maximum ${m} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),s;const r=e.slice(0,t),o=[];for(const i of r){const y=X(i,x,L);if(!y.valid){j(new Error(y.error),{userMessage:y.error,severity:"warning",showNotification:!0});continue}o.push({id:M(),file:i,previewURL:Q(i),progress:null,uploaded:null,error:null})}if(o.length===0)return s;const a=d?[...s,...o]:o;return w?setTimeout(()=>{p(a,!0)},0):o.forEach(i=>T(i)),a})},[d,m,x,L,w,T,p]),O=R(e=>{c(s=>{const n=s.find(r=>r.id===e);n&&V(n.previewURL);const t=s.filter(r=>r.id!==e);return p(t,!1),t})},[p]),W=f.some(e=>!e.uploaded&&!e.error),J=f.some(e=>e.progress!==null&&e.progress<100),q=f.length>0?f.reduce((e,s)=>e+(s.progress??0),0)/f.length:0;return{files:f,addFiles:D,removeFile:O,hasPending:W,isUploading:J,progress:q,formId:h,isDeferred:w}}export{er as useFileUpload};
@@ -1 +1 @@
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};
1
+ "use client";import{useEffect as a}from"react";import{isClient as u}from"@donotdev/core";import{useFormStore as i}from"../stores";function s({enabled:r=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}={}){const o=i(t=>t.hasDirtyForms());a(()=>{if(!r||!o||!u())return;const t=n=>(n.preventDefault(),n.returnValue=e,e);return window.addEventListener("beforeunload",t),()=>{window.removeEventListener("beforeunload",t)}},[r,o,e])}async function d(r="You have unsaved changes. Discard them?"){return!u()||!i.getState().hasDirtyForms()?!0:window.confirm(r)}var h=s;export{d as checkFormNavigation,h as default,s as useFormNavigationGuard};
@@ -1 +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
+ "use client";import{useMemo as m}from"react";function N(f,e,n,t,b={}){const{limit:l=3,tolerance:a=.2}=b,c=m(()=>{if(!e||!n||n.length===0||t.length===0)return[];const d=e.id;return n.filter(g=>g.id===d?!1:t.some(u=>{const r=f.fields[u];if(!r)return!1;const s=e[u],i=g[u];if(s==null||i==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const o=Number(s),p=Number(i);if(isNaN(o)||isNaN(p))return!1;const h=Math.abs(o*a);return Math.abs(p-o)<=h}return String(s)===String(i)})).slice(0,l)},[e,n,t,f.fields,l,a]);return{items:c,hasItems:c.length>0}}var M=N;export{M as default,N as useRelatedItems};
@@ -1 +1 @@
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};
1
+ "use client";import{useEffect as a,useCallback as f}from"react";import{isClient as u}from"@donotdev/core";function i({isDirty:e,enabled:n=!0,message:r="You have unsaved changes. Are you sure you want to leave?",onBeforeNavigate:d}){a(()=>{if(!n||!e||!u())return;const o=t=>(t.preventDefault(),t.returnValue=r,r);return window.addEventListener("beforeunload",o),()=>{window.removeEventListener("beforeunload",o)}},[e,n,r])}function s(e,n="You have unsaved changes. Discard them?"){return f(async()=>e?u()?window.confirm(n):!1:!0,[e,n])}var v=i;export{v as default,s as useConfirmNavigation,i as useUnsavedChangesWarning};
package/dist/index.d.ts CHANGED
@@ -23,7 +23,7 @@ export { useEntityForm, useEntityField, useController, isFieldEditable, getField
23
23
  export type { ViewerRole, RenderableField, GetFieldsForOperationOptions, EntityFieldsInput, SchemaOperation, ValidationIssue, ValidationResult, InferEntityData, InferEntityInput, InferEntityOutput, UseEntityFormOptions, EntityFormReturn, EntityFieldReturn, UseControllerProps, UseControllerReturn, ControllerRenderProps, ControllerFieldState, } from './forms';
24
24
  export { UploadProvider, useUploadContext } from './contexts';
25
25
  export type { UploadProviderProps } from './contexts';
26
- export { useFileUpload, useUnsavedChangesWarning, useConfirmNavigation, useEntityFavorites, useRelatedItems, } from './hooks';
27
- export type { FileMetadata, UseFileUploadOptions, UseEntityFavoritesOptions, UseEntityFavoritesReturn, UseRelatedItemsOptions, UseRelatedItemsReturn, } from './hooks';
26
+ export { useFileUpload, useUnsavedChangesWarning, useConfirmNavigation, useEntityFavorites, useRelatedItems, useCrudFilters, } from './hooks';
27
+ export type { FileMetadata, UseFileUploadOptions, UseEntityFavoritesOptions, UseEntityFavoritesReturn, UseRelatedItemsOptions, UseRelatedItemsReturn, UseCrudFiltersOptions, UseCrudFiltersReturn, } from './hooks';
28
28
  export { isStorageUrl, validatePicture, checkForBlobUrls, hasBlobUrls, } from './utils/uploadValidation';
29
29
  //# sourceMappingURL=index.d.ts.map
@@ -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,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"}
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,EACf,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,GACrB,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 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};
1
+ export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{getCrudService as a}from"./CrudService";import{useCrudStore as d}from"./CrudStore";import{loadDeterministicRange as m,upsertDeterministic as F,appendToCollection as u}from"./utils/collections";import{getFieldRegistry as f,registerFieldType as x,isFieldTypeRegistered as y}from"./FieldRegistry";import{registerBuiltinFieldType as c,getFieldTypeMetadata as C,getFilterType as v,getDisplayFormatter as U,isFilterable as b,getValueType as E,clearFieldTypeRegistry as R}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as h}from"./builtinFieldTypes";import{useEntityForm as S,useEntityField as L,useController as P,isFieldEditable as k,getFieldsForOperation as I,validateEntity as M,translateFieldLabel as N,translateLabel as O}from"./forms";import{UploadProvider as W,useUploadContext as j}from"./contexts";import{useFileUpload as w,useUnsavedChangesWarning as z,useConfirmNavigation as A,useEntityFavorites as G,useRelatedItems as H,useCrudFilters as J}from"./hooks";import{isStorageUrl as Q,validatePicture as X,checkForBlobUrls as Y,hasBlobUrls as Z}from"./utils/uploadValidation";export{W as UploadProvider,u as appendToCollection,Y as checkForBlobUrls,R as clearFieldTypeRegistry,a as getCrudService,U as getDisplayFormatter,f as getFieldRegistry,C as getFieldTypeMetadata,I as getFieldsForOperation,v as getFilterType,E as getValueType,Z as hasBlobUrls,k as isFieldEditable,y as isFieldTypeRegistered,b as isFilterable,Q as isStorageUrl,m as loadDeterministicRange,c as registerBuiltinFieldType,h as registerBuiltinFieldTypes,x as registerFieldType,N as translateFieldLabel,O as translateLabel,F as upsertDeterministic,A as useConfirmNavigation,P as useController,J as useCrudFilters,d as useCrudStore,G as useEntityFavorites,L as useEntityField,S as useEntityForm,w as useFileUpload,H as useRelatedItems,z as useUnsavedChangesWarning,j as useUploadContext,M as validateEntity,X as validatePicture};
@@ -1 +1 @@
1
- {"version":3,"file":"registerBuiltinFieldTypes.d.ts","sourceRoot":"","sources":["../src/registerBuiltinFieldTypes.tsx"],"names":[],"mappings":"AAk1BA;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CA6sBnD"}
1
+ {"version":3,"file":"registerBuiltinFieldTypes.d.ts","sourceRoot":"","sources":["../src/registerBuiltinFieldTypes.tsx"],"names":[],"mappings":"AAu2BA;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CA+sBnD"}
@@ -1 +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
+ "use client";import{createDoNotDevStore as i}from"@donotdev/core";const m={status:"idle",error:null,uploadProgress:0,isDirty:!1},u=i({name:"form-store",createStore:(o,e)=>({forms:{},startSubmit:r=>{o(s=>{const t=s.forms[r]||m;return{forms:{...s.forms,[r]:{...t,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(r,s)=>{o(t=>{const n=t.forms[r]||m;return{forms:{...t.forms,[r]:{...n,status:"uploading",uploadProgress:Math.min(100,Math.max(0,s))}}}})},setValidating:r=>{o(s=>{const t=s.forms[r]||m;return{forms:{...s.forms,[r]:{...t,status:"validating",uploadProgress:100}}}})},setSubmitting:r=>{o(s=>{const t=s.forms[r]||m;return{forms:{...s.forms,[r]:{...t,status:"submitting"}}}})},setSuccess:r=>{o(s=>{const t=s.forms[r]||m;return{forms:{...s.forms,[r]:{...t,status:"success",error:null}}}}),setTimeout(()=>{e().reset(r)},1500)},setError:(r,s)=>{o(t=>{const n=t.forms[r]||m;return{forms:{...t.forms,[r]:{...n,status:"error",error:s}}}})},reset:r=>{o(s=>({forms:{...s.forms,[r]:{...m}}}))},setIsDirty:(r,s)=>{o(t=>{const n=t.forms[r]||m;return{forms:{...t.forms,[r]:{...n,isDirty:s}}}})},hasDirtyForms:()=>{const r=e().forms;return Object.values(r).some(s=>s.isDirty)},getDirtyFormIds:()=>{const r=e().forms;return Object.entries(r).filter(([s,t])=>t.isDirty).map(([s])=>s)},cleanup:r=>{o(s=>{const{[r]:t,...n}=s.forms;return{forms:n}})},getStatus:r=>e().forms[r]?.status??"idle",isLoading:r=>{const s=e().forms[r]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"},getUploadProgress:r=>e().forms[r]?.uploadProgress??0,getError:r=>e().forms[r]?.error??null,getIsDirty:r=>e().forms[r]?.isDirty??!1})}),f=o=>u(e=>e.forms[o]?.status??"idle"),l=o=>u(e=>{const r=e.forms[o]?.status??"idle";return r==="uploading"||r==="validating"||r==="submitting"}),c=o=>u(e=>e.forms[o]?.uploadProgress??0),p=o=>u(e=>e.forms[o]?.error??null),g=o=>u(e=>e.forms[o]?.isDirty??!1),d=()=>u(o=>o.hasDirtyForms());export{p as useFormError,g as useFormIsDirty,l as useFormLoading,f as useFormStatus,u as useFormStore,d as useHasDirtyForms,c as useUploadProgress};
@@ -1 +1 @@
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};
1
+ "use client";import{createDoNotDevStore as U}from"@donotdev/core";const i={status:"idle",progress:0,error:null},d=U({name:"upload-store",createStore:(u,r)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(s,n,t,o)=>{u(e=>({uploadFunctions:{...e.uploadFunctions,[s]:{...e.uploadFunctions[s]||{},[n]:t}},checkPendingFunctions:{...e.checkPendingFunctions,[s]:{...e.checkPendingFunctions[s]||{},[n]:o||(()=>!1)}}}))},unregisterUpload:(s,n)=>{u(t=>{const o=t.uploadFunctions[s],e=t.checkPendingFunctions[s];if(!o)return t;const{[n]:a,...c}=o,{[n]:g,...l}=e||{},{[n]:h,...F}=t.retryAttempts[s]||{};return{uploadFunctions:{...t.uploadFunctions,[s]:c},checkPendingFunctions:{...t.checkPendingFunctions,[s]:l},retryAttempts:{...t.retryAttempts,[s]:F}}})},startUpload:(s,n)=>{u(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[n]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(s,n,t)=>{u(o=>{const e=o.uploads[s]?.[n]||i;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[n]:{...e,progress:Math.min(100,Math.max(0,t))}}}}})},completeUpload:(s,n)=>{u(t=>{const o=t.uploads[s]?.[n]||i;return{uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[n]:{...o,status:"complete",progress:100}}}}})},failUpload:(s,n,t)=>{u(o=>{const e=o.uploads[s]?.[n]||i;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[n]:{...e,status:"error",error:t}}}}})},resetUpload:(s,n)=>{u(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[n]:{...i}}}}))},resetForm:s=>{u(n=>({uploads:{...n.uploads,[s]:{}}}))},cleanup:s=>{u(n=>{const{[s]:t,...o}=n.uploads,{[s]:e,...a}=n.uploadFunctions;return{uploads:o,uploadFunctions:a}})},uploadAll:async s=>{const t=r().uploadFunctions[s];if(!t)return;const o=Object.entries(t);if(o.length===0)return;const e=async(a,c,g=1)=>{r().startUpload(s,a);try{await c(l=>{r().setProgress(s,a,l)}),r().completeUpload(s,a),u(l=>({retryAttempts:{...l.retryAttempts,[s]:{...l.retryAttempts[s]||{},[a]:0}}}))}catch(l){const h=l instanceof Error?l.message:"Upload failed",F=r().maxRetries,y=r().retryAttempts[s]?.[a]||0;if(y<F){u(p=>({retryAttempts:{...p.retryAttempts,[s]:{...p.retryAttempts[s]||{},[a]:y+1}}}));const P=r().retryDelay*Math.pow(2,g-1);return await new Promise(p=>setTimeout(p,P)),e(a,c,g+1)}else throw r().failUpload(s,a,h),l}};await Promise.all(o.map(async([a,c])=>{await e(a,c)}))},hasPendingUploads:s=>{const n=r(),t=n.uploadFunctions[s],o=n.checkPendingFunctions[s];return t?Object.entries(t).some(([e,a])=>{const c=o?.[e];return c?c():!0}):!1},getStatus:(s,n)=>r().uploads[s]?.[n]?.status??"idle",getProgress:(s,n)=>r().uploads[s]?.[n]?.progress??0,getTotalProgress:s=>{const n=r().uploads[s];if(!n)return 100;const t=Object.values(n);if(t.length===0)return 100;const o=t.reduce((e,a)=>e+a.progress,0);return Math.round(o/t.length)},isUploading:s=>{const n=r().uploads[s];return n?Object.values(n).some(t=>t.status==="uploading"):!1},getError:(s,n)=>r().uploads[s]?.[n]?.error??null})}),k=u=>d(r=>{const s=r.uploads[u];if(!s)return 100;const n=Object.values(s);if(n.length===0)return 100;const t=n.reduce((o,e)=>o+e.progress,0);return Math.round(t/n.length)}),x=u=>d(r=>{const s=r.uploads[u];return s?Object.values(s).some(n=>n.status==="uploading"):!1}),_=(u,r)=>d(s=>s.uploads[u]?.[r]?.progress??0),w=(u,r)=>d(s=>s.uploads[u]?.[r]?.status??"idle");export{_ as useFieldProgress,w as useFieldUploadStatus,x as useIsUploading,k as useTotalProgress,d as useUploadStore};
@@ -1 +1 @@
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};
1
+ import{useFormStore as o,useFormStatus as e,useFormLoading as u,useUploadProgress as t,useFormError as a,useFormIsDirty as m,useHasDirtyForms as F}from"./FormStore";import{useUploadStore as l,useTotalProgress as i,useIsUploading as p,useFieldProgress as g,useFieldUploadStatus as S}from"./UploadStore";export{g as useFieldProgress,S as useFieldUploadStatus,a as useFormError,m as useFormIsDirty,u as useFormLoading,e as useFormStatus,o as useFormStore,F as useHasDirtyForms,p as useIsUploading,i as useTotalProgress,t as useUploadProgress,l as useUploadStore};