@donotdev/crud 0.0.31 → 0.1.0

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 (248) hide show
  1. package/LICENSE.md +3 -3
  2. package/dist/CrudService.d.ts +4 -4
  3. package/dist/CrudService.js +2 -2
  4. package/dist/CrudStore.d.ts +1 -1
  5. package/dist/CrudStore.js +1 -1
  6. package/dist/FieldRegistry.d.ts +1 -1
  7. package/dist/FieldRegistry.d.ts.map +1 -1
  8. package/dist/FieldRegistry.js +1 -1
  9. package/dist/adapters/FunctionsAdapter.d.ts +3 -3
  10. package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
  11. package/dist/adapters/FunctionsAdapter.js +1 -1
  12. package/dist/adapters/index.d.ts +1 -1
  13. package/dist/builtinFieldTypes.d.ts +1 -1
  14. package/dist/components/CrudButton.js +1 -1
  15. package/dist/components/DateFilter.js +1 -1
  16. package/dist/components/DisplayFieldRenderer.d.ts +1 -1
  17. package/dist/components/DisplayFieldRenderer.js +1 -1
  18. package/dist/components/DisplayThumbnail.d.ts +1 -1
  19. package/dist/components/DisplayThumbnail.js +1 -1
  20. package/dist/components/EntityFilters.js +1 -1
  21. package/dist/components/FormFieldRenderer.js +1 -1
  22. package/dist/components/FormLayout.d.ts +1 -1
  23. package/dist/components/FormLayout.js +1 -1
  24. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  25. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  26. package/dist/components/controlled/complex/ControlledFieldArrayField.js +1 -1
  27. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  28. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  29. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  30. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  31. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  32. package/dist/components/controlled/complex/index.js +1 -1
  33. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  34. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  35. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  36. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  37. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  38. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  39. package/dist/components/controlled/file/index.js +1 -1
  40. package/dist/components/controlled/index.js +1 -1
  41. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  42. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
  43. package/dist/components/controlled/input/ControlledDurationField.js +1 -1
  44. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  45. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  46. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  47. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  48. package/dist/components/controlled/input/ControlledPriceField.js +1 -1
  49. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  50. package/dist/components/controlled/input/ControlledRatingField.js +1 -1
  51. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  52. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  53. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  54. package/dist/components/controlled/input/index.js +1 -1
  55. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  56. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  57. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  58. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  59. package/dist/components/controlled/select/ControlledReferenceField.js +1 -1
  60. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  61. package/dist/components/controlled/select/index.js +1 -1
  62. package/dist/components/controlled/types.js +1 -1
  63. package/dist/components/fields/display/AvatarFieldDisplay.d.ts +1 -1
  64. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
  65. package/dist/components/fields/display/BadgeFieldDisplay.d.ts +1 -1
  66. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
  67. package/dist/components/fields/display/ButtonFieldDisplay.d.ts +2 -2
  68. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -1
  69. package/dist/components/fields/display/CheckboxFieldDisplay.d.ts +1 -1
  70. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
  71. package/dist/components/fields/display/DateFieldDisplay.d.ts +1 -1
  72. package/dist/components/fields/display/DateFieldDisplay.js +1 -1
  73. package/dist/components/fields/display/DropdownDisplay.d.ts +1 -1
  74. package/dist/components/fields/display/DropdownDisplay.js +1 -1
  75. package/dist/components/fields/display/FileFieldDisplay.d.ts +1 -1
  76. package/dist/components/fields/display/FileFieldDisplay.js +1 -1
  77. package/dist/components/fields/display/GeoPointFieldDisplay.d.ts +1 -1
  78. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -1
  79. package/dist/components/fields/display/HiddenFieldDisplay.d.ts +2 -2
  80. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -1
  81. package/dist/components/fields/display/ImageFieldDisplay.d.ts +1 -1
  82. package/dist/components/fields/display/ImageFieldDisplay.js +1 -1
  83. package/dist/components/fields/display/LinkFieldDisplay.d.ts +1 -1
  84. package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
  85. package/dist/components/fields/display/MapFieldDisplay.d.ts +1 -1
  86. package/dist/components/fields/display/MapFieldDisplay.js +1 -1
  87. package/dist/components/fields/display/MultiDropdownDisplay.d.ts +1 -1
  88. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -1
  89. package/dist/components/fields/display/MultiInputTextFieldDisplay.d.ts +1 -1
  90. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -1
  91. package/dist/components/fields/display/NumberFieldDisplay.d.ts +1 -1
  92. package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
  93. package/dist/components/fields/display/PasswordFieldDisplay.d.ts +1 -1
  94. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
  95. package/dist/components/fields/display/PhoneNumberDisplay.d.ts +1 -1
  96. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -1
  97. package/dist/components/fields/display/RadioFieldDisplay.d.ts +1 -1
  98. package/dist/components/fields/display/RadioFieldDisplay.js +1 -1
  99. package/dist/components/fields/display/RangeFieldDisplay.d.ts +1 -1
  100. package/dist/components/fields/display/RangeFieldDisplay.js +1 -1
  101. package/dist/components/fields/display/ReferenceFieldDisplay.d.ts +1 -1
  102. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
  103. package/dist/components/fields/display/RichTextDisplay.d.ts +1 -1
  104. package/dist/components/fields/display/RichTextDisplay.js +2 -2
  105. package/dist/components/fields/display/TextAreaDisplay.d.ts +1 -1
  106. package/dist/components/fields/display/TextAreaDisplay.js +1 -1
  107. package/dist/components/fields/display/TextFieldDisplay.d.ts +1 -1
  108. package/dist/components/fields/display/TextFieldDisplay.js +1 -1
  109. package/dist/components/fields/display/TimestampFieldDisplay.d.ts +1 -1
  110. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
  111. package/dist/components/fields/display/index.d.ts +1 -1
  112. package/dist/components/fields/display/index.js +1 -1
  113. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  114. package/dist/components/form/fields/AvatarFieldComponent.d.ts +2 -2
  115. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  116. package/dist/components/form/fields/BadgeFieldComponent.d.ts +2 -2
  117. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  118. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  119. package/dist/components/form/fields/CheckboxFieldComponent.d.ts +1 -1
  120. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  121. package/dist/components/form/fields/ComboboxComponent.d.ts +1 -1
  122. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  123. package/dist/components/form/fields/CurrencyFieldComponent.d.ts +1 -1
  124. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  125. package/dist/components/form/fields/DateFieldComponent.d.ts +1 -1
  126. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  127. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  128. package/dist/components/form/fields/DropdownComponent.d.ts +1 -1
  129. package/dist/components/form/fields/DropdownComponent.js +1 -1
  130. package/dist/components/form/fields/DurationFieldComponent.js +1 -1
  131. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  132. package/dist/components/form/fields/GdprConsentFieldComponent.d.ts +1 -1
  133. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  134. package/dist/components/form/fields/GeoPointFieldComponent.d.ts +1 -1
  135. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  136. package/dist/components/form/fields/HiddenFieldComponent.d.ts +1 -1
  137. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  138. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  139. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  140. package/dist/components/form/fields/MultiDropdownComponent.d.ts +1 -1
  141. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  142. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  143. package/dist/components/form/fields/NumberFieldComponent.d.ts +1 -1
  144. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  145. package/dist/components/form/fields/PasswordFieldComponent.d.ts +1 -1
  146. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  147. package/dist/components/form/fields/PhoneNumberComponent.d.ts +1 -1
  148. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  149. package/dist/components/form/fields/PriceFieldComponent.js +1 -1
  150. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  151. package/dist/components/form/fields/RangeFieldComponent.d.ts +1 -1
  152. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  153. package/dist/components/form/fields/RatingFieldComponent.d.ts +1 -1
  154. package/dist/components/form/fields/RatingFieldComponent.js +1 -1
  155. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  156. package/dist/components/form/fields/RichTextComponent.d.ts +1 -1
  157. package/dist/components/form/fields/RichTextComponent.js +1 -1
  158. package/dist/components/form/fields/SwitchFieldComponent.d.ts +1 -1
  159. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  160. package/dist/components/form/fields/TextAreaComponent.d.ts +1 -1
  161. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  162. package/dist/components/form/fields/TextFieldComponent.d.ts +2 -2
  163. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  164. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  165. package/dist/components/form/fields/index.d.ts +1 -1
  166. package/dist/components/form/fields/index.js +1 -1
  167. package/dist/components/form/fields/internal/TiptapEditor.d.ts +1 -1
  168. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  169. package/dist/components/form/fields/types.d.ts +1 -1
  170. package/dist/components/form/index.d.ts +1 -1
  171. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  172. package/dist/components/index.d.ts +1 -1
  173. package/dist/components/index.js +1 -1
  174. package/dist/contexts/UploadContext.js +1 -1
  175. package/dist/contexts/index.js +1 -1
  176. package/dist/fieldTypeRegistry.d.ts.map +1 -1
  177. package/dist/fieldTypeRegistry.js +1 -1
  178. package/dist/fieldTypeRegistry.store.js +1 -1
  179. package/dist/fieldTypeRegistry.types.d.ts.map +1 -1
  180. package/dist/forms/hooks/index.d.ts +1 -1
  181. package/dist/forms/hooks/index.js +1 -1
  182. package/dist/forms/hooks/useController.js +1 -1
  183. package/dist/forms/hooks/useEntityField.d.ts +1 -1
  184. package/dist/forms/hooks/useEntityField.js +1 -1
  185. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  186. package/dist/forms/hooks/useEntityForm.js +1 -1
  187. package/dist/forms/index.d.ts +1 -1
  188. package/dist/forms/index.js +1 -1
  189. package/dist/forms/types.d.ts +7 -7
  190. package/dist/forms/utils/buildInitialValues.js +1 -1
  191. package/dist/forms/utils/getFieldsForOperation.d.ts +2 -2
  192. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  193. package/dist/forms/utils/index.d.ts +1 -1
  194. package/dist/forms/utils/index.js +1 -1
  195. package/dist/forms/utils/isFieldEditable.d.ts +1 -1
  196. package/dist/forms/utils/isFieldEditable.js +1 -1
  197. package/dist/forms/utils/translateFieldLabel.d.ts +3 -3
  198. package/dist/forms/utils/translateFieldLabel.js +1 -1
  199. package/dist/forms/utils/validateEntity.d.ts +1 -1
  200. package/dist/forms/utils/validateEntity.js +1 -1
  201. package/dist/hooks/index.js +1 -1
  202. package/dist/hooks/useCrudFilters.js +1 -1
  203. package/dist/hooks/useEntityFavorites.js +1 -1
  204. package/dist/hooks/useFieldConditions.js +1 -1
  205. package/dist/hooks/useFileUpload.js +1 -1
  206. package/dist/hooks/useReferenceResolver.js +1 -1
  207. package/dist/hooks/useRelatedItems.js +1 -1
  208. package/dist/hooks/useUnsavedChangesWarning.js +1 -1
  209. package/dist/index.d.ts +1 -1
  210. package/dist/index.js +1 -1
  211. package/dist/registerBuiltinFieldTypes.js +1 -1
  212. package/dist/stores/FormStore.js +1 -1
  213. package/dist/stores/UploadStore.js +1 -1
  214. package/dist/stores/index.d.ts +1 -1
  215. package/dist/stores/index.js +1 -1
  216. package/dist/tsconfig.tsbuildinfo +1 -1
  217. package/dist/types.d.ts +4 -4
  218. package/dist/types.js +1 -1
  219. package/dist/useBaseCrudList.js +1 -1
  220. package/dist/useCrud.js +1 -1
  221. package/dist/useCrudCardList.js +1 -1
  222. package/dist/useCrudList.js +1 -1
  223. package/dist/utils/clientListProcessing.d.ts +1 -1
  224. package/dist/utils/clientListProcessing.js +1 -1
  225. package/dist/utils/collections.d.ts +6 -6
  226. package/dist/utils/collections.js +1 -1
  227. package/dist/utils/fileStorage.js +1 -1
  228. package/dist/utils/imageProcessing.d.ts +1 -1
  229. package/dist/utils/imageProcessing.js +1 -1
  230. package/dist/utils/imageStorage.js +1 -1
  231. package/dist/utils/imageUtils.d.ts +1 -1
  232. package/dist/utils/imageUtils.js +1 -1
  233. package/dist/utils/matchesFilter.d.ts.map +1 -1
  234. package/dist/utils/matchesFilter.js +1 -1
  235. package/dist/utils/mergeWithOptimistic.js +1 -1
  236. package/dist/utils/sanitizeHtml.d.ts +0 -5
  237. package/dist/utils/sanitizeHtml.d.ts.map +1 -1
  238. package/dist/utils/sanitizeHtml.js +1 -1
  239. package/dist/utils/scopeUtils.js +1 -1
  240. package/dist/utils/uploadValidation.d.ts +1 -1
  241. package/dist/utils/uploadValidation.js +1 -1
  242. package/dist/workflows/WorkflowPersistence.d.ts +1 -1
  243. package/dist/workflows/WorkflowPersistence.js +1 -1
  244. package/dist/workflows/defineWorkflow.d.ts +1 -1
  245. package/dist/workflows/index.d.ts +1 -1
  246. package/dist/workflows/index.js +1 -1
  247. package/dist/workflows/useEntityWorkflow.js +1 -1
  248. package/package.json +3 -3
@@ -2,7 +2,7 @@
2
2
  * @fileoverview Form hooks barrel export
