@donotdev/crud 0.0.28 → 0.0.30

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