@donotdev/crud 0.0.19 → 0.0.20

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 (162) hide show
  1. package/dist/CrudService.d.ts.map +1 -1
  2. package/dist/CrudService.js +2 -2
  3. package/dist/CrudStore.js +1 -1
  4. package/dist/FieldRegistry.js +1 -1
  5. package/dist/adapters/FunctionsAdapter.js +1 -1
  6. package/dist/components/CrudButton.js +1 -1
  7. package/dist/components/CrudCard.js +1 -1
  8. package/dist/components/DateFilter.js +1 -1
  9. package/dist/components/DisplayFieldRenderer.js +1 -1
  10. package/dist/components/DisplayThumbnail.js +1 -1
  11. package/dist/components/EntityFilters.js +1 -1
  12. package/dist/components/FormFieldRenderer.js +1 -1
  13. package/dist/components/FormLayout.js +1 -1
  14. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  15. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  16. package/dist/components/controlled/complex/ControlledFieldArrayField.js +1 -1
  17. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  18. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  19. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  20. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  21. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  22. package/dist/components/controlled/complex/index.js +1 -1
  23. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  24. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  25. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  26. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  27. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  28. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  29. package/dist/components/controlled/file/index.js +1 -1
  30. package/dist/components/controlled/index.js +1 -1
  31. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  32. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
  33. package/dist/components/controlled/input/ControlledDurationField.js +1 -1
  34. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  35. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  36. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  37. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  38. package/dist/components/controlled/input/ControlledPriceField.js +1 -1
  39. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  40. package/dist/components/controlled/input/ControlledRatingField.js +1 -1
  41. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  42. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  43. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  44. package/dist/components/controlled/input/index.js +1 -1
  45. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  46. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  47. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  48. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  49. package/dist/components/controlled/select/ControlledReferenceField.js +1 -1
  50. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  51. package/dist/components/controlled/select/index.js +1 -1
  52. package/dist/components/controlled/types.js +1 -1
  53. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
  54. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
  55. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -1
  56. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
  57. package/dist/components/fields/display/DateFieldDisplay.js +1 -1
  58. package/dist/components/fields/display/DropdownDisplay.js +1 -1
  59. package/dist/components/fields/display/FileFieldDisplay.js +1 -1
  60. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -1
  61. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -1
  62. package/dist/components/fields/display/ImageFieldDisplay.js +1 -1
  63. package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
  64. package/dist/components/fields/display/MapFieldDisplay.js +1 -1
  65. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -1
  66. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -1
  67. package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
  68. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
  69. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -1
  70. package/dist/components/fields/display/RadioFieldDisplay.js +1 -1
  71. package/dist/components/fields/display/RangeFieldDisplay.js +1 -1
  72. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
  73. package/dist/components/fields/display/RichTextDisplay.js +2 -2
  74. package/dist/components/fields/display/TextAreaDisplay.js +1 -1
  75. package/dist/components/fields/display/TextFieldDisplay.js +1 -1
  76. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
  77. package/dist/components/fields/display/index.js +1 -1
  78. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  79. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  80. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  81. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  82. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  83. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  84. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  85. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  86. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  87. package/dist/components/form/fields/DropdownComponent.js +1 -1
  88. package/dist/components/form/fields/DurationFieldComponent.js +1 -1
  89. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  90. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  91. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  92. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  93. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  94. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  95. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  96. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  97. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  98. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  99. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  100. package/dist/components/form/fields/PriceFieldComponent.js +1 -1
  101. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  102. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  103. package/dist/components/form/fields/RatingFieldComponent.js +1 -1
  104. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  105. package/dist/components/form/fields/RichTextComponent.js +1 -1
  106. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  107. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  108. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  109. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  110. package/dist/components/form/fields/index.js +1 -1
  111. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  112. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  113. package/dist/components/index.js +1 -1
  114. package/dist/contexts/UploadContext.js +1 -1
  115. package/dist/contexts/index.js +1 -1
  116. package/dist/fieldTypeRegistry.js +1 -1
  117. package/dist/forms/hooks/index.js +1 -1
  118. package/dist/forms/hooks/useController.js +1 -1
  119. package/dist/forms/hooks/useEntityField.js +1 -1
  120. package/dist/forms/hooks/useEntityForm.js +1 -1
  121. package/dist/forms/index.js +1 -1
  122. package/dist/forms/utils/buildInitialValues.js +1 -1
  123. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  124. package/dist/forms/utils/index.js +1 -1
  125. package/dist/forms/utils/isFieldEditable.js +1 -1
  126. package/dist/forms/utils/translateFieldLabel.js +1 -1
  127. package/dist/forms/utils/validateEntity.js +1 -1
  128. package/dist/hooks/index.js +1 -1
  129. package/dist/hooks/useCrudFilters.js +1 -1
  130. package/dist/hooks/useEntityFavorites.js +1 -1
  131. package/dist/hooks/useFieldConditions.js +1 -1
  132. package/dist/hooks/useFileUpload.js +1 -1
  133. package/dist/hooks/useReferenceResolver.js +1 -1
  134. package/dist/hooks/useRelatedItems.js +1 -1
  135. package/dist/hooks/useUnsavedChangesWarning.js +1 -1
  136. package/dist/index.js +1 -1
  137. package/dist/registerBuiltinFieldTypes.js +1 -1
  138. package/dist/stores/FormStore.js +1 -1
  139. package/dist/stores/UploadStore.js +1 -1
  140. package/dist/stores/index.js +1 -1
  141. package/dist/tsconfig.tsbuildinfo +1 -1
  142. package/dist/types.js +1 -1
  143. package/dist/useBaseCrudList.js +1 -1
  144. package/dist/useCrud.js +1 -1
  145. package/dist/useCrudCardList.js +1 -1
  146. package/dist/useCrudList.js +1 -1
  147. package/dist/utils/clientListProcessing.js +1 -1
  148. package/dist/utils/collections.js +1 -1
  149. package/dist/utils/fileStorage.js +1 -1
  150. package/dist/utils/imageProcessing.js +1 -1
  151. package/dist/utils/imageStorage.js +1 -1
  152. package/dist/utils/imageUtils.js +1 -1
  153. package/dist/utils/matchesFilter.js +1 -1
  154. package/dist/utils/mergeWithOptimistic.js +1 -1
  155. package/dist/utils/sanitizeHtml.js +1 -1
  156. package/dist/utils/scopeUtils.js +1 -1
  157. package/dist/utils/uploadValidation.js +1 -1
  158. package/dist/workflows/WorkflowPersistence.js +1 -1
  159. package/dist/workflows/defineWorkflow.js +1 -1
  160. package/dist/workflows/index.js +1 -1
  161. package/dist/workflows/useEntityWorkflow.js +1 -1
  162. package/package.json +4 -4
