@donotdev/crud 0.0.16 → 0.0.17

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 (195) hide show
  1. package/dist/CrudService.d.ts.map +1 -1
  2. package/dist/CrudService.js +2 -2
  3. package/dist/CrudStore.d.ts.map +1 -1
  4. package/dist/CrudStore.js +1 -1
  5. package/dist/FieldRegistry.d.ts.map +1 -1
  6. package/dist/FieldRegistry.js +1 -1
  7. package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
  8. package/dist/adapters/FunctionsAdapter.js +1 -1
  9. package/dist/components/CrudButton.js +1 -1
  10. package/dist/components/CrudCard.d.ts.map +1 -1
  11. package/dist/components/CrudCard.js +1 -1
  12. package/dist/components/DateFilter.js +1 -1
  13. package/dist/components/DisplayFieldRenderer.js +1 -1
  14. package/dist/components/DisplayThumbnail.js +1 -1
  15. package/dist/components/EntityFilters.d.ts +1 -34
  16. package/dist/components/EntityFilters.d.ts.map +1 -1
  17. package/dist/components/EntityFilters.js +1 -1
  18. package/dist/components/FormFieldRenderer.js +1 -1
  19. package/dist/components/FormLayout.js +1 -1
  20. package/dist/components/controlled/complex/ControlledAddressField.js +1 -1
  21. package/dist/components/controlled/complex/ControlledDateField.js +1 -1
  22. package/dist/components/controlled/complex/ControlledFieldArrayField.d.ts +18 -0
  23. package/dist/components/controlled/complex/ControlledFieldArrayField.d.ts.map +1 -0
  24. package/dist/components/controlled/complex/ControlledFieldArrayField.js +1 -0
  25. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  26. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  27. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  28. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  29. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  30. package/dist/components/controlled/complex/index.d.ts +1 -0
  31. package/dist/components/controlled/complex/index.d.ts.map +1 -1
  32. package/dist/components/controlled/complex/index.js +1 -1
  33. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  34. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  35. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  36. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  37. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  38. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  39. package/dist/components/controlled/file/index.js +1 -1
  40. package/dist/components/controlled/index.js +1 -1
  41. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  42. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
  43. package/dist/components/controlled/input/ControlledDurationField.js +1 -1
  44. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  45. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  46. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  47. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  48. package/dist/components/controlled/input/ControlledPriceField.js +1 -1
  49. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  50. package/dist/components/controlled/input/ControlledRatingField.js +1 -1
  51. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  52. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  53. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  54. package/dist/components/controlled/input/index.js +1 -1
  55. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  56. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  57. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  58. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  59. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  60. package/dist/components/controlled/select/index.js +1 -1
  61. package/dist/components/controlled/types.js +1 -1
  62. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
  63. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
  64. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -1
  65. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
  66. package/dist/components/fields/display/DateFieldDisplay.js +1 -1
  67. package/dist/components/fields/display/DropdownDisplay.js +1 -1
  68. package/dist/components/fields/display/FileFieldDisplay.js +1 -1
  69. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -1
  70. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -1
  71. package/dist/components/fields/display/ImageFieldDisplay.js +1 -1
  72. package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
  73. package/dist/components/fields/display/MapFieldDisplay.js +1 -1
  74. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -1
  75. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -1
  76. package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
  77. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
  78. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -1
  79. package/dist/components/fields/display/RadioFieldDisplay.js +1 -1
  80. package/dist/components/fields/display/RangeFieldDisplay.js +1 -1
  81. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
  82. package/dist/components/fields/display/RichTextDisplay.js +2 -2
  83. package/dist/components/fields/display/TextAreaDisplay.js +1 -1
  84. package/dist/components/fields/display/TextFieldDisplay.js +1 -1
  85. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
  86. package/dist/components/fields/display/index.js +1 -1
  87. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  88. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  89. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  90. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  91. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  92. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  93. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  94. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  95. package/dist/components/form/fields/DocumentFieldComponent.d.ts.map +1 -1
  96. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  97. package/dist/components/form/fields/DropdownComponent.js +1 -1
  98. package/dist/components/form/fields/DurationFieldComponent.js +1 -1
  99. package/dist/components/form/fields/FileFieldComponent.d.ts.map +1 -1
  100. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  101. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  102. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  103. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  104. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  105. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  106. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  107. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  108. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  109. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  110. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  111. package/dist/components/form/fields/PriceFieldComponent.js +1 -1
  112. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  113. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  114. package/dist/components/form/fields/RatingFieldComponent.js +1 -1
  115. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  116. package/dist/components/form/fields/RichTextComponent.js +1 -1
  117. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  118. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  119. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  120. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  121. package/dist/components/form/fields/index.js +1 -1
  122. package/dist/components/form/fields/internal/TiptapEditor.d.ts.map +1 -1
  123. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  124. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  125. package/dist/components/index.d.ts +2 -1
  126. package/dist/components/index.d.ts.map +1 -1
  127. package/dist/components/index.js +1 -1
  128. package/dist/contexts/UploadContext.js +1 -1
  129. package/dist/contexts/index.js +1 -1
  130. package/dist/fieldTypeRegistry.js +1 -1
  131. package/dist/forms/hooks/index.js +1 -1
  132. package/dist/forms/hooks/useController.js +1 -1
  133. package/dist/forms/hooks/useEntityField.d.ts +15 -24
  134. package/dist/forms/hooks/useEntityField.d.ts.map +1 -1
  135. package/dist/forms/hooks/useEntityField.js +1 -1
  136. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  137. package/dist/forms/hooks/useEntityForm.js +1 -1
  138. package/dist/forms/index.js +1 -1
  139. package/dist/forms/types.d.ts +13 -0
  140. package/dist/forms/types.d.ts.map +1 -1
  141. package/dist/forms/utils/buildInitialValues.d.ts.map +1 -1
  142. package/dist/forms/utils/buildInitialValues.js +1 -1
  143. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  144. package/dist/forms/utils/index.js +1 -1
  145. package/dist/forms/utils/isFieldEditable.js +1 -1
  146. package/dist/forms/utils/translateFieldLabel.js +1 -1
  147. package/dist/forms/utils/validateEntity.js +1 -1
  148. package/dist/hooks/useCrudFilters.js +1 -1
  149. package/dist/hooks/useEntityFavorites.js +1 -1
  150. package/dist/hooks/useFileUpload.d.ts.map +1 -1
  151. package/dist/hooks/useFileUpload.js +1 -1
  152. package/dist/hooks/useRelatedItems.js +1 -1
  153. package/dist/index.d.ts +4 -0
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +1 -1
  156. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -1
  157. package/dist/registerBuiltinFieldTypes.js +1 -1
  158. package/dist/stores/FormStore.js +1 -1
  159. package/dist/stores/UploadStore.d.ts.map +1 -1
  160. package/dist/stores/UploadStore.js +1 -1
  161. package/dist/stores/index.js +1 -1
  162. package/dist/tsconfig.tsbuildinfo +1 -1
  163. package/dist/types.js +1 -1
  164. package/dist/useBaseCrudList.d.ts.map +1 -1
  165. package/dist/useBaseCrudList.js +1 -1
  166. package/dist/useCrud.js +1 -1
  167. package/dist/useCrudCardList.d.ts +14 -19
  168. package/dist/useCrudCardList.d.ts.map +1 -1
  169. package/dist/useCrudCardList.js +1 -1
  170. package/dist/useCrudList.d.ts +19 -18
  171. package/dist/useCrudList.d.ts.map +1 -1
  172. package/dist/useCrudList.js +1 -1
  173. package/dist/utils/clientListProcessing.d.ts +82 -0
  174. package/dist/utils/clientListProcessing.d.ts.map +1 -0
  175. package/dist/utils/clientListProcessing.js +1 -0
  176. package/dist/utils/collections.js +1 -1
  177. package/dist/utils/fileStorage.d.ts.map +1 -1
  178. package/dist/utils/fileStorage.js +1 -1
  179. package/dist/utils/imageProcessing.js +1 -1
  180. package/dist/utils/imageStorage.d.ts.map +1 -1
  181. package/dist/utils/imageStorage.js +1 -1
  182. package/dist/utils/imageUtils.js +1 -1
  183. package/dist/utils/matchesFilter.d.ts +45 -0
  184. package/dist/utils/matchesFilter.d.ts.map +1 -0
  185. package/dist/utils/matchesFilter.js +1 -0
  186. package/dist/utils/mergeWithOptimistic.d.ts.map +1 -1
  187. package/dist/utils/mergeWithOptimistic.js +1 -1
  188. package/dist/utils/sanitizeHtml.js +1 -1
  189. package/dist/utils/scopeUtils.js +1 -1
  190. package/dist/utils/uploadValidation.d.ts.map +1 -1
  191. package/dist/utils/uploadValidation.js +1 -1
  192. package/package.json +3 -3
  193. package/dist/hooks/useFormNavigationGuard.d.ts +0 -34
  194. package/dist/hooks/useFormNavigationGuard.d.ts.map +0 -1
  195. package/dist/hooks/useFormNavigationGuard.js +0 -1
