@donotdev/crud 0.0.29 → 0.0.31

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 (116) hide show
  1. package/dist/CrudStore.js +1 -1
  2. package/dist/adapters/FunctionsAdapter.js +1 -1
  3. package/dist/components/CrudButton.js +1 -1
  4. package/dist/components/CrudCard.d.ts +1 -1
  5. package/dist/components/CrudCard.d.ts.map +1 -1
  6. package/dist/components/CrudCard.js +1 -1
  7. package/dist/components/DateFilter.js +1 -1
  8. package/dist/components/DisplayFieldRenderer.d.ts.map +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/ControlledDateField.js +1 -1
  15. package/dist/components/controlled/complex/ControlledFieldArrayField.js +1 -1
  16. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  17. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  18. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  19. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  20. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  21. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  22. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  23. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  24. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  25. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
  26. package/dist/components/controlled/input/ControlledDurationField.js +1 -1
  27. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  28. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  29. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  30. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  31. package/dist/components/controlled/input/ControlledRatingField.js +1 -1
  32. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  33. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  34. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  35. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  36. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  37. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  38. package/dist/components/controlled/select/ControlledReferenceField.js +1 -1
  39. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  40. package/dist/components/controlled/types.js +1 -1
  41. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
  42. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
  43. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
  44. package/dist/components/fields/display/DateFieldDisplay.js +1 -1
  45. package/dist/components/fields/display/FileFieldDisplay.js +1 -1
  46. package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
  47. package/dist/components/fields/display/MapFieldDisplay.js +1 -1
  48. package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
  49. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
  50. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
  51. package/dist/components/fields/display/TextAreaDisplay.js +1 -1
  52. package/dist/components/fields/display/TextFieldDisplay.js +1 -1
  53. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  54. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  55. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  56. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  57. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  58. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  59. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  60. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  61. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  62. package/dist/components/form/fields/DurationFieldComponent.js +1 -1
  63. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  64. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  65. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  66. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  67. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  68. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  69. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  70. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  71. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  72. package/dist/components/form/fields/PriceFieldComponent.js +1 -1
  73. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  74. package/dist/components/form/fields/RatingFieldComponent.js +1 -1
  75. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  76. package/dist/components/form/fields/RichTextComponent.js +1 -1
  77. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  78. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  79. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  80. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  81. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  82. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  83. package/dist/fieldTypeRegistry.store.js +1 -1
  84. package/dist/forms/hooks/useController.js +1 -1
  85. package/dist/forms/hooks/useEntityField.js +1 -1
  86. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  87. package/dist/forms/hooks/useEntityForm.js +1 -1
  88. package/dist/forms/utils/buildInitialValues.js +1 -1
  89. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  90. package/dist/forms/utils/isFieldEditable.js +1 -1
  91. package/dist/forms/utils/translateFieldLabel.js +1 -1
  92. package/dist/forms/utils/validateEntity.js +1 -1
  93. package/dist/hooks/useEntityFavorites.js +1 -1
  94. package/dist/hooks/useFileUpload.js +1 -1
  95. package/dist/hooks/useReferenceResolver.js +1 -1
  96. package/dist/hooks/useRelatedItems.js +1 -1
  97. package/dist/hooks/useUnsavedChangesWarning.js +1 -1
  98. package/dist/stores/FormStore.d.ts.map +1 -1
  99. package/dist/stores/FormStore.js +1 -1
  100. package/dist/stores/UploadStore.js +1 -1
  101. package/dist/tsconfig.tsbuildinfo +1 -1
  102. package/dist/useBaseCrudList.js +1 -1
  103. package/dist/useCrud.js +1 -1
  104. package/dist/useCrudCardList.js +1 -1
  105. package/dist/useCrudList.js +1 -1
  106. package/dist/utils/collections.js +1 -1
  107. package/dist/utils/imageProcessing.js +1 -1
  108. package/dist/utils/imageStorage.js +1 -1
  109. package/dist/utils/matchesFilter.d.ts.map +1 -1
  110. package/dist/utils/matchesFilter.js +1 -1
  111. package/dist/utils/mergeWithOptimistic.js +1 -1
  112. package/dist/utils/sanitizeHtml.js +1 -1
  113. package/dist/utils/uploadValidation.js +1 -1
  114. package/dist/workflows/defineWorkflow.js +1 -1
  115. package/dist/workflows/useEntityWorkflow.js +1 -1
  116. package/package.json +3 -3