@@ -1 +1 @@
1
- "use client";import{valibotResolver as M}from"@hookform/resolvers/valibot";import{useMemo as d,useEffect as T,useRef as v,useCallback as w,createElement as se}from"react";import{useForm as oe}from"react-hook-form";import{toast as ie,ToastAction as ne}from"@donotdev/components";import{useLocalStorage as ue,BACKEND_GENERATED_FIELD_NAMES as ce,createSchemas as le}from"@donotdev/core";import{useFormStore as j,useFormStatus as de,useUploadProgress as fe}from"../../stores";import{useUploadStore as q}from"../../stores/UploadStore";import{checkForBlobUrls as z}from"../../utils/uploadValidation";import{getFieldsForOperation as me}from"../utils";import{buildInitialFromRecord as pe,buildSchemaDefaults as ge}from"../utils/buildInitialValues";const Se=i=>i;function G(i,E){const e={...i};for(const p of Object.keys(E)){const c=i[p],f=E[p];f!==null&&typeof f=="object"&&!Array.isArray(f)&&c!==null&&typeof c=="object"&&!Array.isArray(c)?e[p]=G(c,f):e[p]=f}return e}function be(i,E={}){const{formId:e,operation:p,defaultValues:c,viewerRole:f,mode:K="onBlur",t:Y}=E,g=Y??Se,U=f??"guest",n=p??(c?"edit":"create"),H=de(e??""),J=fe(e??""),V=d(()=>le(i),[i.name]),P=d(()=>M(V.create),[V.create]),C=d(()=>M(V.draft),[V.draft]),Q=d(()=>async(t,a,s)=>((t?.status??c?.status)==="draft"?C:P)(t,a,s),[P,C,c?.status]),F=d(()=>ge(i),[i]),$=c,u=d(()=>{if(n==="create")return F;if($)return pe(i,$)},[n,F,i,$]),o=oe({defaultValues:n==="create"?u:void 0,mode:K,resolver:Q,shouldUnregister:!1,shouldFocusError:!0}),A=v(o);T(()=>{A.current=o},[o]);const D=v(null);T(()=>{if(n==="edit"&&u){const t=u.id??null;t&&t!==D.current?(A.current.reset(u),D.current=t):!t&&D.current===null&&(A.current.reset(u),D.current="initialized")}},[n,u]);const k=c?.id,W=d(()=>{const t=`${i.name.toLowerCase()}-form-draft`;return n==="create"?t:k?`${t}-${k}`:`${t}-edit`},[i.name,n,k]),{value:b,setValue:x,removeValue:S}=ue(W,{defaultValue:null,syncAcrossTabs:!0}),y=v(!1);T(()=>{if(y.current)return;const t=a=>{const s=()=>{S(),a&&A.current.reset(a)};ie({toastType:"info",title:g("draft.restored",{defaultValue:"Draft restored"}),description:g("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:se(ne,{altText:g("draft.discard",{defaultValue:"Discard"}),onClick:s},g("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(n==="create"&&!c){b&&(o.reset(b),t(F)),y.current=!0;return}if(n==="edit"&&u){if(b){const a=G(u,b);o.reset(a),t(u)}y.current=!0}},[n,c,b,o,u,S,g,F]);const O=v(!1),h=v(null);T(()=>{const t=o.watch(a=>{O.current||!y.current||(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{a&&Object.values(a).some(s=>s!=null&&s!=="")&&x(a)},3e3))});return()=>{t.unsubscribe(),h.current&&clearTimeout(h.current)}},[o,x]);const B=w(async()=>{if(!e)return!0;const t=q.getState(),a=j.getState();if(!t.hasPendingUploads(e))return!0;try{a.setUploading(e,0),await t.uploadAll(e),await new Promise(m=>setTimeout(m,50));let s=o.getValues(),r=z(s),l=0;const R=5;for(;r.length>0&&l<R;)l++,await new Promise(m=>setTimeout(m,100)),s=o.getValues(),r=z(s);if(r.length>0){const m=`Upload incomplete: files still pending at ${r.join(", ")}`;return a.setError(e,m),!1}return!0}catch(s){const r=s instanceof Error?s.message:"File upload failed";return j.getState().setError(e,r),!1}},[e,o]),L=w(t=>n!=="create"?t:Object.fromEntries(Object.entries(t).filter(([a])=>!ce.includes(a))),[n]),N=w(t=>{if(typeof window>"u")return;const a=Object.keys(t).find(r=>r!=="root"&&t[r]);if(!a)return;const s=document.querySelector(`input[name="${a}"][aria-invalid="true"], textarea[name="${a}"][aria-invalid="true"], select[name="${a}"][aria-invalid="true"]`);s&&(s.scrollIntoView({behavior:"smooth",block:"center"}),s.focus())},[]),_=o.handleSubmit,X=d(()=>((t,a)=>async s=>{s?.preventDefault?.();const r=e?j.getState():null;e&&r&&r.startSubmit(e),O.current=!0;try{if(!await B()){e&&r&&r.setError(e,"Upload failed");return}e&&r&&r.setValidating(e),await _(async(l,R)=>{e&&r&&r.setSubmitting(e);const m=L(l);try{await t(m,R),S(),e&&r&&r.setSuccess(e)}catch(I){const ae=I instanceof Error?I.message:"Submission failed";throw e&&r&&r.setError(e,ae),I}},l=>{e&&r&&r.setError(e,"Validation failed"),N(l),a?.(l)})(s)}catch{if(e&&r){const l=r.getStatus(e);l!=="error"&&l!=="idle"&&l!=="success"&&r.reset(e)}}finally{O.current=!1}}),[_,e,B,L,N,n,S]),Z=w(()=>{S(),o.reset(u),y.current=!1},[S,o,u]),ee=w(()=>{e&&(j.getState().cleanup(e),q.getState().cleanup(e))},[e]),te=d(()=>me(i,{operation:n,viewerRole:U,availableFields:void 0}),[i,n,U]),re=o.formState.isSubmitted||Object.keys(o.formState.touchedFields||{}).length>0;return{...o,handleSubmit:X,fields:te,operation:n,entity:i,t:g,viewerRole:U,formId:e,formStatus:e?H:"idle",uploadProgress:e?J:0,cleanup:ee,isDirty:o.formState.isDirty,hasUserInteracted:re,resetForm:Z,originalValues:u}}export{be as useEntityForm};
1
+ "use client";import{valibotResolver as K}from"@hookform/resolvers/valibot";import{useMemo as l,useEffect as A,useRef as V,useCallback as v,createElement as ae}from"react";import{useForm as ne}from"react-hook-form";import{toast as ie,ToastAction as ue}from"@donotdev/components";import{useLocalStorage as ce,BACKEND_GENERATED_FIELD_NAMES as le,createSchemas as fe}from"@donotdev/core";import{useFormStore as P,useFormStatus as de,useUploadProgress as me}from"../../stores";import{useUploadStore as N}from"../../stores/UploadStore";import{checkForBlobUrls as q}from"../../utils/uploadValidation";import{getFieldsForOperation as pe}from"../utils";import{buildInitialFromRecord as Se,buildSchemaDefaults as ge}from"../utils/buildInitialValues";const he=n=>n;function z(n,E){const e={...n};for(const S of Object.keys(E)){const c=n[S],d=E[S];d!==null&&typeof d=="object"&&!Array.isArray(d)&&c!==null&&typeof c=="object"&&!Array.isArray(c)?e[S]=z(c,d):e[S]=d}return e}function Ae(n,E={}){const{formId:e,operation:S,defaultValues:c,viewerRole:d,mode:G="onBlur",t:H}=E,g=H??he,U=d??"guest",i=S??(c?"edit":"create"),W=de(e??""),Y=me(e??""),F=l(()=>fe(n),[n.name]),O=l(()=>K(F.create),[F.create]),$=l(()=>K(F.draft),[F.draft]),J=l(()=>async(r,s,a)=>((r?.status??c?.status)==="draft"?$:O)(r,s,a),[O,$,c?.status]),y=l(()=>ge(n),[n]),j=c,u=l(()=>{if(i==="create")return y;if(j)return Se(n,j)},[i,y,n,j]),o=ne({defaultValues:i==="create"?u:void 0,mode:G,resolver:J,shouldUnregister:!1,shouldFocusError:!0}),R=V(o);A(()=>{R.current=o},[o]);const T=V(null);A(()=>{if(i==="edit"&&u){const r=u.id??null;r&&r!==T.current?(R.current.reset(u),T.current=r):!r&&T.current===null&&(R.current.reset(u),T.current="initialized")}},[i,u]);const k=c?.id,Q=l(()=>{const r=`${n.name.toLowerCase()}-form-draft`;return i==="create"?r:k?`${r}-${k}`:`${r}-edit`},[n.name,i,k]),{value:b,setValue:x,removeValue:h}=ce(Q,{defaultValue:null,syncAcrossTabs:!0}),D=V(!1);A(()=>{if(D.current)return;const r=s=>{const a=()=>{h(),s&&R.current.reset(s)};ie({toastType:"info",title:g("draft.restored",{defaultValue:"Draft restored"}),description:g("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:ae(ue,{altText:g("draft.discard",{defaultValue:"Discard"}),onClick:a},g("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(i==="create"&&!c){b&&(o.reset(b),r(y)),D.current=!0;return}if(i==="edit"&&u){if(b){const s=z(u,b);o.reset(s),r(u)}D.current=!0}},[i,c,b,o,u,h,g,y]);const I=V(!1),w=V(null);A(()=>{const r=o.watch(s=>{I.current||!D.current||(w.current&&clearTimeout(w.current),w.current=setTimeout(()=>{if(!s)return;Object.values(s).some(t=>t!=null&&t!=="")&&x(s)},3e3))});return()=>{r.unsubscribe(),w.current&&clearTimeout(w.current)}},[o,x]);const B=v(async()=>{if(!e)return!0;const r=N.getState(),s=P.getState();if(!r.hasPendingUploads(e))return!0;try{s.setUploading(e,0),await r.uploadAll(e),await new Promise(p=>setTimeout(p,50));let a=o.getValues(),t=q(a),f=0;const m=5;for(;t.length>0&&f<m;)f++,await new Promise(p=>setTimeout(p,100)),a=o.getValues(),t=q(a);if(t.length>0){const p=`Upload incomplete: files still pending at ${t.join(", ")}`;return s.setError(e,p),!1}return!0}catch(a){const t=a instanceof Error?a.message:"File upload failed";return P.getState().setError(e,t),!1}},[e,o]),C=v(r=>i!=="create"?r:Object.fromEntries(Object.entries(r).filter(([s])=>!le.includes(s))),[i]),L=v(r=>{if(typeof window>"u")return;const s=Object.keys(r).find(t=>t!=="root"&&r[t]);if(!s)return;const a=document.querySelector(`input[name="${s}"][aria-invalid="true"], textarea[name="${s}"][aria-invalid="true"], select[name="${s}"][aria-invalid="true"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.focus())},[]),_=o.handleSubmit,X=l(()=>((r,s)=>async a=>{a?.preventDefault?.();const t=e?P.getState():null;e&&t&&t.startSubmit(e),I.current=!0;try{if(!await B()){e&&t&&t.setError(e,"Upload failed");return}e&&t&&t.setValidating(e),await _(async(m,p)=>{e&&t&&t.setSubmitting(e);const se=C(m);try{await r(se,p),h(),e&&t&&t.setSuccess(e)}catch(M){const oe=M instanceof Error?M.message:"Submission failed";throw e&&t&&t.setError(e,oe),M}},m=>{e&&t&&t.setError(e,"Validation failed"),L(m),s?.(m)})(a)}catch{if(e&&t){const f=t.getStatus(e);f!=="error"&&f!=="idle"&&f!=="success"&&t.reset(e)}}finally{I.current=!1}}),[_,e,B,C,L,i,h]),Z=v(()=>{h(),o.reset(u),D.current=!1},[h,o,u]),ee=v(()=>{e&&(P.getState().cleanup(e),N.getState().cleanup(e))},[e]),te=l(()=>pe(n,{operation:i,viewerRole:U,availableFields:void 0}),[n,i,U]),re=o.formState.isSubmitted||Object.keys(o.formState.touchedFields||{}).length>0;return{...o,handleSubmit:X,fields:te,operation:i,entity:n,t:g,viewerRole:U,formId:e,formStatus:e?W:"idle",uploadProgress:e?Y:0,cleanup:ee,isDirty:o.formState.isDirty,hasUserInteracted:re,resetForm:Z,originalValues:u}}export{Ae 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};
@@ -1 +1 @@
1
- function l(r,i){if(i in r)return r[i];const o=i.replace(/_([a-z])/g,(t,n)=>n.toUpperCase());if(o!==i&&o in r)return r[o]}function s(r,i){if(i in r)return!0;const o=i.replace(/_([a-z])/g,(t,n)=>n.toUpperCase());return o!==i&&o in r}function u(r,i){const o=i??{},t={...o};return Object.entries(r.fields).forEach(([n,e])=>{const p=l(t,n);p!==void 0&&!(n in t)&&(t[n]=p);const c=!s(o,n)||p===null||p===void 0;if(e.type==="switch"){if(p==null){const a=e.options?.fieldSpecific;t[n]=a?.uncheckedValue??!1}}else c&&(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==="iban"||e.type==="password"||e.type==="color"?t[n]="":(e.type==="number"||e.type==="range"||e.type==="rating")&&(t[n]=void 0))}),t}function y(r){return u(r,{})}export{u as buildInitialFromRecord,y as buildSchemaDefaults};
1
+ function y(n,c){if(c in n)return n[c];const r=c.replace(/_([a-z])/g,(u,e)=>e.toUpperCase());if(r!==c&&r in n)return n[r]}function o(n,c){if(c in n)return!0;const r=c.replace(/_([a-z])/g,(u,e)=>e.toUpperCase());return r!==c&&r in n}function b(n,c){const r=c??{},u={...r};return Object.entries(n.fields).forEach(([e,t])=>{const s=y(u,e);s!==void 0&&!(e in u)&&(u[e]=s);const p=!o(r,e)||s===null||s===void 0;if(t.type==="switch"){if(s==null){const a=t.options?.fieldSpecific;u[e]=a?.uncheckedValue??!1}}else p&&(t.type==="price"?u[e]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:t.type==="checkbox"||t.type==="boolean"?u[e]=!1:t.type==="text"||t.type==="textarea"||t.type==="email"||t.type==="url"||t.type==="tel"||t.type==="iban"||t.type==="password"||t.type==="color"?u[e]="":(t.type==="number"||t.type==="range"||t.type==="rating")&&(u[e]=void 0))}),u}function h(n){return b(n,{})}export{b as buildInitialFromRecord,h as buildSchemaDefaults};
@@ -1 +1 @@
1
- import{isFieldVisible as u}from"@donotdev/core";import{isFieldEditable as m}from"./isFieldEditable";function g(i,d){const{operation:e,viewerRole:r,availableFields:l}=d,n=r??"guest",f=i&&typeof i=="object"&&"fields"in i&&"name"in i?i.fields:i,b=Object.entries(f),s=[];for(const[a,p]of b){const t=p,o=t.visibility||"guest";if(!u(o,n)||e==="create"&&o==="technical"||e==="edit"&&l&&!l.includes(a))continue;let c=m(t.editable,n,e);e==="edit"&&o==="technical"&&t.editable===void 0&&(c=!1),s.push({name:a,config:t,editable:c})}return s}export{g as getFieldsForOperation};
1
+ import{isFieldVisible as p}from"@donotdev/core";import{isFieldEditable as m}from"./isFieldEditable";function g(e,r){const{operation:i,viewerRole:d,availableFields:l}=r,n=d??"guest",a=e&&typeof e=="object"&&"fields"in e&&"name"in e?e.fields:e,u=Object.entries(a),s=[];for(const[c,b]of u){const o=b,t=o.visibility||"guest";if(!p(t,n)||i==="create"&&t==="technical"||i==="edit"&&l&&!l.includes(c))continue;let f=m(o.editable,n,i);i==="edit"&&t==="technical"&&o.editable===void 0&&(f=!1),s.push({name:c,config:o,editable:f})}return s}export{g as getFieldsForOperation};
@@ -1 +1 @@
1
- import{isFieldEditable as a}from"./isFieldEditable";import{getFieldsForOperation as t}from"./getFieldsForOperation";import{validateEntity as e}from"./validateEntity";import{translateFieldLabel as i,translateLabel as l}from"./translateFieldLabel";export{t as getFieldsForOperation,a as isFieldEditable,i as translateFieldLabel,l as translateLabel,e as validateEntity};
1
+ import{isFieldEditable as r}from"./isFieldEditable";import{getFieldsForOperation as o}from"./getFieldsForOperation";import{validateEntity as i}from"./validateEntity";import{translateFieldLabel as p,translateLabel as f}from"./translateFieldLabel";export{o as getFieldsForOperation,r as isFieldEditable,p as translateFieldLabel,f as translateLabel,i as validateEntity};
@@ -1 +1 @@
1
- import{hasRoleAccess as t,USER_ROLES as o}from"@donotdev/core";function s(e,a,i){return e===void 0||e===!0?!0:e===!1?!1:e==="admin"?t(a,o.ADMIN):e==="create-only"?i==="create":!0}export{s as isFieldEditable};
1
+ import{hasRoleAccess as t,USER_ROLES as u}from"@donotdev/core";function i(r,e,n){return r===void 0||r===!0?!0:r===!1?!1:r==="admin"?t(e,u.ADMIN):r==="create-only"?n==="create":!0}export{i as isFieldEditable};
@@ -1 +1 @@
1
- function i(e,r){if(typeof e=="string"&&e.includes(":")){const n=e.split(":"),t=n[1]??e,s=n[0];if(t.startsWith("status.")){const a=r(t);return a!==t&&a!==`${s}:${t}`?a:r(t,{ns:s})}return r(t,{ns:s})}return r(e)}function l(e,r,n){const t=r?.label||e;return i(t,n)}export{l as translateFieldLabel,i as translateLabel};
1
+ function a(n,s){if(typeof n=="string"&&n.includes(":")){const r=n.split(":"),t=r[1]??n,e=r[0];if(t.startsWith("status.")){const i=s(t);return i!==t&&i!==`${e}:${t}`?i:s(t,{ns:e})}return s(t,{ns:e})}return s(n)}function o(n,s,r){const t=s?.label||n;return a(t,r)}export{o as translateFieldLabel,a as translateLabel};
@@ -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 e}from"./useFileUpload";import{useUnsavedChangesWarning as s}from"./useUnsavedChangesWarning";import{useEntityFavorites as a}from"./useEntityFavorites";import{useCrudFilters as r}from"./useCrudFilters";import{useRelatedItems as o}from"./useRelatedItems";import{useFieldConditions as i}from"./useFieldConditions";import{useReferenceResolver as t}from"./useReferenceResolver";export{r as useCrudFilters,a as useEntityFavorites,i as useFieldConditions,e as useFileUpload,t as useReferenceResolver,o as useRelatedItems,s as useUnsavedChangesWarning};
1
+ import{useFileUpload as o}from"./useFileUpload";import{useUnsavedChangesWarning as t}from"./useUnsavedChangesWarning";import{useEntityFavorites as i}from"./useEntityFavorites";import{useCrudFilters as n}from"./useCrudFilters";import{useRelatedItems as u}from"./useRelatedItems";import{useFieldConditions as a}from"./useFieldConditions";import{useReferenceResolver as l}from"./useReferenceResolver";export{n as useCrudFilters,i as useEntityFavorites,a as useFieldConditions,o as useFileUpload,l as useReferenceResolver,u as useRelatedItems,t as useUnsavedChangesWarning};
@@ -1 +1 @@
1
- import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";const c={};function u(r){const{collection:e}=r,i=s(t=>t.collections[e]?.ui?.filters??c),l=o(t=>{s.getState().setFilters(e,t)},[e]),n=s(t=>t.collections[e]?.ui?.showFavoritesOnly??!1),a=o(t=>{s.getState().setShowFavoritesOnly(e,t)},[e]);return{filters:i,setFilters:l,showFavoritesOnly:n,setShowFavoritesOnly:a}}export{u as useCrudFilters};
1
+ import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";const a={};function f(r){const{collection:e}=r,l=s(t=>t.collections[e]?.ui?.filters??a),i=o(t=>{s.getState().setFilters(e,t)},[e]),n=s(t=>t.collections[e]?.ui?.showFavoritesOnly??!1),c=o(t=>{s.getState().setShowFavoritesOnly(e,t)},[e]);return{filters:l,setFilters:i,showFavoritesOnly:n,setShowFavoritesOnly:c}}export{f as useCrudFilters};
@@ -1 +1 @@
1
- import{useCallback as o}from"react";import{useLocalStorage as p}from"@donotdev/core";function y(s={}){const{storageKey:l,collection:u="entities"}=s,d=l||`favorites-${u}`,{value: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{useMemo as s}from"react";import{useWatch as c}from"react-hook-form";import{evaluateFieldConditions as f}from"@donotdev/core";function u(o,r){const t=c({control:r}),e=s(()=>o.some(n=>n.config.conditions),[o]);return s(()=>{if(!e)return{};const n={};for(const i of o)i.config.conditions&&(n[i.name]=f(i.config.conditions,t));return n},[o,t,e])}export{u as useFieldConditions};
1
+ "use client";import{useMemo as r}from"react";import{useWatch as c}from"react-hook-form";import{evaluateFieldConditions as u}from"@donotdev/core";function d(o,s){const t=c({control:s}),e=r(()=>o.some(n=>n.config.conditions),[o]);return r(()=>{if(!e)return{};const n={};for(const i of o)i.config.conditions&&(n[i.name]=u(i.config.conditions,t));return n},[o,t,e])}export{d as useFieldConditions};
@@ -1 +1 @@
1
- "use client";import{useState as T,useCallback as v,useEffect as A,useRef as g,startTransition as q}from"react";import{handleError as C}from"@donotdev/core";import{useUploadContext as G}from"../contexts/UploadContext";import{useUploadStore as N}from"../stores/UploadStore";let W=0;function k(s){if(s){const u=s.split("/").pop()?.split("?")[0];if(u)return`file-${u}`}W+=1;const a=typeof performance<"u"?performance.now():Date.now(),p=Math.random().toString(36).slice(2,11);return`file-${W}-${a}-${p}`}function H(s){return URL.createObjectURL(s)}function B(s){s.startsWith("blob:")&&URL.revokeObjectURL(s)}function K(s,a,p){return a.length>0&&!a.some(u=>{if(u.endsWith("/*")){const h=u.slice(0,-2);return s.type.startsWith(h)}return s.type===u})?{valid:!1,error:`File type ${s.type} not accepted`}:s.size>p?{valid:!1,error:`File exceeds ${(p/1048576).toFixed(0)}MB limit`}:{valid:!0}}function Q({name:s,value:a,onChange:p,multiple:u=!1,maxFiles:h=10,maxSize:$=10*1024*1024,accept:S=[],storagePath:V="uploads",uploadFn:U}){const y=G(),w=!!y,[d,c]=T([]),R=g(!1),b=g(null),L=g(a),x=g([]),F=g(!1),E=g(null);A(()=>{if(R.current){R.current=!1;return}const n=a?JSON.stringify((Array.isArray(a)?a:[a]).map(i=>i.fullUrl).filter(Boolean)):null;n!==b.current&&(b.current=n,L.current=a,q(()=>{if(a){const i=(Array.isArray(a)?a:[a]).filter(t=>t.fullUrl).map((t,r)=>({id:`${k(t.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:t.thumbUrl||t.fullUrl,progress:100,uploaded:t,error:null}));c(i)}else c([])}))},[a]),A(()=>{x.current=d},[d]),A(()=>{F.current&&(F.current=!1,E.current?.(d,!0))},[d]),A(()=>()=>{x.current.forEach(n=>B(n.previewURL))},[]);const f=v((n,i=!1)=>{const t=(i?n.filter(l=>!l.error):n.filter(l=>l.uploaded&&!l.error)).map(l=>l.uploaded?l.uploaded:i&&w?{fullUrl:l.previewURL,thumbUrl:l.previewURL}:null).filter(l=>l!==null);let r;u?r=t.length>0?t:null:r=t[0]||null;const e=L.current;(()=>{if(!r&&!e)return!1;if(!r||!e)return!0;if(u&&Array.isArray(r)&&Array.isArray(e)){if(r.length!==e.length)return!0;const l=r.map(m=>m.fullUrl).join(","),o=e.map(m=>m.fullUrl).join(",");return l!==o}return!u&&!Array.isArray(r)&&!Array.isArray(e)?r.fullUrl!==e.fullUrl:!0})()&&(R.current=!0,L.current=r,p(r))},[u,p,w]);E.current=f;const M=v(async()=>{if(!U)return;let n=[];if(c(t=>(n=t.filter(r=>!r.uploaded&&!r.error),n.length===0?t:t.map(r=>n.some(e=>e.id===r.id)?{...r,progress:0}:r))),n.length===0)return;const i=await Promise.allSettled(n.map(async t=>{try{const r=await U(t.file,e=>{c(l=>l.map(o=>o.id===t.id?{...o,progress:e}:o))});return{id:t.id,picture:r,error:null}}catch(r){const e=r instanceof Error?r.message:"Upload failed";return{id:t.id,picture:null,error:e}}}));c(t=>{const r=t.map(e=>{const l=i.find(o=>o.status==="fulfilled"&&o.value.id===e.id);if(l&&l.status==="fulfilled"){const o=l.value;return{...e,uploaded:o.picture,progress:o.picture?100:null,error:o.error}}return e});return f(r,!1),r})},[U,f]),j=g(M);j.current=M,A(()=>{if(!(!y||!s))return N.getState().registerUpload(y,s,async()=>{await j.current()},()=>x.current.some(n=>!n.uploaded&&!n.error)),()=>{N.getState().unregisterUpload(y,s)}},[y,s]);const O=v(async n=>{if(U){c(i=>i.map(t=>t.id===n.id?{...t,progress:0}:t));try{const i=await U(n.file,t=>{c(r=>r.map(e=>e.id===n.id?{...e,progress:t}:e))});c(t=>{const r=t.map(e=>e.id===n.id?{...e,uploaded:i,progress:100,error:null}:e);return f(r,!1),r})}catch(i){const t=i instanceof Error?i.message:"Upload failed";c(r=>r.map(e=>e.id===n.id?{...e,error:t,progress:null}:e))}}},[U,f]),D=v(n=>{c(i=>{const t=(u?h:1)-i.length;if(t<=0)return C(new Error("Maximum files reached"),{userMessage:u?`Maximum ${h} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),i;const r=n.slice(0,t),e=[];for(const o of r){const m=K(o,S,$);if(!m.valid){C(new Error(m.error),{userMessage:m.error,severity:"warning",showNotification:!0});continue}e.push({id:k(),file:o,previewURL:H(o),progress:null,uploaded:null,error:null})}if(e.length===0)return i;const l=u?[...i,...e]:e;return w?F.current=!0:e.forEach(o=>O(o)),l})},[u,h,S,$,w,O,f]),z=v(n=>{c(i=>{const t=i.find(e=>e.id===n);t&&B(t.previewURL);const r=i.filter(e=>e.id!==n);return f(r,!1),r})},[f]),I=d.some(n=>!n.uploaded&&!n.error),J=d.some(n=>n.progress!==null&&n.progress<100),P=d.length>0?d.reduce((n,i)=>n+(i.progress??0),0)/d.length:0;return{files:d,addFiles:D,removeFile:z,hasPending:I,isUploading:J,progress:P,formId:y,isDeferred:w}}export{Q as useFileUpload};
1
+ "use client";import{useState as G,useCallback as A,useEffect as L,useRef as U,startTransition as H}from"react";import{handleError as k}from"@donotdev/core";import{useUploadContext as K}from"../contexts/UploadContext";import{useUploadStore as B}from"../stores/UploadStore";let D=0;function M(l){if(l){const a=l.split("/").pop()?.split("?")[0];if(a)return`file-${a}`}D+=1;const u=typeof performance<"u"?performance.now():Date.now(),g=Math.random().toString(36).slice(2,11);return`file-${D}-${u}-${g}`}function Q(l){return URL.createObjectURL(l)}function T(l){l.startsWith("blob:")&&URL.revokeObjectURL(l)}function X(l,u,g){return u.length>0&&!u.some(m=>{if(m.endsWith("/*")){const E=m.slice(0,-2);return l.type.startsWith(E)}return l.type===m})?{valid:!1,error:`File type ${l.type} not accepted`}:l.size>g?{valid:!1,error:`File exceeds ${(g/1048576).toFixed(0)}MB limit`}:{valid:!0}}function er({name:l,value:u,onChange:g,multiple:a=!1,maxFiles:m=10,maxSize:E=10*1024*1024,accept:P=[],storagePath:Y="uploads",uploadFn:h}){const w=K(),y=!!w,[f,d]=G([]),v=U(!1),S=U(null),F=U(u),$=U([]),b=U(!1),C=U(null);L(()=>{if(v.current){v.current=!1;return}const t=u?JSON.stringify((Array.isArray(u)?u:[u]).map(s=>s.fullUrl).filter(Boolean)):null;t!==S.current&&(S.current=t,F.current=u,H(()=>{if(u){const n=(Array.isArray(u)?u:[u]).filter(e=>e.fullUrl).map((e,r)=>({id:`${M(e.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:e.thumbUrl||e.fullUrl,progress:100,uploaded:e,error:null}));d(n)}else d([])}))},[u]),L(()=>{$.current=f},[f]),L(()=>{b.current&&(b.current=!1,C.current?.(f,!0))},[f]),L(()=>()=>{$.current.forEach(t=>T(t.previewURL))},[]);const p=A((t,s=!1)=>{const e=(s?t.filter(o=>!o.error):t.filter(o=>o.uploaded&&!o.error)).map(o=>o.uploaded?o.uploaded:s&&y?{fullUrl:o.previewURL,thumbUrl:o.previewURL}:null).filter(o=>o!==null);let r;a?r=e.length>0?e:null:r=e[0]||null;const i=F.current;(()=>{if(!r&&!i)return!1;if(!r||!i)return!0;if(a&&Array.isArray(r)&&Array.isArray(i)){if(r.length!==i.length)return!0;const o=r.map(x=>x.fullUrl).join(","),R=i.map(x=>x.fullUrl).join(",");return o!==R}return!a&&!Array.isArray(r)&&!Array.isArray(i)?r.fullUrl!==i.fullUrl:!0})()&&(v.current=!0,F.current=r,g(r))},[a,g,y]);C.current=p;const I=A(async()=>{if(!h)return;let t=[];if(d(n=>(t=n.filter(e=>!e.uploaded&&!e.error),t.length===0?n:n.map(e=>t.some(r=>r.id===e.id)?{...e,progress:0}:e))),t.length===0)return;const s=await Promise.allSettled(t.map(async n=>{try{const e=await h(n.file,r=>{d(i=>i.map(c=>c.id===n.id?{...c,progress:r}:c))});return{id:n.id,picture:e,error:null}}catch(e){const r=e instanceof Error?e.message:"Upload failed";return{id:n.id,picture:null,error:r}}}));d(n=>{const e=n.map(r=>{const i=s.find(c=>c.status==="fulfilled"&&c.value.id===r.id);if(i&&i.status==="fulfilled"){const c=i.value;return{...r,uploaded:c.picture,progress:c.picture?100:null,error:c.error}}return r});return p(e,!1),e})},[h,p]),N=U(I);N.current=I,L(()=>{if(!(!w||!l))return B.getState().registerUpload(w,l,async()=>{await N.current()},()=>$.current.some(t=>!t.uploaded&&!t.error)),()=>{B.getState().unregisterUpload(w,l)}},[w,l]);const j=A(async t=>{if(h){d(s=>s.map(n=>n.id===t.id?{...n,progress:0}:n));try{const s=await h(t.file,n=>{d(e=>e.map(r=>r.id===t.id?{...r,progress:n}:r))});d(n=>{const e=n.map(r=>r.id===t.id?{...r,uploaded:s,progress:100,error:null}:r);return p(e,!1),e})}catch(s){const n=s instanceof Error?s.message:"Upload failed";d(e=>e.map(r=>r.id===t.id?{...r,error:n,progress:null}:r))}}},[h,p]),V=A(t=>{d(s=>{const e=(a?m:1)-s.length;if(e<=0)return k(new Error("Maximum files reached"),{userMessage:a?`Maximum ${m} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),s;const r=t.slice(0,e),i=[];for(const o of r){const R=X(o,P,E);if(!R.valid){k(new Error(R.error),{userMessage:R.error,severity:"warning",showNotification:!0});continue}i.push({id:M(),file:o,previewURL:Q(o),progress:null,uploaded:null,error:null})}if(i.length===0)return s;const c=a?[...s,...i]:i;return y?b.current=!0:i.forEach(o=>j(o)),c})},[a,m,P,E,y,j,p]),O=A(t=>{d(s=>{const n=s.find(r=>r.id===t);n&&T(n.previewURL);const e=s.filter(r=>r.id!==t);return p(e,!1),e})},[p]),W=f.some(t=>!t.uploaded&&!t.error),J=f.some(t=>t.progress!==null&&t.progress<100),q=f.length>0?f.reduce((t,s)=>t+(s.progress??0),0)/f.length:0;return{files:f,addFiles:V,removeFile:O,hasPending:W,isUploading:J,progress:q,formId:w,isDeferred:y}}export{er as useFileUpload};
@@ -1 +1 @@
1
- "use client";import{useMemo as p}from"react";import{buildReferenceLabel as v}from"../components/controlled/select/ControlledReferenceField";import{useCrudList as c}from"../useCrudList";function R(n){const o=new Map;for(const i of Object.values(n.fields)){const e=i.validation?.reference;if(typeof e=="string"&&!o.has(e)){const l=i.options?.fieldSpecific;o.set(e,{collection:e,labelFields:l?.labelFields,displayField:l?.displayField})}}return Array.from(o.values())}function M(n){const o=p(()=>R(n),[n]),i=o[0],e=o[1],l=o[2],s=o[3],{items:d}=c(i?.collection??"__disabled_0__",{enabled:!!i}),{items:a}=c(e?.collection??"__disabled_1__",{enabled:!!e}),{items:f}=c(l?.collection??"__disabled_2__",{enabled:!!l}),{items:r}=c(s?.collection??"__disabled_3__",{enabled:!!s}),F=[{info:i,items:d},{info:e,items:a},{info:l,items:f},{info:s,items:r}];return p(()=>{const _={};for(const{info:t,items:m}of F){if(!t||!m.length)continue;const b={};for(const y of m){const u=y;b[u.id]=v(u,t.labelFields,t.displayField)}_[t.collection]=b}return _},[i?.collection,d,e?.collection,a,l?.collection,f,s?.collection,r])}export{M as useReferenceResolver};
1
+ "use client";import{useMemo as p}from"react";import{buildReferenceLabel as v}from"../components/controlled/select/ControlledReferenceField";import{useCrudList as c}from"../useCrudList";function y(t){const o=new Map;for(const i of Object.values(t.fields)){const e=i.validation?.reference;if(typeof e=="string"&&!o.has(e)){const l=i.options?.fieldSpecific;o.set(e,{collection:e,labelFields:l?.labelFields,displayField:l?.displayField})}}return Array.from(o.values())}function M(t){const o=p(()=>y(t),[t]),i=o[0],e=o[1],l=o[2],s=o[3],{items:f}=c(i?.collection??"__disabled_0__",{enabled:!!i}),{items:r}=c(e?.collection??"__disabled_1__",{enabled:!!e}),{items:d}=c(l?.collection??"__disabled_2__",{enabled:!!l}),{items:a}=c(s?.collection??"__disabled_3__",{enabled:!!s}),F=[{info:i,items:f},{info:e,items:r},{info:l,items:d},{info:s,items:a}];return p(()=>{const m={};for(const{info:n,items:_}of F){if(!n||!_.length)continue;const u={};for(const R of _){const b=R;u[b.id]=v(b,n.labelFields,n.displayField)}m[n.collection]=u}return m},[i?.collection,f,e?.collection,r,l?.collection,d,s?.collection,a])}export{M as useReferenceResolver};
@@ -1 +1 @@
1
- "use client";import{useMemo as g}from"react";function p(a,e,t,n,N={}){const{limit:o=3,tolerance:m=.2}=N,c=g(()=>{if(!e||!t||t.length===0||n.length===0)return[];const b=e.id;return t.filter(f=>f.id===b?!1:n.some(i=>{const r=a.fields[i];if(!r)return!1;const s=e[i],u=f[i];if(s==null||u==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const l=Number(s),h=Number(u);if(isNaN(l)||isNaN(h))return!1;const d=Math.abs(l*m);return Math.abs(h-l)<=d}return String(s)===String(u)})).slice(0,o)},[e,t,n,a.fields,o,m]);return{items:c,hasItems:c.length>0}}export{p as useRelatedItems};
1
+ "use client";import{useMemo as N}from"react";function y(f,e,n,t,p={}){const{limit:l=3,tolerance:a=.2}=p,c=N(()=>{if(!e||!n||n.length===0||t.length===0)return[];const h=e.id;return n.filter(g=>g.id===h?!1:t.some(s=>{const r=f.fields[s];if(!r)return!1;const u=e[s],i=g[s];if(u==null||i==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const o=Number(u),b=Number(i);if(isNaN(o)||isNaN(b))return!1;const m=Math.abs(o*a);return Math.abs(b-o)<=m}return String(u)===String(i)})).slice(0,l)},[e,n,t,f.fields,l,a]);return{items:c,hasItems:c.length>0}}export{y as useRelatedItems};
@@ -1 +1 @@
1
- "use client";import{useEffect as s}from"react";import{isClient as u}from"@donotdev/core";function o({isDirty:n,enabled:a=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}){s(()=>{if(!a||!n||!u())return;const r=t=>(t.preventDefault(),t.returnValue=e,e);return window.addEventListener("beforeunload",r),()=>{window.removeEventListener("beforeunload",r)}},[n,a,e])}var i=o;export{i as default,o as useUnsavedChangesWarning};
1
+ "use client";import{useEffect as u}from"react";import{isClient as a}from"@donotdev/core";function f({isDirty:n,enabled:r=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}){u(()=>{if(!r||!n||!a())return;const o=t=>(t.preventDefault(),t.returnValue=e,e);return window.addEventListener("beforeunload",o),()=>{window.removeEventListener("beforeunload",o)}},[n,r,e])}var l=f;export{l as default,f 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{FunctionsAdapter as e}from"./adapters/FunctionsAdapter";import{getCrudService as a}from"./CrudService";import{useCrudStore as s}from"./CrudStore";import{OPTIMISTIC_STATUSES as t,CRUD_OPERATION as r}from"./types";import{loadDeterministicRange as i,upsertDeterministic as l,appendToCollection as o}from"./utils/collections";import{getFieldRegistry as d,registerFieldType as p,isFieldTypeRegistered as n}from"./FieldRegistry";import{registerBuiltinFieldType as m,getFieldTypeMetadata as F,getFilterType as u,getDisplayFormatter as f,isFilterable as y,getValueType as g,clearFieldTypeRegistry as c}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as T}from"./builtinFieldTypes";import{useEntityForm as S,useEntityField as C,useController as R,isFieldEditable as U,getFieldsForOperation as b,validateEntity as v,translateFieldLabel as E,translateLabel as h}from"./forms";import{UploadProvider as k,useUploadContext as W}from"./contexts";import{useFileUpload as w,useUnsavedChangesWarning as I,useEntityFavorites as x,useRelatedItems as B,useCrudFilters as O,useFieldConditions as P,useReferenceResolver as D}from"./hooks";import{isStorageUrl as A,validatePicture as L,checkForBlobUrls as M,hasBlobUrls as V}from"./utils/uploadValidation";import{defineWorkflow as _,useEntityWorkflow as N,saveWorkflowState as q,loadWorkflowState as z,clearWorkflowState as H}from"./workflows";import{formatValue as J}from"./components/DisplayFieldRenderer";import{buildReferenceLabel as K}from"./components/controlled/select/ControlledReferenceField";import{matchesFilter as Q}from"./utils/matchesFilter";import{applyFilters as X,applySearch as Y,applySort as Z,getSearchableFields as j}from"./utils/clientListProcessing";export{r as CRUD_OPERATION,e as FunctionsAdapter,t as OPTIMISTIC_STATUSES,k as UploadProvider,o as appendToCollection,X as applyFilters,Y as applySearch,Z as applySort,K as buildReferenceLabel,M as checkForBlobUrls,c as clearFieldTypeRegistry,H as clearWorkflowState,_ as defineWorkflow,J as formatValue,a as getCrudService,f as getDisplayFormatter,d as getFieldRegistry,F as getFieldTypeMetadata,b as getFieldsForOperation,u as getFilterType,j as getSearchableFields,g as getValueType,V as hasBlobUrls,U as isFieldEditable,n as isFieldTypeRegistered,y as isFilterable,A as isStorageUrl,i as loadDeterministicRange,z as loadWorkflowState,Q as matchesFilter,m as registerBuiltinFieldType,T as registerBuiltinFieldTypes,p as registerFieldType,q as saveWorkflowState,E as translateFieldLabel,h as translateLabel,l as upsertDeterministic,R as useController,O as useCrudFilters,s as useCrudStore,x as useEntityFavorites,C as useEntityField,S as useEntityForm,N as useEntityWorkflow,P as useFieldConditions,w as useFileUpload,D as useReferenceResolver,B as useRelatedItems,I as useUnsavedChangesWarning,W as useUploadContext,v as validateEntity,L as validatePicture};
1
+ export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{FunctionsAdapter as s}from"./adapters/FunctionsAdapter";import{getCrudService as d}from"./CrudService";import{useCrudStore as m}from"./CrudStore";import{OPTIMISTIC_STATUSES as F,CRUD_OPERATION as u}from"./types";import{loadDeterministicRange as y,upsertDeterministic as g,appendToCollection as c}from"./utils/collections";import{getFieldRegistry as S,registerFieldType as C,isFieldTypeRegistered as R}from"./FieldRegistry";import{registerBuiltinFieldType as U,getFieldTypeMetadata as v,getFilterType as E,getDisplayFormatter as h,isFilterable as k,getValueType as W,clearFieldTypeRegistry as w}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as B}from"./builtinFieldTypes";import{useEntityForm as O,useEntityField as P,useController as A,isFieldEditable as L,getFieldsForOperation as M,validateEntity as V,translateFieldLabel as _,translateLabel as N}from"./forms";import{UploadProvider as q,useUploadContext as z}from"./contexts";import{useFileUpload as H,useUnsavedChangesWarning as J,useEntityFavorites as K,useRelatedItems as Q,useCrudFilters as X,useFieldConditions as Y,useReferenceResolver as Z}from"./hooks";import{isStorageUrl as ee,validatePicture as re,checkForBlobUrls as te,hasBlobUrls as oe}from"./utils/uploadValidation";import{defineWorkflow as ie,useEntityWorkflow as ae,saveWorkflowState as se,loadWorkflowState as pe,clearWorkflowState as de}from"./workflows";import{formatValue as me}from"./components/DisplayFieldRenderer";import{buildReferenceLabel as Fe}from"./components/controlled/select/ControlledReferenceField";import{matchesFilter as xe}from"./utils/matchesFilter";import{applyFilters as ge,applySearch as ce,applySort as Te,getSearchableFields as Se}from"./utils/clientListProcessing";export{u as CRUD_OPERATION,s as FunctionsAdapter,F as OPTIMISTIC_STATUSES,q as UploadProvider,c as appendToCollection,ge as applyFilters,ce as applySearch,Te as applySort,Fe as buildReferenceLabel,te as checkForBlobUrls,w as clearFieldTypeRegistry,de as clearWorkflowState,ie as defineWorkflow,me as formatValue,d as getCrudService,h as getDisplayFormatter,S as getFieldRegistry,v as getFieldTypeMetadata,M as getFieldsForOperation,E as getFilterType,Se as getSearchableFields,W as getValueType,oe as hasBlobUrls,L as isFieldEditable,R as isFieldTypeRegistered,k as isFilterable,ee as isStorageUrl,y as loadDeterministicRange,pe as loadWorkflowState,xe as matchesFilter,U as registerBuiltinFieldType,B as registerBuiltinFieldTypes,C as registerFieldType,se as saveWorkflowState,_ as translateFieldLabel,N as translateLabel,g as upsertDeterministic,A as useController,X as useCrudFilters,m as useCrudStore,K as useEntityFavorites,P as useEntityField,O as useEntityForm,ae as useEntityWorkflow,Y as useFieldConditions,H as useFileUpload,Z as useReferenceResolver,Q as useRelatedItems,J as useUnsavedChangesWarning,z as useUploadContext,V as validateEntity,re as validatePicture};
@@ -1 +1 @@
1
- "use client";import{jsx as p,jsxs as u}from"react/jsx-runtime";import{Text as f,Stack as b,ImageGallery as $,Rating as I,CopyToClipboard as j}from"@donotdev/components";import{formatCurrency as F,maybeTranslate as N}from"@donotdev/core";import{ControlledCheckboxField as A,ControlledComboboxField as M,ControlledDateField as v,ControlledDropdownField as P,ControlledFileField as B,ControlledMultiFileField as R,ControlledDocumentField as _,ControlledMultiDocumentField as E,ControlledGeoPointField as U,ControlledImageField as H,ControlledMapField as K,ControlledMultiDropdownField as Y,ControlledMultiInputField as G,ControlledNumberField as O,ControlledPasswordField as J,ControlledPhoneField as W,ControlledRangeField as q,ControlledRatingField as Q,ControlledDurationField as X,ControlledRadioField as Z,ControlledReferenceField as ee,ControlledYearField as te,ControlledTextField as m,ControlledTextareaField as re,ControlledRichTextField as oe,ControlledTimestampField as ne,ControlledAddressField as le,ControlledFieldArrayField as ae,ControlledSwitchField as ie,ControlledMultiImageField as ce,ControlledGdprConsentField as se,ControlledCurrencyField as pe,ControlledPriceField as de}from"./components/controlled";import{AvatarFieldComponent as ue,BadgeFieldComponent as ye,ButtonFieldComponent as D,HiddenFieldComponent as fe,TextAreaComponent as me,RichTextComponent as ge,TextFieldComponent as T}from"./components/form/fields";import{registerBuiltinFieldType as i}from"./fieldTypeRegistry";import{translateLabel as h}from"./forms/utils";import{sanitizeHtml as be}from"./utils/sanitizeHtml";function d(e){return e?p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p(f,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,o,n,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,o,n,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,o,n,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,o,n,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,o,n,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},month:(e,o,n,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},boolean:(e,o,n)=>e?"Yes":"No",checkbox:(e,o,n)=>e?"Yes":"No",switch:(e,o,n)=>{const t=o.options?.fieldSpecific;if(t){const r=t.uncheckedValue??!1,l=t.checkedValue??!0;if(e===l&&t.checkedLabel)return h(t.checkedLabel,n);if(e===r&&t.uncheckedLabel)return h(t.uncheckedLabel,n)}return e?"Yes":"No"},year:(e,o,n)=>String(e),number:(e,o,n)=>{if(e==null||e==="")return"\u2014";const t=o.options?.unit??"",r=N(n,o.options?.suffix);return[(typeof e=="number"?e.toLocaleString():String(e))+t,r].filter(Boolean).join(" ")},currency:(e,o,n)=>{if(e==null||isNaN(e))return"";const t=(o.options||{}).fieldSpecific?.currency||"EUR";return F(e,t)},price:(e,o,n,t)=>{const r=t?.compact??!1,l=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 y=a.currency||"EUR",x=a.vatIncluded??!0,g=a.discountPercent??0,S=g>0?s*(1-g/100):s,C=x?` ${n("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(g>0){const L=F(s,y),w=F(S,y),k=` ${n("crud:price.discountPercent",{percent:Math.round(g),defaultValue:"-{{percent}}%"})}`;return l?`${w}${C}${k}`:r?u(f,{variant:"success",weight:"bold",children:[w,C,k]}):u(b,{direction:"column",gap:"tight",align:"end",children:[p(f,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:L}),u(f,{variant:"success",weight:"bold",children:[w,C]})]})}return`${F(s,y)}${C}`},range:(e,o,n)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,o,n,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const l=typeof e=="number"?e:parseFloat(e);if(isNaN(l))return d(r);const a=o.validation?.max??5;return p(I,{value:l,max:a,readonly:!0,"aria-label":`${l} out of ${a} stars`})},duration:(e,o,n,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const l=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(l))return d(r);if(l===0)return n("crud:duration.zero",{defaultValue:"\u2014"});if(l<60)return n("crud:duration.minutes",{count:l,defaultValue:`${l} min`});const a=Math.floor(l/60),s=l%60;return n("crud:duration.hoursMinutes",{hours:a,minutes:s,defaultValue:s===0?`${a}h`:`${a}h ${s}min`})},gdprConsent:(e,o,n,t)=>{const r=t?.compact??!1;if(!e||typeof e!="object")return d(r);const l=e.gdprConsent===!0,a=e.gdprConsentDate,s=e.gdprConsentVersion,y=n("crud:gdprConsent.display.yes",{defaultValue:"Consented"}),x=n("crud:gdprConsent.display.no",{defaultValue:"Not consented"});if(!l)return x;const g=[y];if(a)try{const S=new Date(a);g.push(S.toLocaleDateString())}catch{g.push(a)}return s&&g.push(`v${s}`),g.join(" \xB7 ")},select:(e,o,n)=>{const t=o.validation?.options;if(Array.isArray(t)){const r=t.find(l=>l.value===e)?.label;return r?h(r,n):String(e)}return String(e)},radio:(e,o,n)=>{const t=o.validation?.options;if(Array.isArray(t)){const r=t.find(l=>l.value===e)?.label;return r?h(r,n):String(e)}return String(e)},combobox:(e,o,n)=>{const t=o.validation?.options;if(Array.isArray(t)){const r=t.find(l=>l.value===e)?.label;return r?h(r,n):String(e)}return String(e)},multiselect:(e,o,n)=>{if(Array.isArray(e)){const t=o.validation?.options;if(Array.isArray(t))return e.map(r=>{const l=t.find(a=>a.value===r)?.label;return l?h(l,n):r}).join(", ")}return String(e)},image:(e,o,n,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):typeof e=="string"?p("img",{src:e,alt:o.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,o,n,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const l=e[0],a=typeof l=="object"&&l.thumbUrl?l.thumbUrl:l;return r?u("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&&u("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):p($,{images:e,altPrefix:o.label||"Image"})},files:(e,o,n,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(b,{gap:"tight",children:e.map((l,a)=>u("a",{href:l.url||l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[l.filename||`File ${a+1}`,l.size&&u(f,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(l.size/1024)," KB)"]})]},a))})},documents:(e,o,n,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(b,{gap:"tight",children:e.map((l,a)=>u("a",{href:l.url||l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[l.filename||`File ${a+1}`,l.size&&u(f,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(l.size/1024)," KB)"]})]},a))})},file:(e,o,n,t)=>{const r=t?.compact??!1;if(!e)return d(r);const l=typeof e=="string"?e:e.url,a=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[a,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,o,n,t)=>{const r=t?.compact??!1;if(!e)return d(r);const l=typeof e=="string"?e:e.url,a=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[a,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,o,n,t)=>{const r=t?.compact??!1;if(!e)return d(r);const l=o.validation?.reference;if(t?.referenceData&&typeof l=="string"){const a=t.referenceData[l]?.[String(e)];if(a)return a}if(typeof e=="object"&&e!==null){const a=e.displayName||e.name||e.id||String(e);return String(a)}return String(e)},geopoint:(e,o,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)}`:d(r)},address:(e,o,n)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,o,n,t)=>{const r=t?.compact??!1;if(e&&typeof e=="object"){const l=Object.entries(e);return l.length===0?d(r):u(b,{direction:"column",gap:"tight",children:[l.slice(0,5).map(([a,s])=>u(f,{style:{fontSize:"var(--font-size-sm)"},children:[u("strong",{children:[a,":"]})," ",String(s)]},a)),l.length>5&&u(f,{variant:"muted",children:["+",l.length-5," more"]})]})}return d(r)},array:(e,o,n,t)=>{const r=t?.compact??!1;return Array.isArray(e)?e.length===0?d(r):e.join(", "):d(r)},"field-array":(e,o,n,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const l=o.options?.fieldSpecific?.fields;return e.map(a=>{if(typeof a!="object"||a==null)return"";const s=a;return(l?l.map(y=>y.name):Object.keys(s)).map(y=>s[y]).filter(y=>y!=null&&y!=="").map(y=>typeof y=="object"?JSON.stringify(y):String(y)).join(" \xB7 ")}).filter(Boolean).join(", ")},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,o,n)=>u(b,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`mailto:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),p(j,{text:e,tooltipText:n("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:n("crud:actions.copyEmail",{defaultValue:"Copy email"}),onClick:t=>t.stopPropagation()})]}),tel:(e,o,n)=>u(b,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`tel:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),p(j,{text:e,tooltipText:n("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:n("crud:actions.copyPhone",{defaultValue:"Copy phone"}),onClick:t=>t.stopPropagation()})]}),iban:(e,o,n,t)=>{const r=t?.compact??!1;return e?u(b,{direction:"row",gap:"tight",align:"center",children:[p(f,{style:{flex:1},children:e}),p(j,{text:e,tooltipText:n("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:n("crud:actions.copyIban",{defaultValue:"Copy IBAN"}),onClick:l=>l.stopPropagation()})]}):d(r)},url:(e,o,n)=>p("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,o,n)=>u(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(f,{children:e})]}),textarea:(e,o,n)=>String(e),text:(e,o,n)=>String(e),richtext:(e,o,n,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:be(e)},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):d(r)}};function he(e){return e.type==="avatar"}function ve(e){return e.type==="badge"}let z=!1;function V(){z||(z=!0,i({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(T,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,...l.options})}}}),i({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(T,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,type:"email",...l.options})}}}),i({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(T,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,type:"url",...l.options})}}}),i({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(T,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,type:"color",...l.options})}}}),i({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:re,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(me,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,...l.options})}}}),i({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:oe,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(ge,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,...l.options})}}}),i({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:J}}),i({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:W}}),i({type:"iban",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.iban,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(T,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value.replace(/\s/g,"").toUpperCase();n(s)},error:r,...l.options})}}}),i({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:O}}),i({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:pe}}),i({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:de}}),i({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:q}}),i({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:te}}),i({type:"rating",filterable:!0,filterType:"rating",valueType:"number",displayFormatter:c.rating,components:{controlled:Q}}),i({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.duration,components:{controlled:X}}),i({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:A}}),i({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:A}}),i({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",displayFormatter:c.gdprConsent,components:{controlled:se}}),i({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:ie}}),i({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:v}}),i({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:v}}),i({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:v}}),i({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:v}}),i({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:v}}),i({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:ne}}),i({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:B}}),i({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:R}}),i({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:_}}),i({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:E}}),i({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:H}}),i({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:ce}}),i({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:U}}),i({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:le}}),i({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:K}}),i({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:G}}),i({type:"field-array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c["field-array"],components:{controlled:ae}}),i({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:P}}),i({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:M}}),i({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:Y}}),i({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:Z}}),i({type:"reference",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.reference,components:{controlled:ee}}),i({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:o,value:n}=e;return p(fe,{name:o,value:typeof n=="string"?n:""})}}}),i({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,error:t,config:r,t:l}=e;if(!he(r))throw new Error("Invalid config type for avatar field");return p(ue,{config:r,value:typeof o=="string"?o:"",onChange:a=>{n(a)},error:!!t,helperText:t||void 0,t:l,...r.options})}}}),i({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,error:t,config:r,t:l}=e;if(!ve(r))throw new Error("Invalid config type for badge field");return p(ye,{config:r,value:typeof o=="string"?o:"",onChange:a=>{n(a)},error:!!t,helperText:t||void 0,t:l,...r.options})}}}),i({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:o,label:n,config:t}=e;return p(D,{label:n||o,type:"submit",onClick:()=>{},...t.options})}}}),i({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:o,label:n,config:t}=e;return p(D,{label:n||o,type:"reset",onClick:()=>{},...t.options})}}}))}V();export{V as registerAllBuiltinFieldTypes};
1
+ "use client";import{jsx as p,jsxs as u}from"react/jsx-runtime";import{Text as m,Stack as h,ImageGallery as I,Rating as $,CopyToClipboard as j}from"@donotdev/components";import{formatCurrency as S,maybeTranslate as N}from"@donotdev/core";import{ControlledCheckboxField as A,ControlledComboboxField as P,ControlledDateField as C,ControlledDropdownField as M,ControlledFileField as R,ControlledMultiFileField as _,ControlledDocumentField as v,ControlledMultiDocumentField as B,ControlledGeoPointField as E,ControlledImageField as O,ControlledMapField as U,ControlledMultiDropdownField as H,ControlledMultiInputField as K,ControlledNumberField as Y,ControlledPasswordField as G,ControlledPhoneField as J,ControlledRangeField as W,ControlledRatingField as q,ControlledDurationField as Q,ControlledRadioField as X,ControlledReferenceField as Z,ControlledYearField as ee,ControlledTextField as g,ControlledTextareaField as te,ControlledRichTextField as re,ControlledTimestampField as ne,ControlledAddressField as oe,ControlledFieldArrayField as le,ControlledSwitchField as ie,ControlledMultiImageField as ae,ControlledGdprConsentField as ce,ControlledCurrencyField as se,ControlledPriceField as pe}from"./components/controlled";import{AvatarFieldComponent as de,BadgeFieldComponent as fe,ButtonFieldComponent as D,HiddenFieldComponent as ue,TextAreaComponent as ye,RichTextComponent as me,TextFieldComponent as F}from"./components/form/fields";import{registerBuiltinFieldType as a}from"./fieldTypeRegistry";import{translateLabel as T}from"./forms/utils";import{sanitizeHtml as ge}from"./utils/sanitizeHtml";function d(e){return e?p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p(m,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,o,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,o,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,o,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,o,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,o,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},month:(e,o,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},boolean:(e,o,l)=>e?"Yes":"No",checkbox:(e,o,l)=>e?"Yes":"No",switch:(e,o,l)=>{const t=o.options?.fieldSpecific;if(t){const r=t.uncheckedValue??!1,n=t.checkedValue??!0;if(e===n&&t.checkedLabel)return T(t.checkedLabel,l);if(e===r&&t.uncheckedLabel)return T(t.uncheckedLabel,l)}return e?"Yes":"No"},year:(e,o,l)=>String(e),number:(e,o,l)=>{if(e==null||e==="")return"\u2014";const t=o.options?.unit??"",r=N(l,o.options?.suffix);return[(typeof e=="number"?e.toLocaleString():String(e))+t,r].filter(Boolean).join(" ")},currency:(e,o,l)=>{if(e==null||isNaN(e))return"";const n=(o.options||{}).fieldSpecific?.currency||"EUR";return S(e,n)},price:(e,o,l,t)=>{const r=t?.compact??!1,n=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 d(r);const s=i.amount;if(s==null||isNaN(s))return d(r);const f=i.currency||"EUR",y=i.vatIncluded??!0,b=i.discountPercent??0,V=b>0?s*(1-b/100):s,x=y?` ${l("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(b>0){const L=S(s,f),w=S(V,f),k=` ${l("crud:price.discountPercent",{percent:Math.round(b),defaultValue:"-{{percent}}%"})}`;return n?`${w}${x}${k}`:r?u(m,{variant:"success",weight:"bold",children:[w,x,k]}):u(h,{direction:"column",gap:"tight",align:"end",children:[p(m,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:L}),u(m,{variant:"success",weight:"bold",children:[w,x]})]})}return`${S(s,f)}${x}`},range:(e,o,l)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const n=typeof e=="number"?e:parseFloat(e);if(isNaN(n))return d(r);const i=o.validation?.max??5;return p($,{value:n,max:i,readonly:!0,"aria-label":`${n} out of ${i} stars`})},duration:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const n=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(n))return d(r);if(n===0)return l("crud:duration.zero",{defaultValue:"\u2014"});if(n<60)return l("crud:duration.minutes",{count:n,defaultValue:`${n} min`});const i=Math.floor(n/60),s=n%60;return l("crud:duration.hoursMinutes",{hours:i,minutes:s,defaultValue:s===0?`${i}h`:`${i}h ${s}min`})},gdprConsent:(e,o,l,t)=>{const r=t?.compact??!1;if(!e||typeof e!="object")return d(r);const n=e.gdprConsent===!0,i=e.gdprConsentDate,s=e.gdprConsentVersion,f=l("crud:gdprConsent.display.yes",{defaultValue:"Consented"}),y=l("crud:gdprConsent.display.no",{defaultValue:"Not consented"});if(!n)return y;const b=[f];if(i)try{const V=new Date(i);b.push(V.toLocaleDateString())}catch{b.push(i)}return s&&b.push(`v${s}`),b.join(" \xB7 ")},select:(e,o,l)=>{const t=o.validation?.options;if(Array.isArray(t)){const n=t.find(i=>i.value===e)?.label;return n?T(n,l):String(e)}return String(e)},radio:(e,o,l)=>{const t=o.validation?.options;if(Array.isArray(t)){const n=t.find(i=>i.value===e)?.label;return n?T(n,l):String(e)}return String(e)},combobox:(e,o,l)=>{const t=o.validation?.options;if(Array.isArray(t)){const n=t.find(i=>i.value===e)?.label;return n?T(n,l):String(e)}return String(e)},multiselect:(e,o,l)=>{if(Array.isArray(e)){const t=o.validation?.options;if(Array.isArray(t))return e.map(n=>{const s=t.find(f=>f.value===n)?.label;return s?T(s,l):n}).join(", ")}return String(e)},image:(e,o,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):typeof e=="string"?p("img",{src:e,alt:o.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,o,l,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const n=e[0],i=typeof n=="object"&&n.thumbUrl?n.thumbUrl:n;return r?u("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[p("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]})]}):p(I,{images:e,altPrefix:o.label||"Image"})},files:(e,o,l,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(h,{gap:"tight",children:e.map((n,i)=>u("a",{href:n.url||n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[n.filename||`File ${i+1}`,n.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(n.size/1024)," KB)"]})]},i))})},documents:(e,o,l,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(h,{gap:"tight",children:e.map((n,i)=>u("a",{href:n.url||n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[n.filename||`File ${i+1}`,n.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(n.size/1024)," KB)"]})]},i))})},file:(e,o,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);const n=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:n,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,o,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);const n=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:n,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,o,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);const n=o.validation?.reference;if(t?.referenceData&&typeof n=="string"){const i=t.referenceData[n]?.[String(e)];if(i)return i}if(typeof e=="object"&&e!==null){const i=e.displayName||e.name||e.id||String(e);return String(i)}return String(e)},geopoint:(e,o,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,o,l)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,o,l,t)=>{const r=t?.compact??!1;if(e&&typeof e=="object"){const n=Object.entries(e);return n.length===0?d(r):u(h,{direction:"column",gap:"tight",children:[n.slice(0,5).map(([i,s])=>u(m,{style:{fontSize:"var(--font-size-sm)"},children:[u("strong",{children:[i,":"]})," ",String(s)]},i)),n.length>5&&u(m,{variant:"muted",children:["+",n.length-5," more"]})]})}return d(r)},array:(e,o,l,t)=>{const r=t?.compact??!1;return Array.isArray(e)?e.length===0?d(r):e.join(", "):d(r)},"field-array":(e,o,l,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const n=o.options?.fieldSpecific?.fields;return e.map(i=>{if(typeof i!="object"||i==null)return"";const s=i;return(n?n.map(y=>y.name):Object.keys(s)).map(y=>s[y]).filter(y=>y!=null&&y!=="").map(y=>typeof y=="object"?JSON.stringify(y):String(y)).join(" \xB7 ")}).filter(Boolean).join(", ")},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,o,l)=>u(h,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`mailto:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),p(j,{text:e,tooltipText:l("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:l("crud:actions.copyEmail",{defaultValue:"Copy email"}),onClick:t=>t.stopPropagation()})]}),tel:(e,o,l)=>u(h,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`tel:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),p(j,{text:e,tooltipText:l("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:l("crud:actions.copyPhone",{defaultValue:"Copy phone"}),onClick:t=>t.stopPropagation()})]}),iban:(e,o,l,t)=>{const r=t?.compact??!1;return e?u(h,{direction:"row",gap:"tight",align:"center",children:[p(m,{style:{flex:1},children:e}),p(j,{text:e,tooltipText:l("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:l("crud:actions.copyIban",{defaultValue:"Copy IBAN"}),onClick:n=>n.stopPropagation()})]}):d(r)},url:(e,o,l)=>p("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,o,l)=>u(h,{direction:"row",gap:"tight",align:"center",children:[p("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),p(m,{children:e})]}),textarea:(e,o,l)=>String(e),text:(e,o,l)=>String(e),richtext:(e,o,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:ge(e)},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):d(r)}};function be(e){return e.type==="avatar"}function he(e){return e.type==="badge"}let z=!1;function Te(){z||(z=!0,a({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,...n.options})}}}),a({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,type:"email",...n.options})}}}),a({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,type:"url",...n.options})}}}),a({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,type:"color",...n.options})}}}),a({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:te,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(ye,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,...n.options})}}}),a({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:re,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(me,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,...n.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:J}}),a({type:"iban",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.iban,components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value.replace(/\s/g,"").toUpperCase();l(f)},error:r,...n.options})}}}),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:se}}),a({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:pe}}),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:ee}}),a({type:"rating",filterable:!0,filterType:"rating",valueType:"number",displayFormatter:c.rating,components:{controlled:q}}),a({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.duration,components:{controlled:Q}}),a({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:A}}),a({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:A}}),a({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",displayFormatter:c.gdprConsent,components:{controlled:ce}}),a({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:ie}}),a({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:C}}),a({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:C}}),a({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:C}}),a({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:C}}),a({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:C}}),a({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:ne}}),a({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:R}}),a({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:_}}),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:B}}),a({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:O}}),a({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:ae}}),a({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:E}}),a({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:oe}}),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:"field-array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c["field-array"],components:{controlled:le}}),a({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:M}}),a({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:P}}),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:X}}),a({type:"reference",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.reference,components:{controlled:Z}}),a({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:e=>{const{name:o,value:l}=e;return p(ue,{name:o,value:typeof l=="string"?l:""})}}}),a({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,error:t,config:r,t:n}=e;if(!be(r))throw new Error("Invalid config type for avatar field");return p(de,{config:r,value:typeof o=="string"?o:"",onChange:s=>{l(s)},error:!!t,helperText:t||void 0,t:n,...r.options})}}}),a({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,error:t,config:r,t:n}=e;if(!he(r))throw new Error("Invalid config type for badge field");return p(fe,{config:r,value:typeof o=="string"?o:"",onChange:s=>{l(s)},error:!!t,helperText:t||void 0,t:n,...r.options})}}}),a({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:e=>{const{name:o,label:l,config:t}=e;return p(D,{label:l||o,type:"submit",onClick:()=>{},...t.options})}}}),a({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:e=>{const{name:o,label:l,config:t}=e;return p(D,{label:l||o,type:"reset",onClick:()=>{},...t.options})}}}))}Te();export{Te as registerAllBuiltinFieldTypes};
@@ -1 +1 @@
1
- "use client";import{createDoNotDevStore as f}from"@donotdev/core";const a={status:"idle",error:null,uploadProgress:0,isDirty:!1},i=f({name:"form-store",createStore:(t,o)=>{const m=new Map;return{forms:{},startSubmit:s=>{t(r=>{const e=r.forms[s]||a;return{forms:{...r.forms,[s]:{...e,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(s,r)=>{t(e=>{const u=e.forms[s]||a;return{forms:{...e.forms,[s]:{...u,status:"uploading",uploadProgress:Math.min(100,Math.max(0,r))}}}})},setValidating:s=>{t(r=>{const e=r.forms[s]||a;return{forms:{...r.forms,[s]:{...e,status:"validating",uploadProgress:100}}}})},setSubmitting:s=>{t(r=>{const e=r.forms[s]||a;return{forms:{...r.forms,[s]:{...e,status:"submitting"}}}})},setSuccess:s=>{t(u=>{const n=u.forms[s]||a;return{forms:{...u.forms,[s]:{...n,status:"success",error:null}}}});const r=m.get(s);r!==void 0&&clearTimeout(r);const e=setTimeout(()=>{m.delete(s),o().reset(s)},1500);m.set(s,e)},setError:(s,r)=>{t(e=>{const u=e.forms[s]||a;return{forms:{...e.forms,[s]:{...u,status:"error",error:r}}}})},reset:s=>{t(r=>({forms:{...r.forms,[s]:{...a}}}))},setIsDirty:(s,r)=>{t(e=>{const u=e.forms[s]||a;return{forms:{...e.forms,[s]:{...u,isDirty:r}}}})},hasDirtyForms:()=>{const s=o().forms;return Object.values(s).some(r=>r.isDirty)},getDirtyFormIds:()=>{const s=o().forms;return Object.entries(s).filter(([r,e])=>e.isDirty).map(([r])=>r)},cleanup:s=>{const r=m.get(s);r!==void 0&&(clearTimeout(r),m.delete(s)),t(e=>{const{[s]:u,...n}=e.forms;return{forms:n}})},getStatus:s=>o().forms[s]?.status??"idle",isLoading:s=>{const r=o().forms[s]?.status??"idle";return r==="uploading"||r==="validating"||r==="submitting"},getUploadProgress:s=>o().forms[s]?.uploadProgress??0,getError:s=>o().forms[s]?.error??null,getIsDirty:s=>o().forms[s]?.isDirty??!1}}}),l=t=>i(o=>o.forms[t]?.status??"idle"),c=t=>i(o=>{const m=o.forms[t]?.status??"idle";return m==="uploading"||m==="validating"||m==="submitting"}),g=t=>i(o=>o.forms[t]?.uploadProgress??0),d=t=>i(o=>o.forms[t]?.error??null),p=t=>i(o=>o.forms[t]?.isDirty??!1),D=()=>i(t=>Object.values(t.forms).some(o=>o.isDirty));export{d as useFormError,p as useFormIsDirty,c as useFormLoading,l as useFormStatus,i as useFormStore,D as useHasDirtyForms,g as useUploadProgress};
1
+ "use client";import{createDoNotDevStore as l}from"@donotdev/core";const i={status:"idle",error:null,uploadProgress:0,isDirty:!1},m=l({name:"form-store",createStore:(o,t)=>{const n=new Map;return{forms:{},startSubmit:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(r,s)=>{o(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,status:"uploading",uploadProgress:Math.min(100,Math.max(0,s))}}}})},setValidating:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"validating",uploadProgress:100}}}})},setSubmitting:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"submitting"}}}})},setSuccess:r=>{o(u=>{const a=u.forms[r]||i;return{forms:{...u.forms,[r]:{...a,status:"success",error:null}}}});const s=n.get(r);s!==void 0&&clearTimeout(s);const e=setTimeout(()=>{n.delete(r),t().reset(r)},1500);n.set(r,e)},setError:(r,s)=>{o(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,status:"error",error:s}}}})},reset:r=>{o(s=>({forms:{...s.forms,[r]:{...i}}}))},setIsDirty:(r,s)=>{o(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,isDirty:s}}}})},hasDirtyForms:()=>{const r=t().forms;return Object.values(r).some(s=>s.isDirty)},getDirtyFormIds:()=>{const r=t().forms;return Object.entries(r).filter(([s,e])=>e.isDirty).map(([s])=>s)},cleanup:r=>{const s=n.get(r);s!==void 0&&(clearTimeout(s),n.delete(r)),o(e=>{const{[r]:u,...a}=e.forms;return{forms:a}})},getStatus:r=>t().forms[r]?.status??"idle",isLoading:r=>{const s=t().forms[r]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"},getUploadProgress:r=>t().forms[r]?.uploadProgress??0,getError:r=>t().forms[r]?.error??null,getIsDirty:r=>t().forms[r]?.isDirty??!1}}}),c=o=>m(t=>t.forms[o]?.status??"idle"),g=o=>m(t=>{const n=t.forms[o]?.status??"idle";return n==="uploading"||n==="validating"||n==="submitting"}),p=o=>m(t=>t.forms[o]?.uploadProgress??0),d=o=>m(t=>t.forms[o]?.error??null),D=o=>m(t=>t.forms[o]?.isDirty??!1),y=()=>m(o=>Object.values(o.forms).some(t=>t.isDirty));export{d as useFormError,D as useFormIsDirty,g as useFormLoading,c as useFormStatus,m as useFormStore,y as useHasDirtyForms,p as useUploadProgress};
@@ -1 +1 @@
1
- "use client";import{createDoNotDevStore as F}from"@donotdev/core";const m={status:"idle",progress:0,error:null},c=F({name:"upload-store",createStore:(u,a)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(t,s,e,r)=>{u(o=>({uploadFunctions:{...o.uploadFunctions,[t]:{...o.uploadFunctions[t]||{},[s]:e}},checkPendingFunctions:{...o.checkPendingFunctions,[t]:{...o.checkPendingFunctions[t]||{},[s]:r||(()=>!1)}}}))},unregisterUpload:(t,s)=>{u(e=>{const r=e.uploadFunctions[t],o=e.checkPendingFunctions[t];if(!r)return e;const{[s]:l,...p}=r,{[s]:n,...i}=o||{},{[s]:g,...h}=e.retryAttempts[t]||{};return{uploadFunctions:{...e.uploadFunctions,[t]:p},checkPendingFunctions:{...e.checkPendingFunctions,[t]:i},retryAttempts:{...e.retryAttempts,[t]:h}}})},startUpload:(t,s)=>{u(e=>({uploads:{...e.uploads,[t]:{...e.uploads[t]||{},[s]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(t,s,e)=>{u(r=>{const o=r.uploads[t]?.[s]||m;return{uploads:{...r.uploads,[t]:{...r.uploads[t]||{},[s]:{...o,progress:Math.min(100,Math.max(0,e))}}}}})},completeUpload:(t,s)=>{u(e=>{const r=e.uploads[t]?.[s]||m;return{uploads:{...e.uploads,[t]:{...e.uploads[t]||{},[s]:{...r,status:"complete",progress:100}}}}})},failUpload:(t,s,e)=>{u(r=>{const o=r.uploads[t]?.[s]||m;return{uploads:{...r.uploads,[t]:{...r.uploads[t]||{},[s]:{...o,status:"error",error:e}}}}})},resetUpload:(t,s)=>{u(e=>({uploads:{...e.uploads,[t]:{...e.uploads[t]||{},[s]:{...m}}}}))},resetForm:t=>{u(s=>({uploads:{...s.uploads,[t]:{}}}))},cleanup:t=>{u(s=>{const{[t]:e,...r}=s.uploads,{[t]:o,...l}=s.uploadFunctions,{[t]:p,...n}=s.checkPendingFunctions,{[t]:i,...g}=s.retryAttempts;return{uploads:r,uploadFunctions:l,checkPendingFunctions:n,retryAttempts:g}})},uploadAll:async t=>{const s=a().uploadFunctions[t];if(!s)return;const e=Object.entries(s);if(e.length===0)return;const r=async(o,l,p=1)=>{a().startUpload(t,o);try{await l(n=>{a().setProgress(t,o,n)}),a().completeUpload(t,o),u(n=>({retryAttempts:{...n.retryAttempts,[t]:{...n.retryAttempts[t]||{},[o]:0}}}))}catch(n){const i=n instanceof Error?n.message:"Upload failed",g=a().maxRetries;if((a().retryAttempts[t]?.[o]??0)<g){u(d=>({retryAttempts:{...d.retryAttempts,[t]:{...d.retryAttempts[t]||{},[o]:(d.retryAttempts[t]?.[o]??0)+1}}}));const h=a().retryDelay*Math.pow(2,p-1);return await new Promise(d=>setTimeout(d,h)),r(o,l,p+1)}else throw a().failUpload(t,o,i),n}};await Promise.all(e.map(async([o,l])=>{await r(o,l)}))},hasPendingUploads:t=>{const s=a(),e=s.uploadFunctions[t],r=s.checkPendingFunctions[t];return e?Object.entries(e).some(([o,l])=>{const p=r?.[o];return p?p():!0}):!1},getStatus:(t,s)=>a().uploads[t]?.[s]?.status??"idle",getProgress:(t,s)=>a().uploads[t]?.[s]?.progress??0,getTotalProgress:t=>{const s=a().uploads[t];if(!s)return 100;const e=Object.values(s);if(e.length===0)return 100;const r=e.reduce((o,l)=>o+l.progress,0);return Math.round(r/e.length)},isUploading:t=>{const s=a().uploads[t];return s?Object.values(s).some(e=>e.status==="uploading"):!1},getError:(t,s)=>a().uploads[t]?.[s]?.error??null})}),y=u=>c(a=>{const t=a.uploads[u];if(!t)return 100;const s=Object.values(t);if(s.length===0)return 100;const e=s.reduce((r,o)=>r+o.progress,0);return Math.round(e/s.length)}),P=u=>c(a=>{const t=a.uploads[u];return t?Object.values(t).some(s=>s.status==="uploading"):!1}),A=(u,a)=>c(t=>t.uploads[u]?.[a]?.progress??0),U=(u,a)=>c(t=>t.uploads[u]?.[a]?.status??"idle");export{A as useFieldProgress,U as useFieldUploadStatus,P as useIsUploading,y as useTotalProgress,c as useUploadStore};
1
+ "use client";import{createDoNotDevStore as y}from"@donotdev/core";const g={status:"idle",progress:0,error:null},F=y({name:"upload-store",createStore:(u,e)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(n,t,s,o)=>{u(r=>({uploadFunctions:{...r.uploadFunctions,[n]:{...r.uploadFunctions[n]||{},[t]:s}},checkPendingFunctions:{...r.checkPendingFunctions,[n]:{...r.checkPendingFunctions[n]||{},[t]:o||(()=>!1)}}}))},unregisterUpload:(n,t)=>{u(s=>{const o=s.uploadFunctions[n],r=s.checkPendingFunctions[n];if(!o)return s;const{[t]:c,...l}=o,{[t]:p,...a}=r||{},{[t]:d,...h}=s.retryAttempts[n]||{};return{uploadFunctions:{...s.uploadFunctions,[n]:l},checkPendingFunctions:{...s.checkPendingFunctions,[n]:a},retryAttempts:{...s.retryAttempts,[n]:h}}})},startUpload:(n,t)=>{u(s=>({uploads:{...s.uploads,[n]:{...s.uploads[n]||{},[t]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(n,t,s)=>{u(o=>{const r=o.uploads[n]?.[t]||g;return{uploads:{...o.uploads,[n]:{...o.uploads[n]||{},[t]:{...r,progress:Math.min(100,Math.max(0,s))}}}}})},completeUpload:(n,t)=>{u(s=>{const o=s.uploads[n]?.[t]||g;return{uploads:{...s.uploads,[n]:{...s.uploads[n]||{},[t]:{...o,status:"complete",progress:100}}}}})},failUpload:(n,t,s)=>{u(o=>{const r=o.uploads[n]?.[t]||g;return{uploads:{...o.uploads,[n]:{...o.uploads[n]||{},[t]:{...r,status:"error",error:s}}}}})},resetUpload:(n,t)=>{u(s=>({uploads:{...s.uploads,[n]:{...s.uploads[n]||{},[t]:{...g}}}}))},resetForm:n=>{u(t=>({uploads:{...t.uploads,[n]:{}}}))},cleanup:n=>{u(t=>{const{[n]:s,...o}=t.uploads,{[n]:r,...c}=t.uploadFunctions,{[n]:l,...p}=t.checkPendingFunctions,{[n]:a,...d}=t.retryAttempts;return{uploads:o,uploadFunctions:c,checkPendingFunctions:p,retryAttempts:d}})},uploadAll:async n=>{const s=e().uploadFunctions[n];if(!s)return;const o=Object.entries(s);if(o.length===0)return;const r=async(c,l,p=1)=>{e().startUpload(n,c);try{await l(a=>{e().setProgress(n,c,a)}),e().completeUpload(n,c),u(a=>({retryAttempts:{...a.retryAttempts,[n]:{...a.retryAttempts[n]||{},[c]:0}}}))}catch(a){const d=a instanceof Error?a.message:"Upload failed",h=e().maxRetries;if((e().retryAttempts[n]?.[c]??0)<h){u(i=>({retryAttempts:{...i.retryAttempts,[n]:{...i.retryAttempts[n]||{},[c]:(i.retryAttempts[n]?.[c]??0)+1}}}));const P=e().retryDelay*Math.pow(2,p-1);return await new Promise(i=>setTimeout(i,P)),r(c,l,p+1)}else throw e().failUpload(n,c,d),a}};await Promise.all(o.map(async([c,l])=>{await r(c,l)}))},hasPendingUploads:n=>{const t=e(),s=t.uploadFunctions[n],o=t.checkPendingFunctions[n];return s?Object.entries(s).some(([r,c])=>{const l=o?.[r];return l?l():!0}):!1},getStatus:(n,t)=>e().uploads[n]?.[t]?.status??"idle",getProgress:(n,t)=>e().uploads[n]?.[t]?.progress??0,getTotalProgress:n=>{const t=e().uploads[n];if(!t)return 100;const s=Object.values(t);if(s.length===0)return 100;const o=s.reduce((r,c)=>r+c.progress,0);return Math.round(o/s.length)},isUploading:n=>{const t=e().uploads[n];return t?Object.values(t).some(s=>s.status==="uploading"):!1},getError:(n,t)=>e().uploads[n]?.[t]?.error??null})}),k=u=>F(e=>{const n=e.uploads[u];if(!n)return 100;const t=Object.values(n);if(t.length===0)return 100;const s=t.reduce((o,r)=>o+r.progress,0);return Math.round(s/t.length)}),_=u=>F(e=>{const n=e.uploads[u];return n?Object.values(n).some(t=>t.status==="uploading"):!1}),x=(u,e)=>F(n=>n.uploads[u]?.[e]?.progress??0),m=(u,e)=>F(n=>n.uploads[u]?.[e]?.status??"idle");export{x as useFieldProgress,m as useFieldUploadStatus,_ as useIsUploading,k as useTotalProgress,F as useUploadStore};
@@ -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};