3
3
  * @description Exports all form hooks for custom form building.
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
@@ -1 +1 @@
1
- import{useEntityForm as t}from"./useEntityForm";import{useEntityField as o}from"./useEntityField";import{useController as r}from"./useController";export{r as useController,o as useEntityField,t as useEntityForm};
1
+ import{useEntityForm as e}from"./useEntityForm";import{useEntityField as m}from"./useEntityField";import{useController as i}from"./useController";export{i as useController,m as useEntityField,e as useEntityForm};
@@ -1 +1 @@
1
- "use client";import{useController as o}from"react-hook-form";function e(r){return o(r)}export{e as useController};
1
+ "use client";import{useController as e}from"react-hook-form";function t(r){return e(r)}export{t as useController};
@@ -50,7 +50,7 @@ import type { EntityFormReturn, InferEntityData, EntityFieldReturn } from '../ty
50
50
  * @see {@link useEntityForm} for creating the form instance
51
51
  * @see {@link EntityFieldReturn} for return type
52
52
  *
53
- * @version 0.0.2
53
+ * @version 0.1.0
54
54
  * @since 0.0.1
55
55
  * @author AMBROISE PARK Consulting
56
56
  */
@@ -1 +1 @@
1
- "use client";import{useMemo as o,useCallback as p}from"react";import{useController as v}from"./useController";import{formatValue as h}from"../../components/DisplayFieldRenderer";import{isFieldEditable as g}from"../utils";function D(s,e){const{entity:b,operation:r,viewerRole:d,fields:u}=s,l=b.fields[e],i=o(()=>l?{...l,name:l.name||e,label:l.label||e}:{name:e,type:"text",label:e,visibility:"user"},[e,l]),a=o(()=>u.some(n=>n.name===e),[u,e]),c=o(()=>!a||r==="edit"&&i.visibility==="technical"&&i.editable===void 0?!1:g(i.editable,d,r),[a,r,i.visibility,i.editable,d]),{field:m,fieldState:t}=v({name:e,control:s.control}),f=o(()=>({error:t.error?.message,touched:t.isTouched,isDirty:t.isDirty}),[t.error?.message,t.isTouched,t.isDirty]),y=p(n=>h(m.value,i,s.t,n),[m.value,i,s.t]);return{field:m,meta:f,config:i,isEditable:c,isVisible:a,display:y}}export{D as useEntityField};
1
+ "use client";import{useMemo as o,useCallback as p}from"react";import{useController as v}from"./useController";import{formatValue as h}from"../../components/DisplayFieldRenderer";import{isFieldEditable as D}from"../utils";function F(s,e){const{entity:d,operation:n,viewerRole:c,fields:b}=s,r=d.fields[e],t=o(()=>r?{...r,name:r.name||e,label:r.label||e}:{name:e,type:"text",label:e,visibility:"user"},[e,r]),l=o(()=>b.some(u=>u.name===e),[b,e]),y=o(()=>!l||n==="edit"&&t.visibility==="technical"&&t.editable===void 0?!1:D(t.editable,c,n),[l,n,t.visibility,t.editable,c]),{field:a,fieldState:i}=v({name:e,control:s.control}),f=o(()=>({error:i.error?.message,touched:i.isTouched,isDirty:i.isDirty}),[i.error?.message,i.isTouched,i.isDirty]),m=p(u=>h(a.value,t,s.t,u),[a.value,t,s.t]);return{field:a,meta:f,config:t,isEditable:y,isVisible:l,display:m}}export{F as useEntityField};
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAW7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AA2ClB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAmerB"}
1
+ {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAW7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AA2ClB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAoerB"}
@@ -1 +1 @@
1
- "use client";import{valibotResolver as _}from"@hookform/resolvers/valibot";import{useMemo as d,useEffect as T,useRef as v,useCallback as w,createElement as re}from"react";import{useForm as ae}from"react-hook-form";import{toast as se,ToastAction as oe}from"@donotdev/components";import{useLocalStorage as ne,BACKEND_GENERATED_FIELD_NAMES as ue,createSchemas as ie}from"@donotdev/core";import{useFormStore as j,useFormStatus as ce,useUploadProgress as le}from"../../stores";import{useUploadStore as M}from"../../stores/UploadStore";import{checkForBlobUrls as q}from"../../utils/uploadValidation";import{getFieldsForOperation as de}from"../utils";import{buildInitialFromRecord as fe,buildSchemaDefaults as me}from"../utils/buildInitialValues";const pe=n=>n;function z(n,E){const e={...n};for(const p of Object.keys(E)){const c=n[p],f=E[p];f!==null&&typeof f=="object"&&!Array.isArray(f)&&c!==null&&typeof c=="object"&&!Array.isArray(c)?e[p]=z(c,f):e[p]=f}return e}function Se(n,E={}){const{formId:e,operation:p,defaultValues:c,viewerRole:f,mode:G="onBlur",t:K}=E,S=K??pe,U=f??"guest",u=p??(c?"edit":"create"),Y=ce(e??""),H=le(e??""),F=d(()=>ie(n),[n.name]),I=d(()=>_(F.create),[F.create]),P=d(()=>_(F.draft),[F.draft]),J=d(()=>async(t,r,a)=>((t?.status??c?.status)==="draft"?P:I)(t,r,a),[I,P,c?.status]),V=d(()=>me(n),[n]),$=c,i=d(()=>{if(u==="create")return V;if($)return fe(n,$)},[u,V,n,$]),o=ae({defaultValues:u==="create"?i:void 0,mode:G,resolver:J,shouldUnregister:!1,shouldFocusError:!0}),D=v(o);T(()=>{D.current=o},[o]);const A=v(null);T(()=>{if(u==="edit"&&i){const t=i.id??null;t&&t!==A.current?(D.current.reset(i),A.current=t):!t&&A.current===null&&(D.current.reset(i),A.current="initialized")}},[u,i]);const k=c?.id,Q=d(()=>{const t=`${n.name.toLowerCase()}-form-draft`;return u==="create"?t:k?`${t}-${k}`:`${t}-edit`},[n.name,u,k]),{value:g,setValue:C,removeValue:b}=ne(Q,{defaultValue:null,syncAcrossTabs:!0}),y=v(!1);T(()=>{if(y.current)return;const t=r=>{const a=()=>{b(),r&&D.current.reset(r)};se({toastType:"info",title:S("draft.restored",{defaultValue:"Draft restored"}),description:S("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:re(oe,{altText:S("draft.discard",{defaultValue:"Discard"}),onClick:a},S("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(u==="create"&&!c){g&&(o.reset(g),t(V)),y.current=!0;return}if(u==="edit"&&i){if(g){const r=z(i,g);o.reset(r),t(i)}y.current=!0}},[u,c,g,o,i,b,S,V]);const O=v(!1),h=v(null);T(()=>{const t=o.watch(r=>{O.current||!y.current||(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{r&&Object.values(r).some(a=>a!=null&&a!=="")&&C(r)},3e3))});return()=>{t.unsubscribe(),h.current&&clearTimeout(h.current)}},[o,C]);const x=w(async()=>{if(!e)return!0;const t=M.getState(),r=j.getState();if(!t.hasPendingUploads(e))return!0;try{r.setUploading(e,0),await t.uploadAll(e),await new Promise(l=>setTimeout(l,50));let a=o.getValues(),s=q(a),m=0;const R=5;for(;s.length>0&&m<R;)m++,await new Promise(l=>setTimeout(l,100)),a=o.getValues(),s=q(a);if(s.length>0){const l=`Upload incomplete: files still pending at ${s.join(", ")}`;return r.setError(e,l),!1}return!0}catch(a){const s=a instanceof Error?a.message:"File upload failed";return j.getState().setError(e,s),!1}},[e,o]),B=w(t=>u!=="create"?t:Object.fromEntries(Object.entries(t).filter(([r])=>!ue.includes(r))),[u]),L=w(t=>{if(typeof window>"u")return;const r=Object.keys(t).find(s=>s!=="root"&&t[s]);if(!r)return;const a=document.querySelector(`input[name="${r}"][aria-invalid="true"], textarea[name="${r}"][aria-invalid="true"], select[name="${r}"][aria-invalid="true"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.focus())},[]),N=o.handleSubmit,W=d(()=>((t,r)=>async a=>{a?.preventDefault?.();const s=e?j.getState():null;await N(async(m,R)=>{O.current=!0;try{if(e&&s&&s.startSubmit(e),!await x()){e&&s&&s.setError(e,"Upload failed");return}e&&s&&s.setSubmitting(e);const l=B(m);await t(l,R),b(),e&&s&&s.setSuccess(e)}catch(l){throw e&&s&&s.setError(e,l instanceof Error?l.message:"Submission failed"),l}finally{O.current=!1}},m=>{L(m),r?.(m)})(a)}),[N,e,x,B,L,b]),X=w(()=>{b(),o.reset(i),y.current=!1},[b,o,i]),Z=w(()=>{e&&(j.getState().cleanup(e),M.getState().cleanup(e))},[e]),ee=d(()=>de(n,{operation:u,viewerRole:U,availableFields:void 0}),[n,u,U]),te=o.formState.isSubmitted||Object.keys(o.formState.touchedFields||{}).length>0;return{...o,handleSubmit:W,fields:ee,operation:u,entity:n,t:S,viewerRole:U,formId:e,formStatus:e?Y:"idle",uploadProgress:e?H:0,cleanup:Z,isDirty:o.formState.isDirty,hasUserInteracted:te,resetForm:X,originalValues:i}}export{Se as useEntityForm};
1
+ "use client";import{valibotResolver as _}from"@hookform/resolvers/valibot";import{useMemo as f,useEffect as A,useRef as w,useCallback as v,createElement as se}from"react";import{useForm as oe}from"react-hook-form";import{toast as ae,ToastAction as ne}from"@donotdev/components";import{useLocalStorage as ue,BACKEND_GENERATED_FIELD_NAMES as ce,createSchemas as ie}from"@donotdev/core";import{useFormStore as P,useFormStatus as le,useUploadProgress as fe}from"../../stores";import{useUploadStore as K}from"../../stores/UploadStore";import{checkForBlobUrls as N}from"../../utils/uploadValidation";import{getFieldsForOperation as de}from"../utils";import{buildInitialFromRecord as me,buildSchemaDefaults as pe}from"../utils/buildInitialValues";const Se=n=>n;function q(n,F){const e={...n};for(const p of Object.keys(F)){const i=n[p],m=F[p];m!==null&&typeof m=="object"&&!Array.isArray(m)&&i!==null&&typeof i=="object"&&!Array.isArray(i)?e[p]=q(i,m):e[p]=m}return e}function Re(n,F={}){const{formId:e,operation:p,defaultValues:i,viewerRole:m,mode:z="onBlur",t:G}=F,S=G??Se,U=m??"guest",u=p??(i?"edit":"create"),H=le(e??""),W=fe(e??""),E=f(()=>ie(n),[n.name]),O=f(()=>_(E.create),[E.create]),$=f(()=>_(E.draft),[E.draft]),Y=f(()=>async(t,s,a)=>((t?.status??i?.status)==="draft"?$:O)(t,s,a),[O,$,i?.status]),V=f(()=>pe(n),[n]),j=i,c=f(()=>{if(u==="create")return V;if(j)return me(n,j)},[u,V,n,j]),o=oe({defaultValues:u==="create"?c:void 0,mode:z,resolver:Y,shouldUnregister:!1,shouldFocusError:!0}),y=w(o);A(()=>{y.current=o},[o]);const R=w(null);A(()=>{if(u==="edit"&&c){const t=c.id??null;t&&t!==R.current?(y.current.reset(c),R.current=t):!t&&R.current===null&&(y.current.reset(c),R.current="initialized")}},[u,c]);const k=i?.id,J=f(()=>{const t=`${n.name.toLowerCase()}-form-draft`;return u==="create"?t:k?`${t}-${k}`:`${t}-edit`},[n.name,u,k]),{value:b,setValue:M,removeValue:h}=ue(J,{defaultValue:null,syncAcrossTabs:!0}),g=w(!1);A(()=>{if(g.current)return;const t=s=>{const a=()=>{h(),s&&y.current.reset(s)};ae({toastType:"info",title:S("draft.restored",{defaultValue:"Draft restored"}),description:S("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:se(ne,{altText:S("draft.discard",{defaultValue:"Discard"}),onClick:a},S("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(u==="create"&&!i){b&&(o.reset(b),t(V)),g.current=!0;return}if(u==="edit"&&c){if(b){const s=q(c,b);o.reset(s),t(c)}g.current=!0}},[u,i,b,o,c,h,S,V]);const I=w(!1),D=w(null);A(()=>{const t=o.watch(s=>{I.current||!g.current||(D.current&&clearTimeout(D.current),D.current=setTimeout(()=>{if(!s)return;Object.values(s).some(r=>r!=null&&r!=="")&&M(s)},3e3))});return()=>{t.unsubscribe(),D.current&&clearTimeout(D.current)}},[o,M]);const x=v(async()=>{if(!e)return!0;const t=K.getState(),s=P.getState();if(!t.hasPendingUploads(e))return!0;try{s.setUploading(e,0),await t.uploadAll(e),await new Promise(l=>setTimeout(l,50));let a=o.getValues(),r=N(a),d=0;const T=5;for(;r.length>0&&d<T;)d++,await new Promise(l=>setTimeout(l,100)),a=o.getValues(),r=N(a);if(r.length>0){const l=`Upload incomplete: files still pending at ${r.join(", ")}`;return s.setError(e,l),!1}return!0}catch(a){const r=a instanceof Error?a.message:"File upload failed";return P.getState().setError(e,r),!1}},[e,o]),B=v(t=>u!=="create"?t:Object.fromEntries(Object.entries(t).filter(([s])=>!ce.includes(s))),[u]),C=v(t=>{if(typeof window>"u")return;const s=Object.keys(t).find(r=>r!=="root"&&t[r]);if(!s)return;const a=document.querySelector(`input[name="${s}"][aria-invalid="true"], textarea[name="${s}"][aria-invalid="true"], select[name="${s}"][aria-invalid="true"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.focus())},[]),L=o.handleSubmit,Q=f(()=>((t,s)=>async a=>{a?.preventDefault?.();const r=e?P.getState():null;await L(async(d,T)=>{I.current=!0;try{if(e&&r&&r.startSubmit(e),!await x()){e&&r&&r.setError(e,"Upload failed");return}e&&r&&r.setSubmitting(e);const re=B(d);await t(re,T),h(),e&&r&&r.setSuccess(e)}catch(l){throw e&&r&&r.setError(e,l instanceof Error?l.message:"Submission failed"),l}finally{I.current=!1}},d=>{C(d),s?.(d)})(a)}),[L,e,x,B,C,h]),X=v(()=>{h(),o.reset(c),g.current=!1},[h,o,c]),Z=v(()=>{e&&(P.getState().cleanup(e),K.getState().cleanup(e))},[e]),ee=f(()=>de(n,{operation:u,viewerRole:U,availableFields:void 0}),[n,u,U]),te=o.formState.isSubmitted||Object.keys(o.formState.touchedFields||{}).length>0;return{...o,handleSubmit:Q,fields:ee,operation:u,entity:n,t:S,viewerRole:U,formId:e,formStatus:e?H:"idle",uploadProgress:e?W:0,cleanup:Z,isDirty:o.formState.isDirty,hasUserInteracted:te,resetForm:X,originalValues:c}}export{Re as useEntityForm};
@@ -25,7 +25,7 @@
25
25
  * }
26
26
  * ```
27
27
  *
28
- * @version 0.0.1
28
+ * @version 0.1.0
29
29
  * @since 0.0.1
30
30
  * @author AMBROISE PARK Consulting
31
31
  */
@@ -1 +1 @@
1
- import{useEntityForm as a}from"./hooks/useEntityForm";import{useEntityField as t}from"./hooks/useEntityField";import{useController as e}from"./hooks/useController";import{isFieldEditable as s,getFieldsForOperation as i,validateEntity as l,translateFieldLabel as r,translateLabel as o}from"./utils";export{i as getFieldsForOperation,s as isFieldEditable,r as translateFieldLabel,o as translateLabel,e as useController,t as useEntityField,a as useEntityForm,l as validateEntity};
1
+ import{useEntityForm as r}from"./hooks/useEntityForm";import{useEntityField as l}from"./hooks/useEntityField";import{useController as a}from"./hooks/useController";import{isFieldEditable as s,getFieldsForOperation as d,validateEntity as F,translateFieldLabel as m,translateLabel as p}from"./utils";export{d as getFieldsForOperation,s as isFieldEditable,m as translateFieldLabel,p as translateLabel,a as useController,l as useEntityField,r as useEntityForm,F as validateEntity};
@@ -2,7 +2,7 @@
2
2
  * @fileoverview Form type exports
3
3
  * @description Type utilities for type-safe form building with entity definitions.
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
@@ -36,7 +36,7 @@ export type { Entity, EntityField, FieldType, Visibility, Editable, ValidationRu
36
36
  * // { name: string; price: number; active: boolean; id: string; ... }
37
37
  * ```
38
38
  *
39
- * @version 0.0.1
39
+ * @version 0.1.0
40
40
  * @since 0.0.1
41
41
  * @author AMBROISE PARK Consulting
42
42
  */
@@ -51,7 +51,7 @@ export type InferEntityData<E extends Entity> = {
51
51
  *
52
52
  * @template E - Entity type from defineEntity()
53
53
  *
54
- * @version 0.0.1
54
+ * @version 0.1.0
55
55
  * @since 0.0.1
56
56
  * @author AMBROISE PARK Consulting
57
57
  */
@@ -62,7 +62,7 @@ export type InferEntityInput<E extends Entity> = Partial<InferEntityData<E>>;
62
62
  *
63
63
  * @template E - Entity type from defineEntity()
64
64
  *
65
- * @version 0.0.1
65
+ * @version 0.1.0
66
66
  * @since 0.0.1
67
67
  * @author AMBROISE PARK Consulting
68
68
  */
@@ -72,7 +72,7 @@ export type InferEntityOutput<E extends Entity> = InferEntityData<E>;
72
72
  *
73
73
  * @template E - Entity type from defineEntity()
74
74
  *
75
- * @version 0.0.1
75
+ * @version 0.1.0
76
76
  * @since 0.0.1
77
77
  * @author AMBROISE PARK Consulting
78
78
  */
@@ -120,7 +120,7 @@ export interface UseEntityFormOptions<E extends Entity> {
120
120
  *
121
121
  * @template E - Entity type from defineEntity()
122
122
  *
123
- * @version 0.0.1
123
+ * @version 0.1.0
124
124
  * @since 0.0.1
125
125
  * @author AMBROISE PARK Consulting
126
126
  */
@@ -195,7 +195,7 @@ export interface EntityFormReturn<E extends Entity> extends UseFormReturn<InferE
195
195
  * @template E - Entity type from defineEntity()
196
196
  * @template K - Field key from entity
197
197
  *
198
- * @version 0.0.1
198
+ * @version 0.1.0
199
199
  * @since 0.0.1
200
200
  * @author AMBROISE PARK Consulting
201
201
  */
@@ -1 +1 @@
1
- function l(n,c){if(c in n)return n[c];const i=c.replace(/_([a-z])/g,(o,e)=>e.toUpperCase());if(i!==c&&i in n)return n[i]}function s(n,c){if(c in n)return!0;const i=c.replace(/_([a-z])/g,(o,e)=>e.toUpperCase());return i!==c&&i in n}function p(n,c){const i=c??{},o={...i};return Object.entries(n.fields).forEach(([e,t])=>{const r=l(o,e);r!==void 0&&!(e in o)&&(o[e]=r);const a=!s(i,e)||r===null||r===void 0;if(t.type==="switch"){if(r==null){const u=t.options?.fieldSpecific;o[e]=u?.uncheckedValue??!1}}else a&&(t.type==="price"?o[e]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:t.type==="checkbox"||t.type==="boolean"?o[e]=!1:t.type==="text"||t.type==="textarea"||t.type==="email"||t.type==="url"||t.type==="tel"||t.type==="iban"||t.type==="password"||t.type==="color"?o[e]="":(t.type==="number"||t.type==="range"||t.type==="rating")&&(o[e]=void 0))}),o}function y(n){return p(n,{})}export{p as buildInitialFromRecord,y as buildSchemaDefaults};
1
+ function y(n,c){if(c in n)return n[c];const r=c.replace(/_([a-z])/g,(u,e)=>e.toUpperCase());if(r!==c&&r in n)return n[r]}function o(n,c){if(c in n)return!0;const r=c.replace(/_([a-z])/g,(u,e)=>e.toUpperCase());return r!==c&&r in n}function b(n,c){const r=c??{},u={...r};return Object.entries(n.fields).forEach(([e,t])=>{const s=y(u,e);s!==void 0&&!(e in u)&&(u[e]=s);const p=!o(r,e)||s===null||s===void 0;if(t.type==="switch"){if(s==null){const a=t.options?.fieldSpecific;u[e]=a?.uncheckedValue??!1}}else p&&(t.type==="price"?u[e]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:t.type==="checkbox"||t.type==="boolean"?u[e]=!1:t.type==="text"||t.type==="textarea"||t.type==="email"||t.type==="url"||t.type==="tel"||t.type==="iban"||t.type==="password"||t.type==="color"?u[e]="":(t.type==="number"||t.type==="range"||t.type==="rating")&&(u[e]=void 0))}),u}function h(n){return b(n,{})}export{b as buildInitialFromRecord,h as buildSchemaDefaults};
@@ -2,7 +2,7 @@
2
2
  * @fileoverview Field filtering utility
3
3
  * @description Filters entity fields based on operation type, visibility, and viewer role.
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
@@ -78,7 +78,7 @@ export interface GetFieldsForOperationOptions {
78
78
  * @see {@link Entity} for entity definition structure
79
79
  * @see {@link RenderableField} for return type
80
80
  *
81
- * @version 0.0.1
81
+ * @version 0.1.0
82
82
  * @since 0.0.1
83
83
  * @author AMBROISE PARK Consulting
84
84
  */
@@ -1 +1 @@
1
- import{isFieldVisible as u}from"@donotdev/core";import{isFieldEditable as m}from"./isFieldEditable";function g(e,r){const{operation:i,viewerRole:d,availableFields:l}=r,n=d??"guest",f=e&&typeof e=="object"&&"fields"in e&&"name"in e?e.fields:e,b=Object.entries(f),s=[];for(const[a,p]of b){const t=p,o=t.visibility||"guest";if(!u(o,n)||i==="create"&&o==="technical"||i==="edit"&&l&&!l.includes(a))continue;let c=m(t.editable,n,i);i==="edit"&&o==="technical"&&t.editable===void 0&&(c=!1),s.push({name:a,config:t,editable:c})}return s}export{g as getFieldsForOperation};
1
+ import{isFieldVisible as p}from"@donotdev/core";import{isFieldEditable as m}from"./isFieldEditable";function g(e,r){const{operation:i,viewerRole:d,availableFields:l}=r,n=d??"guest",a=e&&typeof e=="object"&&"fields"in e&&"name"in e?e.fields:e,u=Object.entries(a),s=[];for(const[c,b]of u){const o=b,t=o.visibility||"guest";if(!p(t,n)||i==="create"&&t==="technical"||i==="edit"&&l&&!l.includes(c))continue;let f=m(o.editable,n,i);i==="edit"&&t==="technical"&&o.editable===void 0&&(f=!1),s.push({name:c,config:o,editable:f})}return s}export{g as getFieldsForOperation};
@@ -2,7 +2,7 @@
2
2
  * @fileoverview Form utilities barrel export
3
3
  * @description Exports all form utility functions for custom form building.
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
@@ -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};
@@ -27,7 +27,7 @@ export type ViewerRole = 'public' | 'guest' | 'user' | 'admin' | 'super';
27
27
  *
28
28
  * @see {@link Editable} for editable configuration options
29
29
  *
30
- * @version 0.0.1
30
+ * @version 0.1.0
31
31
  * @since 0.0.1
32
32
  * @author AMBROISE PARK Consulting
33
33
  */
@@ -1 +1 @@
1
- import{hasRoleAccess as t,USER_ROLES as i}from"@donotdev/core";function r(a,o,s){return a===void 0||a===!0?!0:a===!1?!1:a==="admin"?t(o,i.ADMIN):a==="create-only"?s==="create":!0}export{r 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};
@@ -3,7 +3,7 @@
3
3
  * @description Centralized helper for translating field labels with namespace support.
4
4
  * Handles namespace:key syntax, config.label fallback, and fields.${fieldName} pattern.
5
5
  *
6
- * @version 0.0.1
6
+ * @version 0.1.0
7
7
  * @since 0.0.1
8
8
  * @author AMBROISE PARK Consulting
9
9
  */
@@ -30,7 +30,7 @@ import type { EntityField, FieldType } from '@donotdev/core';
30
30
  * translateLabel('make', t); // Translates "make" in current namespace (entity or crud)
31
31
  * ```
32
32
  *
33
- * @version 0.0.4
33
+ * @version 0.1.0
34
34
  * @since 0.0.1
35
35
  * @author AMBROISE PARK Consulting
36
36
  */
@@ -68,7 +68,7 @@ export declare function translateLabel(label: string, t: (key: string, options?:
68
68
  * // Returns: translated "status" from "common" namespace
69
69
  * ```
70
70
  *
71
- * @version 0.0.1
71
+ * @version 0.1.0
72
72
  * @since 0.0.1
73
73
  * @author AMBROISE PARK Consulting
74
74
  */
@@ -1 +1 @@
1
- function r(n,s){if(typeof n=="string"&&n.includes(":")){const a=n.split(":"),t=a[1]??n,i=a[0];if(t.startsWith("status.")){const l=s(t);return l!==t&&l!==`${i}:${t}`?l:s(t,{ns:i})}return s(t,{ns:i})}return s(n)}function e(n,s,a){const t=s?.label||n;return r(t,a)}export{e as translateFieldLabel,r as translateLabel};
1
+ function a(n,s){if(typeof n=="string"&&n.includes(":")){const r=n.split(":"),t=r[1]??n,e=r[0];if(t.startsWith("status.")){const i=s(t);return i!==t&&i!==`${e}:${t}`?i:s(t,{ns:e})}return s(t,{ns:e})}return s(n)}function o(n,s,r){const t=s?.label||n;return a(t,r)}export{o as translateFieldLabel,a as translateLabel};
@@ -72,7 +72,7 @@ export interface ValidationResult<T> {
72
72
  * @see {@link Entity} for entity definition structure
73
73
  * @see {@link ValidationResult} for return type
74
74
  *
75
- * @version 0.0.1
75
+ * @version 0.1.0
76
76
  * @since 0.0.1
77
77
  * @author AMBROISE PARK Consulting
78
78
  */
@@ -1 +1 @@
1
- import*as o from"valibot";import{createSchemas as p}from"@donotdev/core";function i(t,r,c="create"){const e=p(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(m=>m.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};
@@ -1 +1 @@
1
- import{useFileUpload as e}from"./useFileUpload";import{useUnsavedChangesWarning as s}from"./useUnsavedChangesWarning";import{useEntityFavorites as r}from"./useEntityFavorites";import{useCrudFilters as a}from"./useCrudFilters";import{useRelatedItems as o}from"./useRelatedItems";import{useFieldConditions as i}from"./useFieldConditions";import{useReferenceResolver as t}from"./useReferenceResolver";export{a as useCrudFilters,r as useEntityFavorites,i as useFieldConditions,e as useFileUpload,t as useReferenceResolver,o as useRelatedItems,s as useUnsavedChangesWarning};
1
+ import{useFileUpload as o}from"./useFileUpload";import{useUnsavedChangesWarning as t}from"./useUnsavedChangesWarning";import{useEntityFavorites as i}from"./useEntityFavorites";import{useCrudFilters as n}from"./useCrudFilters";import{useRelatedItems as u}from"./useRelatedItems";import{useFieldConditions as a}from"./useFieldConditions";import{useReferenceResolver as l}from"./useReferenceResolver";export{n as useCrudFilters,i as useEntityFavorites,a as useFieldConditions,o as useFileUpload,l as useReferenceResolver,u as useRelatedItems,t as useUnsavedChangesWarning};
@@ -1 +1 @@
1
- import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";const c={};function u(r){const{collection:e}=r,i=s(t=>t.collections[e]?.ui?.filters??c),l=o(t=>{s.getState().setFilters(e,t)},[e]),n=s(t=>t.collections[e]?.ui?.showFavoritesOnly??!1),a=o(t=>{s.getState().setShowFavoritesOnly(e,t)},[e]);return{filters:i,setFilters:l,showFavoritesOnly:n,setShowFavoritesOnly:a}}export{u as useCrudFilters};
1
+ import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";const a={};function f(r){const{collection:e}=r,l=s(t=>t.collections[e]?.ui?.filters??a),i=o(t=>{s.getState().setFilters(e,t)},[e]),n=s(t=>t.collections[e]?.ui?.showFavoritesOnly??!1),c=o(t=>{s.getState().setShowFavoritesOnly(e,t)},[e]);return{filters:l,setFilters:i,showFavoritesOnly:n,setShowFavoritesOnly:c}}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:i,setValue:a,isLoaded:c}=p(d,{defaultValue:[]}),n=o(e=>i.includes(e),[i]),v=o(e=>{a(t=>t.includes(e)?t.filter(r=>r!==e):[...t,e])},[a]),f=o(e=>{a(t=>t.includes(e)?t:[...t,e])},[a]),F=o(e=>{a(t=>t.filter(r=>r!==e))},[a]),m=o(()=>{a([])},[a]),g=o(e=>i.includes(e.id),[i]);return{favorites:i,isFavorite:n,toggleFavorite:v,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{useMemo as e}from"react";import{useWatch as c}from"react-hook-form";import{evaluateFieldConditions as f}from"@donotdev/core";function u(o,r){const t=c({control:r}),s=e(()=>o.some(n=>n.config.conditions),[o]);return e(()=>{if(!s)return{};const n={};for(const i of o)i.config.conditions&&(n[i.name]=f(i.config.conditions,t));return n},[o,t,s])}export{u as useFieldConditions};
1
+ "use client";import{useMemo as r}from"react";import{useWatch as c}from"react-hook-form";import{evaluateFieldConditions as u}from"@donotdev/core";function d(o,s){const t=c({control:s}),e=r(()=>o.some(n=>n.config.conditions),[o]);return r(()=>{if(!e)return{};const n={};for(const i of o)i.config.conditions&&(n[i.name]=u(i.config.conditions,t));return n},[o,t,e])}export{d as useFieldConditions};
@@ -1 +1 @@
1
- "use client";import{useState as T,useCallback as v,useEffect as A,useRef as g,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(),p=Math.random().toString(36).slice(2,11);return`file-${P}-${a}-${p}`}function H(s){return URL.createObjectURL(s)}function k(s){s.startsWith("blob:")&&URL.revokeObjectURL(s)}function K(s,a,p){return a.length>0&&!a.some(u=>{if(u.endsWith("/*")){const U=u.slice(0,-2);return s.type.startsWith(U)}return s.type===u})?{valid:!1,error:`File type ${s.type} not accepted`}:s.size>p?{valid:!1,error:`File exceeds ${(p/1048576).toFixed(0)}MB limit`}:{valid:!0}}function Q({name:s,value:a,onChange:p,multiple:u=!1,maxFiles:U=10,maxSize:E=10*1024*1024,accept:b=[],storagePath:V="uploads",uploadFn:y}){const h=G(),w=!!h,[d,c]=T([]),R=g(!1),$=g(null),x=g(a),L=g([]),F=g(!1),M=g(null);A(()=>{if(R.current){R.current=!1;return}const l=a?JSON.stringify((Array.isArray(a)?a:[a]).map(n=>n.fullUrl).filter(Boolean)):null;l!==$.current&&($.current=l,x.current=a,q(()=>{if(a){const n=(Array.isArray(a)?a:[a]).filter(t=>t.fullUrl).map((t,r)=>({id:`${W(t.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:t.thumbUrl||t.fullUrl,progress:100,uploaded:t,error:null}));c(n)}else c([])}))},[a]),A(()=>{L.current=d},[d]),A(()=>{F.current&&(F.current=!1,M.current?.(d,!0))},[d]),A(()=>()=>{L.current.forEach(l=>k(l.previewURL))},[]);const f=v((l,n=!1)=>{const t=(n?l.filter(i=>!i.error):l.filter(i=>i.uploaded&&!i.error)).map(i=>i.uploaded?i.uploaded:n&&w?{fullUrl:i.previewURL,thumbUrl:i.previewURL}:null).filter(i=>i!==null);let r;u?r=t.length>0?t:null:r=t[0]||null;const e=x.current;(()=>{if(!r&&!e)return!1;if(!r||!e)return!0;if(u&&Array.isArray(r)&&Array.isArray(e)){if(r.length!==e.length)return!0;const i=r.map(m=>m.fullUrl).join(","),o=e.map(m=>m.fullUrl).join(",");return i!==o}return!u&&!Array.isArray(r)&&!Array.isArray(e)?r.fullUrl!==e.fullUrl:!0})()&&(R.current=!0,x.current=r,p(r))},[u,p,w]);M.current=f;const S=v(async()=>{if(!y)return;let l=[];if(c(t=>(l=t.filter(r=>!r.uploaded&&!r.error),l.length===0?t:t.map(r=>l.some(e=>e.id===r.id)?{...r,progress:0}:r))),l.length===0)return;const n=await Promise.allSettled(l.map(async t=>{try{const r=await y(t.file,e=>{c(i=>i.map(o=>o.id===t.id?{...o,progress:e}:o))});return{id:t.id,picture:r,error:null}}catch(r){const e=r instanceof Error?r.message:"Upload failed";return{id:t.id,picture:null,error:e}}}));c(t=>{const r=t.map(e=>{const i=n.find(o=>o.status==="fulfilled"&&o.value.id===e.id);if(i&&i.status==="fulfilled"){const o=i.value;return{...e,uploaded:o.picture,progress:o.picture?100:null,error:o.error}}return e});return f(r,!1),r})},[y,f]),j=g(S);j.current=S,A(()=>{if(!(!h||!s))return N.getState().registerUpload(h,s,async()=>{await j.current()},()=>L.current.some(l=>!l.uploaded&&!l.error)),()=>{N.getState().unregisterUpload(h,s)}},[h,s]);const O=v(async l=>{if(y){c(n=>n.map(t=>t.id===l.id?{...t,progress:0}:t));try{const n=await y(l.file,t=>{c(r=>r.map(e=>e.id===l.id?{...e,progress:t}:e))});c(t=>{const r=t.map(e=>e.id===l.id?{...e,uploaded:n,progress:100,error:null}:e);return f(r,!1),r})}catch(n){const t=n instanceof Error?n.message:"Upload failed";c(r=>r.map(e=>e.id===l.id?{...e,error:t,progress:null}:e))}}},[y,f]),z=v(l=>{c(n=>{const t=(u?U:1)-n.length;if(t<=0)return C(new Error("Maximum files reached"),{userMessage:u?`Maximum ${U} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),n;const r=l.slice(0,t),e=[];for(const o of r){const m=K(o,b,E);if(!m.valid){C(new Error(m.error),{userMessage:m.error,severity:"warning",showNotification:!0});continue}e.push({id:W(),file:o,previewURL:H(o),progress:null,uploaded:null,error:null})}if(e.length===0)return n;const i=u?[...n,...e]:e;return w?F.current=!0:e.forEach(o=>O(o)),i})},[u,U,b,E,w,O,f]),B=v(l=>{c(n=>{const t=n.find(e=>e.id===l);t&&k(t.previewURL);const r=n.filter(e=>e.id!==l);return f(r,!1),r})},[f]),D=d.some(l=>!l.uploaded&&!l.error),I=d.some(l=>l.progress!==null&&l.progress<100),J=d.length>0?d.reduce((l,n)=>l+(n.progress??0),0)/d.length:0;return{files:d,addFiles:z,removeFile:B,hasPending:D,isUploading:I,progress:J,formId:h,isDeferred:w}}export{Q as useFileUpload};
1
+ "use client";import{useState as G,useCallback as A,useEffect as L,useRef as U,startTransition as H}from"react";import{handleError as k}from"@donotdev/core";import{useUploadContext as K}from"../contexts/UploadContext";import{useUploadStore as B}from"../stores/UploadStore";let D=0;function M(l){if(l){const a=l.split("/").pop()?.split("?")[0];if(a)return`file-${a}`}D+=1;const u=typeof performance<"u"?performance.now():Date.now(),g=Math.random().toString(36).slice(2,11);return`file-${D}-${u}-${g}`}function Q(l){return URL.createObjectURL(l)}function T(l){l.startsWith("blob:")&&URL.revokeObjectURL(l)}function X(l,u,g){return u.length>0&&!u.some(m=>{if(m.endsWith("/*")){const E=m.slice(0,-2);return l.type.startsWith(E)}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:a=!1,maxFiles:m=10,maxSize:E=10*1024*1024,accept:P=[],storagePath:Y="uploads",uploadFn:h}){const w=K(),y=!!w,[f,d]=G([]),v=U(!1),S=U(null),F=U(u),$=U([]),b=U(!1),C=U(null);L(()=>{if(v.current){v.current=!1;return}const t=u?JSON.stringify((Array.isArray(u)?u:[u]).map(s=>s.fullUrl).filter(Boolean)):null;t!==S.current&&(S.current=t,F.current=u,H(()=>{if(u){const n=(Array.isArray(u)?u:[u]).filter(e=>e.fullUrl).map((e,r)=>({id:`${M(e.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:e.thumbUrl||e.fullUrl,progress:100,uploaded:e,error:null}));d(n)}else d([])}))},[u]),L(()=>{$.current=f},[f]),L(()=>{b.current&&(b.current=!1,C.current?.(f,!0))},[f]),L(()=>()=>{$.current.forEach(t=>T(t.previewURL))},[]);const p=A((t,s=!1)=>{const e=(s?t.filter(o=>!o.error):t.filter(o=>o.uploaded&&!o.error)).map(o=>o.uploaded?o.uploaded:s&&y?{fullUrl:o.previewURL,thumbUrl:o.previewURL}:null).filter(o=>o!==null);let r;a?r=e.length>0?e:null:r=e[0]||null;const i=F.current;(()=>{if(!r&&!i)return!1;if(!r||!i)return!0;if(a&&Array.isArray(r)&&Array.isArray(i)){if(r.length!==i.length)return!0;const o=r.map(x=>x.fullUrl).join(","),R=i.map(x=>x.fullUrl).join(",");return o!==R}return!a&&!Array.isArray(r)&&!Array.isArray(i)?r.fullUrl!==i.fullUrl:!0})()&&(v.current=!0,F.current=r,g(r))},[a,g,y]);C.current=p;const I=A(async()=>{if(!h)return;let t=[];if(d(n=>(t=n.filter(e=>!e.uploaded&&!e.error),t.length===0?n:n.map(e=>t.some(r=>r.id===e.id)?{...e,progress:0}:e))),t.length===0)return;const s=await Promise.allSettled(t.map(async n=>{try{const e=await h(n.file,r=>{d(i=>i.map(c=>c.id===n.id?{...c,progress:r}:c))});return{id:n.id,picture:e,error:null}}catch(e){const r=e instanceof Error?e.message:"Upload failed";return{id:n.id,picture:null,error:r}}}));d(n=>{const e=n.map(r=>{const i=s.find(c=>c.status==="fulfilled"&&c.value.id===r.id);if(i&&i.status==="fulfilled"){const c=i.value;return{...r,uploaded:c.picture,progress:c.picture?100:null,error:c.error}}return r});return p(e,!1),e})},[h,p]),N=U(I);N.current=I,L(()=>{if(!(!w||!l))return B.getState().registerUpload(w,l,async()=>{await N.current()},()=>$.current.some(t=>!t.uploaded&&!t.error)),()=>{B.getState().unregisterUpload(w,l)}},[w,l]);const j=A(async t=>{if(h){d(s=>s.map(n=>n.id===t.id?{...n,progress:0}:n));try{const s=await h(t.file,n=>{d(e=>e.map(r=>r.id===t.id?{...r,progress:n}:r))});d(n=>{const e=n.map(r=>r.id===t.id?{...r,uploaded:s,progress:100,error:null}:r);return p(e,!1),e})}catch(s){const n=s instanceof Error?s.message:"Upload failed";d(e=>e.map(r=>r.id===t.id?{...r,error:n,progress:null}:r))}}},[h,p]),V=A(t=>{d(s=>{const e=(a?m:1)-s.length;if(e<=0)return k(new Error("Maximum files reached"),{userMessage:a?`Maximum ${m} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),s;const r=t.slice(0,e),i=[];for(const o of r){const R=X(o,P,E);if(!R.valid){k(new Error(R.error),{userMessage:R.error,severity:"warning",showNotification:!0});continue}i.push({id:M(),file:o,previewURL:Q(o),progress:null,uploaded:null,error:null})}if(i.length===0)return s;const c=a?[...s,...i]:i;return y?b.current=!0:i.forEach(o=>j(o)),c})},[a,m,P,E,y,j,p]),O=A(t=>{d(s=>{const n=s.find(r=>r.id===t);n&&T(n.previewURL);const e=s.filter(r=>r.id!==t);return p(e,!1),e})},[p]),W=f.some(t=>!t.uploaded&&!t.error),J=f.some(t=>t.progress!==null&&t.progress<100),q=f.length>0?f.reduce((t,s)=>t+(s.progress??0),0)/f.length:0;return{files:f,addFiles:V,removeFile:O,hasPending:W,isUploading:J,progress:q,formId:w,isDeferred:y}}export{er as useFileUpload};
@@ -1 +1 @@
1
- "use client";import{useMemo as p}from"react";import{buildReferenceLabel as v}from"../components/controlled/select/ControlledReferenceField";import{useCrudList as c}from"../useCrudList";function R(t){const o=new Map;for(const i of Object.values(t.fields)){const e=i.validation?.reference;if(typeof e=="string"&&!o.has(e)){const l=i.options?.fieldSpecific;o.set(e,{collection:e,labelFields:l?.labelFields,displayField:l?.displayField})}}return Array.from(o.values())}function M(t){const o=p(()=>R(t),[t]),i=o[0],e=o[1],l=o[2],s=o[3],{items:d}=c(i?.collection??"__disabled_0__",{enabled:!!i}),{items:a}=c(e?.collection??"__disabled_1__",{enabled:!!e}),{items:f}=c(l?.collection??"__disabled_2__",{enabled:!!l}),{items:r}=c(s?.collection??"__disabled_3__",{enabled:!!s}),F=[{info:i,items:d},{info:e,items:a},{info:l,items:f},{info:s,items:r}];return p(()=>{const _={};for(const{info:n,items:m}of F){if(!n||!m.length)continue;const b={};for(const y of m){const u=y;b[u.id]=v(u,n.labelFields,n.displayField)}_[n.collection]=b}return _},[i?.collection,d,e?.collection,a,l?.collection,f,s?.collection,r])}export{M as useReferenceResolver};
1
+ "use client";import{useMemo as p}from"react";import{buildReferenceLabel as v}from"../components/controlled/select/ControlledReferenceField";import{useCrudList as c}from"../useCrudList";function y(t){const o=new Map;for(const i of Object.values(t.fields)){const e=i.validation?.reference;if(typeof e=="string"&&!o.has(e)){const l=i.options?.fieldSpecific;o.set(e,{collection:e,labelFields:l?.labelFields,displayField:l?.displayField})}}return Array.from(o.values())}function M(t){const o=p(()=>y(t),[t]),i=o[0],e=o[1],l=o[2],s=o[3],{items:f}=c(i?.collection??"__disabled_0__",{enabled:!!i}),{items:r}=c(e?.collection??"__disabled_1__",{enabled:!!e}),{items:d}=c(l?.collection??"__disabled_2__",{enabled:!!l}),{items:a}=c(s?.collection??"__disabled_3__",{enabled:!!s}),F=[{info:i,items:f},{info:e,items:r},{info:l,items:d},{info:s,items:a}];return p(()=>{const m={};for(const{info:n,items:_}of F){if(!n||!_.length)continue;const u={};for(const R of _){const b=R;u[b.id]=v(b,n.labelFields,n.displayField)}m[n.collection]=u}return m},[i?.collection,f,e?.collection,r,l?.collection,d,s?.collection,a])}export{M as useReferenceResolver};
@@ -1 +1 @@
1
- "use client";import{useMemo as p}from"react";function N(o,e,t,n,h={}){const{limit:a=3,tolerance:m=.2}=h,c=p(()=>{if(!e||!t||t.length===0||n.length===0)return[];const b=e.id;return t.filter(f=>f.id===b?!1:n.some(s=>{const r=o.fields[s];if(!r)return!1;const i=e[s],u=f[s];if(i==null||u==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const l=Number(i),g=Number(u);if(isNaN(l)||isNaN(g))return!1;const d=Math.abs(l*m);return Math.abs(g-l)<=d}return String(i)===String(u)})).slice(0,a)},[e,t,n,o.fields,a,m]);return{items:c,hasItems:c.length>0}}export{N as useRelatedItems};
1
+ "use client";import{useMemo as N}from"react";function y(f,e,n,t,p={}){const{limit:l=3,tolerance:a=.2}=p,c=N(()=>{if(!e||!n||n.length===0||t.length===0)return[];const h=e.id;return n.filter(g=>g.id===h?!1:t.some(s=>{const r=f.fields[s];if(!r)return!1;const u=e[s],i=g[s];if(u==null||i==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const o=Number(u),b=Number(i);if(isNaN(o)||isNaN(b))return!1;const m=Math.abs(o*a);return Math.abs(b-o)<=m}return String(u)===String(i)})).slice(0,l)},[e,n,t,f.fields,l,a]);return{items:c,hasItems:c.length>0}}export{y as useRelatedItems};
@@ -1 +1 @@
1
- "use client";import{useEffect as s}from"react";import{isClient as o}from"@donotdev/core";function u({isDirty:n,enabled:t=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}){s(()=>{if(!t||!n||!o())return;const r=a=>(a.preventDefault(),a.returnValue=e,e);return window.addEventListener("beforeunload",r),()=>{window.removeEventListener("beforeunload",r)}},[n,t,e])}export{u as useUnsavedChangesWarning};
1
+ "use client";import{useEffect as u}from"react";import{isClient as a}from"@donotdev/core";function d({isDirty:n,enabled:r=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}){u(()=>{if(!r||!n||!a())return;const o=t=>(t.preventDefault(),t.returnValue=e,e);return window.addEventListener("beforeunload",o),()=>{window.removeEventListener("beforeunload",o)}},[n,r,e])}export{d as useUnsavedChangesWarning};
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * @fileoverview CRUD package
3
3
  * @description CRUD operations and form components for DoNotDev framework
4
4
  *
5
- * @version 0.0.3
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{FunctionsAdapter as e}from"./adapters/FunctionsAdapter";import{getCrudService as a}from"./CrudService";import{useCrudStore as s}from"./CrudStore";import{OPTIMISTIC_STATUSES as t,CRUD_OPERATION as r}from"./types";import{loadDeterministicRange as i,upsertDeterministic as l,appendToCollection as o}from"./utils/collections";import{getFieldRegistry as p,registerFieldType as d,isFieldTypeRegistered as n}from"./FieldRegistry";import{registerBuiltinFieldType as m,getFieldTypeMetadata as F,getFilterType as u,getDisplayFormatter as f,isFilterable as y,getValueType as g,clearFieldTypeRegistry as c}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as T}from"./builtinFieldTypes";import{useEntityForm as S,useEntityField as C,useController as R,isFieldEditable as b,getFieldsForOperation as U,validateEntity as v,translateFieldLabel as E,translateLabel as h}from"./forms";import{UploadProvider as k,useUploadContext as W}from"./contexts";import{useFileUpload as w,useUnsavedChangesWarning as I,useEntityFavorites as x,useRelatedItems as B,useCrudFilters as D,useFieldConditions as O,useReferenceResolver as P}from"./hooks";import{isStorageUrl as A,validatePicture as L,checkForBlobUrls as M,hasBlobUrls as V}from"./utils/uploadValidation";import{defineWorkflow as _,useEntityWorkflow as N,saveWorkflowState as j,loadWorkflowState as q,clearWorkflowState as z}from"./workflows";import{formatValue as H}from"./components/DisplayFieldRenderer";import{buildReferenceLabel as J}from"./components/controlled/select/ControlledReferenceField";import{matchesFilter as K}from"./utils/matchesFilter";import{applyFilters as Q,applySearch as X,applySort as Y,getSearchableFields as Z}from"./utils/clientListProcessing";export{r as CRUD_OPERATION,e as FunctionsAdapter,t as OPTIMISTIC_STATUSES,k as UploadProvider,o as appendToCollection,Q as applyFilters,X as applySearch,Y as applySort,J as buildReferenceLabel,M as checkForBlobUrls,c as clearFieldTypeRegistry,z as clearWorkflowState,_ as defineWorkflow,H as formatValue,a as getCrudService,f as getDisplayFormatter,p as getFieldRegistry,F as getFieldTypeMetadata,U as getFieldsForOperation,u as getFilterType,Z as getSearchableFields,g as getValueType,V as hasBlobUrls,b as isFieldEditable,n as isFieldTypeRegistered,y as isFilterable,A as isStorageUrl,i as loadDeterministicRange,q as loadWorkflowState,K as matchesFilter,m as registerBuiltinFieldType,T as registerBuiltinFieldTypes,d as registerFieldType,j as saveWorkflowState,E as translateFieldLabel,h as translateLabel,l as upsertDeterministic,R as useController,D as useCrudFilters,s as useCrudStore,x as useEntityFavorites,C as useEntityField,S as useEntityForm,N as useEntityWorkflow,O as useFieldConditions,w as useFileUpload,P as useReferenceResolver,B as useRelatedItems,I as useUnsavedChangesWarning,W as useUploadContext,v as validateEntity,L as validatePicture};
1
+ export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{FunctionsAdapter as s}from"./adapters/FunctionsAdapter";import{getCrudService as d}from"./CrudService";import{useCrudStore as m}from"./CrudStore";import{OPTIMISTIC_STATUSES as F,CRUD_OPERATION as u}from"./types";import{loadDeterministicRange as y,upsertDeterministic as g,appendToCollection as c}from"./utils/collections";import{getFieldRegistry as S,registerFieldType as C,isFieldTypeRegistered as R}from"./FieldRegistry";import{registerBuiltinFieldType as U,getFieldTypeMetadata as v,getFilterType as E,getDisplayFormatter as h,isFilterable as k,getValueType as W,clearFieldTypeRegistry as w}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as B}from"./builtinFieldTypes";import{useEntityForm as O,useEntityField as P,useController as A,isFieldEditable as L,getFieldsForOperation as M,validateEntity as V,translateFieldLabel as _,translateLabel as N}from"./forms";import{UploadProvider as q,useUploadContext as z}from"./contexts";import{useFileUpload as H,useUnsavedChangesWarning as J,useEntityFavorites as K,useRelatedItems as Q,useCrudFilters as X,useFieldConditions as Y,useReferenceResolver as Z}from"./hooks";import{isStorageUrl as ee,validatePicture as re,checkForBlobUrls as te,hasBlobUrls as oe}from"./utils/uploadValidation";import{defineWorkflow as ie,useEntityWorkflow as ae,saveWorkflowState as se,loadWorkflowState as pe,clearWorkflowState as de}from"./workflows";import{formatValue as me}from"./components/DisplayFieldRenderer";import{buildReferenceLabel as Fe}from"./components/controlled/select/ControlledReferenceField";import{matchesFilter as xe}from"./utils/matchesFilter";import{applyFilters as ge,applySearch as ce,applySort as Te,getSearchableFields as Se}from"./utils/clientListProcessing";export{u as CRUD_OPERATION,s as FunctionsAdapter,F as OPTIMISTIC_STATUSES,q as UploadProvider,c as appendToCollection,ge as applyFilters,ce as applySearch,Te as applySort,Fe as buildReferenceLabel,te as checkForBlobUrls,w as clearFieldTypeRegistry,de as clearWorkflowState,ie as defineWorkflow,me as formatValue,d as getCrudService,h as getDisplayFormatter,S as getFieldRegistry,v as getFieldTypeMetadata,M as getFieldsForOperation,E as getFilterType,Se as getSearchableFields,W as getValueType,oe as hasBlobUrls,L as isFieldEditable,R as isFieldTypeRegistered,k as isFilterable,ee as isStorageUrl,y as loadDeterministicRange,pe as loadWorkflowState,xe as matchesFilter,U as registerBuiltinFieldType,B as registerBuiltinFieldTypes,C as registerFieldType,se as saveWorkflowState,_ as translateFieldLabel,N as translateLabel,g as upsertDeterministic,A as useController,X as useCrudFilters,m as useCrudStore,K as useEntityFavorites,P as useEntityField,O as useEntityForm,ae as useEntityWorkflow,Y as useFieldConditions,H as useFileUpload,Z as useReferenceResolver,Q as useRelatedItems,J as useUnsavedChangesWarning,z as useUploadContext,V as validateEntity,re as validatePicture};
@@ -1 +1 @@
1
- "use client";import{jsx as p,jsxs as f}from"react/jsx-runtime";import{Text as m,Stack as b,ImageGallery as V,Rating as L,CopyToClipboard as w}from"@donotdev/components";import{formatCurrency as F}from"@donotdev/core";import{ControlledCheckboxField as k,ControlledComboboxField as $,ControlledDateField as h,ControlledDropdownField as I,ControlledFileField as N,ControlledMultiFileField as M,ControlledDocumentField as P,ControlledMultiDocumentField as R,ControlledGeoPointField as B,ControlledImageField as _,ControlledMapField as E,ControlledMultiDropdownField as U,ControlledMultiInputField as H,ControlledNumberField as K,ControlledPasswordField as Y,ControlledPhoneField as G,ControlledRangeField as O,ControlledRatingField as J,ControlledDurationField as W,ControlledRadioField as q,ControlledReferenceField as Q,ControlledYearField as X,ControlledTextField as g,ControlledTextareaField as Z,ControlledRichTextField as ee,ControlledTimestampField as te,ControlledAddressField as re,ControlledFieldArrayField as oe,ControlledSwitchField as ne,ControlledMultiImageField as le,ControlledGdprConsentField as ae,ControlledCurrencyField as ie,ControlledPriceField as ce}from"./components/controlled";import{AvatarFieldComponent as se,BadgeFieldComponent as pe,ButtonFieldComponent as A,HiddenFieldComponent as de,TextAreaComponent as ue,RichTextComponent as ye,TextFieldComponent as T}from"./components/form/fields";import{translateLabel as v}from"./forms/utils";import{sanitizeHtml as fe}from"./utils/sanitizeHtml";function d(e){return e?p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p(m,{variant:"muted",children:"\u2014"})}const i={timestamp:(e,a,r,o)=>{const t=o?.compact??!1;if(e==null||e==="")return d(t);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,a,r,o)=>{const t=o?.compact??!1;if(e==null||e==="")return d(t);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,a,r,o)=>{const t=o?.compact??!1;if(e==null||e==="")return d(t);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,a,r,o)=>{const t=o?.compact??!1;if(e==null||e==="")return d(t);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,a,r,o)=>{const t=o?.compact??!1;return e==null||e===""?d(t):String(e)},month:(e,a,r,o)=>{const t=o?.compact??!1;return e==null||e===""?d(t):String(e)},boolean:(e,a,r)=>e?"Yes":"No",checkbox:(e,a,r)=>e?"Yes":"No",switch:(e,a,r)=>{const o=a.options?.fieldSpecific;if(o){const t=o.uncheckedValue??!1,n=o.checkedValue??!0;if(e===n&&o.checkedLabel)return v(o.checkedLabel,r);if(e===t&&o.uncheckedLabel)return v(o.uncheckedLabel,r)}return e?"Yes":"No"},year:(e,a,r)=>String(e),number:e=>e==null||e===""?"\u2014":typeof e=="number"?e.toLocaleString():String(e),currency:(e,a,r)=>{if(e==null||isNaN(e))return"";const o=(a.options||{}).fieldSpecific?.currency||"EUR";return F(e,o)},price:(e,a,r,o)=>{const t=o?.compact??!1,n=o?.asString??!1,l=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(l==null||typeof l!="object")return d(t);const c=l.amount;if(c==null||isNaN(c))return d(t);const s=l.currency||"EUR",y=l.vatIncluded??!0,u=l.discountPercent??0,x=u>0?c*(1-u/100):c,C=y?` ${r("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(u>0){const z=F(c,s),S=F(x,s),j=` ${r("crud:price.discountPercent",{percent:Math.round(u),defaultValue:"-{{percent}}%"})}`;return n?`${S}${C}${j}`:t?f(m,{variant:"success",weight:"bold",children:[S,C,j]}):f(b,{direction:"column",gap:"tight",align:"end",children:[p(m,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:z}),f(m,{variant:"success",weight:"bold",children:[S,C]})]})}return`${F(c,s)}${C}`},range:(e,a,r)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,a,r,o)=>{const t=o?.compact??!1;if(e==null)return d(t);const n=typeof e=="number"?e:parseFloat(e);if(isNaN(n))return d(t);const l=a.validation?.max??5;return p(L,{value:n,max:l,readonly:!0,"aria-label":`${n} out of ${l} stars`})},duration:(e,a,r,o)=>{const t=o?.compact??!1;if(e==null)return d(t);const n=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(n))return d(t);if(n===0)return r("crud:duration.zero",{defaultValue:"\u2014"});if(n<60)return r("crud:duration.minutes",{count:n,defaultValue:`${n} min`});const l=Math.floor(n/60),c=n%60;return r("crud:duration.hoursMinutes",{hours:l,minutes:c,defaultValue:c===0?`${l}h`:`${l}h ${c}min`})},gdprConsent:(e,a,r,o)=>{const t=o?.compact??!1;if(!e||typeof e!="object")return d(t);const n=e.gdprConsent===!0,l=e.gdprConsentDate,c=e.gdprConsentVersion,s=r("crud:gdprConsent.display.yes",{defaultValue:"Consented"}),y=r("crud:gdprConsent.display.no",{defaultValue:"Not consented"});if(!n)return y;const u=[s];if(l)try{const x=new Date(l);u.push(x.toLocaleDateString())}catch{u.push(l)}return c&&u.push(`v${c}`),u.join(" \xB7 ")},select:(e,a,r)=>{const o=a.validation?.options;if(Array.isArray(o)){const t=o.find(n=>n.value===e)?.label;return t?v(t,r):String(e)}return String(e)},radio:(e,a,r)=>{const o=a.validation?.options;if(Array.isArray(o)){const t=o.find(n=>n.value===e)?.label;return t?v(t,r):String(e)}return String(e)},combobox:(e,a,r)=>{const o=a.validation?.options;if(Array.isArray(o)){const t=o.find(n=>n.value===e)?.label;return t?v(t,r):String(e)}return String(e)},multiselect:(e,a,r)=>{if(Array.isArray(e)){const o=a.validation?.options;if(Array.isArray(o))return e.map(t=>{const n=o.find(l=>l.value===t)?.label;return n?v(n,r):t}).join(", ")}return String(e)},image:(e,a,r,o)=>{const t=o?.compact??!1;return e==null||e===""?d(t):typeof e=="string"?p("img",{src:e,alt:a.label||"",style:{width:t?"40px":void 0,height:t?"40px":void 0,maxWidth:t?void 0:"200px",maxHeight:t?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):d(t)},images:(e,a,r,o)=>{const t=o?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(t);const n=e[0],l=typeof n=="object"&&n.thumbUrl?n.thumbUrl:n;return t?f("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[p("img",{src:l,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&f("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):p(V,{images:e,altPrefix:a.label||"Image"})},files:(e,a,r,o)=>{const t=o?.compact??!1;return!Array.isArray(e)||e.length===0?d(t):p(b,{gap:"tight",children:e.map((n,l)=>f("a",{href:n.url||n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[n.filename||`File ${l+1}`,n.size&&f(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(n.size/1024)," KB)"]})]},l))})},documents:(e,a,r,o)=>{const t=o?.compact??!1;return!Array.isArray(e)||e.length===0?d(t):p(b,{gap:"tight",children:e.map((n,l)=>f("a",{href:n.url||n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[n.filename||`File ${l+1}`,n.size&&f(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(n.size/1024)," KB)"]})]},l))})},file:(e,a,r,o)=>{const t=o?.compact??!1;if(!e)return d(t);const n=typeof e=="string"?e:e.url,l=typeof e=="string"?"View file":e.filename||"View file";return f("a",{href:n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[l,typeof e=="object"&&e.size&&f("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,a,r,o)=>{const t=o?.compact??!1;if(!e)return d(t);const n=typeof e=="string"?e:e.url,l=typeof e=="string"?"View file":e.filename||"View file";return f("a",{href:n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[l,typeof e=="object"&&e.size&&f("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,a,r,o)=>{const t=o?.compact??!1;if(!e)return d(t);const n=a.validation?.reference;if(o?.referenceData&&typeof n=="string"){const l=o.referenceData[n]?.[String(e)];if(l)return l}if(typeof e=="object"&&e!==null){const l=e.displayName||e.name||e.id||String(e);return String(l)}return String(e)},geopoint:(e,a,r,o)=>{const t=o?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:d(t)},address:(e,a,r)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,a,r,o)=>{const t=o?.compact??!1;if(e&&typeof e=="object"){const n=Object.entries(e);return n.length===0?d(t):f(b,{direction:"column",gap:"tight",children:[n.slice(0,5).map(([l,c])=>f(m,{style:{fontSize:"var(--font-size-sm)"},children:[f("strong",{children:[l,":"]})," ",String(c)]},l)),n.length>5&&f(m,{variant:"muted",children:["+",n.length-5," more"]})]})}return d(t)},array:(e,a,r,o)=>{const t=o?.compact??!1;return Array.isArray(e)?e.length===0?d(t):e.join(", "):d(t)},"field-array":(e,a,r,o)=>{const t=o?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(t);const n=a.options?.fieldSpecific?.fields;return e.map(l=>{if(typeof l!="object"||l==null)return"";const c=l;return(n?n.map(s=>s.name):Object.keys(c)).map(s=>c[s]).filter(s=>s!=null&&s!=="").map(s=>typeof s=="object"?JSON.stringify(s):String(s)).join(" \xB7 ")}).filter(Boolean).join(", ")},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,a,r)=>f(b,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`mailto:${e}`,style:{color:"var(--primary)",flex:1},onClick:o=>o.stopPropagation(),children:e}),p(w,{text:e,tooltipText:r("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:r("crud:actions.copyEmail",{defaultValue:"Copy email"}),onClick:o=>o.stopPropagation()})]}),tel:(e,a,r)=>f(b,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`tel:${e}`,style:{color:"var(--primary)",flex:1},onClick:o=>o.stopPropagation(),children:e}),p(w,{text:e,tooltipText:r("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:r("crud:actions.copyPhone",{defaultValue:"Copy phone"}),onClick:o=>o.stopPropagation()})]}),iban:(e,a,r,o)=>{const t=o?.compact??!1;return e?f(b,{direction:"row",gap:"tight",align:"center",children:[p(m,{style:{flex:1},children:e}),p(w,{text:e,tooltipText:r("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:r("crud:actions.copyIban",{defaultValue:"Copy IBAN"}),onClick:n=>n.stopPropagation()})]}):d(t)},url:(e,a,r)=>p("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,a,r)=>f(b,{direction:"row",gap:"tight",align:"center",children:[p("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),p(m,{children:e})]}),textarea:(e,a,r)=>String(e),text:(e,a,r)=>String(e),richtext:(e,a,r,o)=>{const t=o?.compact??!1;return e&&typeof e=="string"?t?e.replace(/<[^>]*>/g,"").trim()||p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p("div",{dangerouslySetInnerHTML:{__html:fe(e)},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):d(t)}};function me(e){return e.type==="avatar"}function ge(e){return e.type==="badge"}let D=!1;function be(e,a){if(D)return;D=!0;const r=o=>{const{type:t,components:n}=o;n&&a.registerComponent(t,n.controlled,n.uncontrolled),e.set(t,o)};r({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.text,components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(T,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,...s.options})}}}),r({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.email,components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(T,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,type:"email",...s.options})}}}),r({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.url,components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(T,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,type:"url",...s.options})}}}),r({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.color,components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(T,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,type:"color",...s.options})}}}),r({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.textarea,components:{controlled:Z,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(ue,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,...s.options})}}}),r({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.richtext,components:{controlled:ee,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(ye,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value;n(u)},error:c,...s.options})}}}),r({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:i.password,components:{controlled:Y}}),r({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.tel,components:{controlled:G}}),r({type:"iban",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.iban,components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,label:l,error:c,config:s}=o;return p(T,{label:l||"",value:typeof t=="string"?t:"",onChange:y=>{const u=y.target.value.replace(/\s/g,"").toUpperCase();n(u)},error:c,...s.options})}}}),r({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:i.number,components:{controlled:K}}),r({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:i.currency,components:{controlled:ie}}),r({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:i.price,components:{controlled:ce}}),r({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:i.range,components:{controlled:O}}),r({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:i.year,components:{controlled:X}}),r({type:"rating",filterable:!0,filterType:"rating",valueType:"number",displayFormatter:i.rating,components:{controlled:J}}),r({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:i.duration,components:{controlled:W}}),r({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:i.boolean,components:{controlled:k}}),r({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:i.checkbox,components:{controlled:k}}),r({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",displayFormatter:i.gdprConsent,components:{controlled:ae}}),r({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:i.switch,components:{controlled:ne}}),r({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i.date,components:{controlled:h}}),r({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i["datetime-local"],components:{controlled:h}}),r({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i.time,components:{controlled:h}}),r({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i.week,components:{controlled:h}}),r({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i.month,components:{controlled:h}}),r({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:i.timestamp,components:{controlled:te}}),r({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:i.file,components:{controlled:N}}),r({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:i.files,components:{controlled:M}}),r({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:i.document,components:{controlled:P}}),r({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:i.documents,components:{controlled:R}}),r({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:i.image,components:{controlled:_}}),r({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:i.images,components:{controlled:le}}),r({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:i.geopoint,components:{controlled:B}}),r({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:i.address,components:{controlled:re}}),r({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:i.map,components:{controlled:E}}),r({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:i.array,components:{controlled:H}}),r({type:"field-array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:i["field-array"],components:{controlled:oe}}),r({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:i.select,components:{controlled:I}}),r({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:i.combobox,components:{controlled:$}}),r({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:i.multiselect,components:{controlled:U}}),r({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:i.radio,components:{controlled:q}}),r({type:"reference",filterable:!0,filterType:"text",valueType:"string",displayFormatter:i.reference,components:{controlled:Q}}),r({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:o=>{const{name:t,value:n}=o;return p(de,{name:t,value:typeof n=="string"?n:""})}}}),r({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,error:l,config:c,t:s}=o;if(!me(c))throw new Error("Invalid config type for avatar field");return p(se,{config:c,value:typeof t=="string"?t:"",onChange:y=>{n(y)},error:!!l,helperText:l||void 0,t:s,...c.options})}}}),r({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:o=>{const{value:t,onChange:n,error:l,config:c,t:s}=o;if(!ge(c))throw new Error("Invalid config type for badge field");return p(pe,{config:c,value:typeof t=="string"?t:"",onChange:y=>{n(y)},error:!!l,helperText:l||void 0,t:s,...c.options})}}}),r({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:o=>{const{name:t,label:n,config:l}=o;return p(A,{label:n||t,type:"submit",onClick:()=>{},...l.options})}}}),r({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:o=>{const{name:t,label:n,config:l}=o;return p(A,{label:n||t,type:"reset",onClick:()=>{},...l.options})}}})}export{be as registerAllBuiltinFieldTypes};
1
+ "use client";import{jsx as s,jsxs as y}from"react/jsx-runtime";import{Text as g,Stack as h,ImageGallery as L,Rating as I,CopyToClipboard as w}from"@donotdev/components";import{formatCurrency as S}from"@donotdev/core";import{ControlledCheckboxField as k,ControlledComboboxField as $,ControlledDateField as C,ControlledDropdownField as N,ControlledFileField as P,ControlledMultiFileField as M,ControlledDocumentField as R,ControlledMultiDocumentField as _,ControlledGeoPointField as v,ControlledImageField as B,ControlledMapField as E,ControlledMultiDropdownField as O,ControlledMultiInputField as U,ControlledNumberField as H,ControlledPasswordField as K,ControlledPhoneField as Y,ControlledRangeField as G,ControlledRatingField as J,ControlledDurationField as W,ControlledRadioField as q,ControlledReferenceField as Q,ControlledYearField as X,ControlledTextField as b,ControlledTextareaField as Z,ControlledRichTextField as ee,ControlledTimestampField as te,ControlledAddressField as re,ControlledFieldArrayField as ne,ControlledSwitchField as oe,ControlledMultiImageField as le,ControlledGdprConsentField as ie,ControlledCurrencyField as ae,ControlledPriceField as ce}from"./components/controlled";import{AvatarFieldComponent as se,BadgeFieldComponent as pe,ButtonFieldComponent as A,HiddenFieldComponent as de,TextAreaComponent as fe,RichTextComponent as ue,TextFieldComponent as F}from"./components/form/fields";import{translateLabel as T}from"./forms/utils";import{sanitizeHtml as ye}from"./utils/sanitizeHtml";function p(e){return e?s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s(g,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,i,t,r)=>{const n=r?.compact??!1;if(e==null||e==="")return p(n);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,i,t,r)=>{const n=r?.compact??!1;if(e==null||e==="")return p(n);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,i,t,r)=>{const n=r?.compact??!1;if(e==null||e==="")return p(n);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,i,t,r)=>{const n=r?.compact??!1;if(e==null||e==="")return p(n);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,i,t,r)=>{const n=r?.compact??!1;return e==null||e===""?p(n):String(e)},month:(e,i,t,r)=>{const n=r?.compact??!1;return e==null||e===""?p(n):String(e)},boolean:(e,i,t)=>e?"Yes":"No",checkbox:(e,i,t)=>e?"Yes":"No",switch:(e,i,t)=>{const r=i.options?.fieldSpecific;if(r){const n=r.uncheckedValue??!1,o=r.checkedValue??!0;if(e===o&&r.checkedLabel)return T(r.checkedLabel,t);if(e===n&&r.uncheckedLabel)return T(r.uncheckedLabel,t)}return e?"Yes":"No"},year:(e,i,t)=>String(e),number:e=>e==null||e===""?"\u2014":typeof e=="number"?e.toLocaleString():String(e),currency:(e,i,t)=>{if(e==null||isNaN(e))return"";const o=(i.options||{}).fieldSpecific?.currency||"EUR";return S(e,o)},price:(e,i,t,r)=>{const n=r?.compact??!1,o=r?.asString??!1,l=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(l==null||typeof l!="object")return p(n);const a=l.amount;if(a==null||isNaN(a))return p(n);const f=l.currency||"EUR",u=l.vatIncluded??!0,d=l.discountPercent??0,m=d>0?a*(1-d/100):a,x=u?` ${t("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(d>0){const z=S(a,f),V=S(m,f),j=` ${t("crud:price.discountPercent",{percent:Math.round(d),defaultValue:"-{{percent}}%"})}`;return o?`${V}${x}${j}`:n?y(g,{variant:"success",weight:"bold",children:[V,x,j]}):y(h,{direction:"column",gap:"tight",align:"end",children:[s(g,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:z}),y(g,{variant:"success",weight:"bold",children:[V,x]})]})}return`${S(a,f)}${x}`},range:(e,i,t)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,i,t,r)=>{const n=r?.compact??!1;if(e==null)return p(n);const o=typeof e=="number"?e:parseFloat(e);if(isNaN(o))return p(n);const l=i.validation?.max??5;return s(I,{value:o,max:l,readonly:!0,"aria-label":`${o} out of ${l} stars`})},duration:(e,i,t,r)=>{const n=r?.compact??!1;if(e==null)return p(n);const o=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(o))return p(n);if(o===0)return t("crud:duration.zero",{defaultValue:"\u2014"});if(o<60)return t("crud:duration.minutes",{count:o,defaultValue:`${o} min`});const l=Math.floor(o/60),a=o%60;return t("crud:duration.hoursMinutes",{hours:l,minutes:a,defaultValue:a===0?`${l}h`:`${l}h ${a}min`})},gdprConsent:(e,i,t,r)=>{const n=r?.compact??!1;if(!e||typeof e!="object")return p(n);const o=e.gdprConsent===!0,l=e.gdprConsentDate,a=e.gdprConsentVersion,f=t("crud:gdprConsent.display.yes",{defaultValue:"Consented"}),u=t("crud:gdprConsent.display.no",{defaultValue:"Not consented"});if(!o)return u;const d=[f];if(l)try{const m=new Date(l);d.push(m.toLocaleDateString())}catch{d.push(l)}return a&&d.push(`v${a}`),d.join(" \xB7 ")},select:(e,i,t)=>{const r=i.validation?.options;if(Array.isArray(r)){const o=r.find(l=>l.value===e)?.label;return o?T(o,t):String(e)}return String(e)},radio:(e,i,t)=>{const r=i.validation?.options;if(Array.isArray(r)){const o=r.find(l=>l.value===e)?.label;return o?T(o,t):String(e)}return String(e)},combobox:(e,i,t)=>{const r=i.validation?.options;if(Array.isArray(r)){const o=r.find(l=>l.value===e)?.label;return o?T(o,t):String(e)}return String(e)},multiselect:(e,i,t)=>{if(Array.isArray(e)){const r=i.validation?.options;if(Array.isArray(r))return e.map(o=>{const a=r.find(f=>f.value===o)?.label;return a?T(a,t):o}).join(", ")}return String(e)},image:(e,i,t,r)=>{const n=r?.compact??!1;return e==null||e===""?p(n):typeof e=="string"?s("img",{src:e,alt:i.label||"",style:{width:n?"40px":void 0,height:n?"40px":void 0,maxWidth:n?void 0:"200px",maxHeight:n?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):p(n)},images:(e,i,t,r)=>{const n=r?.compact??!1;if(!Array.isArray(e)||e.length===0)return p(n);const o=e[0],l=typeof o=="object"&&o.thumbUrl?o.thumbUrl:o;return n?y("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[s("img",{src:l,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&y("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):s(L,{images:e,altPrefix:i.label||"Image"})},files:(e,i,t,r)=>{const n=r?.compact??!1;return!Array.isArray(e)||e.length===0?p(n):s(h,{gap:"tight",children:e.map((o,l)=>y("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 ${l+1}`,o.size&&y(g,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},l))})},documents:(e,i,t,r)=>{const n=r?.compact??!1;return!Array.isArray(e)||e.length===0?p(n):s(h,{gap:"tight",children:e.map((o,l)=>y("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 ${l+1}`,o.size&&y(g,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},l))})},file:(e,i,t,r)=>{const n=r?.compact??!1;if(!e)return p(n);const o=typeof e=="string"?e:e.url,l=typeof e=="string"?"View file":e.filename||"View file";return y("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[l,typeof e=="object"&&e.size&&y("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,i,t,r)=>{const n=r?.compact??!1;if(!e)return p(n);const o=typeof e=="string"?e:e.url,l=typeof e=="string"?"View file":e.filename||"View file";return y("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[l,typeof e=="object"&&e.size&&y("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,i,t,r)=>{const n=r?.compact??!1;if(!e)return p(n);const o=i.validation?.reference;if(r?.referenceData&&typeof o=="string"){const l=r.referenceData[o]?.[String(e)];if(l)return l}if(typeof e=="object"&&e!==null){const l=e.displayName||e.name||e.id||String(e);return String(l)}return String(e)},geopoint:(e,i,t,r)=>{const n=r?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:p(n)},address:(e,i,t)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,i,t,r)=>{const n=r?.compact??!1;if(e&&typeof e=="object"){const o=Object.entries(e);return o.length===0?p(n):y(h,{direction:"column",gap:"tight",children:[o.slice(0,5).map(([l,a])=>y(g,{style:{fontSize:"var(--font-size-sm)"},children:[y("strong",{children:[l,":"]})," ",String(a)]},l)),o.length>5&&y(g,{variant:"muted",children:["+",o.length-5," more"]})]})}return p(n)},array:(e,i,t,r)=>{const n=r?.compact??!1;return Array.isArray(e)?e.length===0?p(n):e.join(", "):p(n)},"field-array":(e,i,t,r)=>{const n=r?.compact??!1;if(!Array.isArray(e)||e.length===0)return p(n);const o=i.options?.fieldSpecific?.fields;return e.map(l=>{if(typeof l!="object"||l==null)return"";const a=l;return(o?o.map(u=>u.name):Object.keys(a)).map(u=>a[u]).filter(u=>u!=null&&u!=="").map(u=>typeof u=="object"?JSON.stringify(u):String(u)).join(" \xB7 ")}).filter(Boolean).join(", ")},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,i,t)=>y(h,{direction:"row",gap:"tight",align:"center",children:[s("a",{href:`mailto:${e}`,style:{color:"var(--primary)",flex:1},onClick:r=>r.stopPropagation(),children:e}),s(w,{text:e,tooltipText:t("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:t("crud:actions.copyEmail",{defaultValue:"Copy email"}),onClick:r=>r.stopPropagation()})]}),tel:(e,i,t)=>y(h,{direction:"row",gap:"tight",align:"center",children:[s("a",{href:`tel:${e}`,style:{color:"var(--primary)",flex:1},onClick:r=>r.stopPropagation(),children:e}),s(w,{text:e,tooltipText:t("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:t("crud:actions.copyPhone",{defaultValue:"Copy phone"}),onClick:r=>r.stopPropagation()})]}),iban:(e,i,t,r)=>{const n=r?.compact??!1;return e?y(h,{direction:"row",gap:"tight",align:"center",children:[s(g,{style:{flex:1},children:e}),s(w,{text:e,tooltipText:t("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:t("crud:actions.copyIban",{defaultValue:"Copy IBAN"}),onClick:o=>o.stopPropagation()})]}):p(n)},url:(e,i,t)=>s("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,i,t)=>y(h,{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(g,{children:e})]}),textarea:(e,i,t)=>String(e),text:(e,i,t)=>String(e),richtext:(e,i,t,r)=>{const n=r?.compact??!1;return e&&typeof e=="string"?n?e.replace(/<[^>]*>/g,"").trim()||s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s("div",{dangerouslySetInnerHTML:{__html:ye(e)},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):p(n)}};function me(e){return e.type==="avatar"}function ge(e){return e.type==="badge"}let D=!1;function Ve(e,i){if(D)return;D=!0;const t=r=>{const{type:n,components:o}=r;o&&i.registerComponent(n,o.controlled,o.uncontrolled),e.set(n,r)};t({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(F,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,...f.options})}}}),t({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(F,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,type:"email",...f.options})}}}),t({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(F,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,type:"url",...f.options})}}}),t({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(F,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,type:"color",...f.options})}}}),t({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:Z,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(fe,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,...f.options})}}}),t({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:ee,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(ue,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value;o(m)},error:a,...f.options})}}}),t({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:K}}),t({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:Y}}),t({type:"iban",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.iban,components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,label:l,error:a,config:f}=r;return s(F,{label:l||"",value:typeof n=="string"?n:"",onChange:d=>{const m=d.target.value.replace(/\s/g,"").toUpperCase();o(m)},error:a,...f.options})}}}),t({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:H}}),t({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:ae}}),t({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:ce}}),t({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:G}}),t({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:X}}),t({type:"rating",filterable:!0,filterType:"rating",valueType:"number",displayFormatter:c.rating,components:{controlled:J}}),t({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.duration,components:{controlled:W}}),t({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:k}}),t({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:k}}),t({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",displayFormatter:c.gdprConsent,components:{controlled:ie}}),t({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:oe}}),t({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:C}}),t({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:C}}),t({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:C}}),t({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:C}}),t({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:C}}),t({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:te}}),t({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:P}}),t({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:M}}),t({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:R}}),t({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:_}}),t({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:B}}),t({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:le}}),t({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:v}}),t({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:re}}),t({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:E}}),t({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:U}}),t({type:"field-array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c["field-array"],components:{controlled:ne}}),t({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:N}}),t({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:$}}),t({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:O}}),t({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:q}}),t({type:"reference",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.reference,components:{controlled:Q}}),t({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:b,uncontrolled:r=>{const{name:n,value:o}=r;return s(de,{name:n,value:typeof o=="string"?o:""})}}}),t({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,error:l,config:a,t:f}=r;if(!me(a))throw new Error("Invalid config type for avatar field");return s(se,{config:a,value:typeof n=="string"?n:"",onChange:d=>{o(d)},error:!!l,helperText:l||void 0,t:f,...a.options})}}}),t({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:b,uncontrolled:r=>{const{value:n,onChange:o,error:l,config:a,t:f}=r;if(!ge(a))throw new Error("Invalid config type for badge field");return s(pe,{config:a,value:typeof n=="string"?n:"",onChange:d=>{o(d)},error:!!l,helperText:l||void 0,t:f,...a.options})}}}),t({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:b,uncontrolled:r=>{const{name:n,label:o,config:l}=r;return s(A,{label:o||n,type:"submit",onClick:()=>{},...l.options})}}}),t({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:b,uncontrolled:r=>{const{name:n,label:o,config:l}=r;return s(A,{label:o||n,type:"reset",onClick:()=>{},...l.options})}}})}export{Ve as registerAllBuiltinFieldTypes};
@@ -1 +1 @@
1
- "use client";import{createDoNotDevStore as l}from"@donotdev/core";const i={status:"idle",error:null,uploadProgress:0,isDirty:!1},a=l({name:"form-store",createStore:(o,t)=>{const m=new Map;return{forms:{},startSubmit:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(r,s)=>{o(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,status:"uploading",uploadProgress:Math.min(100,Math.max(0,s))}}}})},setValidating:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"validating",uploadProgress:100}}}})},setSubmitting:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"submitting"}}}})},setSuccess:r=>{o(u=>{const n=u.forms[r]||i;return{forms:{...u.forms,[r]:{...n,status:"success",error:null}}}});const s=m.get(r);s!==void 0&&clearTimeout(s);const e=setTimeout(()=>{m.delete(r),t().reset(r)},1500);m.set(r,e)},setError:(r,s)=>{t().reset(r)},reset:r=>{o(s=>({forms:{...s.forms,[r]:{...i}}}))},setIsDirty:(r,s)=>{o(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,isDirty:s}}}})},hasDirtyForms:()=>{const r=t().forms;return Object.values(r).some(s=>s.isDirty)},getDirtyFormIds:()=>{const r=t().forms;return Object.entries(r).filter(([s,e])=>e.isDirty).map(([s])=>s)},cleanup:r=>{const s=m.get(r);s!==void 0&&(clearTimeout(s),m.delete(r)),o(e=>{const{[r]:u,...n}=e.forms;return{forms:n}})},getStatus:r=>t().forms[r]?.status??"idle",isLoading:r=>{const s=t().forms[r]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"},getUploadProgress:r=>t().forms[r]?.uploadProgress??0,getError:r=>t().forms[r]?.error??null,getIsDirty:r=>t().forms[r]?.isDirty??!1}}}),f=o=>a(t=>t.forms[o]?.status??"idle"),g=o=>a(t=>{const m=t.forms[o]?.status??"idle";return m==="uploading"||m==="validating"||m==="submitting"}),c=o=>a(t=>t.forms[o]?.uploadProgress??0),d=o=>a(t=>t.forms[o]?.error??null),p=o=>a(t=>t.forms[o]?.isDirty??!1),D=()=>a(o=>Object.values(o.forms).some(t=>t.isDirty));export{d as useFormError,p as useFormIsDirty,g as useFormLoading,f as useFormStatus,a as useFormStore,D as useHasDirtyForms,c as useUploadProgress};
1
+ "use client";import{createDoNotDevStore as l}from"@donotdev/core";const i={status:"idle",error:null,uploadProgress:0,isDirty:!1},m=l({name:"form-store",createStore:(t,o)=>{const n=new Map;return{forms:{},startSubmit:r=>{t(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(r,s)=>{t(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,status:"uploading",uploadProgress:Math.min(100,Math.max(0,s))}}}})},setValidating:r=>{t(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"validating",uploadProgress:100}}}})},setSubmitting:r=>{t(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"submitting"}}}})},setSuccess:r=>{t(u=>{const a=u.forms[r]||i;return{forms:{...u.forms,[r]:{...a,status:"success",error:null}}}});const s=n.get(r);s!==void 0&&clearTimeout(s);const e=setTimeout(()=>{n.delete(r),o().reset(r)},1500);n.set(r,e)},setError:(r,s)=>{o().reset(r)},reset:r=>{t(s=>({forms:{...s.forms,[r]:{...i}}}))},setIsDirty:(r,s)=>{t(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,isDirty:s}}}})},hasDirtyForms:()=>{const r=o().forms;return Object.values(r).some(s=>s.isDirty)},getDirtyFormIds:()=>{const r=o().forms;return Object.entries(r).filter(([s,e])=>e.isDirty).map(([s])=>s)},cleanup:r=>{const s=n.get(r);s!==void 0&&(clearTimeout(s),n.delete(r)),t(e=>{const{[r]:u,...a}=e.forms;return{forms:a}})},getStatus:r=>o().forms[r]?.status??"idle",isLoading:r=>{const s=o().forms[r]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"},getUploadProgress:r=>o().forms[r]?.uploadProgress??0,getError:r=>o().forms[r]?.error??null,getIsDirty:r=>o().forms[r]?.isDirty??!1}}}),c=t=>m(o=>o.forms[t]?.status??"idle"),g=t=>m(o=>{const n=o.forms[t]?.status??"idle";return n==="uploading"||n==="validating"||n==="submitting"}),p=t=>m(o=>o.forms[t]?.uploadProgress??0),d=t=>m(o=>o.forms[t]?.error??null),D=t=>m(o=>o.forms[t]?.isDirty??!1),y=()=>m(t=>Object.values(t.forms).some(o=>o.isDirty));export{d as useFormError,D as useFormIsDirty,g as useFormLoading,c as useFormStatus,m as useFormStore,y as useHasDirtyForms,p as useUploadProgress};
@@ -1 +1 @@
1
- "use client";import{createDoNotDevStore as F}from"@donotdev/core";const m={status:"idle",progress:0,error:null},d=F({name:"upload-store",createStore:(a,n)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(s,e,t,o)=>{a(r=>({uploadFunctions:{...r.uploadFunctions,[s]:{...r.uploadFunctions[s]||{},[e]:t}},checkPendingFunctions:{...r.checkPendingFunctions,[s]:{...r.checkPendingFunctions[s]||{},[e]:o||(()=>!1)}}}))},unregisterUpload:(s,e)=>{a(t=>{const o=t.uploadFunctions[s],r=t.checkPendingFunctions[s];if(!o)return t;const{[e]:l,...p}=o,{[e]:u,...i}=r||{},{[e]:g,...h}=t.retryAttempts[s]||{};return{uploadFunctions:{...t.uploadFunctions,[s]:p},checkPendingFunctions:{...t.checkPendingFunctions,[s]:i},retryAttempts:{...t.retryAttempts,[s]:h}}})},startUpload:(s,e)=>{a(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[e]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(s,e,t)=>{a(o=>{const r=o.uploads[s]?.[e]||m;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[e]:{...r,progress:Math.min(100,Math.max(0,t))}}}}})},completeUpload:(s,e)=>{a(t=>{const o=t.uploads[s]?.[e]||m;return{uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[e]:{...o,status:"complete",progress:100}}}}})},failUpload:(s,e,t)=>{a(o=>{const r=o.uploads[s]?.[e]||m;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[e]:{...r,status:"error",error:t}}}}})},resetUpload:(s,e)=>{a(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[e]:{...m}}}}))},resetForm:s=>{a(e=>({uploads:{...e.uploads,[s]:{}}}))},cleanup:s=>{a(e=>{const{[s]:t,...o}=e.uploads,{[s]:r,...l}=e.uploadFunctions,{[s]:p,...u}=e.checkPendingFunctions,{[s]:i,...g}=e.retryAttempts;return{uploads:o,uploadFunctions:l,checkPendingFunctions:u,retryAttempts:g}})},uploadAll:async s=>{const e=n().uploadFunctions[s];if(!e)return;const t=Object.entries(e);if(t.length===0)return;const o=async(r,l,p=1)=>{n().startUpload(s,r);try{await l(u=>{n().setProgress(s,r,u)}),n().completeUpload(s,r),a(u=>({retryAttempts:{...u.retryAttempts,[s]:{...u.retryAttempts[s]||{},[r]:0}}}))}catch(u){const i=u instanceof Error?u.message:"Upload failed",g=n().maxRetries;if((n().retryAttempts[s]?.[r]??0)<g){a(c=>({retryAttempts:{...c.retryAttempts,[s]:{...c.retryAttempts[s]||{},[r]:(c.retryAttempts[s]?.[r]??0)+1}}}));const h=n().retryDelay*Math.pow(2,p-1);return await new Promise(c=>setTimeout(c,h)),o(r,l,p+1)}else throw n().failUpload(s,r,i),u}};await Promise.all(t.map(async([r,l])=>{await o(r,l)}))},hasPendingUploads:s=>{const e=n(),t=e.uploadFunctions[s],o=e.checkPendingFunctions[s];return t?Object.entries(t).some(([r,l])=>{const p=o?.[r];return p?p():!0}):!1},getStatus:(s,e)=>n().uploads[s]?.[e]?.status??"idle",getProgress:(s,e)=>n().uploads[s]?.[e]?.progress??0,getTotalProgress:s=>{const e=n().uploads[s];if(!e)return 100;const t=Object.values(e);if(t.length===0)return 100;const o=t.reduce((r,l)=>r+l.progress,0);return Math.round(o/t.length)},isUploading:s=>{const e=n().uploads[s];return e?Object.values(e).some(t=>t.status==="uploading"):!1},getError:(s,e)=>n().uploads[s]?.[e]?.error??null})}),y=a=>d(n=>{const s=n.uploads[a];if(!s)return 100;const e=Object.values(s);if(e.length===0)return 100;const t=e.reduce((o,r)=>o+r.progress,0);return Math.round(t/e.length)}),P=a=>d(n=>{const s=n.uploads[a];return s?Object.values(s).some(e=>e.status==="uploading"):!1}),A=(a,n)=>d(s=>s.uploads[a]?.[n]?.progress??0),U=(a,n)=>d(s=>s.uploads[a]?.[n]?.status??"idle");export{A as useFieldProgress,U as useFieldUploadStatus,P as useIsUploading,y as useTotalProgress,d as useUploadStore};
1
+ "use client";import{createDoNotDevStore as y}from"@donotdev/core";const g={status:"idle",progress:0,error:null},F=y({name:"upload-store",createStore:(u,e)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(n,t,s,o)=>{u(r=>({uploadFunctions:{...r.uploadFunctions,[n]:{...r.uploadFunctions[n]||{},[t]:s}},checkPendingFunctions:{...r.checkPendingFunctions,[n]:{...r.checkPendingFunctions[n]||{},[t]:o||(()=>!1)}}}))},unregisterUpload:(n,t)=>{u(s=>{const o=s.uploadFunctions[n],r=s.checkPendingFunctions[n];if(!o)return s;const{[t]:c,...l}=o,{[t]:p,...a}=r||{},{[t]:d,...h}=s.retryAttempts[n]||{};return{uploadFunctions:{...s.uploadFunctions,[n]:l},checkPendingFunctions:{...s.checkPendingFunctions,[n]:a},retryAttempts:{...s.retryAttempts,[n]:h}}})},startUpload:(n,t)=>{u(s=>({uploads:{...s.uploads,[n]:{...s.uploads[n]||{},[t]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(n,t,s)=>{u(o=>{const r=o.uploads[n]?.[t]||g;return{uploads:{...o.uploads,[n]:{...o.uploads[n]||{},[t]:{...r,progress:Math.min(100,Math.max(0,s))}}}}})},completeUpload:(n,t)=>{u(s=>{const o=s.uploads[n]?.[t]||g;return{uploads:{...s.uploads,[n]:{...s.uploads[n]||{},[t]:{...o,status:"complete",progress:100}}}}})},failUpload:(n,t,s)=>{u(o=>{const r=o.uploads[n]?.[t]||g;return{uploads:{...o.uploads,[n]:{...o.uploads[n]||{},[t]:{...r,status:"error",error:s}}}}})},resetUpload:(n,t)=>{u(s=>({uploads:{...s.uploads,[n]:{...s.uploads[n]||{},[t]:{...g}}}}))},resetForm:n=>{u(t=>({uploads:{...t.uploads,[n]:{}}}))},cleanup:n=>{u(t=>{const{[n]:s,...o}=t.uploads,{[n]:r,...c}=t.uploadFunctions,{[n]:l,...p}=t.checkPendingFunctions,{[n]:a,...d}=t.retryAttempts;return{uploads:o,uploadFunctions:c,checkPendingFunctions:p,retryAttempts:d}})},uploadAll:async n=>{const s=e().uploadFunctions[n];if(!s)return;const o=Object.entries(s);if(o.length===0)return;const r=async(c,l,p=1)=>{e().startUpload(n,c);try{await l(a=>{e().setProgress(n,c,a)}),e().completeUpload(n,c),u(a=>({retryAttempts:{...a.retryAttempts,[n]:{...a.retryAttempts[n]||{},[c]:0}}}))}catch(a){const d=a instanceof Error?a.message:"Upload failed",h=e().maxRetries;if((e().retryAttempts[n]?.[c]??0)<h){u(i=>({retryAttempts:{...i.retryAttempts,[n]:{...i.retryAttempts[n]||{},[c]:(i.retryAttempts[n]?.[c]??0)+1}}}));const P=e().retryDelay*Math.pow(2,p-1);return await new Promise(i=>setTimeout(i,P)),r(c,l,p+1)}else throw e().failUpload(n,c,d),a}};await Promise.all(o.map(async([c,l])=>{await r(c,l)}))},hasPendingUploads:n=>{const t=e(),s=t.uploadFunctions[n],o=t.checkPendingFunctions[n];return s?Object.entries(s).some(([r,c])=>{const l=o?.[r];return l?l():!0}):!1},getStatus:(n,t)=>e().uploads[n]?.[t]?.status??"idle",getProgress:(n,t)=>e().uploads[n]?.[t]?.progress??0,getTotalProgress:n=>{const t=e().uploads[n];if(!t)return 100;const s=Object.values(t);if(s.length===0)return 100;const o=s.reduce((r,c)=>r+c.progress,0);return Math.round(o/s.length)},isUploading:n=>{const t=e().uploads[n];return t?Object.values(t).some(s=>s.status==="uploading"):!1},getError:(n,t)=>e().uploads[n]?.[t]?.error??null})}),k=u=>F(e=>{const n=e.uploads[u];if(!n)return 100;const t=Object.values(n);if(t.length===0)return 100;const s=t.reduce((o,r)=>o+r.progress,0);return Math.round(s/t.length)}),_=u=>F(e=>{const n=e.uploads[u];return n?Object.values(n).some(t=>t.status==="uploading"):!1}),x=(u,e)=>F(n=>n.uploads[u]?.[e]?.progress??0),m=(u,e)=>F(n=>n.uploads[u]?.[e]?.status??"idle");export{x as useFieldProgress,m as useFieldUploadStatus,_ as useIsUploading,k as useTotalProgress,F as useUploadStore};
@@ -2,7 +2,7 @@
2
2
  * @fileoverview CRUD Stores
3
3
  * @description Store exports for CRUD feature
4
4
  *
5
- * @version 0.0.1
5
+ * @version 0.1.0
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */