@donotdev/crud 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/CrudService.js +1 -1
  2. package/dist/CrudStore.js +1 -1
  3. package/dist/FieldRegistry.js +1 -1
  4. package/dist/adapters/FirestoreAdapter.js +1 -1
  5. package/dist/adapters/FunctionsAdapter.js +1 -1
  6. package/dist/adapters/index.js +1 -1
  7. package/dist/components/CrudButton.js +1 -1
  8. package/dist/components/DisplayFieldRenderer.js +1 -1
  9. package/dist/components/EntityDisplayRenderer.d.ts +2 -2
  10. package/dist/components/EntityDisplayRenderer.d.ts.map +1 -1
  11. package/dist/components/EntityDisplayRenderer.js +1 -1
  12. package/dist/components/EntityFilters.js +1 -1
  13. package/dist/components/EntityFormRenderer.js +1 -1
  14. package/dist/components/FormFieldRenderer.js +1 -1
  15. package/dist/components/FormLayout.js +1 -1
  16. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  17. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  18. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  19. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  20. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  21. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  22. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  23. package/dist/components/controlled/complex/index.js +1 -1
  24. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  25. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  26. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  27. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  28. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  29. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  30. package/dist/components/controlled/file/index.js +1 -1
  31. package/dist/components/controlled/index.js +1 -1
  32. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  33. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
  34. package/dist/components/controlled/input/ControlledDurationField.d.ts +7 -0
  35. package/dist/components/controlled/input/ControlledDurationField.d.ts.map +1 -0
  36. package/dist/components/controlled/input/ControlledDurationField.js +1 -0
  37. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  38. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  39. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  40. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  41. package/dist/components/controlled/input/ControlledPriceField.js +1 -1
  42. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  43. package/dist/components/controlled/input/ControlledRatingField.js +1 -1
  44. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  45. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  46. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  47. package/dist/components/controlled/input/index.d.ts +1 -0
  48. package/dist/components/controlled/input/index.d.ts.map +1 -1
  49. package/dist/components/controlled/input/index.js +1 -1
  50. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  51. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  52. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  53. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  54. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  55. package/dist/components/controlled/select/index.js +1 -1
  56. package/dist/components/controlled/types.js +1 -1
  57. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
  58. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
  59. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -1
  60. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
  61. package/dist/components/fields/display/DateFieldDisplay.js +1 -1
  62. package/dist/components/fields/display/DropdownDisplay.js +1 -1
  63. package/dist/components/fields/display/FileFieldDisplay.js +1 -1
  64. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -1
  65. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -1
  66. package/dist/components/fields/display/ImageFieldDisplay.js +1 -1
  67. package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
  68. package/dist/components/fields/display/MapFieldDisplay.js +1 -1
  69. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -1
  70. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -1
  71. package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
  72. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
  73. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -1
  74. package/dist/components/fields/display/RadioFieldDisplay.js +1 -1
  75. package/dist/components/fields/display/RangeFieldDisplay.js +1 -1
  76. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
  77. package/dist/components/fields/display/RichTextDisplay.js +2 -2
  78. package/dist/components/fields/display/TextAreaDisplay.js +1 -1
  79. package/dist/components/fields/display/TextFieldDisplay.js +1 -1
  80. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
  81. package/dist/components/fields/display/index.js +1 -1
  82. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  83. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  84. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  85. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  86. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  87. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  88. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  89. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  90. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  91. package/dist/components/form/fields/DropdownComponent.js +1 -1
  92. package/dist/components/form/fields/DurationFieldComponent.d.ts +42 -0
  93. package/dist/components/form/fields/DurationFieldComponent.d.ts.map +1 -0
  94. package/dist/components/form/fields/DurationFieldComponent.js +1 -0
  95. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  96. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  97. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  98. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  99. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  100. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  101. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  102. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  103. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  104. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  105. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  106. package/dist/components/form/fields/PriceFieldComponent.js +1 -1
  107. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  108. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  109. package/dist/components/form/fields/RatingFieldComponent.js +1 -1
  110. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  111. package/dist/components/form/fields/RichTextComponent.js +1 -1
  112. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  113. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  114. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  115. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  116. package/dist/components/form/fields/index.d.ts +3 -0
  117. package/dist/components/form/fields/index.d.ts.map +1 -1
  118. package/dist/components/form/fields/index.js +1 -1
  119. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  120. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  121. package/dist/components/index.js +1 -1
  122. package/dist/contexts/UploadContext.js +1 -1
  123. package/dist/contexts/index.js +1 -1
  124. package/dist/fieldTypeRegistry.js +1 -1
  125. package/dist/forms/hooks/index.js +1 -1
  126. package/dist/forms/hooks/useController.js +1 -1
  127. package/dist/forms/hooks/useEntityField.js +1 -1
  128. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  129. package/dist/forms/hooks/useEntityForm.js +1 -1
  130. package/dist/forms/index.js +1 -1
  131. package/dist/forms/types.d.ts +5 -3
  132. package/dist/forms/types.d.ts.map +1 -1
  133. package/dist/forms/utils/getFieldsForOperation.d.ts +2 -3
  134. package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
  135. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  136. package/dist/forms/utils/index.js +1 -1
  137. package/dist/forms/utils/isFieldEditable.d.ts +1 -1
  138. package/dist/forms/utils/isFieldEditable.d.ts.map +1 -1
  139. package/dist/forms/utils/isFieldEditable.js +1 -1
  140. package/dist/forms/utils/translateFieldLabel.js +1 -1
  141. package/dist/forms/utils/validateEntity.js +1 -1
  142. package/dist/hooks/index.js +1 -1
  143. package/dist/hooks/useEntityFavorites.js +1 -1
  144. package/dist/hooks/useFileUpload.js +1 -1
  145. package/dist/hooks/useFormNavigationGuard.js +1 -1
  146. package/dist/hooks/useRelatedItems.js +1 -1
  147. package/dist/hooks/useUnsavedChangesWarning.js +1 -1
  148. package/dist/index.js +1 -1
  149. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -1
  150. package/dist/registerBuiltinFieldTypes.js +1 -1
  151. package/dist/stores/FormStore.js +1 -1
  152. package/dist/stores/UploadStore.js +1 -1
  153. package/dist/stores/index.js +1 -1
  154. package/dist/tsconfig.tsbuildinfo +1 -1
  155. package/dist/useBaseCrudList.js +1 -1
  156. package/dist/useCrud.js +1 -1
  157. package/dist/useCrudCardList.js +1 -1
  158. package/dist/useCrudList.js +1 -1
  159. package/dist/utils/collections.js +1 -1
  160. package/dist/utils/fileStorage.js +1 -1
  161. package/dist/utils/imageProcessing.js +1 -1
  162. package/dist/utils/imageStorage.js +1 -1
  163. package/dist/utils/imageUtils.js +1 -1
  164. package/dist/utils/mergeWithOptimistic.js +1 -1
  165. package/dist/utils/scopeUtils.js +1 -1
  166. package/dist/utils/uploadValidation.js +1 -1
  167. package/package.json +2 -2