@@ -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}),D=v(o);T(()=>{D.current=o},[o]);const A=v(null);T(()=>{if(n==="edit"&&u){const t=u.id??null;t&&t!==A.current?(D.current.reset(u),A.current=t):!t&&A.current===null&&(D.current.reset(u),A.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&&D.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 _}from"@hookform/resolvers/valibot";import{useMemo as d,useEffect as T,useRef as v,useCallback as w,createElement as re}from"react";import{useForm as ae}from"react-hook-form";import{toast as se,ToastAction as oe}from"@donotdev/components";import{useLocalStorage as ne,BACKEND_GENERATED_FIELD_NAMES as ue,createSchemas as ie}from"@donotdev/core";import{useFormStore as j,useFormStatus as ce,useUploadProgress as le}from"../../stores";import{useUploadStore as M}from"../../stores/UploadStore";import{checkForBlobUrls as q}from"../../utils/uploadValidation";import{getFieldsForOperation as de}from"../utils";import{buildInitialFromRecord as fe,buildSchemaDefaults as me}from"../utils/buildInitialValues";const pe=n=>n;function z(n,E){const e={...n};for(const p of Object.keys(E)){const c=n[p],f=E[p];f!==null&&typeof f=="object"&&!Array.isArray(f)&&c!==null&&typeof c=="object"&&!Array.isArray(c)?e[p]=z(c,f):e[p]=f}return e}function Se(n,E={}){const{formId:e,operation:p,defaultValues:c,viewerRole:f,mode:G="onBlur",t:K}=E,S=K??pe,U=f??"guest",u=p??(c?"edit":"create"),Y=ce(e??""),H=le(e??""),F=d(()=>ie(n),[n.name]),I=d(()=>_(F.create),[F.create]),P=d(()=>_(F.draft),[F.draft]),J=d(()=>async(t,r,a)=>((t?.status??c?.status)==="draft"?P:I)(t,r,a),[I,P,c?.status]),V=d(()=>me(n),[n]),$=c,i=d(()=>{if(u==="create")return V;if($)return fe(n,$)},[u,V,n,$]),o=ae({defaultValues:u==="create"?i:void 0,mode:G,resolver:J,shouldUnregister:!1,shouldFocusError:!0}),D=v(o);T(()=>{D.current=o},[o]);const A=v(null);T(()=>{if(u==="edit"&&i){const t=i.id??null;t&&t!==A.current?(D.current.reset(i),A.current=t):!t&&A.current===null&&(D.current.reset(i),A.current="initialized")}},[u,i]);const k=c?.id,Q=d(()=>{const t=`${n.name.toLowerCase()}-form-draft`;return u==="create"?t:k?`${t}-${k}`:`${t}-edit`},[n.name,u,k]),{value:g,setValue:C,removeValue:b}=ne(Q,{defaultValue:null,syncAcrossTabs:!0}),y=v(!1);T(()=>{if(y.current)return;const t=r=>{const a=()=>{b(),r&&D.current.reset(r)};se({toastType:"info",title:S("draft.restored",{defaultValue:"Draft restored"}),description:S("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:re(oe,{altText:S("draft.discard",{defaultValue:"Discard"}),onClick:a},S("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(u==="create"&&!c){g&&(o.reset(g),t(V)),y.current=!0;return}if(u==="edit"&&i){if(g){const r=z(i,g);o.reset(r),t(i)}y.current=!0}},[u,c,g,o,i,b,S,V]);const O=v(!1),h=v(null);T(()=>{const t=o.watch(r=>{O.current||!y.current||(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{r&&Object.values(r).some(a=>a!=null&&a!=="")&&C(r)},3e3))});return()=>{t.unsubscribe(),h.current&&clearTimeout(h.current)}},[o,C]);const x=w(async()=>{if(!e)return!0;const t=M.getState(),r=j.getState();if(!t.hasPendingUploads(e))return!0;try{r.setUploading(e,0),await t.uploadAll(e),await new Promise(l=>setTimeout(l,50));let a=o.getValues(),s=q(a),m=0;const R=5;for(;s.length>0&&m<R;)m++,await new Promise(l=>setTimeout(l,100)),a=o.getValues(),s=q(a);if(s.length>0){const l=`Upload incomplete: files still pending at ${s.join(", ")}`;return r.setError(e,l),!1}return!0}catch(a){const s=a instanceof Error?a.message:"File upload failed";return j.getState().setError(e,s),!1}},[e,o]),B=w(t=>u!=="create"?t:Object.fromEntries(Object.entries(t).filter(([r])=>!ue.includes(r))),[u]),L=w(t=>{if(typeof window>"u")return;const r=Object.keys(t).find(s=>s!=="root"&&t[s]);if(!r)return;const a=document.querySelector(`input[name="${r}"][aria-invalid="true"], textarea[name="${r}"][aria-invalid="true"], select[name="${r}"][aria-invalid="true"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.focus())},[]),N=o.handleSubmit,W=d(()=>((t,r)=>async a=>{a?.preventDefault?.();const s=e?j.getState():null;await N(async(m,R)=>{O.current=!0;try{if(e&&s&&s.startSubmit(e),!await x()){e&&s&&s.setError(e,"Upload failed");return}e&&s&&s.setSubmitting(e);const l=B(m);await t(l,R),b(),e&&s&&s.setSuccess(e)}catch(l){throw e&&s&&s.setError(e,l instanceof Error?l.message:"Submission failed"),l}finally{O.current=!1}},m=>{L(m),r?.(m)})(a)}),[N,e,x,B,L,b]),X=w(()=>{b(),o.reset(i),y.current=!1},[b,o,i]),Z=w(()=>{e&&(j.getState().cleanup(e),M.getState().cleanup(e))},[e]),ee=d(()=>de(n,{operation:u,viewerRole:U,availableFields:void 0}),[n,u,U]),te=o.formState.isSubmitted||Object.keys(o.formState.touchedFields||{}).length>0;return{...o,handleSubmit:W,fields:ee,operation:u,entity:n,t:S,viewerRole:U,formId:e,formStatus:e?Y:"idle",uploadProgress:e?H:0,cleanup:Z,isDirty:o.formState.isDirty,hasUserInteracted:te,resetForm:X,originalValues:i}}export{Se as useEntityForm};
@@ -1 +1 @@
1
- function l(i,r){if(r in i)return i[r];const o=r.replace(/_([a-z])/g,(t,n)=>n.toUpperCase());if(o!==r&&o in i)return i[o]}function s(i,r){if(r in i)return!0;const o=r.replace(/_([a-z])/g,(t,n)=>n.toUpperCase());return o!==r&&o in i}function c(i,r){const o=r??{},t={...o};return Object.entries(i.fields).forEach(([n,e])=>{const p=l(t,n);p!==void 0&&!(n in t)&&(t[n]=p);const a=!s(o,n)||p===null||p===void 0;if(e.type==="switch"){if(p==null){const u=e.options?.fieldSpecific;t[n]=u?.uncheckedValue??!1}}else a&&(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(i){return c(i,{})}export{c as buildInitialFromRecord,y as buildSchemaDefaults};
1
+ function l(n,c){if(c in n)return n[c];const i=c.replace(/_([a-z])/g,(o,e)=>e.toUpperCase());if(i!==c&&i in n)return n[i]}function s(n,c){if(c in n)return!0;const i=c.replace(/_([a-z])/g,(o,e)=>e.toUpperCase());return i!==c&&i in n}function p(n,c){const i=c??{},o={...i};return Object.entries(n.fields).forEach(([e,t])=>{const r=l(o,e);r!==void 0&&!(e in o)&&(o[e]=r);const a=!s(i,e)||r===null||r===void 0;if(t.type==="switch"){if(r==null){const u=t.options?.fieldSpecific;o[e]=u?.uncheckedValue??!1}}else a&&(t.type==="price"?o[e]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:t.type==="checkbox"||t.type==="boolean"?o[e]=!1:t.type==="text"||t.type==="textarea"||t.type==="email"||t.type==="url"||t.type==="tel"||t.type==="iban"||t.type==="password"||t.type==="color"?o[e]="":(t.type==="number"||t.type==="range"||t.type==="rating")&&(o[e]=void 0))}),o}function y(n){return p(n,{})}export{p as buildInitialFromRecord,y as buildSchemaDefaults};
@@ -1 +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 u}from"@donotdev/core";import{isFieldEditable as m}from"./isFieldEditable";function g(e,r){const{operation:i,viewerRole:d,availableFields:l}=r,n=d??"guest",f=e&&typeof e=="object"&&"fields"in e&&"name"in e?e.fields:e,b=Object.entries(f),s=[];for(const[a,p]of b){const t=p,o=t.visibility||"guest";if(!u(o,n)||i==="create"&&o==="technical"||i==="edit"&&l&&!l.includes(a))continue;let c=m(t.editable,n,i);i==="edit"&&o==="technical"&&t.editable===void 0&&(c=!1),s.push({name:a,config:t,editable:c})}return s}export{g as getFieldsForOperation};
@@ -1 +1 @@
1
- import{hasRoleAccess as t,USER_ROLES as o}from"@donotdev/core";function s(e,i,r){return e===void 0||e===!0?!0:e===!1?!1:e==="admin"?t(i,o.ADMIN):e==="create-only"?r==="create":!0}export{s as isFieldEditable};
1
+ import{hasRoleAccess as t,USER_ROLES as i}from"@donotdev/core";function r(a,o,s){return a===void 0||a===!0?!0:a===!1?!1:a==="admin"?t(o,i.ADMIN):a==="create-only"?s==="create":!0}export{r as isFieldEditable};
@@ -1 +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 r(n,s){if(typeof n=="string"&&n.includes(":")){const a=n.split(":"),t=a[1]??n,i=a[0];if(t.startsWith("status.")){const l=s(t);return l!==t&&l!==`${i}:${t}`?l:s(t,{ns:i})}return s(t,{ns:i})}return s(n)}function e(n,s,a){const t=s?.label||n;return r(t,a)}export{e as translateFieldLabel,r as translateLabel};
@@ -1 +1 @@
1
- import*as o from"valibot";import{createSchemas as i}from"@donotdev/core";function m(t,r,c="create"){const e=i(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{m as validateEntity};
1
+ import*as o from"valibot";import{createSchemas as p}from"@donotdev/core";function i(t,r,c="create"){const e=p(t),u={create:e.create,draft:e.draft,update:e.update,full:e.get}[c],s=o.safeParse(u,r);return s.success?{success:!0,data:s.output}:{success:!1,issues:s.issues.map(a=>({path:a.path?.map(m=>m.key).join(".")||"",message:a.message}))}}export{i as validateEntity};
@@ -1 +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:[]}),n=o(e=>t.includes(e),[t]),v=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:n,toggleFavorite:v,addFavorite:f,removeFavorite:F,clearFavorites:m,favoritesFilter:g,isLoaded:c}}export{y as useEntityFavorites};
1
+ import{useCallback as o}from"react";import{useLocalStorage as p}from"@donotdev/core";function y(s={}){const{storageKey:l,collection:u="entities"}=s,d=l||`favorites-${u}`,{value:i,setValue:a,isLoaded:c}=p(d,{defaultValue:[]}),n=o(e=>i.includes(e),[i]),v=o(e=>{a(t=>t.includes(e)?t.filter(r=>r!==e):[...t,e])},[a]),f=o(e=>{a(t=>t.includes(e)?t:[...t,e])},[a]),F=o(e=>{a(t=>t.filter(r=>r!==e))},[a]),m=o(()=>{a([])},[a]),g=o(e=>i.includes(e.id),[i]);return{favorites:i,isFavorite:n,toggleFavorite:v,addFavorite:f,removeFavorite:F,clearFavorites:m,favoritesFilter:g,isLoaded:c}}export{y as useEntityFavorites};
@@ -1 +1 @@
1
- "use client";import{useState as T,useCallback as v,useEffect as A,useRef as g,startTransition as q}from"react";import{handleError as C}from"@donotdev/core";import{useUploadContext as G}from"../contexts/UploadContext";import{useUploadStore as N}from"../stores/UploadStore";let P=0;function W(s){if(s){const u=s.split("/").pop()?.split("?")[0];if(u)return`file-${u}`}P+=1;const a=typeof performance<"u"?performance.now():Date.now(),p=Math.random().toString(36).slice(2,11);return`file-${P}-${a}-${p}`}function H(s){return URL.createObjectURL(s)}function k(s){s.startsWith("blob:")&&URL.revokeObjectURL(s)}function K(s,a,p){return a.length>0&&!a.some(u=>{if(u.endsWith("/*")){const U=u.slice(0,-2);return s.type.startsWith(U)}return s.type===u})?{valid:!1,error:`File type ${s.type} not accepted`}:s.size>p?{valid:!1,error:`File exceeds ${(p/1048576).toFixed(0)}MB limit`}:{valid:!0}}function Q({name:s,value:a,onChange:p,multiple:u=!1,maxFiles:U=10,maxSize:$=10*1024*1024,accept:S=[],storagePath:V="uploads",uploadFn:y}){const h=G(),w=!!h,[d,c]=T([]),R=g(!1),E=g(null),x=g(a),L=g([]),F=g(!1),M=g(null);A(()=>{if(R.current){R.current=!1;return}const n=a?JSON.stringify((Array.isArray(a)?a:[a]).map(l=>l.fullUrl).filter(Boolean)):null;n!==E.current&&(E.current=n,x.current=a,q(()=>{if(a){const l=(Array.isArray(a)?a:[a]).filter(t=>t.fullUrl).map((t,r)=>({id:`${W(t.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:t.thumbUrl||t.fullUrl,progress:100,uploaded:t,error:null}));c(l)}else c([])}))},[a]),A(()=>{L.current=d},[d]),A(()=>{F.current&&(F.current=!1,M.current?.(d,!0))},[d]),A(()=>()=>{L.current.forEach(n=>k(n.previewURL))},[]);const f=v((n,l=!1)=>{const t=(l?n.filter(i=>!i.error):n.filter(i=>i.uploaded&&!i.error)).map(i=>i.uploaded?i.uploaded:l&&w?{fullUrl:i.previewURL,thumbUrl:i.previewURL}:null).filter(i=>i!==null);let r;u?r=t.length>0?t:null:r=t[0]||null;const e=x.current;(()=>{if(!r&&!e)return!1;if(!r||!e)return!0;if(u&&Array.isArray(r)&&Array.isArray(e)){if(r.length!==e.length)return!0;const i=r.map(m=>m.fullUrl).join(","),o=e.map(m=>m.fullUrl).join(",");return i!==o}return!u&&!Array.isArray(r)&&!Array.isArray(e)?r.fullUrl!==e.fullUrl:!0})()&&(R.current=!0,x.current=r,p(r))},[u,p,w]);M.current=f;const b=v(async()=>{if(!y)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 l=await Promise.allSettled(n.map(async t=>{try{const r=await y(t.file,e=>{c(i=>i.map(o=>o.id===t.id?{...o,progress:e}:o))});return{id:t.id,picture:r,error:null}}catch(r){const e=r instanceof Error?r.message:"Upload failed";return{id:t.id,picture:null,error:e}}}));c(t=>{const r=t.map(e=>{const i=l.find(o=>o.status==="fulfilled"&&o.value.id===e.id);if(i&&i.status==="fulfilled"){const o=i.value;return{...e,uploaded:o.picture,progress:o.picture?100:null,error:o.error}}return e});return f(r,!1),r})},[y,f]),j=g(b);j.current=b,A(()=>{if(!(!h||!s))return N.getState().registerUpload(h,s,async()=>{await j.current()},()=>L.current.some(n=>!n.uploaded&&!n.error)),()=>{N.getState().unregisterUpload(h,s)}},[h,s]);const O=v(async n=>{if(y){c(l=>l.map(t=>t.id===n.id?{...t,progress:0}:t));try{const l=await y(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:l,progress:100,error:null}:e);return f(r,!1),r})}catch(l){const t=l instanceof Error?l.message:"Upload failed";c(r=>r.map(e=>e.id===n.id?{...e,error:t,progress:null}:e))}}},[y,f]),z=v(n=>{c(l=>{const t=(u?U:1)-l.length;if(t<=0)return C(new Error("Maximum files reached"),{userMessage:u?`Maximum ${U} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),l;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:W(),file:o,previewURL:H(o),progress:null,uploaded:null,error:null})}if(e.length===0)return l;const i=u?[...l,...e]:e;return w?F.current=!0:e.forEach(o=>O(o)),i})},[u,U,S,$,w,O,f]),B=v(n=>{c(l=>{const t=l.find(e=>e.id===n);t&&k(t.previewURL);const r=l.filter(e=>e.id!==n);return f(r,!1),r})},[f]),D=d.some(n=>!n.uploaded&&!n.error),I=d.some(n=>n.progress!==null&&n.progress<100),J=d.length>0?d.reduce((n,l)=>n+(l.progress??0),0)/d.length:0;return{files:d,addFiles:z,removeFile:B,hasPending:D,isUploading:I,progress:J,formId:h,isDeferred:w}}export{Q as useFileUpload};
1
+ "use client";import{useState as T,useCallback as v,useEffect as A,useRef as g,startTransition as q}from"react";import{handleError as C}from"@donotdev/core";import{useUploadContext as G}from"../contexts/UploadContext";import{useUploadStore as N}from"../stores/UploadStore";let P=0;function W(s){if(s){const u=s.split("/").pop()?.split("?")[0];if(u)return`file-${u}`}P+=1;const a=typeof performance<"u"?performance.now():Date.now(),p=Math.random().toString(36).slice(2,11);return`file-${P}-${a}-${p}`}function H(s){return URL.createObjectURL(s)}function k(s){s.startsWith("blob:")&&URL.revokeObjectURL(s)}function K(s,a,p){return a.length>0&&!a.some(u=>{if(u.endsWith("/*")){const U=u.slice(0,-2);return s.type.startsWith(U)}return s.type===u})?{valid:!1,error:`File type ${s.type} not accepted`}:s.size>p?{valid:!1,error:`File exceeds ${(p/1048576).toFixed(0)}MB limit`}:{valid:!0}}function Q({name:s,value:a,onChange:p,multiple:u=!1,maxFiles:U=10,maxSize:E=10*1024*1024,accept:b=[],storagePath:V="uploads",uploadFn:y}){const h=G(),w=!!h,[d,c]=T([]),R=g(!1),$=g(null),x=g(a),L=g([]),F=g(!1),M=g(null);A(()=>{if(R.current){R.current=!1;return}const l=a?JSON.stringify((Array.isArray(a)?a:[a]).map(n=>n.fullUrl).filter(Boolean)):null;l!==$.current&&($.current=l,x.current=a,q(()=>{if(a){const n=(Array.isArray(a)?a:[a]).filter(t=>t.fullUrl).map((t,r)=>({id:`${W(t.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:t.thumbUrl||t.fullUrl,progress:100,uploaded:t,error:null}));c(n)}else c([])}))},[a]),A(()=>{L.current=d},[d]),A(()=>{F.current&&(F.current=!1,M.current?.(d,!0))},[d]),A(()=>()=>{L.current.forEach(l=>k(l.previewURL))},[]);const f=v((l,n=!1)=>{const t=(n?l.filter(i=>!i.error):l.filter(i=>i.uploaded&&!i.error)).map(i=>i.uploaded?i.uploaded:n&&w?{fullUrl:i.previewURL,thumbUrl:i.previewURL}:null).filter(i=>i!==null);let r;u?r=t.length>0?t:null:r=t[0]||null;const e=x.current;(()=>{if(!r&&!e)return!1;if(!r||!e)return!0;if(u&&Array.isArray(r)&&Array.isArray(e)){if(r.length!==e.length)return!0;const i=r.map(m=>m.fullUrl).join(","),o=e.map(m=>m.fullUrl).join(",");return i!==o}return!u&&!Array.isArray(r)&&!Array.isArray(e)?r.fullUrl!==e.fullUrl:!0})()&&(R.current=!0,x.current=r,p(r))},[u,p,w]);M.current=f;const S=v(async()=>{if(!y)return;let l=[];if(c(t=>(l=t.filter(r=>!r.uploaded&&!r.error),l.length===0?t:t.map(r=>l.some(e=>e.id===r.id)?{...r,progress:0}:r))),l.length===0)return;const n=await Promise.allSettled(l.map(async t=>{try{const r=await y(t.file,e=>{c(i=>i.map(o=>o.id===t.id?{...o,progress:e}:o))});return{id:t.id,picture:r,error:null}}catch(r){const e=r instanceof Error?r.message:"Upload failed";return{id:t.id,picture:null,error:e}}}));c(t=>{const r=t.map(e=>{const i=n.find(o=>o.status==="fulfilled"&&o.value.id===e.id);if(i&&i.status==="fulfilled"){const o=i.value;return{...e,uploaded:o.picture,progress:o.picture?100:null,error:o.error}}return e});return f(r,!1),r})},[y,f]),j=g(S);j.current=S,A(()=>{if(!(!h||!s))return N.getState().registerUpload(h,s,async()=>{await j.current()},()=>L.current.some(l=>!l.uploaded&&!l.error)),()=>{N.getState().unregisterUpload(h,s)}},[h,s]);const O=v(async l=>{if(y){c(n=>n.map(t=>t.id===l.id?{...t,progress:0}:t));try{const n=await y(l.file,t=>{c(r=>r.map(e=>e.id===l.id?{...e,progress:t}:e))});c(t=>{const r=t.map(e=>e.id===l.id?{...e,uploaded:n,progress:100,error:null}:e);return f(r,!1),r})}catch(n){const t=n instanceof Error?n.message:"Upload failed";c(r=>r.map(e=>e.id===l.id?{...e,error:t,progress:null}:e))}}},[y,f]),z=v(l=>{c(n=>{const t=(u?U:1)-n.length;if(t<=0)return C(new Error("Maximum files reached"),{userMessage:u?`Maximum ${U} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),n;const r=l.slice(0,t),e=[];for(const o of r){const m=K(o,b,E);if(!m.valid){C(new Error(m.error),{userMessage:m.error,severity:"warning",showNotification:!0});continue}e.push({id:W(),file:o,previewURL:H(o),progress:null,uploaded:null,error:null})}if(e.length===0)return n;const i=u?[...n,...e]:e;return w?F.current=!0:e.forEach(o=>O(o)),i})},[u,U,b,E,w,O,f]),B=v(l=>{c(n=>{const t=n.find(e=>e.id===l);t&&k(t.previewURL);const r=n.filter(e=>e.id!==l);return f(r,!1),r})},[f]),D=d.some(l=>!l.uploaded&&!l.error),I=d.some(l=>l.progress!==null&&l.progress<100),J=d.length>0?d.reduce((l,n)=>l+(n.progress??0),0)/d.length:0;return{files:d,addFiles:z,removeFile:B,hasPending:D,isUploading:I,progress:J,formId:h,isDeferred:w}}export{Q as useFileUpload};
@@ -1 +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 R(t){const o=new Map;for(const i of Object.values(t.fields)){const e=i.validation?.reference;if(typeof e=="string"&&!o.has(e)){const l=i.options?.fieldSpecific;o.set(e,{collection:e,labelFields:l?.labelFields,displayField:l?.displayField})}}return Array.from(o.values())}function M(t){const o=p(()=>R(t),[t]),i=o[0],e=o[1],l=o[2],s=o[3],{items:d}=c(i?.collection??"__disabled_0__",{enabled:!!i}),{items:a}=c(e?.collection??"__disabled_1__",{enabled:!!e}),{items:f}=c(l?.collection??"__disabled_2__",{enabled:!!l}),{items:r}=c(s?.collection??"__disabled_3__",{enabled:!!s}),F=[{info:i,items:d},{info:e,items:a},{info:l,items:f},{info:s,items:r}];return p(()=>{const _={};for(const{info:n,items:m}of F){if(!n||!m.length)continue;const b={};for(const y of m){const u=y;b[u.id]=v(u,n.labelFields,n.displayField)}_[n.collection]=b}return _},[i?.collection,d,e?.collection,a,l?.collection,f,s?.collection,r])}export{M as useReferenceResolver};
@@ -1 +1 @@
1
- "use client";import{useMemo as h}from"react";function p(a,e,t,n,N={}){const{limit:m=3,tolerance:o=.2}=N,c=h(()=>{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),g=Number(u);if(isNaN(l)||isNaN(g))return!1;const d=Math.abs(l*o);return Math.abs(g-l)<=d}return String(s)===String(u)})).slice(0,m)},[e,t,n,a.fields,m,o]);return{items:c,hasItems:c.length>0}}export{p as useRelatedItems};
1
+ "use client";import{useMemo as p}from"react";function N(o,e,t,n,h={}){const{limit:a=3,tolerance:m=.2}=h,c=p(()=>{if(!e||!t||t.length===0||n.length===0)return[];const b=e.id;return t.filter(f=>f.id===b?!1:n.some(s=>{const r=o.fields[s];if(!r)return!1;const i=e[s],u=f[s];if(i==null||u==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const l=Number(i),g=Number(u);if(isNaN(l)||isNaN(g))return!1;const d=Math.abs(l*m);return Math.abs(g-l)<=d}return String(i)===String(u)})).slice(0,a)},[e,t,n,o.fields,a,m]);return{items:c,hasItems:c.length>0}}export{N as useRelatedItems};
@@ -1 +1 @@
1
- "use client";import{useEffect as t}from"react";import{isClient as a}from"@donotdev/core";function u({isDirty:n,enabled:r=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}){t(()=>{if(!r||!n||!a())return;const o=s=>(s.preventDefault(),s.returnValue=e,e);return window.addEventListener("beforeunload",o),()=>{window.removeEventListener("beforeunload",o)}},[n,r,e])}export{u as useUnsavedChangesWarning};
1
+ "use client";import{useEffect as s}from"react";import{isClient as o}from"@donotdev/core";function u({isDirty:n,enabled:t=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}){s(()=>{if(!t||!n||!o())return;const r=a=>(a.preventDefault(),a.returnValue=e,e);return window.addEventListener("beforeunload",r),()=>{window.removeEventListener("beforeunload",r)}},[n,t,e])}export{u as useUnsavedChangesWarning};
@@ -1 +1 @@
1
- {"version":3,"file":"FormStore.d.ts","sourceRoot":"","sources":["../../src/stores/FormStore.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,OAAO,CAAC;AAEZ;;GAEG;AACH,UAAU,SAAS;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAE/B,8EAA8E;IAC9E,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,wCAAwC;IACxC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,2BAA2B;IAC3B,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,qDAAqD;IACrD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wBAAwB;IACxB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,sBAAsB;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,+BAA+B;IAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,uCAAuC;IACvC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAGlC,2BAA2B;IAC3B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvD,iCAAiC;IACjC,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,6BAA6B;IAC7B,eAAe,EAAE,MAAM,MAAM,EAAE,CAAC;IAGhC,sBAAsB;IACtB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC;IAC1C,4CAA4C;IAC5C,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,0BAA0B;IAC1B,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,wBAAwB;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC5C,6BAA6B;IAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC;AASD;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,2IA6MvB,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,UACiB,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,OAQ5C,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,MACgB,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IACM,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,OACgB,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAO,OACwC,CAAC"}
1
+ {"version":3,"file":"FormStore.d.ts","sourceRoot":"","sources":["../../src/stores/FormStore.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,OAAO,CAAC;AAEZ;;GAEG;AACH,UAAU,SAAS;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAE/B,8EAA8E;IAC9E,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,wCAAwC;IACxC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,2BAA2B;IAC3B,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,qDAAqD;IACrD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wBAAwB;IACxB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,sBAAsB;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,+BAA+B;IAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,uCAAuC;IACvC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAGlC,2BAA2B;IAC3B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvD,iCAAiC;IACjC,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,6BAA6B;IAC7B,eAAe,EAAE,MAAM,MAAM,EAAE,CAAC;IAGhC,sBAAsB;IACtB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC;IAC1C,4CAA4C;IAC5C,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,0BAA0B;IAC1B,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,wBAAwB;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC5C,6BAA6B;IAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC;AASD;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,2IAoMvB,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,UACiB,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,OAQ5C,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,MACgB,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IACM,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,OACgB,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAO,OACwC,CAAC"}
@@ -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},a=l({name:"form-store",createStore:(o,t)=>{const m=new Map;return{forms:{},startSubmit:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"uploading",error:null,uploadProgress:0}}}})},setUploading:(r,s)=>{o(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,status:"uploading",uploadProgress:Math.min(100,Math.max(0,s))}}}})},setValidating:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"validating",uploadProgress:100}}}})},setSubmitting:r=>{o(s=>{const e=s.forms[r]||i;return{forms:{...s.forms,[r]:{...e,status:"submitting"}}}})},setSuccess:r=>{o(u=>{const n=u.forms[r]||i;return{forms:{...u.forms,[r]:{...n,status:"success",error:null}}}});const s=m.get(r);s!==void 0&&clearTimeout(s);const e=setTimeout(()=>{m.delete(r),t().reset(r)},1500);m.set(r,e)},setError:(r,s)=>{t().reset(r)},reset:r=>{o(s=>({forms:{...s.forms,[r]:{...i}}}))},setIsDirty:(r,s)=>{o(e=>{const u=e.forms[r]||i;return{forms:{...e.forms,[r]:{...u,isDirty:s}}}})},hasDirtyForms:()=>{const r=t().forms;return Object.values(r).some(s=>s.isDirty)},getDirtyFormIds:()=>{const r=t().forms;return Object.entries(r).filter(([s,e])=>e.isDirty).map(([s])=>s)},cleanup:r=>{const s=m.get(r);s!==void 0&&(clearTimeout(s),m.delete(r)),o(e=>{const{[r]:u,...n}=e.forms;return{forms:n}})},getStatus:r=>t().forms[r]?.status??"idle",isLoading:r=>{const s=t().forms[r]?.status??"idle";return s==="uploading"||s==="validating"||s==="submitting"},getUploadProgress:r=>t().forms[r]?.uploadProgress??0,getError:r=>t().forms[r]?.error??null,getIsDirty:r=>t().forms[r]?.isDirty??!1}}}),f=o=>a(t=>t.forms[o]?.status??"idle"),g=o=>a(t=>{const m=t.forms[o]?.status??"idle";return m==="uploading"||m==="validating"||m==="submitting"}),c=o=>a(t=>t.forms[o]?.uploadProgress??0),d=o=>a(t=>t.forms[o]?.error??null),p=o=>a(t=>t.forms[o]?.isDirty??!1),D=()=>a(o=>Object.values(o.forms).some(t=>t.isDirty));export{d as useFormError,p as useFormIsDirty,g as useFormLoading,f as useFormStatus,a as useFormStore,D as useHasDirtyForms,c as useUploadProgress};
@@ -1 +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,n)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(t,e,o,r)=>{u(s=>({uploadFunctions:{...s.uploadFunctions,[t]:{...s.uploadFunctions[t]||{},[e]:o}},checkPendingFunctions:{...s.checkPendingFunctions,[t]:{...s.checkPendingFunctions[t]||{},[e]:r||(()=>!1)}}}))},unregisterUpload:(t,e)=>{u(o=>{const r=o.uploadFunctions[t],s=o.checkPendingFunctions[t];if(!r)return o;const{[e]:l,...p}=r,{[e]:a,...i}=s||{},{[e]:g,...h}=o.retryAttempts[t]||{};return{uploadFunctions:{...o.uploadFunctions,[t]:p},checkPendingFunctions:{...o.checkPendingFunctions,[t]:i},retryAttempts:{...o.retryAttempts,[t]:h}}})},startUpload:(t,e)=>{u(o=>({uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(t,e,o)=>{u(r=>{const s=r.uploads[t]?.[e]||m;return{uploads:{...r.uploads,[t]:{...r.uploads[t]||{},[e]:{...s,progress:Math.min(100,Math.max(0,o))}}}}})},completeUpload:(t,e)=>{u(o=>{const r=o.uploads[t]?.[e]||m;return{uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{...r,status:"complete",progress:100}}}}})},failUpload:(t,e,o)=>{u(r=>{const s=r.uploads[t]?.[e]||m;return{uploads:{...r.uploads,[t]:{...r.uploads[t]||{},[e]:{...s,status:"error",error:o}}}}})},resetUpload:(t,e)=>{u(o=>({uploads:{...o.uploads,[t]:{...o.uploads[t]||{},[e]:{...m}}}}))},resetForm:t=>{u(e=>({uploads:{...e.uploads,[t]:{}}}))},cleanup:t=>{u(e=>{const{[t]:o,...r}=e.uploads,{[t]:s,...l}=e.uploadFunctions,{[t]:p,...a}=e.checkPendingFunctions,{[t]:i,...g}=e.retryAttempts;return{uploads:r,uploadFunctions:l,checkPendingFunctions:a,retryAttempts:g}})},uploadAll:async t=>{const e=n().uploadFunctions[t];if(!e)return;const o=Object.entries(e);if(o.length===0)return;const r=async(s,l,p=1)=>{n().startUpload(t,s);try{await l(a=>{n().setProgress(t,s,a)}),n().completeUpload(t,s),u(a=>({retryAttempts:{...a.retryAttempts,[t]:{...a.retryAttempts[t]||{},[s]:0}}}))}catch(a){const i=a instanceof Error?a.message:"Upload failed",g=n().maxRetries;if((n().retryAttempts[t]?.[s]??0)<g){u(d=>({retryAttempts:{...d.retryAttempts,[t]:{...d.retryAttempts[t]||{},[s]:(d.retryAttempts[t]?.[s]??0)+1}}}));const h=n().retryDelay*Math.pow(2,p-1);return await new Promise(d=>setTimeout(d,h)),r(s,l,p+1)}else throw n().failUpload(t,s,i),a}};await Promise.all(o.map(async([s,l])=>{await r(s,l)}))},hasPendingUploads:t=>{const e=n(),o=e.uploadFunctions[t],r=e.checkPendingFunctions[t];return o?Object.entries(o).some(([s,l])=>{const p=r?.[s];return p?p():!0}):!1},getStatus:(t,e)=>n().uploads[t]?.[e]?.status??"idle",getProgress:(t,e)=>n().uploads[t]?.[e]?.progress??0,getTotalProgress:t=>{const e=n().uploads[t];if(!e)return 100;const o=Object.values(e);if(o.length===0)return 100;const r=o.reduce((s,l)=>s+l.progress,0);return Math.round(r/o.length)},isUploading:t=>{const e=n().uploads[t];return e?Object.values(e).some(o=>o.status==="uploading"):!1},getError:(t,e)=>n().uploads[t]?.[e]?.error??null})}),y=u=>c(n=>{const t=n.uploads[u];if(!t)return 100;const e=Object.values(t);if(e.length===0)return 100;const o=e.reduce((r,s)=>r+s.progress,0);return Math.round(o/e.length)}),P=u=>c(n=>{const t=n.uploads[u];return t?Object.values(t).some(e=>e.status==="uploading"):!1}),A=(u,n)=>c(t=>t.uploads[u]?.[n]?.progress??0),U=(u,n)=>c(t=>t.uploads[u]?.[n]?.status??"idle");export{A as useFieldProgress,U as useFieldUploadStatus,P as useIsUploading,y as useTotalProgress,c as useUploadStore};
1
+ "use client";import{createDoNotDevStore as F}from"@donotdev/core";const m={status:"idle",progress:0,error:null},d=F({name:"upload-store",createStore:(a,n)=>({uploads:{},uploadFunctions:{},checkPendingFunctions:{},retryAttempts:{},maxRetries:3,retryDelay:1e3,registerUpload:(s,e,t,o)=>{a(r=>({uploadFunctions:{...r.uploadFunctions,[s]:{...r.uploadFunctions[s]||{},[e]:t}},checkPendingFunctions:{...r.checkPendingFunctions,[s]:{...r.checkPendingFunctions[s]||{},[e]:o||(()=>!1)}}}))},unregisterUpload:(s,e)=>{a(t=>{const o=t.uploadFunctions[s],r=t.checkPendingFunctions[s];if(!o)return t;const{[e]:l,...p}=o,{[e]:u,...i}=r||{},{[e]:g,...h}=t.retryAttempts[s]||{};return{uploadFunctions:{...t.uploadFunctions,[s]:p},checkPendingFunctions:{...t.checkPendingFunctions,[s]:i},retryAttempts:{...t.retryAttempts,[s]:h}}})},startUpload:(s,e)=>{a(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[e]:{status:"uploading",progress:0,error:null}}}}))},setProgress:(s,e,t)=>{a(o=>{const r=o.uploads[s]?.[e]||m;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[e]:{...r,progress:Math.min(100,Math.max(0,t))}}}}})},completeUpload:(s,e)=>{a(t=>{const o=t.uploads[s]?.[e]||m;return{uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[e]:{...o,status:"complete",progress:100}}}}})},failUpload:(s,e,t)=>{a(o=>{const r=o.uploads[s]?.[e]||m;return{uploads:{...o.uploads,[s]:{...o.uploads[s]||{},[e]:{...r,status:"error",error:t}}}}})},resetUpload:(s,e)=>{a(t=>({uploads:{...t.uploads,[s]:{...t.uploads[s]||{},[e]:{...m}}}}))},resetForm:s=>{a(e=>({uploads:{...e.uploads,[s]:{}}}))},cleanup:s=>{a(e=>{const{[s]:t,...o}=e.uploads,{[s]:r,...l}=e.uploadFunctions,{[s]:p,...u}=e.checkPendingFunctions,{[s]:i,...g}=e.retryAttempts;return{uploads:o,uploadFunctions:l,checkPendingFunctions:u,retryAttempts:g}})},uploadAll:async s=>{const e=n().uploadFunctions[s];if(!e)return;const t=Object.entries(e);if(t.length===0)return;const o=async(r,l,p=1)=>{n().startUpload(s,r);try{await l(u=>{n().setProgress(s,r,u)}),n().completeUpload(s,r),a(u=>({retryAttempts:{...u.retryAttempts,[s]:{...u.retryAttempts[s]||{},[r]:0}}}))}catch(u){const i=u instanceof Error?u.message:"Upload failed",g=n().maxRetries;if((n().retryAttempts[s]?.[r]??0)<g){a(c=>({retryAttempts:{...c.retryAttempts,[s]:{...c.retryAttempts[s]||{},[r]:(c.retryAttempts[s]?.[r]??0)+1}}}));const h=n().retryDelay*Math.pow(2,p-1);return await new Promise(c=>setTimeout(c,h)),o(r,l,p+1)}else throw n().failUpload(s,r,i),u}};await Promise.all(t.map(async([r,l])=>{await o(r,l)}))},hasPendingUploads:s=>{const e=n(),t=e.uploadFunctions[s],o=e.checkPendingFunctions[s];return t?Object.entries(t).some(([r,l])=>{const p=o?.[r];return p?p():!0}):!1},getStatus:(s,e)=>n().uploads[s]?.[e]?.status??"idle",getProgress:(s,e)=>n().uploads[s]?.[e]?.progress??0,getTotalProgress:s=>{const e=n().uploads[s];if(!e)return 100;const t=Object.values(e);if(t.length===0)return 100;const o=t.reduce((r,l)=>r+l.progress,0);return Math.round(o/t.length)},isUploading:s=>{const e=n().uploads[s];return e?Object.values(e).some(t=>t.status==="uploading"):!1},getError:(s,e)=>n().uploads[s]?.[e]?.error??null})}),y=a=>d(n=>{const s=n.uploads[a];if(!s)return 100;const e=Object.values(s);if(e.length===0)return 100;const t=e.reduce((o,r)=>o+r.progress,0);return Math.round(t/e.length)}),P=a=>d(n=>{const s=n.uploads[a];return s?Object.values(s).some(e=>e.status==="uploading"):!1}),A=(a,n)=>d(s=>s.uploads[a]?.[n]?.progress??0),U=(a,n)=>d(s=>s.uploads[a]?.[n]?.status??"idle");export{A as useFieldProgress,U as useFieldUploadStatus,P as useIsUploading,y as useTotalProgress,d as useUploadStore};