@@ -1 +1 @@
1
- "use client";import{jsx as e,Fragment as re,jsxs as a}from"react/jsx-runtime";import{ChevronLeft as ne,ChevronRight as le,RotateCcw as M,RotateCw as B,Trash2 as de,Check as ce,Undo2 as se,ZoomIn as ge,ZoomOut as me,Maximize2 as pe,Grid3X3 as he}from"lucide-react";import{useCallback as g,useEffect as H,useState as c,useRef as ue}from"react";import ve from"react-easy-crop";import{Button as o,BUTTON_VARIANT as r,Sheet as fe,Stack as l,Text as u,Slider as F,ToggleGroup as ye}from"@donotdev/components";import{useTranslation as we}from"@donotdev/core";import{processImage as Ce}from"../../../utils/imageProcessing";import{createPreviewURL as be,revokePreviewURL as ke}from"../../../utils/imageUtils";const xe={free:void 0,"1:1":1,"4:3":4/3,"16:9":16/9,"3:2":3/2};function Y({images:h,selectedIndex:n,open:T,onClose:U,onUpdate:Z,onDelete:E,onNavigate:m,multiple:L=!1}){const{t}=we("crud"),[D,C]=c({x:0,y:0}),[v,p]=c(1),[b,f]=c(0),[N,$]=c(null),[S,z]=c("free"),[k,q]=c(!0),[y,w]=c(!1),[G,A]=c(!1),[X,x]=c(!1),I=ue({crop:{x:0,y:0},zoom:1,rotation:0}),d=h[n],R=L&&n>0,O=L&&n<h.length-1;H(()=>{if(d){const i={x:0,y:0};C(i),p(1),f(d.rotation*90),z("free"),w(!1),x(!1),I.current={crop:i,zoom:1,rotation:d.rotation*90}}},[d]);const _=g((i,s)=>{$(s)},[]),J=g(()=>{C(I.current.crop),p(I.current.zoom),f(I.current.rotation)},[]),P=g(()=>{f(i=>(i-90+360)%360)},[]),V=g(()=>{f(i=>(i+90)%360)},[]),K=g(()=>{p(i=>Math.min(i+.25,3))},[]),Q=g(()=>{p(i=>Math.max(i-.25,1))},[]),ee=g(()=>{p(1),C({x:0,y:0})},[]),ie=async()=>{if(!(!d||!N)){A(!0);try{const i=await Ce(d.file,{crop:N,maxWidth:2048,maxHeight:2048,quality:.95}),s=new File([i.fullBlob],d.file.name,{type:"image/webp"}),oe=be(s);d.previewURL.startsWith("blob:")&&ke(d.previewURL),Z(n,{file:s,previewURL:oe,uploaded:null,uploadProgress:null,error:null,rotation:0}),w(!1)}catch{}finally{A(!1)}}},te=g(()=>{E(n),x(!1),h.length===1?U():n>=h.length-1&&m(n-1)},[n,h.length,E,U,m]);if(H(()=>{if(!T)return;const i=s=>{s.key==="ArrowLeft"&&R?m(n-1):s.key==="ArrowRight"&&O?m(n+1):s.key==="Escape"&&y&&w(!1)};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[T,R,O,n,m,y]),!d)return null;const W=d.uploadProgress!==null&&d.uploadProgress<100,j=d.uploaded?.fullUrl||d.previewURL,ae=L?t("image.editor.titleWithIndex",{current:n+1,total:h.length}):t("image.editor.title");return e(fe,{open:T,onOpenChange:i=>!i&&U(),side:"right",title:ae,description:t("image.editor.description"),noSwipe:y,children:a(l,{gap:"large",style:{height:"100%"},children:[e("div",{style:{position:"relative",flex:1,minHeight:300,backgroundColor:"var(--surface-muted)",borderRadius:"var(--radius-lg)",overflow:"hidden"},children:y?e(ve,{image:j,crop:D,zoom:v,rotation:b,aspect:xe[S],onCropChange:C,onCropComplete:_,onZoomChange:p,showGrid:k,style:{containerStyle:{position:"absolute",top:0,left:0,right:0,bottom:0},cropAreaStyle:{border:"2px solid var(--primary)",boxShadow:"0 0 0 9999px rgba(0,0,0,0.5)"}}}):a(re,{children:[R&&e(o,{variant:r.GHOST,icon:ne,onClick:()=>m(n-1),"aria-label":t("image.editor.previousImage"),style:{position:"absolute",left:"var(--gap-sm)",top:"50%",transform:"translateY(-50%)",zIndex:10,backgroundColor:"rgba(0,0,0,0.3)",color:"white"}}),e("img",{src:j,alt:`Image ${n+1}`,style:{width:"100%",height:"100%",objectFit:"contain",transform:`rotate(${b}deg)`,transition:"transform var(--dur-normal) var(--ease-out)"}}),O&&e(o,{variant:r.GHOST,icon:le,onClick:()=>m(n+1),"aria-label":t("image.editor.nextImage"),style:{position:"absolute",right:"var(--gap-sm)",top:"50%",transform:"translateY(-50%)",zIndex:10,backgroundColor:"rgba(0,0,0,0.3)",color:"white"}})]})}),y?a(l,{children:[a(l,{gap:"tight",children:[e(u,{level:"small",variant:"muted",children:t("image.editor.aspectRatio")}),e(ye,{type:"single",value:S,onValueChange:i=>i&&z(i),items:[{value:"free",label:t("image.editor.aspectFree")},{value:"1:1",label:"1:1"},{value:"4:3",label:"4:3"},{value:"16:9",label:"16:9"}]})]}),a(l,{gap:"tight",children:[a(l,{direction:"row",justify:"between",align:"center",children:[e(u,{level:"small",variant:"muted",children:t("image.editor.zoom")}),a(u,{level:"small",variant:"muted",children:[Math.round(v*100),"%"]})]}),a(l,{direction:"row",gap:"tight",align:"center",children:[e(o,{variant:r.OUTLINE,icon:me,display:"compact",onClick:Q,disabled:v<=1}),e(F,{value:[v],min:1,max:3,step:.05,onValueChange:i=>p(i[0]??1),style:{flex:1}}),e(o,{variant:r.OUTLINE,icon:ge,display:"compact",onClick:K,disabled:v>=3})]})]}),a(l,{gap:"tight",children:[a(l,{direction:"row",justify:"between",align:"center",children:[e(u,{level:"small",variant:"muted",children:t("image.editor.rotation")}),a(u,{level:"small",variant:"muted",children:[b,"\xB0"]})]}),a(l,{direction:"row",gap:"tight",align:"center",children:[e(o,{variant:r.OUTLINE,icon:M,display:"compact",onClick:P,tooltip:t("image.editor.rotateLeft")}),e(F,{value:[b],min:0,max:360,step:1,onValueChange:i=>f(i[0]??0),style:{flex:1}}),e(o,{variant:r.OUTLINE,icon:B,display:"compact",onClick:V,tooltip:t("image.editor.rotateRight")})]})]}),a(l,{direction:"row",gap:"tight",children:[e(o,{variant:r.OUTLINE,icon:pe,display:"compact",onClick:ee,tooltip:t("image.editor.fitToView")}),e(o,{variant:r.OUTLINE,icon:he,display:"compact",onClick:()=>q(!k),tooltip:t(k?"image.editor.hideGrid":"image.editor.showGrid"),"data-active":k||void 0}),e(o,{variant:r.OUTLINE,icon:se,display:"compact",onClick:J,tooltip:t("image.editor.reset")})]}),a(l,{direction:"row",style:{marginTop:"var(--gap-md)"},children:[e(o,{variant:r.OUTLINE,onClick:()=>w(!1),fullWidth:!0,children:t("image.editor.cancel")}),e(o,{variant:r.PRIMARY,icon:ce,onClick:ie,disabled:G,fullWidth:!0,children:t(G?"image.editor.processing":"image.editor.apply")})]})]}):a(l,{children:[a(l,{direction:"row",gap:"tight",justify:"center",children:[e(o,{variant:r.OUTLINE,icon:M,display:"compact",onClick:P,tooltip:t("image.editor.rotateLeft")}),e(o,{variant:r.PRIMARY,onClick:()=>w(!0),disabled:W,children:t("image.editor.editButton")}),e(o,{variant:r.OUTLINE,icon:B,display:"compact",onClick:V,tooltip:t("image.editor.rotateRight")})]}),X?a(l,{style:{border:"1px solid var(--destructive)",padding:"var(--gap-md)",borderRadius:"var(--radius-md)"},children:[e(u,{variant:"destructive",level:"small",align:"center",children:t("image.editor.deleteConfirm")}),a(l,{direction:"row",gap:"tight",children:[e(o,{variant:r.OUTLINE,onClick:()=>x(!1),fullWidth:!0,children:t("image.editor.cancel")}),e(o,{variant:r.DESTRUCTIVE,onClick:te,fullWidth:!0,children:t("actions.delete")})]})]}):e(o,{variant:r.GHOST,icon:de,onClick:()=>x(!0),disabled:W,style:{color:"var(--destructive)"},children:t("image.editor.deleteImage")})]})]})})}var Ie=Y;export{Y as ImageViewerDialog,Ie as default};
1
+ "use client";import{jsx as e,Fragment as re,jsxs as o}from"react/jsx-runtime";import{ChevronLeft as ae,ChevronRight as ne,RotateCcw as W,RotateCw as M,Trash2 as le,Check as ce,Undo2 as se,ZoomIn as de,ZoomOut as pe,Maximize2 as me,Grid3X3 as ge}from"lucide-react";import{useCallback as p,useEffect as Z,useState as s,useRef as he}from"react";import ue from"react-easy-crop";import{Button as r,BUTTON_VARIANT as a,Sheet as fe,Stack as l,Text as u,Slider as _,ToggleGroup as ve}from"@donotdev/components";import{useTranslation as we}from"@donotdev/core";import{processImage as ye}from"../../../utils/imageProcessing";import{createPreviewURL as Ce,revokePreviewURL as be}from"../../../utils/imageUtils";const Re={free:void 0,"1:1":1,"4:3":4/3,"16:9":16/9,"3:2":3/2};function ke({images:h,selectedIndex:n,open:L,onClose:U,onUpdate:B,onDelete:S,onNavigate:m,multiple:E=!1}){const{t:i}=we("crud"),[D,C]=s({x:0,y:0}),[f,g]=s(1),[b,v]=s(0),[I,H]=s(null),[P,A]=s("free"),[R,Y]=s(!0),[w,y]=s(!1),[G,z]=s(!1),[$,k]=s(!1),T=he({crop:{x:0,y:0},zoom:1,rotation:0}),c=h[n],O=E&&n>0,x=E&&n<h.length-1;Z(()=>{if(c){const t={x:0,y:0};C(t),g(1),v(c.rotation*90),A("free"),y(!1),k(!1),T.current={crop:t,zoom:1,rotation:c.rotation*90}}},[c]);const q=p((t,d)=>{H(d)},[]),K=p(()=>{C(T.current.crop),g(T.current.zoom),v(T.current.rotation)},[]),j=p(()=>{v(t=>(t-90+360)%360)},[]),F=p(()=>{v(t=>(t+90)%360)},[]),X=p(()=>{g(t=>Math.min(t+.25,3))},[]),J=p(()=>{g(t=>Math.max(t-.25,1))},[]),Q=p(()=>{g(1),C({x:0,y:0})},[]),ee=async()=>{if(!(!c||!I)){z(!0);try{const t=await ye(c.file,{crop:I,maxWidth:2048,maxHeight:2048,quality:.95}),d=new File([t.fullBlob],c.file.name,{type:"image/webp"}),oe=Ce(d);c.previewURL.startsWith("blob:")&&be(c.previewURL),B(n,{file:d,previewURL:oe,uploaded:null,uploadProgress:null,error:null,rotation:0}),y(!1)}catch{}finally{z(!1)}}},te=p(()=>{S(n),k(!1),h.length===1?U():n>=h.length-1&&m(n-1)},[n,h.length,S,U,m]);if(Z(()=>{if(!L)return;const t=d=>{d.key==="ArrowLeft"&&O?m(n-1):d.key==="ArrowRight"&&x?m(n+1):d.key==="Escape"&&w&&y(!1)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[L,O,x,n,m,w]),!c)return null;const N=c.uploadProgress!==null&&c.uploadProgress<100,V=c.uploaded?.fullUrl||c.previewURL,ie=E?i("image.editor.titleWithIndex",{current:n+1,total:h.length}):i("image.editor.title");return e(fe,{open:L,onOpenChange:t=>!t&&U(),side:"right",title:ie,description:i("image.editor.description"),noSwipe:w,children:o(l,{gap:"large",style:{height:"100%"},children:[e("div",{style:{position:"relative",flex:1,minHeight:300,backgroundColor:"var(--surface-muted)",borderRadius:"var(--radius-lg)",overflow:"hidden"},children:w?e(ue,{image:V,crop:D,zoom:f,rotation:b,aspect:Re[P],onCropChange:C,onCropComplete:q,onZoomChange:g,showGrid:R,style:{containerStyle:{position:"absolute",top:0,left:0,right:0,bottom:0},cropAreaStyle:{border:"2px solid var(--primary)",boxShadow:"0 0 0 9999px rgba(0,0,0,0.5)"}}}):o(re,{children:[O&&e(r,{variant:a.GHOST,icon:ae,onClick:()=>m(n-1),"aria-label":i("image.editor.previousImage"),style:{position:"absolute",left:"var(--gap-sm)",top:"50%",transform:"translateY(-50%)",zIndex:10,backgroundColor:"rgba(0,0,0,0.3)",color:"white"}}),e("img",{src:V,alt:`Image ${n+1}`,style:{width:"100%",height:"100%",objectFit:"contain",transform:`rotate(${b}deg)`,transition:"transform var(--dur-normal) var(--ease-out)"}}),x&&e(r,{variant:a.GHOST,icon:ne,onClick:()=>m(n+1),"aria-label":i("image.editor.nextImage"),style:{position:"absolute",right:"var(--gap-sm)",top:"50%",transform:"translateY(-50%)",zIndex:10,backgroundColor:"rgba(0,0,0,0.3)",color:"white"}})]})}),w?o(l,{children:[o(l,{gap:"tight",children:[e(u,{level:"small",variant:"muted",children:i("image.editor.aspectRatio")}),e(ve,{type:"single",value:P,onValueChange:t=>t&&A(t),items:[{value:"free",label:i("image.editor.aspectFree")},{value:"1:1",label:"1:1"},{value:"4:3",label:"4:3"},{value:"16:9",label:"16:9"}]})]}),o(l,{gap:"tight",children:[o(l,{direction:"row",justify:"between",align:"center",children:[e(u,{level:"small",variant:"muted",children:i("image.editor.zoom")}),o(u,{level:"small",variant:"muted",children:[Math.round(f*100),"%"]})]}),o(l,{direction:"row",gap:"tight",align:"center",children:[e(r,{variant:a.OUTLINE,icon:pe,display:"compact",onClick:J,disabled:f<=1}),e(_,{value:[f],min:1,max:3,step:.05,onValueChange:t=>g(t[0]??1),style:{flex:1}}),e(r,{variant:a.OUTLINE,icon:de,display:"compact",onClick:X,disabled:f>=3})]})]}),o(l,{gap:"tight",children:[o(l,{direction:"row",justify:"between",align:"center",children:[e(u,{level:"small",variant:"muted",children:i("image.editor.rotation")}),o(u,{level:"small",variant:"muted",children:[b,"\xB0"]})]}),o(l,{direction:"row",gap:"tight",align:"center",children:[e(r,{variant:a.OUTLINE,icon:W,display:"compact",onClick:j,tooltip:i("image.editor.rotateLeft")}),e(_,{value:[b],min:0,max:360,step:1,onValueChange:t=>v(t[0]??0),style:{flex:1}}),e(r,{variant:a.OUTLINE,icon:M,display:"compact",onClick:F,tooltip:i("image.editor.rotateRight")})]})]}),o(l,{direction:"row",gap:"tight",children:[e(r,{variant:a.OUTLINE,icon:me,display:"compact",onClick:Q,tooltip:i("image.editor.fitToView")}),e(r,{variant:a.OUTLINE,icon:ge,display:"compact",onClick:()=>Y(!R),tooltip:i(R?"image.editor.hideGrid":"image.editor.showGrid"),"data-active":R||void 0}),e(r,{variant:a.OUTLINE,icon:se,display:"compact",onClick:K,tooltip:i("image.editor.reset")})]}),o(l,{direction:"row",style:{marginTop:"var(--gap-md)"},children:[e(r,{variant:a.OUTLINE,onClick:()=>y(!1),fullWidth:!0,children:i("image.editor.cancel")}),e(r,{variant:a.PRIMARY,icon:ce,onClick:ee,disabled:G,fullWidth:!0,children:i(G?"image.editor.processing":"image.editor.apply")})]})]}):o(l,{children:[o(l,{direction:"row",gap:"tight",justify:"center",children:[e(r,{variant:a.OUTLINE,icon:W,display:"compact",onClick:j,tooltip:i("image.editor.rotateLeft")}),e(r,{variant:a.PRIMARY,onClick:()=>y(!0),disabled:N,children:i("image.editor.editButton")}),e(r,{variant:a.OUTLINE,icon:M,display:"compact",onClick:F,tooltip:i("image.editor.rotateRight")})]}),$?o(l,{style:{border:"1px solid var(--destructive)",padding:"var(--gap-md)",borderRadius:"var(--radius-md)"},children:[e(u,{variant:"destructive",level:"small",align:"center",children:i("image.editor.deleteConfirm")}),o(l,{direction:"row",gap:"tight",children:[e(r,{variant:a.OUTLINE,onClick:()=>k(!1),fullWidth:!0,children:i("image.editor.cancel")}),e(r,{variant:a.DESTRUCTIVE,onClick:te,fullWidth:!0,children:i("actions.delete")})]})]}):e(r,{variant:a.GHOST,icon:le,onClick:()=>k(!0),disabled:N,style:{color:"var(--destructive)"},children:i("image.editor.deleteImage")})]})]})})}var Pe=ke;export{ke as ImageViewerDialog,Pe as default};
@@ -14,7 +14,8 @@ export type { DisplayFieldRendererProps } from './DisplayFieldRenderer';
14
14
  export { default as FormLayout } from './FormLayout';
15
15
  export * from './controlled';
16
16
  export * from './form';
17
- export { EntityFilters, matchesFilter } from './EntityFilters';
17
+ export { EntityFilters } from './EntityFilters';
18
+ export { matchesFilter } from '../utils/matchesFilter';
18
19
  export type { EntityFiltersProps } from './EntityFilters';
19
20
  export * from './fields/display';
20
21
  export { DisplayThumbnail } from './DisplayThumbnail';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC3E,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC3E,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- import{default as r}from"./CrudButton";import{FormFieldRenderer as a}from"./FormFieldRenderer";import{DisplayFieldRenderer as e,formatValue as o}from"./DisplayFieldRenderer";import{default as t}from"./FormLayout";export*from"./controlled";export*from"./form";import{EntityFilters as m,matchesFilter as s}from"./EntityFilters";export*from"./fields/display";import{DisplayThumbnail as i}from"./DisplayThumbnail";import{CrudCard as l}from"./CrudCard";export{r as CrudButton,l as CrudCard,e as DisplayFieldRenderer,i as DisplayThumbnail,m as EntityFilters,a as FormFieldRenderer,t as FormLayout,o as formatValue,s as matchesFilter};
1
+ import{default as e}from"./CrudButton";import{FormFieldRenderer as m}from"./FormFieldRenderer";import{DisplayFieldRenderer as p,formatValue as a}from"./DisplayFieldRenderer";import{default as l}from"./FormLayout";export*from"./controlled";export*from"./form";import{EntityFilters as s}from"./EntityFilters";import{matchesFilter as n}from"../utils/matchesFilter";export*from"./fields/display";import{DisplayThumbnail as h}from"./DisplayThumbnail";import{CrudCard as R}from"./CrudCard";export{e as CrudButton,R as CrudCard,p as DisplayFieldRenderer,h as DisplayThumbnail,s as EntityFilters,m as FormFieldRenderer,l as FormLayout,a as formatValue,n as matchesFilter};
@@ -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 r}from"./FieldRegistry";const t=new Map;function l(e){const{type:i,components:n}=e;n&&r().registerComponent(i,n.controlled,n.uncontrolled),t.set(i,e)}function a(e){return t.get(e)}function o(e){return r().getFilterType(e)||t.get(e)?.filterType}function s(e){return r().getDisplayFormatter(e)||t.get(e)?.displayFormatter}function p(e){return r().isFilterable(e)?!0:t.get(e)?.filterable??!1}function u(e){return t.get(e)?.valueType}function c(){t.clear()}export{c as clearFieldTypeRegistry,s as getDisplayFormatter,a as getFieldTypeMetadata,o as getFilterType,u as getValueType,p as isFilterable,l as registerBuiltinFieldType};
1
+ "use client";import{getFieldRegistry as i}from"./FieldRegistry";const r=new Map;function s(e){const{type:t,components:n}=e;n&&i().registerComponent(t,n.controlled,n.uncontrolled),r.set(t,e)}function u(e){return r.get(e)}function c(e){const t=i().getFilterType(e);return t||r.get(e)?.filterType}function p(e){const t=i().getDisplayFormatter(e);return t||r.get(e)?.displayFormatter}function g(e){return i().isFilterable(e)?!0:r.get(e)?.filterable??!1}function a(e){return r.get(e)?.valueType}function f(){r.clear()}export{f as clearFieldTypeRegistry,p as getDisplayFormatter,u as getFieldTypeMetadata,c as getFilterType,a as getValueType,g as isFilterable,s as registerBuiltinFieldType};
@@ -1 +1 @@
1
- import{useEntityForm as t}from"./useEntityForm";import{useEntityField as o}from"./useEntityField";import{useController as r}from"./useController";export{r as useController,o as useEntityField,t as useEntityForm};
1
+ import{useEntityForm as e}from"./useEntityForm";import{useEntityField as m}from"./useEntityField";import{useController as i}from"./useController";export{i as useController,m as useEntityField,e as useEntityForm};
@@ -1 +1 @@
1
- "use client";import{useController as o}from"react-hook-form";function e(r){return o(r)}export{e as useController};
1
+ "use client";import{useController as e}from"react-hook-form";function t(r){return e(r)}export{t as useController};
@@ -6,22 +6,31 @@ import type { EntityFormReturn, InferEntityData, EntityFieldReturn } from '../ty
6
6
  * Useful when you need fine-grained control over field rendering,
7
7
  * such as custom components, conditional logic, or complex layouts.
8
8
  *
9
+ * Returns `{ field, meta, config, isEditable, isVisible, display }`.
10
+ * - `display(options?)` formats the current value using the registered field type formatter.
11
+ *
9
12
  * @template E - Entity type from defineEntity()
10
13
  * @template K - Field key from entity
11
14
  * @param form - Form instance from useEntityForm
12
15
  * @param fieldName - Name of the field to control
13
- * @returns Field state, config, and editability information
16
+ * @returns Field state, config, editability info, and display formatter
14
17
  *
15
18
  * @example
16
19
  * ```tsx
17
- * import { useEntityForm, useEntityField } from '@donotdev/crud/forms';
20
+ * // Custom field with display()
21
+ * const { field, display, isEditable } = useEntityField(form, 'price');
22
+ * // display() → "€42.00" (uses registered formatter)
23
+ * // display({ compact: true }) → compact format for lists
24
+ * if (!isEditable) return <span>{display()}</span>;
25
+ * ```
18
26
  *
27
+ * @example
28
+ * ```tsx
29
+ * // Full custom field
19
30
  * function CustomEmailField({ form }) {
20
31
  * const { field, meta, config, isEditable } = useEntityField(form, 'email');
21
32
  *
22
- * if (!isEditable) {
23
- * return <span>{field.value}</span>;
24
- * }
33
+ * if (!isEditable) return <span>{field.value}</span>;
25
34
  *
26
35
  * return (
27
36
  * <div>
@@ -38,28 +47,10 @@ import type { EntityFormReturn, InferEntityData, EntityFieldReturn } from '../ty
38
47
  * }
39
48
  * ```
40
49
  *
41
- * @example
42
- * ```tsx
43
- * // With conditional rendering
44
- * function ConditionalField({ form }) {
45
- * const typeField = useEntityField(form, 'type');
46
- * const lengthField = useEntityField(form, 'truckBedLength');
47
- *
48
- * return (
49
- * <>
50
- * <Select {...typeField.field} options={typeField.config.validation?.options} />
51
- * {typeField.field.value === 'truck' && lengthField.isVisible && (
52
- * <Input {...lengthField.field} label={lengthField.config.label} />
53
- * )}
54
- * </>
55
- * );
56
- * }
57
- * ```
58
- *
59
50
  * @see {@link useEntityForm} for creating the form instance
60
51
  * @see {@link EntityFieldReturn} for return type
61
52
  *
62
- * @version 0.0.1
53
+ * @version 0.0.2
63
54
  * @since 0.0.1
64
55
  * @author AMBROISE PARK Consulting
65
56
  */
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityField.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityField.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,gBAAgB,CAAC;AAI1D,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,wBAAgB,cAAc,CAC5B,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,MAAM,eAAe,CAAC,CAAC,CAAC,EAClC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CA0ElE"}
1
+ {"version":3,"file":"useEntityField.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityField.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,gBAAgB,CAAC;AAK1D,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAgB,cAAc,CAC5B,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,MAAM,eAAe,CAAC,CAAC,CAAC,EAClC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAkFlE"}
@@ -1 +1 @@
1
- "use client";import{useMemo as s}from"react";import{useController as y}from"./useController";import{isFieldEditable as p}from"../utils";function v(a,e){const{entity:m,operation:o,viewerRole:n,fields:d}=a,l=m.fields[e],i=s(()=>l?{...l,name:l.name||e,label:l.label||e}:{name:e,type:"text",label:e,visibility:"user"},[e,l]),r=s(()=>d.some(f=>f.name===e),[d,e]),b=s(()=>!r||o==="edit"&&i.visibility==="technical"&&i.editable===void 0?!1:p(i.editable,n,o),[r,o,i.visibility,i.editable,n]),{field:c,fieldState:t}=y({name:e,control:a.control}),u=s(()=>({error:t.error?.message,touched:t.isTouched,isDirty:t.isDirty}),[t.error?.message,t.isTouched,t.isDirty]);return{field:c,meta:u,config:i,isEditable:b,isVisible:r}}export{v as useEntityField};
1
+ "use client";import{useMemo as o,useCallback as p}from"react";import{useController as v}from"./useController";import{isFieldEditable as h}from"../utils";import{formatValue as D}from"../../components/DisplayFieldRenderer";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:h(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=>D(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":"AA8BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAW7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAsClB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAmgBrB"}
1
+ {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAW7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAsClB;;;;;;;;;;;;;;;;;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 +1 @@
1
- "use client";import{valibotResolver as W}from"@hookform/resolvers/valibot";import{useMemo as l,useEffect as P,useRef as d,useCallback as w,createElement as ce}from"react";import{useForm as le,useWatch as fe}from"react-hook-form";import{toast as de,ToastAction as me}from"@donotdev/components";import{useLocalStorage as pe,BACKEND_GENERATED_FIELD_NAMES as Se,createSchemas as ge}from"@donotdev/core";import{useFormStore as I,useFormStatus as he,useUploadProgress as be}from"../../stores";import{useUploadStore as q}from"../../stores/UploadStore";import{checkForBlobUrls as G}from"../../utils/uploadValidation";import{getFieldsForOperation as De}from"../utils";import{buildInitialFromRecord as Ve,buildSchemaDefaults as ve}from"../utils/buildInitialValues";const ye=a=>a;function H(a,F){const e={...a};for(const h of Object.keys(F)){const c=a[h],m=F[h];m!==null&&typeof m=="object"&&!Array.isArray(m)&&c!==null&&typeof c=="object"&&!Array.isArray(c)?e[h]=H(c,m):e[h]=m}return e}function je(a,F={}){const{formId:e,operation:h,defaultValues:c,viewerRole:m,mode:Y="onBlur",t:Q}=F,b=Q??ye,U=m??"guest",u=h??(c?"edit":"create"),X=he(e??""),Z=be(e??""),E=l(()=>ge(a),[a.name]),x=l(()=>W(E.create),[E.create]),B=l(()=>W(E.draft),[E.draft]),ee=l(()=>async(r,s,o)=>((r?.status??c?.status)==="draft"?B:x)(r,s,o),[x,B,c?.status]),R=l(()=>ve(a),[a]),j=c,i=l(()=>{if(u==="create")return R;if(j)return Ve(a,j)},[u,R,a,j]),n=le({defaultValues:u==="create"?i:void 0,mode:Y,resolver:ee,shouldUnregister:!1,shouldFocusError:!0}),T=d(n);P(()=>{T.current=n},[n]);const A=d(null);P(()=>{if(u==="edit"&&i){const r=i.id??null;r&&r!==A.current?(T.current.reset(i),A.current=r):!r&&A.current===null&&(T.current.reset(i),A.current="initialized")}},[u,i]);const k=c?.id,te=l(()=>{const r=`${a.name.toLowerCase()}-form-draft`;return u==="create"?r:k?`${r}-${k}`:`${r}-edit`},[a.name,u,k]),{value:V,setValue:C,removeValue:D}=pe(te,{defaultValue:null,syncAcrossTabs:!0}),v=d(!1);P(()=>{if(v.current)return;const r=s=>{const o=()=>{D(),s&&T.current.reset(s)};de({toastType:"info",title:b("draft.restored",{defaultValue:"Draft restored"}),description:b("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:ce(me,{altText:b("draft.discard",{defaultValue:"Discard"}),onClick:o},b("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(u==="create"&&!c){V&&(n.reset(V),r(R)),v.current=!0;return}if(u==="edit"&&i){if(V){const s=H(i,V);n.reset(s),r(i)}v.current=!0}},[u,c,V,n,i,D,b,R]);const p=fe({control:n.control}),M=d(!1),y=d(null),O=d(void 0),$=d(!0),L=d(p);P(()=>{if($.current){$.current=!1,O.current=p?JSON.stringify(p):void 0;return}if(M.current||!v.current)return;const r=p?JSON.stringify(p):void 0;if(O.current!==r)return O.current=r,L.current=p,y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{const s=L.current;if(!s)return;Object.values(s).some(t=>t!=null&&t!=="")&&C(s)},3e3),()=>{y.current&&clearTimeout(y.current)}},[p,C]);const J=w(async()=>{if(!e)return!0;const r=q.getState(),s=I.getState();if(!r.hasPendingUploads(e))return!0;try{s.setUploading(e,0),await r.uploadAll(e),await new Promise(g=>setTimeout(g,50));let o=n.getValues(),t=G(o),f=0;const S=5;for(;t.length>0&&f<S;)f++,await new Promise(g=>setTimeout(g,100)),o=n.getValues(),t=G(o);if(t.length>0){const g=`Upload incomplete: files still pending at ${t.join(", ")}`;return s.setError(e,g),!1}return!0}catch(o){const t=o instanceof Error?o.message:"File upload failed";return I.getState().setError(e,t),!1}},[e,n]),_=w(r=>u!=="create"?r:Object.fromEntries(Object.entries(r).filter(([s])=>!Se.includes(s))),[u]),z=w(r=>{if(typeof window>"u")return;const s=Object.keys(r).find(t=>t!=="root"&&r[t]);if(!s)return;const o=document.querySelector(`input[name="${s}"][aria-invalid="true"], textarea[name="${s}"][aria-invalid="true"], select[name="${s}"][aria-invalid="true"]`);o&&(o.scrollIntoView({behavior:"smooth",block:"center"}),o.focus())},[]),K=n.handleSubmit,re=l(()=>((r,s)=>async o=>{o?.preventDefault?.();const t=e?I.getState():null;e&&t&&t.startSubmit(e),M.current=!0;try{if(!await J()){e&&t&&t.setError(e,"Upload failed");return}e&&t&&t.setValidating(e),await K(async(S,g)=>{e&&t&&t.setSubmitting(e);const ue=_(S);try{await r(ue,g),D(),e&&t&&t.setSuccess(e)}catch(N){const ie=N instanceof Error?N.message:"Submission failed";throw e&&t&&t.setError(e,ie),N}},S=>{e&&t&&t.setError(e,"Validation failed"),z(S),s?.(S)})(o)}catch{if(e&&t){const f=t.getStatus(e);f!=="error"&&f!=="idle"&&f!=="success"&&t.reset(e)}}finally{M.current=!1}}),[K,e,J,_,z,u,D]),se=w(()=>{D(),n.reset(i),O.current=i?JSON.stringify(i):void 0,$.current=!0,v.current=!1},[D,n,i]),oe=w(()=>{e&&(I.getState().cleanup(e),q.getState().cleanup(e))},[e]),ne=l(()=>De(a,{operation:u,viewerRole:U,availableFields:void 0}),[a,u,U]),ae=n.formState.isSubmitted||Object.keys(n.formState.touchedFields||{}).length>0;return{...n,handleSubmit:re,fields:ne,operation:u,entity:a,t:b,viewerRole:U,formId:e,formStatus:e?X:"idle",uploadProgress:e?Z:0,cleanup:oe,isDirty:n.formState.isDirty,hasUserInteracted:ae,resetForm:se,originalValues:i}}export{je as useEntityForm};
1
+ "use client";import{valibotResolver as K}from"@hookform/resolvers/valibot";import{useMemo as l,useEffect as A,useRef as V,useCallback as v,createElement as ae}from"react";import{useForm as ne}from"react-hook-form";import{toast as ie,ToastAction as ue}from"@donotdev/components";import{useLocalStorage as ce,BACKEND_GENERATED_FIELD_NAMES as le,createSchemas as fe}from"@donotdev/core";import{useFormStore as P,useFormStatus as de,useUploadProgress as me}from"../../stores";import{useUploadStore as N}from"../../stores/UploadStore";import{checkForBlobUrls as q}from"../../utils/uploadValidation";import{getFieldsForOperation as pe}from"../utils";import{buildInitialFromRecord as Se,buildSchemaDefaults as ge}from"../utils/buildInitialValues";const he=n=>n;function z(n,E){const e={...n};for(const S of Object.keys(E)){const c=n[S],d=E[S];d!==null&&typeof d=="object"&&!Array.isArray(d)&&c!==null&&typeof c=="object"&&!Array.isArray(c)?e[S]=z(c,d):e[S]=d}return e}function Ae(n,E={}){const{formId:e,operation:S,defaultValues:c,viewerRole:d,mode:G="onBlur",t:H}=E,g=H??he,U=d??"guest",i=S??(c?"edit":"create"),W=de(e??""),Y=me(e??""),F=l(()=>fe(n),[n.name]),O=l(()=>K(F.create),[F.create]),$=l(()=>K(F.draft),[F.draft]),J=l(()=>async(r,s,a)=>((r?.status??c?.status)==="draft"?$:O)(r,s,a),[O,$,c?.status]),y=l(()=>ge(n),[n]),j=c,u=l(()=>{if(i==="create")return y;if(j)return Se(n,j)},[i,y,n,j]),o=ne({defaultValues:i==="create"?u:void 0,mode:G,resolver:J,shouldUnregister:!1,shouldFocusError:!0}),R=V(o);A(()=>{R.current=o},[o]);const T=V(null);A(()=>{if(i==="edit"&&u){const r=u.id??null;r&&r!==T.current?(R.current.reset(u),T.current=r):!r&&T.current===null&&(R.current.reset(u),T.current="initialized")}},[i,u]);const k=c?.id,Q=l(()=>{const r=`${n.name.toLowerCase()}-form-draft`;return i==="create"?r:k?`${r}-${k}`:`${r}-edit`},[n.name,i,k]),{value:b,setValue:x,removeValue:h}=ce(Q,{defaultValue:null,syncAcrossTabs:!0}),D=V(!1);A(()=>{if(D.current)return;const r=s=>{const a=()=>{h(),s&&R.current.reset(s)};ie({toastType:"info",title:g("draft.restored",{defaultValue:"Draft restored"}),description:g("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:ae(ue,{altText:g("draft.discard",{defaultValue:"Discard"}),onClick:a},g("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(i==="create"&&!c){b&&(o.reset(b),r(y)),D.current=!0;return}if(i==="edit"&&u){if(b){const s=z(u,b);o.reset(s),r(u)}D.current=!0}},[i,c,b,o,u,h,g,y]);const I=V(!1),w=V(null);A(()=>{const r=o.watch(s=>{I.current||!D.current||(w.current&&clearTimeout(w.current),w.current=setTimeout(()=>{if(!s)return;Object.values(s).some(t=>t!=null&&t!=="")&&x(s)},3e3))});return()=>{r.unsubscribe(),w.current&&clearTimeout(w.current)}},[o,x]);const B=v(async()=>{if(!e)return!0;const r=N.getState(),s=P.getState();if(!r.hasPendingUploads(e))return!0;try{s.setUploading(e,0),await r.uploadAll(e),await new Promise(p=>setTimeout(p,50));let a=o.getValues(),t=q(a),f=0;const m=5;for(;t.length>0&&f<m;)f++,await new Promise(p=>setTimeout(p,100)),a=o.getValues(),t=q(a);if(t.length>0){const p=`Upload incomplete: files still pending at ${t.join(", ")}`;return s.setError(e,p),!1}return!0}catch(a){const t=a instanceof Error?a.message:"File upload failed";return P.getState().setError(e,t),!1}},[e,o]),C=v(r=>i!=="create"?r:Object.fromEntries(Object.entries(r).filter(([s])=>!le.includes(s))),[i]),L=v(r=>{if(typeof window>"u")return;const s=Object.keys(r).find(t=>t!=="root"&&r[t]);if(!s)return;const a=document.querySelector(`input[name="${s}"][aria-invalid="true"], textarea[name="${s}"][aria-invalid="true"], select[name="${s}"][aria-invalid="true"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.focus())},[]),_=o.handleSubmit,X=l(()=>((r,s)=>async a=>{a?.preventDefault?.();const t=e?P.getState():null;e&&t&&t.startSubmit(e),I.current=!0;try{if(!await B()){e&&t&&t.setError(e,"Upload failed");return}e&&t&&t.setValidating(e),await _(async(m,p)=>{e&&t&&t.setSubmitting(e);const se=C(m);try{await r(se,p),h(),e&&t&&t.setSuccess(e)}catch(M){const oe=M instanceof Error?M.message:"Submission failed";throw e&&t&&t.setError(e,oe),M}},m=>{e&&t&&t.setError(e,"Validation failed"),L(m),s?.(m)})(a)}catch{if(e&&t){const f=t.getStatus(e);f!=="error"&&f!=="idle"&&f!=="success"&&t.reset(e)}}finally{I.current=!1}}),[_,e,B,C,L,i,h]),Z=v(()=>{h(),o.reset(u),D.current=!1},[h,o,u]),ee=v(()=>{e&&(P.getState().cleanup(e),N.getState().cleanup(e))},[e]),te=l(()=>pe(n,{operation:i,viewerRole:U,availableFields:void 0}),[n,i,U]),re=o.formState.isSubmitted||Object.keys(o.formState.touchedFields||{}).length>0;return{...o,handleSubmit:X,fields:te,operation:i,entity:n,t:g,viewerRole:U,formId:e,formStatus:e?W:"idle",uploadProgress:e?Y:0,cleanup:ee,isDirty:o.formState.isDirty,hasUserInteracted:re,resetForm:Z,originalValues:u}}export{Ae as useEntityForm};
@@ -1 +1 @@
1
- import{useEntityForm as a}from"./hooks/useEntityForm";import{useEntityField as t}from"./hooks/useEntityField";import{useController as e}from"./hooks/useController";import{isFieldEditable as s,getFieldsForOperation as i,validateEntity as l,translateFieldLabel as r,translateLabel as o}from"./utils";export{i as getFieldsForOperation,s as isFieldEditable,r as translateFieldLabel,o as translateLabel,e as useController,t as useEntityField,a as useEntityForm,l as validateEntity};
1
+ import{useEntityForm as r}from"./hooks/useEntityForm";import{useEntityField as l}from"./hooks/useEntityField";import{useController as a}from"./hooks/useController";import{isFieldEditable as s,getFieldsForOperation as d,validateEntity as F,translateFieldLabel as m,translateLabel as p}from"./utils";export{d as getFieldsForOperation,s as isFieldEditable,m as translateFieldLabel,p as translateLabel,a as useController,l as useEntityField,r as useEntityForm,F as validateEntity};
@@ -6,6 +6,7 @@
6
6
  * @since 0.0.1
7
7
  * @author AMBROISE PARK Consulting
8
8
  */
9
+ import type { ReactElement } from 'react';
9
10
  import type { Entity, EntityField, FieldType, FieldTypeToValue, Visibility, Editable, ValidationRules, dndevSchema } from '@donotdev/core';
10
11
  import type { FormStatus } from '../stores/FormStore';
11
12
  import type { RenderableField, ViewerRole } from './utils';
@@ -223,5 +224,17 @@ export interface EntityFieldReturn<E extends Entity, K extends keyof InferEntity
223
224
  * Whether field is visible (based on filtering).
224
225
  */
225
226
  isVisible: boolean;
227
+ /**
228
+ * Format the current field value for display using registered formatter.
229
+ * Returns the formatted value as string or ReactElement.
230
+ *
231
+ * @param options - Formatting options
232
+ * @param options.compact - Use compact formatting (smaller images, plain spans for empty)
233
+ * @param options.asString - Prefer string output when possible
234
+ */
235
+ display: (options?: {
236
+ compact?: boolean;
237
+ asString?: boolean;
238
+ }) => string | ReactElement;
226
239
  }
227
240
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildInitialValues.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/buildInitialValues.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAwD7B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAG7B"}
1
+ {"version":3,"file":"buildInitialValues.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/buildInitialValues.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AA2BhD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CA6D7B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAG7B"}
@@ -1 +1 @@
1
- function p(c,r){const o=r??{},e={...o};return Object.entries(c.fields).forEach(([n,t])=>{const i=e[n],l=!(n in o)||i===null||i===void 0;if(t.type==="switch"){if(i==null){const u=t.options?.fieldSpecific;e[n]=u?.uncheckedValue??!1}}else l&&(t.type==="price"?e[n]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:t.type==="checkbox"||t.type==="boolean"?e[n]=!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"?e[n]="":(t.type==="number"||t.type==="range"||t.type==="rating")&&(e[n]=void 0))}),e}function a(c){return p(c,{})}export{p as buildInitialFromRecord,a 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(e,r){const{operation:i,viewerRole:d,availableFields:l}=r,n=d??"guest",f=e&&typeof e=="object"&&"fields"in e&&"name"in e?e.fields:e,b=Object.entries(f),s=[];for(const[a,p]of b){const t=p,o=t.visibility||"guest";if(!u(o,n)||i==="create"&&o==="technical"||i==="edit"&&l&&!l.includes(a))continue;let c=m(t.editable,n,i);i==="edit"&&o==="technical"&&t.editable===void 0&&(c=!1),s.push({name:a,config:t,editable:c})}return s}export{g as getFieldsForOperation};
1
+ import{isFieldVisible as p}from"@donotdev/core";import{isFieldEditable as m}from"./isFieldEditable";function g(e,r){const{operation:i,viewerRole:d,availableFields:l}=r,n=d??"guest",a=e&&typeof e=="object"&&"fields"in e&&"name"in e?e.fields:e,u=Object.entries(a),s=[];for(const[c,b]of u){const o=b,t=o.visibility||"guest";if(!p(t,n)||i==="create"&&t==="technical"||i==="edit"&&l&&!l.includes(c))continue;let f=m(o.editable,n,i);i==="edit"&&t==="technical"&&o.editable===void 0&&(f=!1),s.push({name:c,config:o,editable:f})}return s}export{g as getFieldsForOperation};
@@ -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 i}from"@donotdev/core";function r(a,o,s){return a===void 0||a===!0?!0:a===!1?!1:a==="admin"?t(o,i.ADMIN):a==="create-only"?s==="create":!0}export{r as isFieldEditable};
1
+ import{hasRoleAccess as t,USER_ROLES as u}from"@donotdev/core";function i(r,e,n){return r===void 0||r===!0?!0:r===!1?!1:r==="admin"?t(e,u.ADMIN):r==="create-only"?n==="create":!0}export{i as isFieldEditable};
@@ -1 +1 @@
1
- function r(n,s){if(typeof n=="string"&&n.includes(":")){const a=n.split(":"),t=a[1]??n,i=a[0];if(t.startsWith("status.")){const l=s(t);return l!==t&&l!==`${i}:${t}`?l:s(t,{ns:i})}return s(t,{ns:i})}return s(n)}function e(n,s,a){const t=s?.label||n;return r(t,a)}export{e as translateFieldLabel,r as translateLabel};
1
+ function a(n,s){if(typeof n=="string"&&n.includes(":")){const r=n.split(":"),t=r[1]??n,e=r[0];if(t.startsWith("status.")){const i=s(t);return i!==t&&i!==`${e}:${t}`?i:s(t,{ns:e})}return s(t,{ns:e})}return s(n)}function o(n,s,r){const t=s?.label||n;return a(t,r)}export{o as translateFieldLabel,a as translateLabel};
@@ -1 +1 @@
1
- import*as o from"valibot";import{createSchemas as p}from"@donotdev/core";function i(t,r,c="create"){const e=p(t),u={create:e.create,draft:e.draft,update:e.update,full:e.get}[c],s=o.safeParse(u,r);return s.success?{success:!0,data:s.output}:{success:!1,issues:s.issues.map(a=>({path:a.path?.map(m=>m.key).join(".")||"",message:a.message}))}}export{i as validateEntity};
1
+ import*as o from"valibot";import{createSchemas as p}from"@donotdev/core";function h(a,c,r="create"){const s=p(a),u={create:s.create,draft:s.draft,update:s.update,full:s.get}[r],e=o.safeParse(u,c);return e.success?{success:!0,data:e.output}:{success:!1,issues:e.issues.map(t=>({path:t.path?.map(m=>m.key).join(".")||"",message:t.message}))}}export{h as validateEntity};
@@ -1 +1 @@
1
- import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";const c={};function u(r){const{collection:e}=r,i=s(t=>t.collections[e]?.ui?.filters??c),l=o(t=>{s.getState().setFilters(e,t)},[e]),n=s(t=>t.collections[e]?.ui?.showFavoritesOnly??!1),a=o(t=>{s.getState().setShowFavoritesOnly(e,t)},[e]);return{filters:i,setFilters:l,showFavoritesOnly:n,setShowFavoritesOnly:a}}export{u as useCrudFilters};
1
+ import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";const a={};function f(r){const{collection:e}=r,l=s(t=>t.collections[e]?.ui?.filters??a),i=o(t=>{s.getState().setFilters(e,t)},[e]),n=s(t=>t.collections[e]?.ui?.showFavoritesOnly??!1),c=o(t=>{s.getState().setShowFavoritesOnly(e,t)},[e]);return{filters:l,setFilters:i,showFavoritesOnly:n,setShowFavoritesOnly:c}}export{f as useCrudFilters};
@@ -1 +1 @@
1
- import{useCallback as o}from"react";import{useLocalStorage as p}from"@donotdev/core";function y(s={}){const{storageKey:l,collection:u="entities"}=s,d=l||`favorites-${u}`,{value:i,setValue:a,isLoaded:c}=p(d,{defaultValue:[]}),n=o(e=>i.includes(e),[i]),v=o(e=>{a(t=>t.includes(e)?t.filter(r=>r!==e):[...t,e])},[a]),f=o(e=>{a(t=>t.includes(e)?t:[...t,e])},[a]),F=o(e=>{a(t=>t.filter(r=>r!==e))},[a]),m=o(()=>{a([])},[a]),g=o(e=>i.includes(e.id),[i]);return{favorites:i,isFavorite:n,toggleFavorite:v,addFavorite:f,removeFavorite:F,clearFavorites:m,favoritesFilter:g,isLoaded:c}}export{y as useEntityFavorites};
1
+ import{useCallback as r}from"react";import{useLocalStorage as y}from"@donotdev/core";function V(n={}){const{storageKey:a,collection:c="entities"}=n,u=a||`favorites-${c}`,{value:s,setValue:o,isLoaded:l}=y(u,{defaultValue:[]}),f=r(t=>s.includes(t),[s]),v=r(t=>{o(e=>e.includes(t)?e.filter(i=>i!==t):[...e,t])},[o]),F=r(t=>{o(e=>e.includes(t)?e:[...e,t])},[o]),d=r(t=>{o(e=>e.filter(i=>i!==t))},[o]),m=r(()=>{o([])},[o]),g=r(t=>s.includes(t.id),[s]);return{favorites:s,isFavorite:f,toggleFavorite:v,addFavorite:F,removeFavorite:d,clearFavorites:m,favoritesFilter:g,isLoaded:l}}export{V as useEntityFavorites};
@@ -1 +1 @@
1
- {"version":3,"file":"useFileUpload.d.ts","sourceRoot":"","sources":["../../src/hooks/useFileUpload.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAK9C,8CAA8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,IAAI,EAAE,IAAI,CAAC;IACX,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uCAAuC;IACvC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,qCAAqC;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,oCAAoC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACtD,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CACT,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KACnC,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AA4DD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,QAAa,EACb,OAA0B,EAC1B,MAAW,EACX,WAAuB,EACvB,QAAQ,GACT,EAAE,oBAAoB;IA+anB,yCAAyC;;IAEzC,4CAA4C;yBAvGjC,IAAI,EAAE;IAyGjB,0BAA0B;qBAhCrB,MAAM;IAkCX,2CAA2C;;IAE3C,oCAAoC;;IAEpC,6BAA6B;;IAE7B,qDAAqD;;IAErD,sFAAsF;;EAGzF"}
1
+ {"version":3,"file":"useFileUpload.d.ts","sourceRoot":"","sources":["../../src/hooks/useFileUpload.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAK9C,8CAA8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,IAAI,EAAE,IAAI,CAAC;IACX,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uCAAuC;IACvC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,qCAAqC;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,oCAAoC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACtD,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CACT,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KACnC,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AA4DD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,QAAa,EACb,OAA0B,EAC1B,MAAW,EACX,WAAuB,EACvB,QAAQ,GACT,EAAE,oBAAoB;IAibnB,yCAAyC;;IAEzC,4CAA4C;yBAvGjC,IAAI,EAAE;IAyGjB,0BAA0B;qBAhCrB,MAAM;IAkCX,2CAA2C;;IAE3C,oCAAoC;;IAEpC,6BAA6B;;IAE7B,qDAAqD;;IAErD,sFAAsF;;EAGzF"}
@@ -1 +1 @@
1
- "use client";import{useState as T,useCallback as v,useEffect as A,useRef as g,startTransition as q}from"react";import{handleError as C}from"@donotdev/core";import{useUploadContext as G}from"../contexts/UploadContext";import{useUploadStore as N}from"../stores/UploadStore";let P=0;function W(s){if(s){const u=s.split("/").pop()?.split("?")[0];if(u)return`file-${u}`}P+=1;const a=typeof performance<"u"?performance.now():Date.now(),p=Math.random().toString(36).slice(2,11);return`file-${P}-${a}-${p}`}function H(s){return URL.createObjectURL(s)}function k(s){s.startsWith("blob:")&&URL.revokeObjectURL(s)}function K(s,a,p){return a.length>0&&!a.some(u=>{if(u.endsWith("/*")){const U=u.slice(0,-2);return s.type.startsWith(U)}return s.type===u})?{valid:!1,error:`File type ${s.type} not accepted`}:s.size>p?{valid:!1,error:`File exceeds ${(p/1048576).toFixed(0)}MB limit`}:{valid:!0}}function Q({name:s,value:a,onChange:p,multiple:u=!1,maxFiles:U=10,maxSize:E=10*1024*1024,accept:b=[],storagePath:V="uploads",uploadFn:y}){const h=G(),w=!!h,[d,c]=T([]),R=g(!1),$=g(null),x=g(a),L=g([]),F=g(!1),M=g(null);A(()=>{if(R.current){R.current=!1;return}const l=a?JSON.stringify((Array.isArray(a)?a:[a]).map(n=>n.fullUrl).filter(Boolean)):null;l!==$.current&&($.current=l,x.current=a,q(()=>{if(a){const n=(Array.isArray(a)?a:[a]).filter(t=>t.fullUrl).map((t,r)=>({id:`${W(t.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:t.thumbUrl||t.fullUrl,progress:100,uploaded:t,error:null}));c(n)}else c([])}))},[a]),A(()=>{L.current=d},[d]),A(()=>{F.current&&(F.current=!1,M.current?.(d,!0))},[d]),A(()=>()=>{L.current.forEach(l=>k(l.previewURL))},[]);const f=v((l,n=!1)=>{const t=(n?l.filter(i=>!i.error):l.filter(i=>i.uploaded&&!i.error)).map(i=>i.uploaded?i.uploaded:n&&w?{fullUrl:i.previewURL,thumbUrl:i.previewURL}:null).filter(i=>i!==null);let r;u?r=t.length>0?t:null:r=t[0]||null;const e=x.current;(()=>{if(!r&&!e)return!1;if(!r||!e)return!0;if(u&&Array.isArray(r)&&Array.isArray(e)){if(r.length!==e.length)return!0;const i=r.map(m=>m.fullUrl).join(","),o=e.map(m=>m.fullUrl).join(",");return i!==o}return!u&&!Array.isArray(r)&&!Array.isArray(e)?r.fullUrl!==e.fullUrl:!0})()&&(R.current=!0,x.current=r,p(r))},[u,p,w]);M.current=f;const S=v(async()=>{if(!y)return;let l=[];if(c(t=>(l=t.filter(r=>!r.uploaded&&!r.error),l.length===0?t:t.map(r=>l.some(e=>e.id===r.id)?{...r,progress:0}:r))),l.length===0)return;const n=await Promise.allSettled(l.map(async t=>{try{const r=await y(t.file,e=>{c(i=>i.map(o=>o.id===t.id?{...o,progress:e}:o))});return{id:t.id,picture:r,error:null}}catch(r){const e=r instanceof Error?r.message:"Upload failed";return{id:t.id,picture:null,error:e}}}));c(t=>{const r=t.map(e=>{const i=n.find(o=>o.status==="fulfilled"&&o.value.id===e.id);if(i&&i.status==="fulfilled"){const o=i.value;return{...e,uploaded:o.picture,progress:o.picture?100:null,error:o.error}}return e});return f(r,!1),r})},[y,f]),j=g(S);j.current=S,A(()=>{if(!(!h||!s))return N.getState().registerUpload(h,s,async()=>{await j.current()},()=>L.current.some(l=>!l.uploaded&&!l.error)),()=>{N.getState().unregisterUpload(h,s)}},[h,s]);const O=v(async l=>{if(y){c(n=>n.map(t=>t.id===l.id?{...t,progress:0}:t));try{const n=await y(l.file,t=>{c(r=>r.map(e=>e.id===l.id?{...e,progress:t}:e))});c(t=>{const r=t.map(e=>e.id===l.id?{...e,uploaded:n,progress:100,error:null}:e);return f(r,!1),r})}catch(n){const t=n instanceof Error?n.message:"Upload failed";c(r=>r.map(e=>e.id===l.id?{...e,error:t,progress:null}:e))}}},[y,f]),z=v(l=>{c(n=>{const t=(u?U:1)-n.length;if(t<=0)return C(new Error("Maximum files reached"),{userMessage:u?`Maximum ${U} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),n;const r=l.slice(0,t),e=[];for(const o of r){const m=K(o,b,E);if(!m.valid){C(new Error(m.error),{userMessage:m.error,severity:"warning",showNotification:!0});continue}e.push({id:W(),file:o,previewURL:H(o),progress:null,uploaded:null,error:null})}if(e.length===0)return n;const i=u?[...n,...e]:e;return w?F.current=!0:e.forEach(o=>O(o)),i})},[u,U,b,E,w,O,f]),B=v(l=>{c(n=>{const t=n.find(e=>e.id===l);t&&k(t.previewURL);const r=n.filter(e=>e.id!==l);return f(r,!1),r})},[f]),D=d.some(l=>!l.uploaded&&!l.error),I=d.some(l=>l.progress!==null&&l.progress<100),J=d.length>0?d.reduce((l,n)=>l+(n.progress??0),0)/d.length:0;return{files:d,addFiles:z,removeFile:B,hasPending:D,isUploading:I,progress:J,formId:h,isDeferred:w}}export{Q as useFileUpload};
1
+ "use client";import{useState as G,useCallback as A,useEffect as L,useRef as U,startTransition as H}from"react";import{handleError as k}from"@donotdev/core";import{useUploadContext as K}from"../contexts/UploadContext";import{useUploadStore as B}from"../stores/UploadStore";let D=0;function M(l){if(l){const a=l.split("/").pop()?.split("?")[0];if(a)return`file-${a}`}D+=1;const u=typeof performance<"u"?performance.now():Date.now(),g=Math.random().toString(36).slice(2,11);return`file-${D}-${u}-${g}`}function Q(l){return URL.createObjectURL(l)}function T(l){l.startsWith("blob:")&&URL.revokeObjectURL(l)}function X(l,u,g){return u.length>0&&!u.some(m=>{if(m.endsWith("/*")){const E=m.slice(0,-2);return l.type.startsWith(E)}return l.type===m})?{valid:!1,error:`File type ${l.type} not accepted`}:l.size>g?{valid:!1,error:`File exceeds ${(g/1048576).toFixed(0)}MB limit`}:{valid:!0}}function er({name:l,value:u,onChange:g,multiple:a=!1,maxFiles:m=10,maxSize:E=10*1024*1024,accept:P=[],storagePath:Y="uploads",uploadFn:h}){const w=K(),y=!!w,[f,d]=G([]),v=U(!1),S=U(null),F=U(u),$=U([]),b=U(!1),C=U(null);L(()=>{if(v.current){v.current=!1;return}const t=u?JSON.stringify((Array.isArray(u)?u:[u]).map(s=>s.fullUrl).filter(Boolean)):null;t!==S.current&&(S.current=t,F.current=u,H(()=>{if(u){const n=(Array.isArray(u)?u:[u]).filter(e=>e.fullUrl).map((e,r)=>({id:`${M(e.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:e.thumbUrl||e.fullUrl,progress:100,uploaded:e,error:null}));d(n)}else d([])}))},[u]),L(()=>{$.current=f},[f]),L(()=>{b.current&&(b.current=!1,C.current?.(f,!0))},[f]),L(()=>()=>{$.current.forEach(t=>T(t.previewURL))},[]);const p=A((t,s=!1)=>{const e=(s?t.filter(o=>!o.error):t.filter(o=>o.uploaded&&!o.error)).map(o=>o.uploaded?o.uploaded:s&&y?{fullUrl:o.previewURL,thumbUrl:o.previewURL}:null).filter(o=>o!==null);let r;a?r=e.length>0?e:null:r=e[0]||null;const i=F.current;(()=>{if(!r&&!i)return!1;if(!r||!i)return!0;if(a&&Array.isArray(r)&&Array.isArray(i)){if(r.length!==i.length)return!0;const o=r.map(x=>x.fullUrl).join(","),R=i.map(x=>x.fullUrl).join(",");return o!==R}return!a&&!Array.isArray(r)&&!Array.isArray(i)?r.fullUrl!==i.fullUrl:!0})()&&(v.current=!0,F.current=r,g(r))},[a,g,y]);C.current=p;const I=A(async()=>{if(!h)return;let t=[];if(d(n=>(t=n.filter(e=>!e.uploaded&&!e.error),t.length===0?n:n.map(e=>t.some(r=>r.id===e.id)?{...e,progress:0}:e))),t.length===0)return;const s=await Promise.allSettled(t.map(async n=>{try{const e=await h(n.file,r=>{d(i=>i.map(c=>c.id===n.id?{...c,progress:r}:c))});return{id:n.id,picture:e,error:null}}catch(e){const r=e instanceof Error?e.message:"Upload failed";return{id:n.id,picture:null,error:r}}}));d(n=>{const e=n.map(r=>{const i=s.find(c=>c.status==="fulfilled"&&c.value.id===r.id);if(i&&i.status==="fulfilled"){const c=i.value;return{...r,uploaded:c.picture,progress:c.picture?100:null,error:c.error}}return r});return p(e,!1),e})},[h,p]),N=U(I);N.current=I,L(()=>{if(!(!w||!l))return B.getState().registerUpload(w,l,async()=>{await N.current()},()=>$.current.some(t=>!t.uploaded&&!t.error)),()=>{B.getState().unregisterUpload(w,l)}},[w,l]);const j=A(async t=>{if(h){d(s=>s.map(n=>n.id===t.id?{...n,progress:0}:n));try{const s=await h(t.file,n=>{d(e=>e.map(r=>r.id===t.id?{...r,progress:n}:r))});d(n=>{const e=n.map(r=>r.id===t.id?{...r,uploaded:s,progress:100,error:null}:r);return p(e,!1),e})}catch(s){const n=s instanceof Error?s.message:"Upload failed";d(e=>e.map(r=>r.id===t.id?{...r,error:n,progress:null}:r))}}},[h,p]),V=A(t=>{d(s=>{const e=(a?m:1)-s.length;if(e<=0)return k(new Error("Maximum files reached"),{userMessage:a?`Maximum ${m} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),s;const r=t.slice(0,e),i=[];for(const o of r){const R=X(o,P,E);if(!R.valid){k(new Error(R.error),{userMessage:R.error,severity:"warning",showNotification:!0});continue}i.push({id:M(),file:o,previewURL:Q(o),progress:null,uploaded:null,error:null})}if(i.length===0)return s;const c=a?[...s,...i]:i;return y?b.current=!0:i.forEach(o=>j(o)),c})},[a,m,P,E,y,j,p]),O=A(t=>{d(s=>{const n=s.find(r=>r.id===t);n&&T(n.previewURL);const e=s.filter(r=>r.id!==t);return p(e,!1),e})},[p]),W=f.some(t=>!t.uploaded&&!t.error),J=f.some(t=>t.progress!==null&&t.progress<100),q=f.length>0?f.reduce((t,s)=>t+(s.progress??0),0)/f.length:0;return{files:f,addFiles:V,removeFile:O,hasPending:W,isUploading:J,progress:q,formId:w,isDeferred:y}}export{er as useFileUpload};
@@ -1 +1 @@
1
- "use client";import{useMemo as p}from"react";function N(o,e,t,n,h={}){const{limit:a=3,tolerance:m=.2}=h,c=p(()=>{if(!e||!t||t.length===0||n.length===0)return[];const b=e.id;return t.filter(f=>f.id===b?!1:n.some(s=>{const r=o.fields[s];if(!r)return!1;const i=e[s],u=f[s];if(i==null||u==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const l=Number(i),g=Number(u);if(isNaN(l)||isNaN(g))return!1;const d=Math.abs(l*m);return Math.abs(g-l)<=d}return String(i)===String(u)})).slice(0,a)},[e,t,n,o.fields,a,m]);return{items:c,hasItems:c.length>0}}export{N as useRelatedItems};
1
+ "use client";import{useMemo as N}from"react";function y(f,e,n,t,p={}){const{limit:l=3,tolerance:a=.2}=p,c=N(()=>{if(!e||!n||n.length===0||t.length===0)return[];const h=e.id;return n.filter(g=>g.id===h?!1:t.some(s=>{const r=f.fields[s];if(!r)return!1;const u=e[s],i=g[s];if(u==null||i==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const o=Number(u),b=Number(i);if(isNaN(o)||isNaN(b))return!1;const m=Math.abs(o*a);return Math.abs(b-o)<=m}return String(u)===String(i)})).slice(0,l)},[e,n,t,f.fields,l,a]);return{items:c,hasItems:c.length>0}}export{y as useRelatedItems};
package/dist/index.d.ts CHANGED
@@ -28,4 +28,8 @@ export type { UploadProviderProps } from './contexts';
28
28
  export { useFileUpload, useUnsavedChangesWarning, useEntityFavorites, useRelatedItems, useCrudFilters, } from './hooks';
29
29
  export type { FileMetadata, UseFileUploadOptions, UseEntityFavoritesOptions, UseEntityFavoritesReturn, UseRelatedItemsOptions, UseRelatedItemsReturn, UseCrudFiltersOptions, UseCrudFiltersReturn, } from './hooks';
30
30
  export { isStorageUrl, validatePicture, checkForBlobUrls, hasBlobUrls, } from './utils/uploadValidation';
31
+ export { formatValue } from './components/DisplayFieldRenderer';
32
+ export { matchesFilter } from './utils/matchesFilter';
33
+ export { applyFilters, applySearch, applySort, getSearchableFields, } from './utils/clientListProcessing';
34
+ export type { ClientSortConfig } from './utils/clientListProcessing';
31
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAGH,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,cAAc,CAAC;AAG7B,cAAc,UAAU,CAAC;AAIzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAI/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,YAAY,EACV,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,iBAAiB,GAClB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9D,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAEL,aAAa,EACb,cAAc,EACd,aAAa,EAEb,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,UAAU,EACV,eAAe,EACf,4BAA4B,EAC5B,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAGH,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,cAAc,CAAC;AAG7B,cAAc,UAAU,CAAC;AAIzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAI/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,YAAY,EACV,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,iBAAiB,GAClB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9D,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAEL,aAAa,EACb,cAAc,EACd,aAAa,EAEb,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,UAAU,EACV,eAAe,EACf,4BAA4B,EAC5B,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,SAAS,EACT,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC"}
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 a}from"./adapters/FunctionsAdapter";import{getCrudService as d}from"./CrudService";import{useCrudStore as n}from"./CrudStore";import{OPTIMISTIC_STATUSES as u,CRUD_OPERATION as x}from"./types";import{loadDeterministicRange as g,upsertDeterministic as y,appendToCollection as T}from"./utils/collections";import{getFieldRegistry as C,registerFieldType as U,isFieldTypeRegistered as E}from"./FieldRegistry";import{registerBuiltinFieldType as S,getFieldTypeMetadata as b,getFilterType as v,getDisplayFormatter as I,isFilterable as B,getValueType as D,clearFieldTypeRegistry as O}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as h}from"./builtinFieldTypes";import{useEntityForm as L,useEntityField as M,useController as _,isFieldEditable as k,getFieldsForOperation as N,validateEntity as V,translateFieldLabel as W,translateLabel as j}from"./forms";import{UploadProvider as w,useUploadContext as z}from"./contexts";import{useFileUpload as H,useUnsavedChangesWarning as J,useEntityFavorites as K,useRelatedItems as Q,useCrudFilters as X}from"./hooks";import{isStorageUrl as Z,validatePicture as $,checkForBlobUrls as ee,hasBlobUrls as re}from"./utils/uploadValidation";export{x as CRUD_OPERATION,a as FunctionsAdapter,u as OPTIMISTIC_STATUSES,w as UploadProvider,T as appendToCollection,ee as checkForBlobUrls,O as clearFieldTypeRegistry,d as getCrudService,I as getDisplayFormatter,C as getFieldRegistry,b as getFieldTypeMetadata,N as getFieldsForOperation,v as getFilterType,D as getValueType,re as hasBlobUrls,k as isFieldEditable,E as isFieldTypeRegistered,B as isFilterable,Z as isStorageUrl,g as loadDeterministicRange,S as registerBuiltinFieldType,h as registerBuiltinFieldTypes,U as registerFieldType,W as translateFieldLabel,j as translateLabel,y as upsertDeterministic,_ as useController,X as useCrudFilters,n as useCrudStore,K as useEntityFavorites,M as useEntityField,L as useEntityForm,H as useFileUpload,Q as useRelatedItems,J as useUnsavedChangesWarning,z as useUploadContext,V as validateEntity,$ as validatePicture};
1
+ export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{FunctionsAdapter as p}from"./adapters/FunctionsAdapter";import{getCrudService as d}from"./CrudService";import{useCrudStore as F}from"./CrudStore";import{OPTIMISTIC_STATUSES as f,CRUD_OPERATION as x}from"./types";import{loadDeterministicRange as g,upsertDeterministic as y,appendToCollection as T}from"./utils/collections";import{getFieldRegistry as S,registerFieldType as C,isFieldTypeRegistered as U}from"./FieldRegistry";import{registerBuiltinFieldType as E,getFieldTypeMetadata as R,getFilterType as h,getDisplayFormatter as v,isFilterable as I,getValueType as B,clearFieldTypeRegistry as D}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as P}from"./builtinFieldTypes";import{useEntityForm as L,useEntityField as M,useController as V,isFieldEditable as _,getFieldsForOperation as k,validateEntity as N,translateFieldLabel as W,translateLabel as j}from"./forms";import{UploadProvider as w,useUploadContext as z}from"./contexts";import{useFileUpload as H,useUnsavedChangesWarning as J,useEntityFavorites as K,useRelatedItems as Q,useCrudFilters as X}from"./hooks";import{isStorageUrl as Z,validatePicture as $,checkForBlobUrls as ee,hasBlobUrls as re}from"./utils/uploadValidation";import{formatValue as oe}from"./components/DisplayFieldRenderer";import{matchesFilter as le}from"./utils/matchesFilter";import{applyFilters as pe,applySearch as se,applySort as de,getSearchableFields as me}from"./utils/clientListProcessing";export{x as CRUD_OPERATION,p as FunctionsAdapter,f as OPTIMISTIC_STATUSES,w as UploadProvider,T as appendToCollection,pe as applyFilters,se as applySearch,de as applySort,ee as checkForBlobUrls,D as clearFieldTypeRegistry,oe as formatValue,d as getCrudService,v as getDisplayFormatter,S as getFieldRegistry,R as getFieldTypeMetadata,k as getFieldsForOperation,h as getFilterType,me as getSearchableFields,B as getValueType,re as hasBlobUrls,_ as isFieldEditable,U as isFieldTypeRegistered,I as isFilterable,Z as isStorageUrl,g as loadDeterministicRange,le as matchesFilter,E as registerBuiltinFieldType,P as registerBuiltinFieldTypes,C as registerFieldType,W as translateFieldLabel,j as translateLabel,y as upsertDeterministic,V as useController,X as useCrudFilters,F as useCrudStore,K as useEntityFavorites,M as useEntityField,L as useEntityForm,H as useFileUpload,Q as useRelatedItems,J as useUnsavedChangesWarning,z as useUploadContext,N as validateEntity,$ as validatePicture};
@@ -1 +1 @@
1
- {"version":3,"file":"registerBuiltinFieldTypes.d.ts","sourceRoot":"","sources":["../src/registerBuiltinFieldTypes.tsx"],"names":[],"mappings":"AA43BA;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CA+sBnD"}
1
+ {"version":3,"file":"registerBuiltinFieldTypes.d.ts","sourceRoot":"","sources":["../src/registerBuiltinFieldTypes.tsx"],"names":[],"mappings":"AAq5BA;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CA0tBnD"}
@@ -1 +1 @@
1
- "use client";import{jsx as s,jsxs as u}from"react/jsx-runtime";import{Text as m,Stack as g,ImageGallery as $,Rating as I,CopyToClipboard as k}from"@donotdev/components";import{formatCurrency as F,maybeTranslate as N}from"@donotdev/core";import{ControlledCheckboxField as A,ControlledComboboxField as M,ControlledDateField as v,ControlledDropdownField as P,ControlledFileField as R,ControlledMultiFileField as B,ControlledDocumentField as _,ControlledMultiDocumentField as E,ControlledGeoPointField as U,ControlledImageField as H,ControlledMapField as K,ControlledMultiDropdownField as Y,ControlledMultiInputField as G,ControlledNumberField as O,ControlledPasswordField as W,ControlledPhoneField as q,ControlledRangeField as J,ControlledRatingField as Q,ControlledDurationField as X,ControlledRadioField as Z,ControlledYearField as ee,ControlledTextField as y,ControlledTextareaField as te,ControlledRichTextField as re,ControlledTimestampField as oe,ControlledAddressField as ne,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 D,HiddenFieldComponent as ue,TextAreaComponent as ye,RichTextComponent as me,TextFieldComponent as T}from"./components/form/fields";import{registerBuiltinFieldType as i}from"./fieldTypeRegistry";import{translateLabel as b}from"./forms/utils";import{sanitizeHtml as fe}from"./utils/sanitizeHtml";function d(e){return e?s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s(m,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,n,o,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,n,o,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,n,o,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,n,o,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,n,o,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},month:(e,n,o,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},boolean:(e,n,o)=>e?"Yes":"No",checkbox:(e,n,o)=>e?"Yes":"No",switch:(e,n,o)=>{const t=n.options?.fieldSpecific;if(t){const r=t.uncheckedValue??!1,l=t.checkedValue??!0;if(e===l&&t.checkedLabel)return b(t.checkedLabel,o);if(e===r&&t.uncheckedLabel)return b(t.uncheckedLabel,o)}return e?"Yes":"No"},year:(e,n,o)=>String(e),number:(e,n,o)=>{if(e==null||e==="")return"\u2014";const t=n.options?.unit??"",r=N(o,n.options?.suffix);return[(typeof e=="number"?e.toLocaleString():String(e))+t,r].filter(Boolean).join(" ")},currency:(e,n,o)=>{if(e==null||isNaN(e))return"";const t=(n.options||{}).fieldSpecific?.currency||"EUR";return F(e,t)},price:(e,n,o,t)=>{const r=t?.compact??!1,l=t?.asString??!1,a=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(a==null||typeof a!="object")return d(r);const p=a.amount;if(p==null||isNaN(p))return d(r);const h=a.currency||"EUR",x=a.vatIncluded??!0,f=a.discountPercent??0,S=f>0?p*(1-f/100):p,C=x?` ${o("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(f>0){const L=F(p,h),w=F(S,h),j=` ${o("crud:price.discountPercent",{percent:Math.round(f),defaultValue:"-{{percent}}%"})}`;return l?`${w}${C}${j}`:r?u(m,{variant:"success",weight:"bold",children:[w,C,j]}):u(g,{direction:"column",gap:"tight",align:"end",children:[s(m,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:L}),u(m,{variant:"success",weight:"bold",children:[w,C]})]})}return`${F(p,h)}${C}`},range:(e,n,o)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,n,o,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const l=typeof e=="number"?e:parseFloat(e);if(isNaN(l))return d(r);const a=n.validation?.max??5;return s(I,{value:l,max:a,readonly:!0,"aria-label":`${l} out of ${a} stars`})},duration:(e,n,o,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const l=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(l))return d(r);if(l===0)return o("crud:duration.zero",{defaultValue:"\u2014"});if(l<60)return o("crud:duration.minutes",{count:l,defaultValue:`${l} min`});const a=Math.floor(l/60),p=l%60;return o("crud:duration.hoursMinutes",{hours:a,minutes:p,defaultValue:p===0?`${a}h`:`${a}h ${p}min`})},gdprConsent:(e,n,o,t)=>{const r=t?.compact??!1;if(!e||typeof e!="object")return d(r);const l=e.gdprConsent===!0,a=e.gdprConsentDate,p=e.gdprConsentVersion,h=o("crud:gdprConsent.display.yes",{defaultValue:"Consented"}),x=o("crud:gdprConsent.display.no",{defaultValue:"Not consented"});if(!l)return x;const f=[h];if(a)try{const S=new Date(a);f.push(S.toLocaleDateString())}catch{f.push(a)}return p&&f.push(`v${p}`),f.join(" \xB7 ")},select:(e,n,o)=>{const t=n.validation?.options;if(Array.isArray(t)){const r=t.find(l=>l.value===e)?.label;return r?b(r,o):String(e)}return String(e)},radio:(e,n,o)=>{const t=n.validation?.options;if(Array.isArray(t)){const r=t.find(l=>l.value===e)?.label;return r?b(r,o):String(e)}return String(e)},combobox:(e,n,o)=>{const t=n.validation?.options;if(Array.isArray(t)){const r=t.find(l=>l.value===e)?.label;return r?b(r,o):String(e)}return String(e)},multiselect:(e,n,o)=>{if(Array.isArray(e)){const t=n.validation?.options;if(Array.isArray(t))return e.map(r=>{const l=t.find(a=>a.value===r)?.label;return l?b(l,o):r}).join(", ")}return String(e)},image:(e,n,o,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):typeof e=="string"?s("img",{src:e,alt:n.label||"",style:{width:r?"40px":void 0,height:r?"40px":void 0,maxWidth:r?void 0:"200px",maxHeight:r?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):d(r)},images:(e,n,o,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const l=e[0],a=typeof l=="object"&&l.thumbUrl?l.thumbUrl:l;return r?u("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[s("img",{src:a,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&u("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):s($,{images:e,altPrefix:n.label||"Image"})},files:(e,n,o,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):s(g,{gap:"tight",children:e.map((l,a)=>u("a",{href:l.url||l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[l.filename||`File ${a+1}`,l.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(l.size/1024)," KB)"]})]},a))})},documents:(e,n,o,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):s(g,{gap:"tight",children:e.map((l,a)=>u("a",{href:l.url||l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[l.filename||`File ${a+1}`,l.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(l.size/1024)," KB)"]})]},a))})},file:(e,n,o,t)=>{const r=t?.compact??!1;if(!e)return d(r);const l=typeof e=="string"?e:e.url,a=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[a,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,n,o,t)=>{const r=t?.compact??!1;if(!e)return d(r);const l=typeof e=="string"?e:e.url,a=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[a,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,n,o,t)=>{const r=t?.compact??!1;if(!e)return d(r);if(typeof e=="object"&&e!==null){const l=e.displayName||e.name||e.id||String(e);return String(l)}return String(e)},geopoint:(e,n,o,t)=>{const r=t?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:d(r)},address:(e,n,o)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,n,o,t)=>{const r=t?.compact??!1;if(e&&typeof e=="object"){const l=Object.entries(e);return l.length===0?d(r):u(g,{direction:"column",gap:"tight",children:[l.slice(0,5).map(([a,p])=>u(m,{style:{fontSize:"var(--font-size-sm)"},children:[u("strong",{children:[a,":"]})," ",String(p)]},a)),l.length>5&&u(m,{variant:"muted",children:["+",l.length-5," more"]})]})}return d(r)},array:(e,n,o,t)=>{const r=t?.compact??!1;return Array.isArray(e)?e.length===0?d(r):e.join(", "):d(r)},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,n,o)=>u(g,{direction:"row",gap:"tight",align:"center",children:[s("a",{href:`mailto:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),s(k,{text:e,tooltipText:o("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:o("crud:actions.copyEmail",{defaultValue:"Copy email"}),onClick:t=>t.stopPropagation()})]}),tel:(e,n,o)=>u(g,{direction:"row",gap:"tight",align:"center",children:[s("a",{href:`tel:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),s(k,{text:e,tooltipText:o("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:o("crud:actions.copyPhone",{defaultValue:"Copy phone"}),onClick:t=>t.stopPropagation()})]}),iban:(e,n,o,t)=>{const r=t?.compact??!1;return e?u(g,{direction:"row",gap:"tight",align:"center",children:[s(m,{style:{flex:1},children:e}),s(k,{text:e,tooltipText:o("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:o("crud:actions.copyIban",{defaultValue:"Copy IBAN"}),onClick:l=>l.stopPropagation()})]}):d(r)},url:(e,n,o)=>s("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,n,o)=>u(g,{direction:"row",gap:"tight",align:"center",children:[s("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),s(m,{children:e})]}),textarea:(e,n,o)=>String(e),text:(e,n,o)=>String(e),richtext:(e,n,o,t)=>{const r=t?.compact??!1;return e&&typeof e=="string"?r?e.replace(/<[^>]*>/g,"").trim()||s("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):s("div",{dangerouslySetInnerHTML:{__html:fe(e)},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):d(r)}};function ge(e){return e.type==="avatar"}function be(e){return e.type==="badge"}let z=!1;function V(){z||(z=!0,i({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:y,uncontrolled:e=>{const{value:n,onChange:o,label:t,error:r,config:l}=e;return s(T,{label:t||"",value:typeof n=="string"?n:"",onChange:a=>{const p=a.target.value;o(p)},error:r,...l.options})}}}),i({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:y,uncontrolled:e=>{const{value:n,onChange:o,label:t,error:r,config:l}=e;return s(T,{label:t||"",value:typeof n=="string"?n:"",onChange:a=>{const p=a.target.value;o(p)},error:r,type:"email",...l.options})}}}),i({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:y,uncontrolled:e=>{const{value:n,onChange:o,label:t,error:r,config:l}=e;return s(T,{label:t||"",value:typeof n=="string"?n:"",onChange:a=>{const p=a.target.value;o(p)},error:r,type:"url",...l.options})}}}),i({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:y,uncontrolled:e=>{const{value:n,onChange:o,label:t,error:r,config:l}=e;return s(T,{label:t||"",value:typeof n=="string"?n:"",onChange:a=>{const p=a.target.value;o(p)},error:r,type:"color",...l.options})}}}),i({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:te,uncontrolled:e=>{const{value:n,onChange:o,label:t,error:r,config:l}=e;return s(ye,{label:t||"",value:typeof n=="string"?n:"",onChange:a=>{const p=a.target.value;o(p)},error:r,...l.options})}}}),i({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:re,uncontrolled:e=>{const{value:n,onChange:o,label:t,error:r,config:l}=e;return s(me,{label:t||"",value:typeof n=="string"?n:"",onChange:a=>{const p=a.target.value;o(p)},error:r,...l.options})}}}),i({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:W}}),i({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:q}}),i({type:"iban",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.iban,components:{controlled:y,uncontrolled:e=>{const{value:n,onChange:o,label:t,error:r,config:l}=e;return s(T,{label:t||"",value:typeof n=="string"?n:"",onChange:a=>{const p=a.target.value.replace(/\s/g,"").toUpperCase();o(p)},error:r,...l.options})}}}),i({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:O}}),i({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:ce}}),i({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:se}}),i({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:J}}),i({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:ee}}),i({type:"rating",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.rating,components:{controlled:Q}}),i({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.duration,components:{controlled:X}}),i({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:A}}),i({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:A}}),i({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",displayFormatter:c.gdprConsent,components:{controlled:ie}}),i({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:le}}),i({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:v}}),i({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:v}}),i({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:v}}),i({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:v}}),i({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:v}}),i({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:oe}}),i({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:R}}),i({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:B}}),i({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:_}}),i({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:E}}),i({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:H}}),i({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:ae}}),i({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:U}}),i({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:ne}}),i({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:K}}),i({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:G}}),i({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:P}}),i({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:M}}),i({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:Y}}),i({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:Z}}),i({type:"reference",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.reference,components:{controlled:y}}),i({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:n,value:o}=e;return s(ue,{name:n,value:typeof o=="string"?o:""})}}}),i({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{value:n,onChange:o,error:t,config:r,t:l}=e;if(!ge(r))throw new Error("Invalid config type for avatar field");return s(pe,{config:r,value:typeof n=="string"?n:"",onChange:a=>{o(a)},error:!!t,helperText:t||void 0,t:l,...r.options})}}}),i({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{value:n,onChange:o,error:t,config:r,t:l}=e;if(!be(r))throw new Error("Invalid config type for badge field");return s(de,{config:r,value:typeof n=="string"?n:"",onChange:a=>{o(a)},error:!!t,helperText:t||void 0,t:l,...r.options})}}}),i({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:n,label:o,config:t}=e;return s(D,{label:o||n,type:"submit",onClick:()=>{},...t.options})}}}),i({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:y,uncontrolled:e=>{const{name:n,label:o,config:t}=e;return s(D,{label:o||n,type:"reset",onClick:()=>{},...t.options})}}}))}V();export{V as registerAllBuiltinFieldTypes};
1
+ "use client";import{jsx as p,jsxs as u}from"react/jsx-runtime";import{Text as g,Stack as h,ImageGallery as I,Rating as $,CopyToClipboard as j}from"@donotdev/components";import{formatCurrency as S,maybeTranslate as N}from"@donotdev/core";import{ControlledCheckboxField as A,ControlledComboboxField as P,ControlledDateField as C,ControlledDropdownField as M,ControlledFileField as _,ControlledMultiFileField as B,ControlledDocumentField as R,ControlledMultiDocumentField as v,ControlledGeoPointField as E,ControlledImageField as O,ControlledMapField as U,ControlledMultiDropdownField as H,ControlledMultiInputField as K,ControlledNumberField as Y,ControlledPasswordField as G,ControlledPhoneField as J,ControlledRangeField as W,ControlledRatingField as q,ControlledDurationField as Q,ControlledRadioField as X,ControlledYearField as Z,ControlledTextField as m,ControlledTextareaField as ee,ControlledRichTextField as te,ControlledTimestampField as re,ControlledAddressField as ne,ControlledFieldArrayField as oe,ControlledSwitchField as le,ControlledMultiImageField as ie,ControlledGdprConsentField as ae,ControlledCurrencyField as ce,ControlledPriceField as se}from"./components/controlled";import{AvatarFieldComponent as pe,BadgeFieldComponent as de,ButtonFieldComponent as z,HiddenFieldComponent as fe,TextAreaComponent as ue,RichTextComponent as ye,TextFieldComponent as F}from"./components/form/fields";import{registerBuiltinFieldType as a}from"./fieldTypeRegistry";import{translateLabel as T}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(g,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,o,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,o,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},month:(e,o,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},boolean:(e,o,l)=>e?"Yes":"No",checkbox:(e,o,l)=>e?"Yes":"No",switch:(e,o,l)=>{const t=o.options?.fieldSpecific;if(t){const r=t.uncheckedValue??!1,n=t.checkedValue??!0;if(e===n&&t.checkedLabel)return T(t.checkedLabel,l);if(e===r&&t.uncheckedLabel)return T(t.uncheckedLabel,l)}return e?"Yes":"No"},year:(e,o,l)=>String(e),number:(e,o,l)=>{if(e==null||e==="")return"\u2014";const t=o.options?.unit??"",r=N(l,o.options?.suffix);return[(typeof e=="number"?e.toLocaleString():String(e))+t,r].filter(Boolean).join(" ")},currency:(e,o,l)=>{if(e==null||isNaN(e))return"";const n=(o.options||{}).fieldSpecific?.currency||"EUR";return S(e,n)},price:(e,o,l,t)=>{const r=t?.compact??!1,n=t?.asString??!1,i=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(i==null||typeof i!="object")return d(r);const s=i.amount;if(s==null||isNaN(s))return d(r);const f=i.currency||"EUR",y=i.vatIncluded??!0,b=i.discountPercent??0,V=b>0?s*(1-b/100):s,x=y?` ${l("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(b>0){const L=S(s,f),w=S(V,f),k=` ${l("crud:price.discountPercent",{percent:Math.round(b),defaultValue:"-{{percent}}%"})}`;return n?`${w}${x}${k}`:r?u(g,{variant:"success",weight:"bold",children:[w,x,k]}):u(h,{direction:"column",gap:"tight",align:"end",children:[p(g,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:L}),u(g,{variant:"success",weight:"bold",children:[w,x]})]})}return`${S(s,f)}${x}`},range:(e,o,l)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const n=typeof e=="number"?e:parseFloat(e);if(isNaN(n))return d(r);const i=o.validation?.max??5;return p($,{value:n,max:i,readonly:!0,"aria-label":`${n} out of ${i} stars`})},duration:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const n=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(n))return d(r);if(n===0)return l("crud:duration.zero",{defaultValue:"\u2014"});if(n<60)return l("crud:duration.minutes",{count:n,defaultValue:`${n} min`});const i=Math.floor(n/60),s=n%60;return l("crud:duration.hoursMinutes",{hours:i,minutes:s,defaultValue:s===0?`${i}h`:`${i}h ${s}min`})},gdprConsent:(e,o,l,t)=>{const r=t?.compact??!1;if(!e||typeof e!="object")return d(r);const n=e.gdprConsent===!0,i=e.gdprConsentDate,s=e.gdprConsentVersion,f=l("crud:gdprConsent.display.yes",{defaultValue:"Consented"}),y=l("crud:gdprConsent.display.no",{defaultValue:"Not consented"});if(!n)return y;const b=[f];if(i)try{const V=new Date(i);b.push(V.toLocaleDateString())}catch{b.push(i)}return s&&b.push(`v${s}`),b.join(" \xB7 ")},select:(e,o,l)=>{const t=o.validation?.options;if(Array.isArray(t)){const n=t.find(i=>i.value===e)?.label;return n?T(n,l):String(e)}return String(e)},radio:(e,o,l)=>{const t=o.validation?.options;if(Array.isArray(t)){const n=t.find(i=>i.value===e)?.label;return n?T(n,l):String(e)}return String(e)},combobox:(e,o,l)=>{const t=o.validation?.options;if(Array.isArray(t)){const n=t.find(i=>i.value===e)?.label;return n?T(n,l):String(e)}return String(e)},multiselect:(e,o,l)=>{if(Array.isArray(e)){const t=o.validation?.options;if(Array.isArray(t))return e.map(n=>{const s=t.find(f=>f.value===n)?.label;return s?T(s,l):n}).join(", ")}return String(e)},image:(e,o,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):typeof e=="string"?p("img",{src:e,alt:o.label||"",style:{width:r?"40px":void 0,height:r?"40px":void 0,maxWidth:r?void 0:"200px",maxHeight:r?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):d(r)},images:(e,o,l,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const n=e[0],i=typeof n=="object"&&n.thumbUrl?n.thumbUrl:n;return r?u("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[p("img",{src:i,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&u("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):p(I,{images:e,altPrefix:o.label||"Image"})},files:(e,o,l,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(h,{gap:"tight",children:e.map((n,i)=>u("a",{href:n.url||n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[n.filename||`File ${i+1}`,n.size&&u(g,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(n.size/1024)," KB)"]})]},i))})},documents:(e,o,l,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(h,{gap:"tight",children:e.map((n,i)=>u("a",{href:n.url||n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[n.filename||`File ${i+1}`,n.size&&u(g,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(n.size/1024)," KB)"]})]},i))})},file:(e,o,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);const n=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[i,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,o,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);const n=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[i,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,o,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);if(typeof e=="object"&&e!==null){const n=e.displayName||e.name||e.id||String(e);return String(n)}return String(e)},geopoint:(e,o,l,t)=>{const r=t?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:d(r)},address:(e,o,l)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,o,l,t)=>{const r=t?.compact??!1;if(e&&typeof e=="object"){const n=Object.entries(e);return n.length===0?d(r):u(h,{direction:"column",gap:"tight",children:[n.slice(0,5).map(([i,s])=>u(g,{style:{fontSize:"var(--font-size-sm)"},children:[u("strong",{children:[i,":"]})," ",String(s)]},i)),n.length>5&&u(g,{variant:"muted",children:["+",n.length-5," more"]})]})}return d(r)},array:(e,o,l,t)=>{const r=t?.compact??!1;return Array.isArray(e)?e.length===0?d(r):e.join(", "):d(r)},"field-array":(e,o,l,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const n=o.options?.fieldSpecific?.fields;return e.map(i=>{if(typeof i!="object"||i==null)return"";const s=i;return(n?n.map(y=>y.name):Object.keys(s)).map(y=>s[y]).filter(y=>y!=null&&y!=="").map(y=>typeof y=="object"?JSON.stringify(y):String(y)).join(" \xB7 ")}).filter(Boolean).join(", ")},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,o,l)=>u(h,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`mailto:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),p(j,{text:e,tooltipText:l("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:l("crud:actions.copyEmail",{defaultValue:"Copy email"}),onClick:t=>t.stopPropagation()})]}),tel:(e,o,l)=>u(h,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`tel:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),p(j,{text:e,tooltipText:l("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:l("crud:actions.copyPhone",{defaultValue:"Copy phone"}),onClick:t=>t.stopPropagation()})]}),iban:(e,o,l,t)=>{const r=t?.compact??!1;return e?u(h,{direction:"row",gap:"tight",align:"center",children:[p(g,{style:{flex:1},children:e}),p(j,{text:e,tooltipText:l("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:l("crud:actions.copyIban",{defaultValue:"Copy IBAN"}),onClick:n=>n.stopPropagation()})]}):d(r)},url:(e,o,l)=>p("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,o,l)=>u(h,{direction:"row",gap:"tight",align:"center",children:[p("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),p(g,{children:e})]}),textarea:(e,o,l)=>String(e),text:(e,o,l)=>String(e),richtext:(e,o,l,t)=>{const r=t?.compact??!1;return e&&typeof e=="string"?r?e.replace(/<[^>]*>/g,"").trim()||p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p("div",{dangerouslySetInnerHTML:{__html:me(e)},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):d(r)}};function ge(e){return e.type==="avatar"}function be(e){return e.type==="badge"}let D=!1;function he(){D||(D=!0,a({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,...n.options})}}}),a({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,type:"email",...n.options})}}}),a({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,type:"url",...n.options})}}}),a({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,type:"color",...n.options})}}}),a({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:ee,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(ue,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,...n.options})}}}),a({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:te,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(ye,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,...n.options})}}}),a({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:G}}),a({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:J}}),a({type:"iban",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.iban,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value.replace(/\s/g,"").toUpperCase();l(f)},error:r,...n.options})}}}),a({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:Y}}),a({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:ce}}),a({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:se}}),a({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:W}}),a({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:Z}}),a({type:"rating",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.rating,components:{controlled:q}}),a({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.duration,components:{controlled:Q}}),a({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:A}}),a({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:A}}),a({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",displayFormatter:c.gdprConsent,components:{controlled:ae}}),a({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:le}}),a({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:C}}),a({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:C}}),a({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:C}}),a({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:C}}),a({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:C}}),a({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:re}}),a({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:_}}),a({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:B}}),a({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:R}}),a({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:v}}),a({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:O}}),a({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:ie}}),a({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:E}}),a({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:ne}}),a({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:U}}),a({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:K}}),a({type:"field-array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c["field-array"],components:{controlled:oe}}),a({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:M}}),a({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:P}}),a({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:H}}),a({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:X}}),a({type:"reference",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.reference,components:{controlled:m}}),a({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:o,value:l}=e;return p(fe,{name:o,value:typeof l=="string"?l:""})}}}),a({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:l,error:t,config:r,t:n}=e;if(!ge(r))throw new Error("Invalid config type for avatar field");return p(pe,{config:r,value:typeof o=="string"?o:"",onChange:s=>{l(s)},error:!!t,helperText:t||void 0,t:n,...r.options})}}}),a({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:l,error:t,config:r,t:n}=e;if(!be(r))throw new Error("Invalid config type for badge field");return p(de,{config:r,value:typeof o=="string"?o:"",onChange:s=>{l(s)},error:!!t,helperText:t||void 0,t:n,...r.options})}}}),a({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:o,label:l,config:t}=e;return p(z,{label:l||o,type:"submit",onClick:()=>{},...t.options})}}}),a({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:o,label:l,config:t}=e;return p(z,{label:l||o,type:"reset",onClick:()=>{},...t.options})}}}))}he();export{he as registerAllBuiltinFieldTypes};