@@ -1 +1 @@
1
- "use client";import{getFieldRegistry as i}from"./FieldRegistry";const t=new Map;function a(e){const{type:r,components:n}=e;n&&i().registerComponent(r,n.controlled,n.uncontrolled),t.set(r,e)}function l(e){return t.get(e)}function o(e){return t.get(e)?.filterType}function s(e){return t.get(e)?.displayFormatter}function u(e){return t.get(e)?.filterable??!1}function c(e){return t.get(e)?.valueType}function p(){t.clear()}export{p as clearFieldTypeRegistry,s as getDisplayFormatter,l as getFieldTypeMetadata,o as getFilterType,c as getValueType,u as isFilterable,a as registerBuiltinFieldType};
1
+ "use client";import{getFieldRegistry as i}from"./FieldRegistry";const t=new Map;function p(e){const{type:n,components:r}=e;r&&i().registerComponent(n,r.controlled,r.uncontrolled),t.set(n,e)}function g(e){return t.get(e)}function s(e){return t.get(e)?.filterType}function u(e){return t.get(e)?.displayFormatter}function c(e){return t.get(e)?.filterable??!1}function a(e){return t.get(e)?.valueType}function y(){t.clear()}export{y as clearFieldTypeRegistry,u as getDisplayFormatter,g as getFieldTypeMetadata,s as getFilterType,a as getValueType,c as isFilterable,p as registerBuiltinFieldType};
@@ -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 r}from"react-hook-form";function o(e){return r(e)}export{o as useController};
1
+ "use client";import{useController as e}from"react-hook-form";function t(r){return e(r)}export{t as useController};
@@ -1 +1 @@
1
- "use client";import{useMemo as o}from"react";import{useController as y}from"./useController";import{isFieldEditable as p}from"../utils";function v(a,i){const{entity:m,operation:r,viewerRole:n,fields:d}=a,s=m.fields[i],e=o(()=>s?{...s,name:s.name||i,label:s.label||i}:{name:i,type:"text",label:i,visibility:"user"},[i,s]),l=o(()=>d.some(f=>f.name===i),[d,i]),b=o(()=>!l||r==="edit"&&e.visibility==="technical"&&e.editable===void 0?!1:p(e.editable,n,r),[l,r,e.visibility,e.editable,n]),{field:c,fieldState:t}=y({name:i,control:a.control}),u=o(()=>({error:t.error?.message,touched:t.isTouched,isDirty:t.isDirty}),[t.error?.message,t.isTouched,t.isDirty]);return{field:c,meta:u,config:e,isEditable:b,isVisible:l}}export{v as useEntityField};
1
+ "use client";import{useMemo as s}from"react";import{useController as m}from"./useController";import{isFieldEditable as p}from"../utils";function g(l,e){const{entity:a,operation:o,viewerRole:c,fields:u}=l,r=a.fields[e],t=s(()=>r?{...r,name:r.name||e,label:r.label||e}:{name:e,type:"text",label:e,visibility:"user"},[e,r]),n=s(()=>u.some(f=>f.name===e),[u,e]),b=s(()=>!n||o==="edit"&&t.visibility==="technical"&&t.editable===void 0?!1:p(t.editable,c,o),[n,o,t.visibility,t.editable,c]),{field:d,fieldState:i}=m({name:e,control:l.control}),y=s(()=>({error:i.error?.message,touched:i.isTouched,isDirty:i.isDirty}),[i.error?.message,i.isTouched,i.isDirty]);return{field:d,meta:y,config:t,isEditable:b,isVisible:n}}export{g as useEntityField};
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAwdrB"}
1
+ {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAyerB"}
@@ -1 +1 @@
1
- "use client";import{valibotResolver as B}from"@hookform/resolvers/valibot";import{useMemo as m,useEffect as k,useRef as g,useCallback as y}from"react";import{useForm as ee,useWatch as te}from"react-hook-form";import{useLocalStorage as re,BACKEND_GENERATED_FIELD_NAMES as ae,createSchemas as oe}from"@donotdev/core";import{useFormStore as O,useFormStatus as ne,useUploadProgress as se}from"../../stores";import{useUploadStore as C}from"../../stores/UploadStore";import{checkForBlobUrls as L}from"../../utils/uploadValidation";import{getFieldsForOperation as ie}from"../utils";function ue(l,_={}){const{formId:e,operation:J,defaultValues:u,viewerRole:U="admin",mode:M="onBlur",t:q,autoSave:f=!1}=_,n=J??(u?"edit":"create"),z=ne(e??""),G=se(e??""),b=m(()=>oe(l),[l.name]),D=m(()=>B(b.create),[b.create]),N=m(()=>B(b.draft),[b.draft]),K=m(()=>async(t,a,o)=>((t?.status??u?.status)==="draft"?N:D)(t,a,o),[D,N,u?.status]),i=m(()=>{if(!u)return u;const t={...u};return Object.entries(l.fields).forEach(([a,o])=>{const r=t[a],c=!(a in u)||r===null||r===void 0;if(o.type==="switch"){if(r==null){const v=o.options?.fieldSpecific;t[a]=v?.uncheckedValue??!1}}else c&&(o.type==="price"?t[a]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:(o.type==="checkbox"||o.type==="boolean")&&(t[a]=!1))}),t},[u,l.fields]),s=ee({defaultValues:i,mode:M,resolver:K,shouldUnregister:!1,shouldFocusError:!0}),h=g(null);k(()=>{if(n==="edit"&&i){const t=i.id??null;t&&t!==h.current?(s.reset(i),h.current=t):!t&&h.current===null&&(s.reset(i),h.current="initialized")}},[n,i,s]);const W=m(()=>`${l.name.toLowerCase()}-form-draft`,[l.name]),{value:R,setValue:P,removeValue:E}=re(W,{defaultValue:null,syncAcrossTabs:!0}),w=g(!1);k(()=>{!f||n!=="create"||u||w.current||(R&&s.reset(R),w.current=!0)},[f,n,u,R,s]);const d=te({control:s.control}),F=g(!1),S=g(null),V=g(void 0),T=g(!0);k(()=>{if(T.current){T.current=!1,V.current=d?JSON.stringify(d):void 0;return}if(!f||n!=="create"||F.current||!w.current)return;const t=d?JSON.stringify(d):void 0;if(V.current!==t)return V.current=t,S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{d&&Object.values(d).some(a=>a!=null&&a!=="")&&P(d)},3e3),()=>{S.current&&clearTimeout(S.current)}},[d,f,n,P]);const A=y(async()=>{if(!e)return!0;const t=C.getState(),a=O.getState();if(!t.hasPendingUploads(e))return!0;try{a.setUploading(e,0),await t.uploadAll(e),await new Promise(p=>setTimeout(p,50));let o=s.getValues(),r=L(o),c=0;const v=5;for(;r.length>0&&c<v;)c++,await new Promise(p=>setTimeout(p,100)),o=s.getValues(),r=L(o);if(r.length>0){const p=`Upload incomplete: files still pending at ${r.join(", ")}`;return a.setError(e,p),!1}return!0}catch(o){const r=o instanceof Error?o.message:"File upload failed";return O.getState().setError(e,r),!1}},[e,s]),I=y(t=>n!=="create"?t:Object.fromEntries(Object.entries(t).filter(([a])=>!ae.includes(a))),[n]),$=y(t=>{if(typeof window>"u")return;const a=Object.keys(t).find(r=>r!=="root"&&t[r]);if(!a)return;const o=document.querySelector(`input[name="${a}"][aria-invalid="true"], textarea[name="${a}"][aria-invalid="true"], select[name="${a}"][aria-invalid="true"]`);o&&(o.scrollIntoView({behavior:"smooth",block:"center"}),o.focus())},[]),x=s.handleSubmit,H=m(()=>((t,a)=>async o=>{o?.preventDefault?.();const r=e?O.getState():null;e&&r&&r.startSubmit(e),F.current=!0;try{if(!await A()){F.current=!1;return}e&&r&&r.setValidating(e),await x(async(c,v)=>{e&&r&&r.setSubmitting(e);const p=I(c);try{await t(p,v),f&&n==="create"&&E(),e&&r&&r.setSuccess(e)}catch(j){const Z=j instanceof Error?j.message:"Submission failed";throw e&&r&&r.setError(e,Z),j}},c=>{e&&r&&r.setError(e,"Validation failed"),$(c),a?.(c)})(o)}finally{F.current=!1}}),[x,e,A,I,$,f,n,E]),Q=y(()=>{f&&n==="create"&&E(),s.reset(i),V.current=i?JSON.stringify(i):void 0,T.current=!0,w.current=!1},[f,n,E,s,i]),X=y(()=>{e&&(O.getState().cleanup(e),C.getState().cleanup(e))},[e]),Y=m(()=>ie(l,{operation:n,viewerRole:U,availableFields:void 0}),[l,n,U]);return{...s,handleSubmit:H,fields:Y,operation:n,entity:l,t:q??(t=>t),viewerRole:U,formId:e,formStatus:e?z:"idle",uploadProgress:e?G:0,cleanup:X,isDirty:s.formState.isDirty,resetForm:Q,originalValues:i}}export{ue as useEntityForm};
1
+ "use client";import{valibotResolver as z}from"@hookform/resolvers/valibot";import{useMemo as p,useEffect as U,useRef as S,useCallback as y}from"react";import{useForm as re,useWatch as se}from"react-hook-form";import{useLocalStorage as ne,BACKEND_GENERATED_FIELD_NAMES as oe,createSchemas as ae}from"@donotdev/core";import{useFormStore as F,useFormStatus as ue,useUploadProgress as ce}from"../../stores";import{useUploadStore as B}from"../../stores/UploadStore";import{checkForBlobUrls as L}from"../../utils/uploadValidation";import{getFieldsForOperation as ie}from"../utils";function ve(i,J={}){const{formId:r,operation:_,defaultValues:c,viewerRole:K,mode:W="onBlur",t:q,autoSave:d=!1}=J,R=K??"guest",o=_??(c?"edit":"create"),G=ue(r??""),H=ce(r??""),g=p(()=>ae(i),[i.name]),I=p(()=>z(g.create),[g.create]),k=p(()=>z(g.draft),[g.draft]),Q=p(()=>async(t,n,e)=>((t?.status??c?.status)==="draft"?k:I)(t,n,e),[I,k,c?.status]),u=p(()=>{if(!c)return c;const t={...c};return Object.entries(i.fields).forEach(([n,e])=>{const s=t[n],l=!(n in c)||s===null||s===void 0;if(e.type==="switch"){if(s==null){const f=e.options?.fieldSpecific;t[n]=f?.uncheckedValue??!1}}else l&&(e.type==="price"?t[n]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:e.type==="checkbox"||e.type==="boolean"?t[n]=!1:e.type==="text"||e.type==="textarea"||e.type==="email"||e.type==="url"||e.type==="tel"||e.type==="password"||e.type==="color"?t[n]="":(e.type==="number"||e.type==="range"||e.type==="rating")&&(t[n]=void 0))}),t},[c,i.fields]),a=re({defaultValues:u,mode:W,resolver:Q,shouldUnregister:!1,shouldFocusError:!0}),v=S(null);U(()=>{if(o==="edit"&&u){const t=u.id??null;t&&t!==v.current?(a.reset(u),v.current=t):!t&&v.current===null&&(a.reset(u),v.current="initialized")}},[o,u,a]);const X=p(()=>`${i.name.toLowerCase()}-form-draft`,[i.name]),{value:P,setValue:M,removeValue:w}=ne(X,{defaultValue:null,syncAcrossTabs:!0}),E=S(!1);U(()=>{!d||o!=="create"||c||E.current||(P&&a.reset(P),E.current=!0)},[d,o,c,P,a]);const m=se({control:a.control}),V=S(!1),h=S(null),D=S(void 0),T=S(!0);U(()=>{if(T.current){T.current=!1,D.current=m?JSON.stringify(m):void 0;return}if(!d||o!=="create"||V.current||!E.current)return;const t=m?JSON.stringify(m):void 0;if(D.current!==t)return D.current=t,h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{if(!m)return;Object.values(m).some(e=>e!=null&&e!=="")&&M(m)},3e3),()=>{h.current&&clearTimeout(h.current)}},[m,d,o,M]);const j=y(async()=>{if(!r)return!0;const t=B.getState(),n=F.getState();if(!t.hasPendingUploads(r))return!0;try{n.setUploading(r,0),await t.uploadAll(r),await new Promise(f=>setTimeout(f,50));let e=a.getValues(),s=L(e),b=0;const l=5;for(;s.length>0&&b<l;)b++,await new Promise(f=>setTimeout(f,100)),e=a.getValues(),s=L(e);if(s.length>0){const f=`Upload incomplete: files still pending at ${s.join(", ")}`;return n.setError(r,f),!1}return!0}catch(e){const s=e instanceof Error?e.message:"File upload failed";return F.getState().setError(r,s),!1}},[r,a]),x=y(t=>o!=="create"?t:Object.fromEntries(Object.entries(t).filter(([n])=>!oe.includes(n))),[o]),A=y(t=>{if(typeof window>"u")return;const n=Object.keys(t).find(s=>s!=="root"&&t[s]);if(!n)return;const e=document.querySelector(`input[name="${n}"][aria-invalid="true"], textarea[name="${n}"][aria-invalid="true"], select[name="${n}"][aria-invalid="true"]`);e&&(e.scrollIntoView({behavior:"smooth",block:"center"}),e.focus())},[]),$=a.handleSubmit,Y=p(()=>((t,n)=>async e=>{e?.preventDefault?.();const s=r?F.getState():null;r&&s&&s.startSubmit(r),V.current=!0;try{if(!await j()){V.current=!1;return}r&&s&&s.setValidating(r),await $(async(l,f)=>{r&&s&&s.setSubmitting(r);const ee=x(l);try{await t(ee,f),d&&o==="create"&&w(),r&&s&&s.setSuccess(r)}catch(O){const te=O instanceof Error?O.message:"Submission failed";throw r&&s&&s.setError(r,te),O}},l=>{r&&s&&s.setError(r,"Validation failed"),A(l),n?.(l)})(e)}finally{V.current=!1}}),[$,r,j,x,A,d,o,w]),Z=y(()=>{d&&o==="create"&&w(),a.reset(u),D.current=u?JSON.stringify(u):void 0,T.current=!0,E.current=!1},[d,o,w,a,u]),N=y(()=>{r&&(F.getState().cleanup(r),B.getState().cleanup(r))},[r]),C=p(()=>ie(i,{operation:o,viewerRole:R,availableFields:void 0}),[i,o,R]);return{...a,handleSubmit:Y,fields:C,operation:o,entity:i,t:q??(t=>t),viewerRole:R,formId:r,formStatus:r?G:"idle",uploadProgress:r?H:0,cleanup:N,isDirty:a.formState.isDirty,resetForm:Z,originalValues:u}}export{ve as useEntityForm};
@@ -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};
@@ -97,9 +97,10 @@ export interface UseEntityFormOptions<E extends Entity> {
97
97
  /**
98
98
  * Viewer role for editability checks.
99
99
  * Determines which fields render as inputs vs read-only.
100
- * @default 'admin'
100
+ * If not provided, defaults to 'guest' (most restrictive)
101
+ * @default 'guest'
101
102
  */
102
- viewerRole?: ViewerRole;
103
+ viewerRole?: string;
103
104
  /**
104
105
  * React Hook Form mode.
105
106
  * @default 'onSubmit'
@@ -150,8 +151,9 @@ export interface EntityFormReturn<E extends Entity> extends UseFormReturn<InferE
150
151
  t: (key: string, options?: Record<string, unknown>) => string;
151
152
  /**
152
153
  * Current viewer role.
154
+ * Always has a value (defaults to 'guest' if not provided).
153
155
  */
154
- viewerRole: ViewerRole;
156
+ viewerRole: string;
155
157
  /**
156
158
  * Form ID for state tracking.
157
159
  * Undefined if not provided in options.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,6 @@
9
9
  import type { Entity, EntityField, FieldType } from '@donotdev/core';
10
10
  /** Entity fields input - supports Entity, Entity['fields'], or plain Record */
11
11
  export type EntityFieldsInput = Entity | Entity['fields'] | Record<string, EntityField<FieldType>>;
12
- import type { ViewerRole } from './isFieldEditable';
13
12
  /** Field with computed editability for rendering */
14
13
  export interface RenderableField<T extends FieldType = FieldType> {
15
14
  /** Field name/key */
@@ -23,8 +22,8 @@ export interface RenderableField<T extends FieldType = FieldType> {
23
22
  export interface GetFieldsForOperationOptions {
24
23
  /** Form operation type */
25
24
  operation: 'create' | 'edit';
26
- /** Viewer role for editability checks */
27
- viewerRole?: ViewerRole;
25
+ /** Viewer role for editability checks (defaults to 'guest' if undefined) */
26
+ viewerRole?: string;
28
27
  /**
29
28
  * Available field names (for edit mode).
30
29
  * When provided, only fields in this list are returned.
@@ -1 +1 @@
1
- {"version":3,"file":"getFieldsForOperation.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/getFieldsForOperation.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAErE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,MAAM,CAAC,QAAQ,CAAC,GAChB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AAI3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,oDAAoD;AACpD,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC9D,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,kCAAkC;AAClC,MAAM,WAAW,4BAA4B;IAC3C,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,yCAAyC;IACzC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,4BAA4B,GACpC,eAAe,EAAE,CAoDnB"}
1
+ {"version":3,"file":"getFieldsForOperation.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/getFieldsForOperation.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGrE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,MAAM,CAAC,QAAQ,CAAC,GAChB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AAI3C,oDAAoD;AACpD,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC9D,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,kCAAkC;AAClC,MAAM,WAAW,4BAA4B;IAC3C,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,4BAA4B,GACpC,eAAe,EAAE,CAmDnB"}
@@ -1 +1 @@
1
- import{isFieldEditable as u}from"./isFieldEditable";function p(i,s){const{operation:n,viewerRole:c="admin",availableFields:o}=s,r=i&&typeof i=="object"&&"fields"in i&&"name"in i?i.fields:i,f=Object.entries(r),l=[];for(const[a,b]of f){const e=b,t=e.visibility||"user";if(n==="create"){if(t==="technical"||t==="hidden")continue}else if(t==="hidden"||o&&!o.includes(a))continue;let d=u(e.editable,c,n);n==="edit"&&t==="technical"&&e.editable===void 0&&(d=!1),l.push({name:a,config:e,editable:d})}return l}export{p 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};
@@ -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};
@@ -31,5 +31,5 @@ export type ViewerRole = 'public' | 'guest' | 'user' | 'admin' | 'super';
31
31
  * @since 0.0.1
32
32
  * @author AMBROISE PARK Consulting
33
33
  */
34
- export declare function isFieldEditable(editable: Editable | undefined, viewerRole: ViewerRole, operation: 'create' | 'edit'): boolean;
34
+ export declare function isFieldEditable(editable: Editable | undefined, viewerRole: string, operation: 'create' | 'edit'): boolean;
35
35
  //# sourceMappingURL=isFieldEditable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isFieldEditable.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/isFieldEditable.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,QAAQ,GAAG,MAAM,GAC3B,OAAO,CAcT"}
1
+ {"version":3,"file":"isFieldEditable.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/isFieldEditable.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,QAAQ,GAAG,MAAM,GAC3B,OAAO,CAcT"}
@@ -1 +1 @@
1
- import{hasRoleAccess as t,USER_ROLES as o}from"@donotdev/core";function s(e,a,i){return e===void 0||e===!0?!0:e===!1?!1:e==="admin"?t(a,o.ADMIN):e==="create-only"?i==="create":!0}export{s as isFieldEditable};
1
+ import{hasRoleAccess as t,USER_ROLES as u}from"@donotdev/core";function i(r,e,n){return r===void 0||r===!0?!0:r===!1?!1:r==="admin"?t(e,u.ADMIN):r==="create-only"?n==="create":!0}export{i as isFieldEditable};
@@ -1 +1 @@
1
- function t(e,n){if(typeof e=="string"&&e.includes(":")){const r=e.split(":"),s=r[1]??e,a=r[0];return n(s,{ns:a})}return n(e)}function l(e,n,r){const s=n?.label||e;return t(s,r)}export{l as translateFieldLabel,t as translateLabel};
1
+ function o(t,n){if(typeof t=="string"&&t.includes(":")){const e=t.split(":"),r=e[1]??t,s=e[0];return n(r,{ns:s})}return n(t)}function c(t,n,e){const r=n?.label||t;return o(r,e)}export{c as translateFieldLabel,o as translateLabel};
@@ -1 +1 @@
1
- import*as o from"valibot";import{createSchemas as m}from"@donotdev/core";function i(t,r,c="create"){const e=m(t),u={create:e.create,draft:e.draft,update:e.update,full:e.get}[c],s=o.safeParse(u,r);return s.success?{success:!0,data:s.output}:{success:!1,issues:s.issues.map(a=>({path:a.path?.map(p=>p.key).join(".")||"",message:a.message}))}}export{i as validateEntity};
1
+ import*as o from"valibot";import{createSchemas as p}from"@donotdev/core";function h(a,c,r="create"){const s=p(a),u={create:s.create,draft:s.draft,update:s.update,full:s.get}[r],e=o.safeParse(u,c);return e.success?{success:!0,data:e.output}:{success:!1,issues:e.issues.map(t=>({path:t.path?.map(m=>m.key).join(".")||"",message:t.message}))}}export{h as validateEntity};
@@ -1 +1 @@
1
- import{useFileUpload as s}from"./useFileUpload";import{useUnsavedChangesWarning as a,useConfirmNavigation as e}from"./useUnsavedChangesWarning";import{useEntityFavorites as i}from"./useEntityFavorites";import{useRelatedItems as o}from"./useRelatedItems";export{e as useConfirmNavigation,i as useEntityFavorites,s as useFileUpload,o as useRelatedItems,a as useUnsavedChangesWarning};
1
+ import{useFileUpload as r}from"./useFileUpload";import{useUnsavedChangesWarning as s,useConfirmNavigation as a}from"./useUnsavedChangesWarning";import{useEntityFavorites as n}from"./useEntityFavorites";import{useRelatedItems as f}from"./useRelatedItems";export{a as useConfirmNavigation,n as useEntityFavorites,r as useFileUpload,f as useRelatedItems,s as useUnsavedChangesWarning};
@@ -1 +1 @@
1
- import{useCallback as o}from"react";import{useLocalStorage as p}from"@donotdev/core";function y(s={}){const{storageKey:l,collection:u="entities"}=s,d=l||`favorites-${u}`,{value:t,setValue:a,isLoaded:c}=p(d,{defaultValue:[]}),v=o(e=>t.includes(e),[t]),n=o(e=>{a(i=>i.includes(e)?i.filter(r=>r!==e):[...i,e])},[a]),f=o(e=>{a(i=>i.includes(e)?i:[...i,e])},[a]),F=o(e=>{a(i=>i.filter(r=>r!==e))},[a]),m=o(()=>{a([])},[a]),g=o(e=>t.includes(e.id),[t]);return{favorites:t,isFavorite:v,toggleFavorite:n,addFavorite:f,removeFavorite:F,clearFavorites:m,favoritesFilter:g,isLoaded:c}}export{y as useEntityFavorites};
1
+ import{useCallback as r}from"react";import{useLocalStorage as y}from"@donotdev/core";function V(n={}){const{storageKey:a,collection:c="entities"}=n,u=a||`favorites-${c}`,{value:s,setValue:o,isLoaded:l}=y(u,{defaultValue:[]}),f=r(t=>s.includes(t),[s]),v=r(t=>{o(e=>e.includes(t)?e.filter(i=>i!==t):[...e,t])},[o]),F=r(t=>{o(e=>e.includes(t)?e:[...e,t])},[o]),d=r(t=>{o(e=>e.filter(i=>i!==t))},[o]),m=r(()=>{o([])},[o]),g=r(t=>s.includes(t.id),[s]);return{favorites:s,isFavorite:f,toggleFavorite:v,addFavorite:F,removeFavorite:d,clearFavorites:m,favoritesFilter:g,isLoaded:l}}export{V as useEntityFavorites};
@@ -1 +1 @@
1
- "use client";import{useState as J,useCallback as w,useEffect as A,useRef as v,startTransition as q}from"react";import{handleError as C}from"@donotdev/core";import{useUploadContext as G}from"../contexts/UploadContext";import{useUploadStore as N}from"../stores/UploadStore";let P=0;function W(s){if(s){const u=s.split("/").pop()?.split("?")[0];if(u)return`file-${u}`}P+=1;const a=typeof performance<"u"?performance.now():Date.now(),d=Math.random().toString(36).slice(2,11);return`file-${P}-${a}-${d}`}function H(s){return URL.createObjectURL(s)}function k(s){s.startsWith("blob:")&&URL.revokeObjectURL(s)}function K(s,a,d){return a.length>0&&!a.some(u=>{if(u.endsWith("/*")){const y=u.slice(0,-2);return s.type.startsWith(y)}return s.type===u})?{valid:!1,error:`File type ${s.type} not accepted`}:s.size>d?{valid:!1,error:`File exceeds ${(d/1048576).toFixed(0)}MB limit`}:{valid:!0}}function Q({name:s,value:a,onChange:d,multiple:u=!1,maxFiles:y=10,maxSize:$=10*1024*1024,accept:x=[],storagePath:V="uploads",uploadFn:g}){const h=G(),U=!!h,[f,c]=J([]),R=v(!1),E=v(null),F=v(a),L=v([]);A(()=>{if(R.current){R.current=!1;return}const e=a?JSON.stringify((Array.isArray(a)?a:[a]).map(n=>n.fullUrl).filter(Boolean)):null;e!==E.current&&(E.current=e,F.current=a,q(()=>{if(a){const n=(Array.isArray(a)?a:[a]).filter(i=>i.fullUrl).map((i,r)=>({id:`${W(i.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:i.thumbUrl||i.fullUrl,progress:100,uploaded:i,error:null}));c(n)}else c([])}))},[a]),A(()=>{L.current=f},[f]),A(()=>()=>{L.current.forEach(e=>k(e.previewURL))},[]);const p=w((e,n=!1)=>{const i=(n?e.filter(l=>!l.error):e.filter(l=>l.uploaded&&!l.error)).map(l=>l.uploaded?l.uploaded:n&&U?{fullUrl:l.previewURL,thumbUrl:l.previewURL}:null).filter(l=>l!==null);let r;u?r=i.length>0?i:null:r=i[0]||null;const t=F.current;(()=>{if(!r&&!t)return!1;if(!r||!t)return!0;if(u&&Array.isArray(r)&&Array.isArray(t)){if(r.length!==t.length)return!0;const l=r.map(m=>m.fullUrl).join(","),o=t.map(m=>m.fullUrl).join(",");return l!==o}return!u&&!Array.isArray(r)&&!Array.isArray(t)?r.fullUrl!==t.fullUrl:!0})()&&(R.current=!0,F.current=r,d(r))},[u,d,U]),b=w(async()=>{if(!g)return;let e=[];if(c(i=>(e=i.filter(r=>!r.uploaded&&!r.error),e.length===0?i:i.map(r=>e.some(t=>t.id===r.id)?{...r,progress:0}:r))),e.length===0)return;const n=await Promise.allSettled(e.map(async i=>{try{const r=await g(i.file,t=>{c(l=>l.map(o=>o.id===i.id?{...o,progress:t}:o))});return{id:i.id,picture:r,error:null}}catch(r){const t=r instanceof Error?r.message:"Upload failed";return{id:i.id,picture:null,error:t}}}));c(i=>{const r=i.map(t=>{const l=n.find(o=>o.status==="fulfilled"&&o.value.id===t.id);if(l&&l.status==="fulfilled"){const o=l.value;return{...t,uploaded:o.picture,progress:o.picture?100:null,error:o.error}}return t});return p(r,!1),r})},[g,p]),M=v(b);M.current=b;const S=N(e=>e.registerUpload),j=N(e=>e.unregisterUpload);A(()=>{if(!(!h||!s))return S(h,s,async()=>{await M.current()},()=>L.current.some(e=>!e.uploaded&&!e.error)),()=>{j(h,s)}},[h,s,S,j]);const O=w(async e=>{if(g){c(n=>n.map(i=>i.id===e.id?{...i,progress:0}:i));try{const n=await g(e.file,i=>{c(r=>r.map(t=>t.id===e.id?{...t,progress:i}:t))});c(i=>{const r=i.map(t=>t.id===e.id?{...t,uploaded:n,progress:100,error:null}:t);return p(r,!1),r})}catch(n){const i=n instanceof Error?n.message:"Upload failed";c(r=>r.map(t=>t.id===e.id?{...t,error:i,progress:null}:t))}}},[g,p]),B=w(e=>{c(n=>{const i=(u?y:1)-n.length;if(i<=0)return C(new Error("Maximum files reached"),{userMessage:u?`Maximum ${y} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),n;const r=e.slice(0,i),t=[];for(const o of r){const m=K(o,x,$);if(!m.valid){C(new Error(m.error),{userMessage:m.error,severity:"warning",showNotification:!0});continue}t.push({id:W(),file:o,previewURL:H(o),progress:null,uploaded:null,error:null})}if(t.length===0)return n;const l=u?[...n,...t]:t;return U?setTimeout(()=>{p(l,!0)},0):t.forEach(o=>O(o)),l})},[u,y,x,$,U,O,p]),D=w(e=>{c(n=>{const i=n.find(t=>t.id===e);i&&k(i.previewURL);const r=n.filter(t=>t.id!==e);return p(r,!1),r})},[p]),T=f.some(e=>!e.uploaded&&!e.error),z=f.some(e=>e.progress!==null&&e.progress<100),I=f.length>0?f.reduce((e,n)=>e+(n.progress??0),0)/f.length:0;return{files:f,addFiles:B,removeFile:D,hasPending:T,isUploading:z,progress:I,formId:h,isDeferred:U}}export{Q as useFileUpload};
1
+ "use client";import{useState as G,useCallback as R,useEffect as v,useRef as A,startTransition as H}from"react";import{handleError as j}from"@donotdev/core";import{useUploadContext as K}from"../contexts/UploadContext";import{useUploadStore as k}from"../stores/UploadStore";let B=0;function M(l){if(l){const d=l.split("/").pop()?.split("?")[0];if(d)return`file-${d}`}B+=1;const u=typeof performance<"u"?performance.now():Date.now(),g=Math.random().toString(36).slice(2,11);return`file-${B}-${u}-${g}`}function Q(l){return URL.createObjectURL(l)}function V(l){l.startsWith("blob:")&&URL.revokeObjectURL(l)}function X(l,u,g){return u.length>0&&!u.some(m=>{if(m.endsWith("/*")){const L=m.slice(0,-2);return l.type.startsWith(L)}return l.type===m})?{valid:!1,error:`File type ${l.type} not accepted`}:l.size>g?{valid:!1,error:`File exceeds ${(g/1048576).toFixed(0)}MB limit`}:{valid:!0}}function er({name:l,value:u,onChange:g,multiple:d=!1,maxFiles:m=10,maxSize:L=10*1024*1024,accept:x=[],storagePath:Y="uploads",uploadFn:U}){const h=K(),w=!!h,[f,c]=G([]),E=A(!1),P=A(null),F=A(u),$=A([]);v(()=>{if(E.current){E.current=!1;return}const e=u?JSON.stringify((Array.isArray(u)?u:[u]).map(s=>s.fullUrl).filter(Boolean)):null;e!==P.current&&(P.current=e,F.current=u,H(()=>{if(u){const n=(Array.isArray(u)?u:[u]).filter(t=>t.fullUrl).map((t,r)=>({id:`${M(t.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:t.thumbUrl||t.fullUrl,progress:100,uploaded:t,error:null}));c(n)}else c([])}))},[u]),v(()=>{$.current=f},[f]),v(()=>()=>{$.current.forEach(e=>V(e.previewURL))},[]);const p=R((e,s=!1)=>{const t=(s?e.filter(i=>!i.error):e.filter(i=>i.uploaded&&!i.error)).map(i=>i.uploaded?i.uploaded:s&&w?{fullUrl:i.previewURL,thumbUrl:i.previewURL}:null).filter(i=>i!==null);let r;d?r=t.length>0?t:null:r=t[0]||null;const o=F.current;(()=>{if(!r&&!o)return!1;if(!r||!o)return!0;if(d&&Array.isArray(r)&&Array.isArray(o)){if(r.length!==o.length)return!0;const i=r.map(b=>b.fullUrl).join(","),y=o.map(b=>b.fullUrl).join(",");return i!==y}return!d&&!Array.isArray(r)&&!Array.isArray(o)?r.fullUrl!==o.fullUrl:!0})()&&(E.current=!0,F.current=r,g(r))},[d,g,w]),S=R(async()=>{if(!U)return;let e=[];if(c(n=>(e=n.filter(t=>!t.uploaded&&!t.error),e.length===0?n:n.map(t=>e.some(r=>r.id===t.id)?{...t,progress:0}:t))),e.length===0)return;const s=await Promise.allSettled(e.map(async n=>{try{const t=await U(n.file,r=>{c(o=>o.map(a=>a.id===n.id?{...a,progress:r}:a))});return{id:n.id,picture:t,error:null}}catch(t){const r=t instanceof Error?t.message:"Upload failed";return{id:n.id,picture:null,error:r}}}));c(n=>{const t=n.map(r=>{const o=s.find(a=>a.status==="fulfilled"&&a.value.id===r.id);if(o&&o.status==="fulfilled"){const a=o.value;return{...r,uploaded:a.picture,progress:a.picture?100:null,error:a.error}}return r});return p(t,!1),t})},[U,p]),C=A(S);C.current=S;const I=k(e=>e.registerUpload),N=k(e=>e.unregisterUpload);v(()=>{if(!(!h||!l))return I(h,l,async()=>{await C.current()},()=>$.current.some(e=>!e.uploaded&&!e.error)),()=>{N(h,l)}},[h,l,I,N]);const T=R(async e=>{if(U){c(s=>s.map(n=>n.id===e.id?{...n,progress:0}:n));try{const s=await U(e.file,n=>{c(t=>t.map(r=>r.id===e.id?{...r,progress:n}:r))});c(n=>{const t=n.map(r=>r.id===e.id?{...r,uploaded:s,progress:100,error:null}:r);return p(t,!1),t})}catch(s){const n=s instanceof Error?s.message:"Upload failed";c(t=>t.map(r=>r.id===e.id?{...r,error:n,progress:null}:r))}}},[U,p]),D=R(e=>{c(s=>{const t=(d?m:1)-s.length;if(t<=0)return j(new Error("Maximum files reached"),{userMessage:d?`Maximum ${m} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),s;const r=e.slice(0,t),o=[];for(const i of r){const y=X(i,x,L);if(!y.valid){j(new Error(y.error),{userMessage:y.error,severity:"warning",showNotification:!0});continue}o.push({id:M(),file:i,previewURL:Q(i),progress:null,uploaded:null,error:null})}if(o.length===0)return s;const a=d?[...s,...o]:o;return w?setTimeout(()=>{p(a,!0)},0):o.forEach(i=>T(i)),a})},[d,m,x,L,w,T,p]),O=R(e=>{c(s=>{const n=s.find(r=>r.id===e);n&&V(n.previewURL);const t=s.filter(r=>r.id!==e);return p(t,!1),t})},[p]),W=f.some(e=>!e.uploaded&&!e.error),J=f.some(e=>e.progress!==null&&e.progress<100),q=f.length>0?f.reduce((e,s)=>e+(s.progress??0),0)/f.length:0;return{files:f,addFiles:D,removeFile:O,hasPending:W,isUploading:J,progress:q,formId:h,isDeferred:w}}export{er as useFileUpload};
@@ -1 +1 @@
1
- "use client";import{useEffect as i}from"react";import{isClient as n}from"@donotdev/core";import{useFormStore as s}from"../stores";function u({enabled:e=!0,message:o="You have unsaved changes. Are you sure you want to leave?"}={}){const r=s(a=>a.hasDirtyForms());i(()=>{if(!e||!r||!n())return;const a=t=>(t.preventDefault(),t.returnValue=o,o);return window.addEventListener("beforeunload",a),()=>{window.removeEventListener("beforeunload",a)}},[e,r,o])}async function m(e="You have unsaved changes. Discard them?"){return!n()||!s.getState().hasDirtyForms()?!0:window.confirm(e)}var d=u;export{m as checkFormNavigation,d as default,u as useFormNavigationGuard};
1
+ "use client";import{useEffect as a}from"react";import{isClient as u}from"@donotdev/core";import{useFormStore as i}from"../stores";function s({enabled:r=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}={}){const o=i(t=>t.hasDirtyForms());a(()=>{if(!r||!o||!u())return;const t=n=>(n.preventDefault(),n.returnValue=e,e);return window.addEventListener("beforeunload",t),()=>{window.removeEventListener("beforeunload",t)}},[r,o,e])}async function d(r="You have unsaved changes. Discard them?"){return!u()||!i.getState().hasDirtyForms()?!0:window.confirm(r)}var h=s;export{d as checkFormNavigation,h as default,s as useFormNavigationGuard};
@@ -1 +1 @@
1
- "use client";import{useMemo as g}from"react";function h(u,e,t,s,N={}){const{limit:o=3,tolerance:m=.2}=N,c=g(()=>{if(!e||!t||t.length===0||s.length===0)return[];const p=e.id;return t.filter(f=>f.id===p?!1:s.some(n=>{const r=u.fields[n];if(!r)return!1;const i=e[n],a=f[n];if(i==null||a==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const l=Number(i),d=Number(a);if(isNaN(l)||isNaN(d))return!1;const b=Math.abs(l*m);return Math.abs(d-l)<=b}return String(i)===String(a)})).slice(0,o)},[e,t,s,u.fields,o,m]);return{items:c,hasItems:c.length>0}}var y=h;export{y as default,h as useRelatedItems};
1
+ "use client";import{useMemo as m}from"react";function N(f,e,n,t,b={}){const{limit:l=3,tolerance:a=.2}=b,c=m(()=>{if(!e||!n||n.length===0||t.length===0)return[];const d=e.id;return n.filter(g=>g.id===d?!1:t.some(u=>{const r=f.fields[u];if(!r)return!1;const s=e[u],i=g[u];if(s==null||i==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const o=Number(s),p=Number(i);if(isNaN(o)||isNaN(p))return!1;const h=Math.abs(o*a);return Math.abs(p-o)<=h}return String(s)===String(i)})).slice(0,l)},[e,n,t,f.fields,l,a]);return{items:c,hasItems:c.length>0}}var M=N;export{M as default,N as useRelatedItems};
@@ -1 +1 @@
1
- "use client";import{useEffect as u,useCallback as i}from"react";import{isClient as r}from"@donotdev/core";function t({isDirty:e,enabled:a=!0,message:n="You have unsaved changes. Are you sure you want to leave?",onBeforeNavigate:v}){u(()=>{if(!a||!e||!r())return;const s=o=>(o.preventDefault(),o.returnValue=n,n);return window.addEventListener("beforeunload",s),()=>{window.removeEventListener("beforeunload",s)}},[e,a,n])}function f(e,a="You have unsaved changes. Discard them?"){return i(async()=>e?r()?window.confirm(a):!1:!0,[e,a])}var d=t;export{d as default,f as useConfirmNavigation,t as useUnsavedChangesWarning};
1
+ "use client";import{useEffect as a,useCallback as f}from"react";import{isClient as u}from"@donotdev/core";function i({isDirty:e,enabled:n=!0,message:r="You have unsaved changes. Are you sure you want to leave?",onBeforeNavigate:d}){a(()=>{if(!n||!e||!u())return;const o=t=>(t.preventDefault(),t.returnValue=r,r);return window.addEventListener("beforeunload",o),()=>{window.removeEventListener("beforeunload",o)}},[e,n,r])}function s(e,n="You have unsaved changes. Discard them?"){return f(async()=>e?u()?window.confirm(n):!1:!0,[e,n])}var v=i;export{v as default,s as useConfirmNavigation,i as useUnsavedChangesWarning};
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{getCrudService as e}from"./CrudService";import{useCrudStore as s}from"./CrudStore";import{loadDeterministicRange as a,upsertDeterministic as t,appendToCollection as i}from"./utils/collections";import{getFieldRegistry as r,registerFieldType as l,isFieldTypeRegistered as o}from"./FieldRegistry";import{registerBuiltinFieldType as d,getFieldTypeMetadata as p,getFilterType as n,getDisplayFormatter as F,isFilterable as m,getValueType as g,clearFieldTypeRegistry as u}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as y}from"./builtinFieldTypes";import{useEntityForm as f,useEntityField as T,useController as c,isFieldEditable as v,getFieldsForOperation as C,validateEntity as U,translateFieldLabel as b,translateLabel as E}from"./forms";import{UploadProvider as R,useUploadContext as x}from"./contexts";import{useFileUpload as B,useUnsavedChangesWarning as h,useConfirmNavigation as S,useEntityFavorites as D,useRelatedItems as L}from"./hooks";import{isStorageUrl as P,validatePicture as k,checkForBlobUrls as I,hasBlobUrls as M}from"./utils/uploadValidation";export{R as UploadProvider,i as appendToCollection,I as checkForBlobUrls,u as clearFieldTypeRegistry,e as getCrudService,F as getDisplayFormatter,r as getFieldRegistry,p as getFieldTypeMetadata,C as getFieldsForOperation,n as getFilterType,g as getValueType,M as hasBlobUrls,v as isFieldEditable,o as isFieldTypeRegistered,m as isFilterable,P as isStorageUrl,a as loadDeterministicRange,d as registerBuiltinFieldType,y as registerBuiltinFieldTypes,l as registerFieldType,b as translateFieldLabel,E as translateLabel,t as upsertDeterministic,S as useConfirmNavigation,c as useController,s as useCrudStore,D as useEntityFavorites,T as useEntityField,f as useEntityForm,B as useFileUpload,L as useRelatedItems,h as useUnsavedChangesWarning,x as useUploadContext,U as validateEntity,k as validatePicture};
1
+ export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{getCrudService as s}from"./CrudService";import{useCrudStore as d}from"./CrudStore";import{loadDeterministicRange as m,upsertDeterministic as F,appendToCollection as g}from"./utils/collections";import{getFieldRegistry as f,registerFieldType as x,isFieldTypeRegistered as y}from"./FieldRegistry";import{registerBuiltinFieldType as c,getFieldTypeMetadata as v,getFilterType as C,getDisplayFormatter as U,isFilterable as b,getValueType as E,clearFieldTypeRegistry as R}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as h}from"./builtinFieldTypes";import{useEntityForm as S,useEntityField as L,useController as P,isFieldEditable as k,getFieldsForOperation as I,validateEntity as M,translateFieldLabel as N,translateLabel as O}from"./forms";import{UploadProvider as W,useUploadContext as j}from"./contexts";import{useFileUpload as w,useUnsavedChangesWarning as z,useConfirmNavigation as A,useEntityFavorites as G,useRelatedItems as H}from"./hooks";import{isStorageUrl as K,validatePicture as Q,checkForBlobUrls as X,hasBlobUrls as Y}from"./utils/uploadValidation";export{W as UploadProvider,g as appendToCollection,X as checkForBlobUrls,R as clearFieldTypeRegistry,s as getCrudService,U as getDisplayFormatter,f as getFieldRegistry,v as getFieldTypeMetadata,I as getFieldsForOperation,C as getFilterType,E as getValueType,Y as hasBlobUrls,k as isFieldEditable,y as isFieldTypeRegistered,b as isFilterable,K as isStorageUrl,m as loadDeterministicRange,c as registerBuiltinFieldType,h as registerBuiltinFieldTypes,x as registerFieldType,N as translateFieldLabel,O as translateLabel,F as upsertDeterministic,A as useConfirmNavigation,P as useController,d as useCrudStore,G as useEntityFavorites,L as useEntityField,S as useEntityForm,w as useFileUpload,H as useRelatedItems,z as useUnsavedChangesWarning,j as useUploadContext,M as validateEntity,Q as validatePicture};
@@ -1 +1 @@
1
- {"version":3,"file":"registerBuiltinFieldTypes.d.ts","sourceRoot":"","sources":["../src/registerBuiltinFieldTypes.tsx"],"names":[],"mappings":"AAkuBA;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAmqBnD"}
1
+ {"version":3,"file":"registerBuiltinFieldTypes.d.ts","sourceRoot":"","sources":["../src/registerBuiltinFieldTypes.tsx"],"names":[],"mappings":"AA6vBA;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CA8qBnD"}
@@ -1 +1 @@
1
- "use client";import{jsx as s,jsxs as u}from"react/jsx-runtime";import{Text as m,Stack as g,ImageGallery as I,Rating as $}from"@donotdev/components";import{formatCurrency as T}from"@donotdev/core";import{ControlledCheckboxField as w,ControlledComboboxField as M,ControlledDateField as b,ControlledDropdownField as R,ControlledFileField as N,ControlledMultiFileField as P,ControlledDocumentField as V,ControlledMultiDocumentField as _,ControlledGeoPointField as B,ControlledImageField as E,ControlledMapField as U,ControlledMultiDropdownField as H,ControlledMultiInputField as K,ControlledNumberField as Y,ControlledPasswordField as G,ControlledPhoneField as O,ControlledRangeField as W,ControlledRatingField as q,ControlledRadioField as J,ControlledYearField as Q,ControlledTextField as y,ControlledTextareaField as X,ControlledRichTextField as Z,ControlledTimestampField as ee,ControlledAddressField as te,ControlledSwitchField as re,ControlledMultiImageField as le,ControlledGdprConsentField as ne,ControlledCurrencyField as oe,ControlledPriceField as ae}from"./components/controlled";import{AvatarFieldComponent as ie,BadgeFieldComponent as ce,ButtonFieldComponent as k,HiddenFieldComponent as se,TextAreaComponent as pe,RichTextComponent as de,TextFieldComponent as F}from"./components/form/fields";import{registerBuiltinFieldType as a}from"./fieldTypeRegistry";import{translateLabel as f}from"./forms/utils";function p(e){return e?s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s(m,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return p(r);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,l,n,t)=>{const r=t?.compact??!1;return e==null||e===""?p(r):String(e)},month:(e,l,n,t)=>{const r=t?.compact??!1;return e==null||e===""?p(r):String(e)},boolean:(e,l,n)=>e?"Yes":"No",checkbox:(e,l,n)=>e?"Yes":"No",switch:(e,l,n)=>{const t=l.options?.fieldSpecific;if(t){const r=t.uncheckedValue??!1,o=t.checkedValue??!0;if(e===o&&t.checkedLabel)return f(t.checkedLabel,n);if(e===r&&t.uncheckedLabel)return f(t.uncheckedLabel,n)}return e?"Yes":"No"},year:(e,l,n)=>String(e),number:(e,l,n)=>typeof e=="number"?e.toLocaleString():String(e),currency:(e,l,n)=>{if(e==null||isNaN(e))return"";const t=(l.options||{}).fieldSpecific?.currency||"EUR";return T(e,t)},price:(e,l,n,t)=>{const r=t?.compact??!1,o=t?.asString??!1,i=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(i==null||typeof i!="object")return p(r);const d=i.amount;if(d==null||isNaN(d))return p(r);const C=i.currency||"EUR",z=i.vatIncluded??!0,v=i.discountPercent??0,D=v>0?d*(1-v/100):d,h=z?` ${n("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(v>0){const L=T(d,C),x=T(D,C),S=` ${n("crud:price.discountPercent",{percent:Math.round(v),defaultValue:"-{{percent}}%"})}`;return o?`${x}${h}${S}`:r?u(m,{variant:"success",weight:"bold",children:[x,h,S]}):u(g,{direction:"column",gap:"tight",align:"end",children:[s(m,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:L}),u(m,{variant:"success",weight:"bold",children:[x,h]})]})}return`${T(d,C)}${h}`},range:(e,l,n)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,l,n,t)=>{const r=t?.compact??!1;if(e==null)return p(r);const o=typeof e=="number"?e:parseFloat(e);if(isNaN(o))return p(r);const i=l.validation?.max??5;return s($,{value:o,max:i,readonly:!0,"aria-label":`${o} out of ${i} stars`})},select:(e,l,n)=>{const t=l.validation?.options;if(Array.isArray(t)){const r=t.find(o=>o.value===e)?.label;return r?f(r,n):String(e)}return String(e)},radio:(e,l,n)=>{const t=l.validation?.options;if(Array.isArray(t)){const r=t.find(o=>o.value===e)?.label;return r?f(r,n):String(e)}return String(e)},combobox:(e,l,n)=>{const t=l.validation?.options;if(Array.isArray(t)){const r=t.find(o=>o.value===e)?.label;return r?f(r,n):String(e)}return String(e)},multiselect:(e,l,n)=>{if(Array.isArray(e)){const t=l.validation?.options;if(Array.isArray(t))return e.map(r=>{const o=t.find(i=>i.value===r)?.label;return o?f(o,n):r}).join(", ")}return String(e)},image:(e,l,n,t)=>{const r=t?.compact??!1;return e==null||e===""?p(r):typeof e=="string"?s("img",{src:e,alt:l.label||"",style:{width:r?"40px":void 0,height:r?"40px":void 0,maxWidth:r?void 0:"200px",maxHeight:r?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):p(r)},images:(e,l,n,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return p(r);const o=e[0],i=typeof o=="object"&&o.thumbUrl?o.thumbUrl:o;return r?u("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[s("img",{src:i,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&u("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):s(I,{images:e,altPrefix:l.label||"Image"})},files:(e,l,n,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?p(r):s(g,{gap:"tight",children:e.map((o,i)=>u("a",{href:o.url||o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[o.filename||`File ${i+1}`,o.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},i))})},documents:(e,l,n,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?p(r):s(g,{gap:"tight",children:e.map((o,i)=>u("a",{href:o.url||o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[o.filename||`File ${i+1}`,o.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},i))})},file:(e,l,n,t)=>{const r=t?.compact??!1;if(!e)return p(r);const o=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[i,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,l,n,t)=>{const r=t?.compact??!1;if(!e)return p(r);const o=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[i,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,l,n)=>String(e),geopoint:(e,l,n,t)=>{const r=t?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:p(r)},address:(e,l,n)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,l,n,t)=>{const r=t?.compact??!1;if(e&&typeof e=="object"){const o=Object.entries(e);return o.length===0?p(r):u(g,{direction:"column",gap:"tight",children:[o.slice(0,5).map(([i,d])=>u(m,{style:{fontSize:"var(--font-size-sm)"},children:[u("strong",{children:[i,":"]})," ",String(d)]},i)),o.length>5&&u(m,{variant:"muted",children:["+",o.length-5," more"]})]})}return p(r)},array:(e,l,n,t)=>{const r=t?.compact??!1;return Array.isArray(e)?e.length===0?p(r):e.join(", "):p(r)},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,l,n)=>s("a",{href:`mailto:${e}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:e}),tel:(e,l,n)=>s("a",{href:`tel:${e}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:e}),url:(e,l,n)=>s("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,l,n)=>u(g,{direction:"row",gap:"tight",align:"center",children:[s("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),s(m,{children:e})]}),textarea:(e,l,n)=>String(e),text:(e,l,n)=>String(e),richtext:(e,l,n,t)=>{const r=t?.compact??!1;return e&&typeof e=="string"?r?e.replace(/<[^>]*>/g,"").trim()||s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s("div",{dangerouslySetInnerHTML:{__html:e},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):p(r)}};function ue(e){return e.type==="avatar"}function ye(e){return e.type==="badge"}let A=!1;function j(){A||(A=!0,a({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,...o.options})}}}),a({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,type:"email",...o.options})}}}),a({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,type:"url",...o.options})}}}),a({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(F,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,type:"color",...o.options})}}}),a({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:X,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(pe,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,...o.options})}}}),a({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:Z,uncontrolled:e=>{const{value:l,onChange:n,label:t,error:r,config:o}=e;return s(de,{label:t||"",value:typeof l=="string"?l:"",onChange:i=>{const d=i.target.value;n(d)},error:r,...o.options})}}}),a({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:G}}),a({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:O}}),a({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:Y}}),a({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:oe}}),a({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:ae}}),a({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:W}}),a({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:Q}}),a({type:"rating",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.rating,components:{controlled:q}}),a({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:w}}),a({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:w}}),a({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",components:{controlled:ne}}),a({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:re}}),a({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:b}}),a({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:b}}),a({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:b}}),a({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:b}}),a({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:b}}),a({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:ee}}),a({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:N}}),a({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:P}}),a({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:V}}),a({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:_}}),a({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:E}}),a({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:le}}),a({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:B}}),a({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:te}}),a({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:U}}),a({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:K}}),a({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:R}}),a({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:M}}),a({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:H}}),a({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:J}}),a({type:"reference",filterable:!0,filterType:"text",valueType:"string",components:{controlled:y}}),a({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:l,value:n}=e;return s(se,{name:l,value:typeof n=="string"?n:""})}}}),a({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,error:t,config:r,t:o}=e;if(!ue(r))throw new Error("Invalid config type for avatar field");return s(ie,{config:r,value:typeof l=="string"?l:"",onChange:i=>{n(i)},error:!!t,helperText:t||void 0,t:o,...r.options})}}}),a({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{value:l,onChange:n,error:t,config:r,t:o}=e;if(!ye(r))throw new Error("Invalid config type for badge field");return s(ce,{config:r,value:typeof l=="string"?l:"",onChange:i=>{n(i)},error:!!t,helperText:t||void 0,t:o,...r.options})}}}),a({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:l,label:n,config:t}=e;return s(k,{label:n||l,type:"submit",onClick:()=>{},...t.options})}}}),a({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:l,label:n,config:t}=e;return s(k,{label:n||l,type:"reset",onClick:()=>{},...t.options})}}}))}j();export{j as registerAllBuiltinFieldTypes};
1
+ "use client";import{jsx as p,jsxs as f}from"react/jsx-runtime";import{Text as y,Stack as b,ImageGallery as D,Rating as $}from"@donotdev/components";import{formatCurrency as C}from"@donotdev/core";import{ControlledCheckboxField as V,ControlledComboboxField as I,ControlledDateField as h,ControlledDropdownField as L,ControlledFileField as M,ControlledMultiFileField as N,ControlledDocumentField as R,ControlledMultiDocumentField as _,ControlledGeoPointField as P,ControlledImageField as B,ControlledMapField as E,ControlledMultiDropdownField as U,ControlledMultiInputField as H,ControlledNumberField as K,ControlledPasswordField as O,ControlledPhoneField as Y,ControlledRangeField as G,ControlledRatingField as W,ControlledDurationField as q,ControlledRadioField as J,ControlledYearField as Q,ControlledTextField as m,ControlledTextareaField as X,ControlledRichTextField as Z,ControlledTimestampField as ee,ControlledAddressField as te,ControlledSwitchField as re,ControlledMultiImageField as ne,ControlledGdprConsentField as oe,ControlledCurrencyField as le,ControlledPriceField as ie}from"./components/controlled";import{AvatarFieldComponent as ae,BadgeFieldComponent as ce,ButtonFieldComponent as v,HiddenFieldComponent as se,TextAreaComponent as pe,RichTextComponent as de,TextFieldComponent as x}from"./components/form/fields";import{registerBuiltinFieldType as i}from"./fieldTypeRegistry";import{translateLabel as g}from"./forms/utils";function d(e){return e?p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p(y,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,n,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,n,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,n,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,n,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,n,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},month:(e,n,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},boolean:(e,n,l)=>e?"Yes":"No",checkbox:(e,n,l)=>e?"Yes":"No",switch:(e,n,l)=>{const t=n.options?.fieldSpecific;if(t){const r=t.uncheckedValue??!1,o=t.checkedValue??!0;if(e===o&&t.checkedLabel)return g(t.checkedLabel,l);if(e===r&&t.uncheckedLabel)return g(t.uncheckedLabel,l)}return e?"Yes":"No"},year:(e,n,l)=>String(e),number:(e,n,l)=>typeof e=="number"?e.toLocaleString():String(e),currency:(e,n,l)=>{if(e==null||isNaN(e))return"";const o=(n.options||{}).fieldSpecific?.currency||"EUR";return C(e,o)},price:(e,n,l,t)=>{const r=t?.compact??!1,o=t?.asString??!1,a=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(a==null||typeof a!="object")return d(r);const s=a.amount;if(s==null||isNaN(s))return d(r);const u=a.currency||"EUR",j=a.vatIncluded??!0,T=a.discountPercent??0,A=T>0?s*(1-T/100):s,F=j?` ${l("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(T>0){const z=C(s,u),S=C(A,u),w=` ${l("crud:price.discountPercent",{percent:Math.round(T),defaultValue:"-{{percent}}%"})}`;return o?`${S}${F}${w}`:r?f(y,{variant:"success",weight:"bold",children:[S,F,w]}):f(b,{direction:"column",gap:"tight",align:"end",children:[p(y,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:z}),f(y,{variant:"success",weight:"bold",children:[S,F]})]})}return`${C(s,u)}${F}`},range:(e,n,l)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,n,l,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const o=typeof e=="number"?e:parseFloat(e);if(isNaN(o))return d(r);const a=n.validation?.max??5;return p($,{value:o,max:a,readonly:!0,"aria-label":`${o} out of ${a} stars`})},duration:(e,n,l,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const o=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(o))return d(r);if(o===0)return l("crud:duration.zero",{defaultValue:"\u2014"});if(o<60)return l("crud:duration.minutes",{count:o,defaultValue:`${o} min`});const a=Math.floor(o/60),s=o%60;return l("crud:duration.hoursMinutes",{hours:a,minutes:s,defaultValue:s===0?`${a}h`:`${a}h ${s}min`})},select:(e,n,l)=>{const t=n.validation?.options;if(Array.isArray(t)){const o=t.find(a=>a.value===e)?.label;return o?g(o,l):String(e)}return String(e)},radio:(e,n,l)=>{const t=n.validation?.options;if(Array.isArray(t)){const o=t.find(a=>a.value===e)?.label;return o?g(o,l):String(e)}return String(e)},combobox:(e,n,l)=>{const t=n.validation?.options;if(Array.isArray(t)){const o=t.find(a=>a.value===e)?.label;return o?g(o,l):String(e)}return String(e)},multiselect:(e,n,l)=>{if(Array.isArray(e)){const t=n.validation?.options;if(Array.isArray(t))return e.map(o=>{const s=t.find(u=>u.value===o)?.label;return s?g(s,l):o}).join(", ")}return String(e)},image:(e,n,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):typeof e=="string"?p("img",{src:e,alt:n.label||"",style:{width:r?"40px":void 0,height:r?"40px":void 0,maxWidth:r?void 0:"200px",maxHeight:r?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):d(r)},images:(e,n,l,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const o=e[0],a=typeof o=="object"&&o.thumbUrl?o.thumbUrl:o;return r?f("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[p("img",{src:a,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(D,{images:e,altPrefix:n.label||"Image"})},files:(e,n,l,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(b,{gap:"tight",children:e.map((o,a)=>f("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 ${a+1}`,o.size&&f(y,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},a))})},documents:(e,n,l,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(b,{gap:"tight",children:e.map((o,a)=>f("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 ${a+1}`,o.size&&f(y,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(o.size/1024)," KB)"]})]},a))})},file:(e,n,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);const o=typeof e=="string"?e:e.url,a=typeof e=="string"?"View file":e.filename||"View file";return f("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[a,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,n,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);const o=typeof e=="string"?e:e.url,a=typeof e=="string"?"View file":e.filename||"View file";return f("a",{href:o,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[a,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,n,l)=>String(e),geopoint:(e,n,l,t)=>{const r=t?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:d(r)},address:(e,n,l)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,n,l,t)=>{const r=t?.compact??!1;if(e&&typeof e=="object"){const o=Object.entries(e);return o.length===0?d(r):f(b,{direction:"column",gap:"tight",children:[o.slice(0,5).map(([a,s])=>f(y,{style:{fontSize:"var(--font-size-sm)"},children:[f("strong",{children:[a,":"]})," ",String(s)]},a)),o.length>5&&f(y,{variant:"muted",children:["+",o.length-5," more"]})]})}return d(r)},array:(e,n,l,t)=>{const r=t?.compact??!1;return Array.isArray(e)?e.length===0?d(r):e.join(", "):d(r)},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,n,l)=>p("a",{href:`mailto:${e}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:e}),tel:(e,n,l)=>p("a",{href:`tel:${e}`,style:{color:"var(--primary)"},onClick:t=>t.stopPropagation(),children:e}),url:(e,n,l)=>p("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,n,l)=>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(y,{children:e})]}),textarea:(e,n,l)=>String(e),text:(e,n,l)=>String(e),richtext:(e,n,l,t)=>{const r=t?.compact??!1;return e&&typeof e=="string"?r?e.replace(/<[^>]*>/g,"").trim()||p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p("div",{dangerouslySetInnerHTML:{__html:e},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):d(r)}};function fe(e){return e.type==="avatar"}function ue(e){return e.type==="badge"}let k=!1;function me(){k||(k=!0,i({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:m,uncontrolled:e=>{const{value:n,onChange:l,label:t,error:r,config:o}=e;return p(x,{label:t||"",value:typeof n=="string"?n:"",onChange:s=>{const u=s.target.value;l(u)},error:r,...o.options})}}}),i({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:m,uncontrolled:e=>{const{value:n,onChange:l,label:t,error:r,config:o}=e;return p(x,{label:t||"",value:typeof n=="string"?n:"",onChange:s=>{const u=s.target.value;l(u)},error:r,type:"email",...o.options})}}}),i({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:m,uncontrolled:e=>{const{value:n,onChange:l,label:t,error:r,config:o}=e;return p(x,{label:t||"",value:typeof n=="string"?n:"",onChange:s=>{const u=s.target.value;l(u)},error:r,type:"url",...o.options})}}}),i({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:m,uncontrolled:e=>{const{value:n,onChange:l,label:t,error:r,config:o}=e;return p(x,{label:t||"",value:typeof n=="string"?n:"",onChange:s=>{const u=s.target.value;l(u)},error:r,type:"color",...o.options})}}}),i({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:X,uncontrolled:e=>{const{value:n,onChange:l,label:t,error:r,config:o}=e;return p(pe,{label:t||"",value:typeof n=="string"?n:"",onChange:s=>{const u=s.target.value;l(u)},error:r,...o.options})}}}),i({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:Z,uncontrolled:e=>{const{value:n,onChange:l,label:t,error:r,config:o}=e;return p(de,{label:t||"",value:typeof n=="string"?n:"",onChange:s=>{const u=s.target.value;l(u)},error:r,...o.options})}}}),i({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:O}}),i({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:Y}}),i({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:K}}),i({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:le}}),i({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:ie}}),i({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:G}}),i({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:Q}}),i({type:"rating",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.rating,components:{controlled:W}}),i({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.duration,components:{controlled:q}}),i({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:V}}),i({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:V}}),i({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",components:{controlled:oe}}),i({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:re}}),i({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:h}}),i({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:h}}),i({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:h}}),i({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:h}}),i({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:h}}),i({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:ee}}),i({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:M}}),i({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:N}}),i({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:R}}),i({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:_}}),i({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:B}}),i({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:ne}}),i({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:P}}),i({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:te}}),i({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:E}}),i({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:H}}),i({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:L}}),i({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:I}}),i({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:U}}),i({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:J}}),i({type:"reference",filterable:!0,filterType:"text",valueType:"string",components:{controlled:m}}),i({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:n,value:l}=e;return p(se,{name:n,value:typeof l=="string"?l:""})}}}),i({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{value:n,onChange:l,error:t,config:r,t:o}=e;if(!fe(r))throw new Error("Invalid config type for avatar field");return p(ae,{config:r,value:typeof n=="string"?n:"",onChange:s=>{l(s)},error:!!t,helperText:t||void 0,t:o,...r.options})}}}),i({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{value:n,onChange:l,error:t,config:r,t:o}=e;if(!ue(r))throw new Error("Invalid config type for badge field");return p(ce,{config:r,value:typeof n=="string"?n:"",onChange:s=>{l(s)},error:!!t,helperText:t||void 0,t:o,...r.options})}}}),i({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:n,label:l,config:t}=e;return p(v,{label:l||n,type:"submit",onClick:()=>{},...t.options})}}}),i({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:n,label:l,config:t}=e;return p(v,{label:l||n,type:"reset",onClick:()=>{},...t.options})}}}))}me();export{me as registerAllBuiltinFieldTypes};
@@ -1 +1 @@
1
- "use client";import{createDoNotDevStore as i}from"@donotdev/core";const m={status:"idle",error:null,uploadProgress:0,isDirty:!1},a=i({name:"form-store",createStore:(t,e)=>({forms:{},startSubmit:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(s,r)=>{t(o=>{const u=o.forms[s]||m;return{forms:{...o.forms,[s]:{...u,status:"uploading",uploadProgress:Math.min(100,Math.max(0,r))}}}})},setValidating:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"validating",uploadProgress:100}}}})},setSubmitting:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"submitting"}}}})},setSuccess:s=>{t(r=>{const o=r.forms[s]||m;return{forms:{...r.forms,[s]:{...o,status:"success",error:null}}}}),setTimeout(()=>{e().reset(s)},1500)},setError:(s,r)=>{t(o=>{const u=o.forms[s]||m;return{forms:{...o.forms,[s]:{...u,status:"error",error:r}}}})},reset:s=>{t(r=>({forms:{...r.forms,[s]:{...m}}}))},setIsDirty:(s,r)=>{t(o=>{const u=o.forms[s]||m;return{forms:{...o.forms,[s]:{...u,isDirty:r}}}})},hasDirtyForms:()=>{const s=e().forms;return Object.values(s).some(r=>r.isDirty)},getDirtyFormIds:()=>{const s=e().forms;return Object.entries(s).filter(([r,o])=>o.isDirty).map(([r])=>r)},cleanup:s=>{t(r=>{const{[s]:o,...u}=r.forms;return{forms:u}})},getStatus:s=>e().forms[s]?.status??"idle",isLoading:s=>{const r=e().forms[s]?.status??"idle";return r==="uploading"||r==="validating"||r==="submitting"},getUploadProgress:s=>e().forms[s]?.uploadProgress??0,getError:s=>e().forms[s]?.error??null,getIsDirty:s=>e().forms[s]?.isDirty??!1})}),n=t=>a(e=>e.forms[t]?.status??"idle"),f=t=>a(e=>{const s=e.forms[t]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"}),l=t=>a(e=>e.forms[t]?.uploadProgress??0),g=t=>a(e=>e.forms[t]?.error??null),d=t=>a(e=>e.forms[t]?.isDirty??!1),c=()=>a(t=>t.hasDirtyForms());export{g as useFormError,d as useFormIsDirty,f as useFormLoading,n as useFormStatus,a as useFormStore,c as useHasDirtyForms,l as useUploadProgress};
1
+ "use client";import{createDoNotDevStore as i}from"@donotdev/core";const m={status:"idle",error:null,uploadProgress:0,isDirty:!1},u=i({name:"form-store",createStore:(o,e)=>({forms:{},startSubmit:r=>{o(s=>{const t=s.forms[r]||m;return{forms:{...s.forms,[r]:{...t,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(r,s)=>{o(t=>{const n=t.forms[r]||m;return{forms:{...t.forms,[r]:{...n,status:"uploading",uploadProgress:Math.min(100,Math.max(0,s))}}}})},setValidating:r=>{o(s=>{const t=s.forms[r]||m;return{forms:{...s.forms,[r]:{...t,status:"validating",uploadProgress:100}}}})},setSubmitting:r=>{o(s=>{const t=s.forms[r]||m;return{forms:{...s.forms,[r]:{...t,status:"submitting"}}}})},setSuccess:r=>{o(s=>{const t=s.forms[r]||m;return{forms:{...s.forms,[r]:{...t,status:"success",error:null}}}}),setTimeout(()=>{e().reset(r)},1500)},setError:(r,s)=>{o(t=>{const n=t.forms[r]||m;return{forms:{...t.forms,[r]:{...n,status:"error",error:s}}}})},reset:r=>{o(s=>({forms:{...s.forms,[r]:{...m}}}))},setIsDirty:(r,s)=>{o(t=>{const n=t.forms[r]||m;return{forms:{...t.forms,[r]:{...n,isDirty:s}}}})},hasDirtyForms:()=>{const r=e().forms;return Object.values(r).some(s=>s.isDirty)},getDirtyFormIds:()=>{const r=e().forms;return Object.entries(r).filter(([s,t])=>t.isDirty).map(([s])=>s)},cleanup:r=>{o(s=>{const{[r]:t,...n}=s.forms;return{forms:n}})},getStatus:r=>e().forms[r]?.status??"idle",isLoading:r=>{const s=e().forms[r]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"},getUploadProgress:r=>e().forms[r]?.uploadProgress??0,getError:r=>e().forms[r]?.error??null,getIsDirty:r=>e().forms[r]?.isDirty??!1})}),f=o=>u(e=>e.forms[o]?.status??"idle"),l=o=>u(e=>{const r=e.forms[o]?.status??"idle";return r==="uploading"||r==="validating"||r==="submitting"}),c=o=>u(e=>e.forms[o]?.uploadProgress??0),p=o=>u(e=>e.forms[o]?.error??null),g=o=>u(e=>e.forms[o]?.isDirty??!1),d=()=>u(o=>o.hasDirtyForms());export{p as useFormError,g as useFormIsDirty,l as useFormLoading,f as useFormStatus,u as useFormStore,d as useHasDirtyForms,c as useUploadProgress};
@@ -1 +1 @@
1
- "use client";import{createDoNotDevStore as y}from"@donotdev/core";const g={status:"idle",progress:0,error:null},d=y({name:"upload-store",createStore:(a,n)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(t,e,o,r)=>{a(s=>({uploadFunctions:{...s.uploadFunctions,[t]:{...s.uploadFunctions[t]||{},[e]:o}},checkPendingFunctions:{...s.checkPendingFunctions,[t]:{...s.checkPendingFunctions[t]||{},[e]:r||(()=>!1)}}}))},unregisterUpload:(t,e)=>{a(o=>{const r=o.uploadFunctions[t],s=o.checkPendingFunctions[t];if(!r)return o;const{[e]:u,...p}=r,{[e]:l,...m}=s||{},{[e]:F,...c}=o.retryAttempts[t]||{};return{uploadFunctions:{...o.uploadFunctions,[t]:p},checkPendingFunctions:{...o.checkPendingFunctions,[t]:m},retryAttempts:{...o.retryAttempts,[t]:c}}})},startUpload:(t,e)=>{a(o=>({uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(t,e,o)=>{a(r=>{const s=r.uploads[t]?.[e]||g;return{uploads:{...r.uploads,[t]:{...r.uploads[t]||{},[e]:{...s,progress:Math.min(100,Math.max(0,o))}}}}})},completeUpload:(t,e)=>{a(o=>{const r=o.uploads[t]?.[e]||g;return{uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{...r,status:"complete",progress:100}}}}})},failUpload:(t,e,o)=>{a(r=>{const s=r.uploads[t]?.[e]||g;return{uploads:{...r.uploads,[t]:{...r.uploads[t]||{},[e]:{...s,status:"error",error:o}}}}})},resetUpload:(t,e)=>{a(o=>({uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{...g}}}}))},resetForm:t=>{a(e=>({uploads:{...e.uploads,[t]:{}}}))},cleanup:t=>{a(e=>{const{[t]:o,...r}=e.uploads,{[t]:s,...u}=e.uploadFunctions;return{uploads:r,uploadFunctions:u}})},uploadAll:async t=>{const e=n().uploadFunctions[t];if(!e)return;const o=Object.entries(e);if(o.length===0)return;const r=async(s,u,p=1)=>{n().startUpload(t,s);try{await u(l=>{n().setProgress(t,s,l)}),n().completeUpload(t,s),a(l=>({retryAttempts:{...l.retryAttempts,[t]:{...l.retryAttempts[t]||{},[s]:0}}}))}catch(l){const m=l instanceof Error?l.message:"Upload failed",F=n().maxRetries,c=n().retryAttempts[t]?.[s]||0;if(c<F){a(i=>({retryAttempts:{...i.retryAttempts,[t]:{...i.retryAttempts[t]||{},[s]:c+1}}}));const h=n().retryDelay*Math.pow(2,p-1);return await new Promise(i=>setTimeout(i,h)),r(s,u,p+1)}else throw n().failUpload(t,s,m),l}};await Promise.all(o.map(async([s,u])=>{await r(s,u)}))},hasPendingUploads:t=>{const e=n(),o=e.uploadFunctions[t],r=e.checkPendingFunctions[t];return o?Object.entries(o).some(([s,u])=>{const p=r?.[s];return p?p():!0}):!1},getStatus:(t,e)=>n().uploads[t]?.[e]?.status??"idle",getProgress:(t,e)=>n().uploads[t]?.[e]?.progress??0,getTotalProgress:t=>{const e=n().uploads[t];if(!e)return 100;const o=Object.values(e);if(o.length===0)return 100;const r=o.reduce((s,u)=>s+u.progress,0);return Math.round(r/o.length)},isUploading:t=>{const e=n().uploads[t];return e?Object.values(e).some(o=>o.status==="uploading"):!1},getError:(t,e)=>n().uploads[t]?.[e]?.error??null})}),P=a=>d(n=>{const t=n.uploads[a];if(!t)return 100;const e=Object.values(t);if(e.length===0)return 100;const o=e.reduce((r,s)=>r+s.progress,0);return Math.round(o/e.length)}),U=a=>d(n=>{const t=n.uploads[a];return t?Object.values(t).some(e=>e.status==="uploading"):!1}),f=(a,n)=>d(t=>t.uploads[a]?.[n]?.progress??0),A=(a,n)=>d(t=>t.uploads[a]?.[n]?.status??"idle");export{f as useFieldProgress,A as useFieldUploadStatus,U as useIsUploading,P as useTotalProgress,d as useUploadStore};
1
+ "use client";import{createDoNotDevStore as U}from"@donotdev/core";const i={status:"idle",progress:0,error:null},d=U({name:"upload-store",createStore:(u,r)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(s,n,t,o)=>{u(e=>({uploadFunctions:{...e.uploadFunctions,[s]:{...e.uploadFunctions[s]||{},[n]:t}},checkPendingFunctions:{...e.checkPendingFunctions,[s]:{...e.checkPendingFunctions[s]||{},[n]:o||(()=>!1)}}}))},unregisterUpload:(s,n)=>{u(t=>{const o=t.uploadFunctions[s],e=t.checkPendingFunctions[s];if(!o)return t;const{[n]:a,...c}=o,{[n]:g,...l}=e||{},{[n]:h,...F}=t.retryAttempts[s]||{};return{uploadFunctions:{...t.uploadFunctions,[s]:c},checkPendingFunctions:{...t.checkPendingFunctions,[s]:l},retryAttempts:{...t.retryAttempts,[s]:F}}})},startUpload:(s,n)=>{u(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[n]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(s,n,t)=>{u(o=>{const e=o.uploads[s]?.[n]||i;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[n]:{...e,progress:Math.min(100,Math.max(0,t))}}}}})},completeUpload:(s,n)=>{u(t=>{const o=t.uploads[s]?.[n]||i;return{uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[n]:{...o,status:"complete",progress:100}}}}})},failUpload:(s,n,t)=>{u(o=>{const e=o.uploads[s]?.[n]||i;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[n]:{...e,status:"error",error:t}}}}})},resetUpload:(s,n)=>{u(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[n]:{...i}}}}))},resetForm:s=>{u(n=>({uploads:{...n.uploads,[s]:{}}}))},cleanup:s=>{u(n=>{const{[s]:t,...o}=n.uploads,{[s]:e,...a}=n.uploadFunctions;return{uploads:o,uploadFunctions:a}})},uploadAll:async s=>{const t=r().uploadFunctions[s];if(!t)return;const o=Object.entries(t);if(o.length===0)return;const e=async(a,c,g=1)=>{r().startUpload(s,a);try{await c(l=>{r().setProgress(s,a,l)}),r().completeUpload(s,a),u(l=>({retryAttempts:{...l.retryAttempts,[s]:{...l.retryAttempts[s]||{},[a]:0}}}))}catch(l){const h=l instanceof Error?l.message:"Upload failed",F=r().maxRetries,y=r().retryAttempts[s]?.[a]||0;if(y<F){u(p=>({retryAttempts:{...p.retryAttempts,[s]:{...p.retryAttempts[s]||{},[a]:y+1}}}));const P=r().retryDelay*Math.pow(2,g-1);return await new Promise(p=>setTimeout(p,P)),e(a,c,g+1)}else throw r().failUpload(s,a,h),l}};await Promise.all(o.map(async([a,c])=>{await e(a,c)}))},hasPendingUploads:s=>{const n=r(),t=n.uploadFunctions[s],o=n.checkPendingFunctions[s];return t?Object.entries(t).some(([e,a])=>{const c=o?.[e];return c?c():!0}):!1},getStatus:(s,n)=>r().uploads[s]?.[n]?.status??"idle",getProgress:(s,n)=>r().uploads[s]?.[n]?.progress??0,getTotalProgress:s=>{const n=r().uploads[s];if(!n)return 100;const t=Object.values(n);if(t.length===0)return 100;const o=t.reduce((e,a)=>e+a.progress,0);return Math.round(o/t.length)},isUploading:s=>{const n=r().uploads[s];return n?Object.values(n).some(t=>t.status==="uploading"):!1},getError:(s,n)=>r().uploads[s]?.[n]?.error??null})}),k=u=>d(r=>{const s=r.uploads[u];if(!s)return 100;const n=Object.values(s);if(n.length===0)return 100;const t=n.reduce((o,e)=>o+e.progress,0);return Math.round(t/n.length)}),x=u=>d(r=>{const s=r.uploads[u];return s?Object.values(s).some(n=>n.status==="uploading"):!1}),_=(u,r)=>d(s=>s.uploads[u]?.[r]?.progress??0),w=(u,r)=>d(s=>s.uploads[u]?.[r]?.status??"idle");export{_ as useFieldProgress,w as useFieldUploadStatus,x as useIsUploading,k as useTotalProgress,d as useUploadStore};
@@ -1 +1 @@
1
- import{useFormStore as s,useFormStatus as a,useFormLoading as r,useUploadProgress as o,useFormError as e,useFormIsDirty as u,useHasDirtyForms as t}from"./FormStore";import{useUploadStore as m,useTotalProgress as F,useIsUploading as i,useFieldProgress as l,useFieldUploadStatus as d}from"./UploadStore";export{l as useFieldProgress,d as useFieldUploadStatus,e as useFormError,u as useFormIsDirty,r as useFormLoading,a as useFormStatus,s as useFormStore,t as useHasDirtyForms,i as useIsUploading,F as useTotalProgress,o as useUploadProgress,m as useUploadStore};
1
+ import{useFormStore as o,useFormStatus as e,useFormLoading as u,useUploadProgress as t,useFormError as a,useFormIsDirty as m,useHasDirtyForms as F}from"./FormStore";import{useUploadStore as l,useTotalProgress as i,useIsUploading as p,useFieldProgress as g,useFieldUploadStatus as S}from"./UploadStore";export{g as useFieldProgress,S as useFieldUploadStatus,a as useFormError,m as useFormIsDirty,u as useFormLoading,e as useFormStatus,o as useFormStore,F as useHasDirtyForms,p as useIsUploading,i as useTotalProgress,t as useUploadProgress,l as useUploadStore};