@donotdev/crud 0.0.23 → 0.0.24

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 (174) hide show
  1. package/dist/CrudService.js +2 -2
  2. package/dist/CrudStore.js +1 -1
  3. package/dist/FieldRegistry.js +1 -1
  4. package/dist/adapters/FunctionsAdapter.d.ts +13 -1
  5. package/dist/adapters/FunctionsAdapter.d.ts.map +1 -1
  6. package/dist/adapters/FunctionsAdapter.js +1 -1
  7. package/dist/builtinFieldTypes.d.ts +12 -10
  8. package/dist/builtinFieldTypes.d.ts.map +1 -1
  9. package/dist/components/CrudButton.js +1 -1
  10. package/dist/components/CrudCard.js +1 -1
  11. package/dist/components/DateFilter.js +1 -1
  12. package/dist/components/DisplayFieldRenderer.js +1 -1
  13. package/dist/components/DisplayThumbnail.js +1 -1
  14. package/dist/components/EntityFilters.d.ts.map +1 -1
  15. package/dist/components/EntityFilters.js +1 -1
  16. package/dist/components/FormFieldRenderer.d.ts +0 -1
  17. package/dist/components/FormFieldRenderer.d.ts.map +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.js +1 -1
  23. package/dist/components/controlled/complex/ControlledGeoPointField.js +1 -1
  24. package/dist/components/controlled/complex/ControlledMapField.js +1 -1
  25. package/dist/components/controlled/complex/ControlledMultiInputField.js +1 -1
  26. package/dist/components/controlled/complex/ControlledRichTextField.js +1 -1
  27. package/dist/components/controlled/complex/ControlledTimestampField.js +1 -1
  28. package/dist/components/controlled/complex/index.js +1 -1
  29. package/dist/components/controlled/file/ControlledDocumentField.js +1 -1
  30. package/dist/components/controlled/file/ControlledFileField.js +1 -1
  31. package/dist/components/controlled/file/ControlledImageField.js +1 -1
  32. package/dist/components/controlled/file/ControlledMultiDocumentField.js +1 -1
  33. package/dist/components/controlled/file/ControlledMultiFileField.js +1 -1
  34. package/dist/components/controlled/file/ControlledMultiImageField.js +1 -1
  35. package/dist/components/controlled/file/index.js +1 -1
  36. package/dist/components/controlled/index.js +1 -1
  37. package/dist/components/controlled/input/ControlledCheckboxField.js +1 -1
  38. package/dist/components/controlled/input/ControlledCurrencyField.js +1 -1
  39. package/dist/components/controlled/input/ControlledDurationField.js +1 -1
  40. package/dist/components/controlled/input/ControlledGdprConsentField.js +1 -1
  41. package/dist/components/controlled/input/ControlledNumberField.js +1 -1
  42. package/dist/components/controlled/input/ControlledPasswordField.js +1 -1
  43. package/dist/components/controlled/input/ControlledPhoneField.js +1 -1
  44. package/dist/components/controlled/input/ControlledPriceField.js +1 -1
  45. package/dist/components/controlled/input/ControlledRangeField.js +1 -1
  46. package/dist/components/controlled/input/ControlledRatingField.js +1 -1
  47. package/dist/components/controlled/input/ControlledSwitchField.js +1 -1
  48. package/dist/components/controlled/input/ControlledTextField.js +1 -1
  49. package/dist/components/controlled/input/ControlledTextareaField.js +1 -1
  50. package/dist/components/controlled/input/index.js +1 -1
  51. package/dist/components/controlled/select/ControlledComboboxField.js +1 -1
  52. package/dist/components/controlled/select/ControlledDropdownField.js +1 -1
  53. package/dist/components/controlled/select/ControlledMultiDropdownField.js +1 -1
  54. package/dist/components/controlled/select/ControlledRadioField.js +1 -1
  55. package/dist/components/controlled/select/ControlledReferenceField.js +1 -1
  56. package/dist/components/controlled/select/ControlledYearField.js +1 -1
  57. package/dist/components/controlled/select/index.js +1 -1
  58. package/dist/components/controlled/types.js +1 -1
  59. package/dist/components/fields/display/AvatarFieldDisplay.js +1 -1
  60. package/dist/components/fields/display/BadgeFieldDisplay.js +1 -1
  61. package/dist/components/fields/display/ButtonFieldDisplay.js +1 -1
  62. package/dist/components/fields/display/CheckboxFieldDisplay.js +1 -1
  63. package/dist/components/fields/display/DateFieldDisplay.js +1 -1
  64. package/dist/components/fields/display/DropdownDisplay.js +1 -1
  65. package/dist/components/fields/display/FileFieldDisplay.js +1 -1
  66. package/dist/components/fields/display/GeoPointFieldDisplay.js +1 -1
  67. package/dist/components/fields/display/HiddenFieldDisplay.js +1 -1
  68. package/dist/components/fields/display/ImageFieldDisplay.js +1 -1
  69. package/dist/components/fields/display/LinkFieldDisplay.js +1 -1
  70. package/dist/components/fields/display/MapFieldDisplay.js +1 -1
  71. package/dist/components/fields/display/MultiDropdownDisplay.js +1 -1
  72. package/dist/components/fields/display/MultiInputTextFieldDisplay.js +1 -1
  73. package/dist/components/fields/display/NumberFieldDisplay.js +1 -1
  74. package/dist/components/fields/display/PasswordFieldDisplay.js +1 -1
  75. package/dist/components/fields/display/PhoneNumberDisplay.js +1 -1
  76. package/dist/components/fields/display/RadioFieldDisplay.js +1 -1
  77. package/dist/components/fields/display/RangeFieldDisplay.js +1 -1
  78. package/dist/components/fields/display/ReferenceFieldDisplay.js +1 -1
  79. package/dist/components/fields/display/RichTextDisplay.js +2 -2
  80. package/dist/components/fields/display/TextAreaDisplay.js +1 -1
  81. package/dist/components/fields/display/TextFieldDisplay.js +1 -1
  82. package/dist/components/fields/display/TimestampFieldDisplay.js +1 -1
  83. package/dist/components/fields/display/index.js +1 -1
  84. package/dist/components/form/fields/AddressFieldComponent.js +1 -1
  85. package/dist/components/form/fields/AvatarFieldComponent.js +1 -1
  86. package/dist/components/form/fields/BadgeFieldComponent.js +1 -1
  87. package/dist/components/form/fields/ButtonFieldComponent.js +1 -1
  88. package/dist/components/form/fields/CheckboxFieldComponent.js +1 -1
  89. package/dist/components/form/fields/ComboboxComponent.js +1 -1
  90. package/dist/components/form/fields/CurrencyFieldComponent.js +1 -1
  91. package/dist/components/form/fields/DateFieldComponent.js +1 -1
  92. package/dist/components/form/fields/DocumentFieldComponent.js +1 -1
  93. package/dist/components/form/fields/DropdownComponent.js +1 -1
  94. package/dist/components/form/fields/DurationFieldComponent.js +1 -1
  95. package/dist/components/form/fields/FileFieldComponent.js +1 -1
  96. package/dist/components/form/fields/GdprConsentFieldComponent.js +1 -1
  97. package/dist/components/form/fields/GeoPointFieldComponent.js +1 -1
  98. package/dist/components/form/fields/HiddenFieldComponent.js +1 -1
  99. package/dist/components/form/fields/ImageFieldComponent.js +1 -1
  100. package/dist/components/form/fields/MapFieldComponent.js +1 -1
  101. package/dist/components/form/fields/MultiDropdownComponent.js +1 -1
  102. package/dist/components/form/fields/MultiInputTextFieldComponent.js +1 -1
  103. package/dist/components/form/fields/NumberFieldComponent.js +1 -1
  104. package/dist/components/form/fields/PasswordFieldComponent.js +1 -1
  105. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  106. package/dist/components/form/fields/PriceFieldComponent.js +1 -1
  107. package/dist/components/form/fields/RadioFieldComponent.js +1 -1
  108. package/dist/components/form/fields/RangeFieldComponent.js +1 -1
  109. package/dist/components/form/fields/RatingFieldComponent.js +1 -1
  110. package/dist/components/form/fields/ReferenceFieldComponent.js +1 -1
  111. package/dist/components/form/fields/RichTextComponent.js +1 -1
  112. package/dist/components/form/fields/SwitchFieldComponent.js +1 -1
  113. package/dist/components/form/fields/TextAreaComponent.js +1 -1
  114. package/dist/components/form/fields/TextFieldComponent.js +1 -1
  115. package/dist/components/form/fields/TimestampFieldComponent.js +1 -1
  116. package/dist/components/form/fields/index.js +1 -1
  117. package/dist/components/form/fields/internal/TiptapEditor.js +2 -2
  118. package/dist/components/form/internal/ImageViewerDialog.js +1 -1
  119. package/dist/components/index.js +1 -1
  120. package/dist/contexts/UploadContext.js +1 -1
  121. package/dist/contexts/index.js +1 -1
  122. package/dist/fieldTypeRegistry.d.ts +38 -14
  123. package/dist/fieldTypeRegistry.d.ts.map +1 -1
  124. package/dist/fieldTypeRegistry.js +1 -1
  125. package/dist/forms/hooks/index.js +1 -1
  126. package/dist/forms/hooks/useController.js +1 -1
  127. package/dist/forms/hooks/useEntityField.js +1 -1
  128. package/dist/forms/hooks/useEntityForm.js +1 -1
  129. package/dist/forms/index.js +1 -1
  130. package/dist/forms/utils/buildInitialValues.js +1 -1
  131. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  132. package/dist/forms/utils/index.js +1 -1
  133. package/dist/forms/utils/isFieldEditable.js +1 -1
  134. package/dist/forms/utils/translateFieldLabel.js +1 -1
  135. package/dist/forms/utils/validateEntity.js +1 -1
  136. package/dist/hooks/index.js +1 -1
  137. package/dist/hooks/useCrudFilters.js +1 -1
  138. package/dist/hooks/useEntityFavorites.js +1 -1
  139. package/dist/hooks/useFieldConditions.js +1 -1
  140. package/dist/hooks/useFileUpload.js +1 -1
  141. package/dist/hooks/useReferenceResolver.js +1 -1
  142. package/dist/hooks/useRelatedItems.js +1 -1
  143. package/dist/hooks/useUnsavedChangesWarning.js +1 -1
  144. package/dist/index.d.ts +5 -0
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js +1 -1
  147. package/dist/registerBuiltinFieldTypes.js +1 -1
  148. package/dist/stores/FormStore.js +1 -1
  149. package/dist/stores/UploadStore.js +1 -1
  150. package/dist/stores/index.js +1 -1
  151. package/dist/tsconfig.tsbuildinfo +1 -1
  152. package/dist/types.js +1 -1
  153. package/dist/useBaseCrudList.js +1 -1
  154. package/dist/useCrud.js +1 -1
  155. package/dist/useCrudCardList.js +1 -1
  156. package/dist/useCrudList.js +1 -1
  157. package/dist/utils/clientListProcessing.js +1 -1
  158. package/dist/utils/collections.js +1 -1
  159. package/dist/utils/fileStorage.d.ts.map +1 -1
  160. package/dist/utils/fileStorage.js +1 -1
  161. package/dist/utils/imageProcessing.js +1 -1
  162. package/dist/utils/imageStorage.d.ts.map +1 -1
  163. package/dist/utils/imageStorage.js +1 -1
  164. package/dist/utils/imageUtils.js +1 -1
  165. package/dist/utils/matchesFilter.js +1 -1
  166. package/dist/utils/mergeWithOptimistic.js +1 -1
  167. package/dist/utils/sanitizeHtml.js +1 -1
  168. package/dist/utils/scopeUtils.js +1 -1
  169. package/dist/utils/uploadValidation.js +1 -1
  170. package/dist/workflows/WorkflowPersistence.js +1 -1
  171. package/dist/workflows/defineWorkflow.js +1 -1
  172. package/dist/workflows/index.js +1 -1
  173. package/dist/workflows/useEntityWorkflow.js +1 -1
  174. package/package.json +2 -13
@@ -1 +1 @@
1
- "use client";import{jsx as e,Fragment as re,jsxs as a}from"react/jsx-runtime";import{ChevronLeft as le,ChevronRight as ne,RotateCcw as M,RotateCw as H,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 B,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 n,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:l,open:T,onClose:R,onUpdate:D,onDelete:E,onNavigate:m,multiple:L=!1}){const{t}=we("crud"),[Z,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,P]=c(!1),[X,x]=c(!1),I=ue({crop:{x:0,y:0},zoom:1,rotation:0}),d=h[l],U=L&&l>0,O=L&&l<h.length-1;B(()=>{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)},[]),A=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)){P(!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),D(l,{file:s,previewURL:oe,uploaded:null,uploadProgress:null,error:null,rotation:0}),w(!1)}catch{}finally{P(!1)}}},te=g(()=>{E(l),x(!1),h.length===1?R():l>=h.length-1&&m(l-1)},[l,h.length,E,R,m]);if(B(()=>{if(!T)return;const i=s=>{s.key==="ArrowLeft"&&U?m(l-1):s.key==="ArrowRight"&&O?m(l+1):s.key==="Escape"&&y&&w(!1)};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[T,U,O,l,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:l+1,total:h.length}):t("image.editor.title");return e(fe,{open:T,onOpenChange:i=>!i&&R(),side:"right",title:ae,description:t("image.editor.description"),noSwipe:y,children:a(n,{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:Z,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:[U&&e(o,{variant:r.GHOST,icon:le,onClick:()=>m(l-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 ${l+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:ne,onClick:()=>m(l+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(n,{children:[a(n,{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(n,{gap:"tight",children:[a(n,{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(n,{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(n,{gap:"tight",children:[a(n,{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(n,{direction:"row",gap:"tight",align:"center",children:[e(o,{variant:r.OUTLINE,icon:M,display:"compact",onClick:A,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:H,display:"compact",onClick:V,tooltip:t("image.editor.rotateRight")})]})]}),a(n,{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(n,{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(n,{children:[a(n,{direction:"row",gap:"tight",justify:"center",children:[e(o,{variant:r.OUTLINE,icon:M,display:"compact",onClick:A,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:H,display:"compact",onClick:V,tooltip:t("image.editor.rotateRight")})]}),X?a(n,{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(n,{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};
@@ -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 m}from"./FormLayout";export*from"./controlled";export*from"./form";import{EntityFilters as t}from"./EntityFilters";import{matchesFilter as s}from"../utils/matchesFilter";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,t as EntityFilters,a as FormFieldRenderer,m 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:r,children:o}){return t(e.Provider,{value:r,children:o})}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};
@@ -3,11 +3,34 @@
3
3
  * @description Single source of truth for framework built-in field types.
4
4
  * Coordinates schema registration, UI components, filter metadata, and display formatting.
5
5
  *
6
- * @version 0.0.1
6
+ * Built-in field types are auto-registered via side-effect import of
7
+ * `registerBuiltinFieldTypes.tsx`. This creates a circular dependency:
8
+ *
9
+ * fieldTypeRegistry → registerBuiltinFieldTypes → fieldTypeRegistry
10
+ *
11
+ * Safe because:
12
+ * - `registerBuiltinFieldType()` is a function declaration (hoisted in ESM)
13
+ * - `metadataRegistry` is lazily initialized via `getMetadataRegistry()`
14
+ * so it exists even when the module hasn't fully evaluated yet
15
+ * - `getFieldRegistry()` in FieldRegistry.ts is already lazy (singleton)
16
+ *
17
+ * This guarantees that ALL code paths (display, form, filter, Expo) get
18
+ * built-in formatters without each consumer needing a magic side-effect import.
19
+ *
20
+ * @version 0.0.2
7
21
  * @since 0.0.1
8
22
  * @author AMBROISE PARK Consulting
9
23
  */
10
24
  import type { EntityField, FieldType } from '@donotdev/core';
25
+ /**
26
+ * Side-effect import — triggers `registerAllBuiltinFieldTypes()` at module load.
27
+ *
28
+ * Circular dependency with this file is intentional and safe (see fileoverview).
29
+ * Placing it here (the single lookup entry point) means every consumer —
30
+ * DisplayFieldRenderer, FormFieldRenderer, EntityFilters, CrudCard, Expo
31
+ * renderers — is covered without needing their own import.
32
+ */
33
+ import './registerBuiltinFieldTypes';
11
34
  import type { ControlledFieldProps, UncontrolledFieldProps } from './FieldRegistry';
12
35
  import type { ComponentType, ReactElement } from 'react';
13
36
  /**
@@ -56,13 +79,14 @@ export interface FieldTypeMetadata {
56
79
  components?: ComponentRegistration;
57
80
  }
58
81
  /**
59
- * Register a built-in field type with all metadata
82
+ * Register a built-in field type with all metadata.
83
+ *
84
+ * Single registration point for framework built-ins. Coordinates:
85
+ * - UI component registration (via FieldRegistry singleton)
86
+ * - Filter / display metadata storage
60
87
  *
61
- * This is the single registration point for framework built-ins.
62
- * It coordinates:
63
- * - Schema registration (via registerSchemaGenerator)
64
- * - UI component registration (via FieldRegistry)
65
- * - Filter/display metadata storage
88
+ * Schemas are registered separately in `@donotdev/core/schemas/getSchemaType.ts`
89
+ * because backend functions need them at module load without pulling in React.
66
90
  *
67
91
  * @param metadata - Complete field type metadata
68
92
  */
@@ -72,18 +96,18 @@ export declare function registerBuiltinFieldType(metadata: FieldTypeMetadata): v
72
96
  */
73
97
  export declare function getFieldTypeMetadata(type: string): FieldTypeMetadata | undefined;
74
98
  /**
75
- * Get filter type for a field type
76
- * Custom types (registerFieldType with filterType) are checked first via FieldRegistry.
99
+ * Get filter type for a field type.
100
+ * Custom types (via `registerFieldType` with `filterType`) take precedence.
77
101
  */
78
102
  export declare function getFilterType(type: string): FilterType | undefined;
79
103
  /**
80
- * Get display formatter for a field type
81
- * Custom types (registerFieldType with displayFormatter) are checked first via FieldRegistry.
104
+ * Get display formatter for a field type.
105
+ * Custom types (via `registerFieldType` with `displayFormatter`) take precedence.
82
106
  */
83
107
  export declare function getDisplayFormatter(type: string): DisplayFormatter | undefined;
84
108
  /**
85
- * Check if a field type is filterable
86
- * Custom types (registerFieldType with filterable) are checked first via FieldRegistry.
109
+ * Check if a field type is filterable.
110
+ * Custom types (via `registerFieldType` with `filterable`) take precedence.
87
111
  */
88
112
  export declare function isFilterable(type: string): boolean;
89
113
  /**
@@ -91,7 +115,7 @@ export declare function isFilterable(type: string): boolean;
91
115
  */
92
116
  export declare function getValueType(type: string): ValueType | undefined;
93
117
  /**
94
- * Clear registry (testing)
118
+ * Clear registry (testing only)
95
119
  */
96
120
  export declare function clearFieldTypeRegistry(): void;
97
121
  //# sourceMappingURL=fieldTypeRegistry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fieldTypeRegistry.d.ts","sourceRoot":"","sources":["../src/fieldTypeRegistry.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI7D,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,MAAM,GACN,SAAS,GACT,aAAa,GACb,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAC7B,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,WAAW,EACnB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,EACzD,OAAO,CAAC,EAAE,uBAAuB,KAC9B,MAAM,GAAG,YAAY,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,aAAa,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1D,YAAY,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;CACtD;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,yBAAyB;IACzB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,oBAAoB;IACpB,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAOD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAmB1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GACX,iBAAiB,GAAG,SAAS,CAE/B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAIlE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,SAAS,CAI9B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEhE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
1
+ {"version":3,"file":"fieldTypeRegistry.d.ts","sourceRoot":"","sources":["../src/fieldTypeRegistry.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI7D;;;;;;;GAOG;AACH,OAAO,6BAA6B,CAAC;AAErC,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,MAAM,GACN,SAAS,GACT,aAAa,GACb,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAC7B,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,WAAW,EACnB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,EACzD,OAAO,CAAC,EAAE,uBAAuB,KAC9B,MAAM,GAAG,YAAY,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,aAAa,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1D,YAAY,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;CACtD;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,yBAAyB;IACzB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,oBAAoB;IACpB,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAqBD;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAa1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GACX,iBAAiB,GAAG,SAAS,CAE/B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAIlE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,SAAS,CAI9B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEhE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -1 +1 @@
1
- "use client";import{getFieldRegistry as n}from"./FieldRegistry";const e=new Map;function a(t){const{type:r,components:i}=t;i&&n().registerComponent(r,i.controlled,i.uncontrolled),e.set(r,t)}function l(t){return e.get(t)}function o(t){return n().getFilterType(t)||e.get(t)?.filterType}function s(t){return n().getDisplayFormatter(t)||e.get(t)?.displayFormatter}function c(t){return n().isFilterable(t)?!0:e.get(t)?.filterable??!1}function p(t){return e.get(t)?.valueType}function u(){e.clear()}export{u as clearFieldTypeRegistry,s as getDisplayFormatter,l as getFieldTypeMetadata,o as getFilterType,p as getValueType,c as isFilterable,a as registerBuiltinFieldType};
1
+ "use client";import{getFieldRegistry as i}from"./FieldRegistry";import"./registerBuiltinFieldTypes";var o=null;function r(){return o||(o=new Map),o}function a(e){const{type:t,components:n}=e;n&&i().registerComponent(t,n.controlled,n.uncontrolled),r().set(t,e)}function g(e){return r().get(e)}function p(e){const t=i().getFilterType(e);return t||r().get(e)?.filterType}function c(e){const t=i().getDisplayFormatter(e);return t||r().get(e)?.displayFormatter}function f(e){return i().isFilterable(e)?!0:r().get(e)?.filterable??!1}function y(e){return r().get(e)?.valueType}function F(){r().clear()}export{F as clearFieldTypeRegistry,c as getDisplayFormatter,g as getFieldTypeMetadata,p as getFilterType,y as getValueType,f as isFilterable,a as registerBuiltinFieldType};
@@ -1 +1 @@
1
- import{useEntityForm as t}from"./useEntityForm";import{useEntityField as o}from"./useEntityField";import{useController as r}from"./useController";export{r as useController,o as useEntityField,t as useEntityForm};
1
+ import{useEntityForm as e}from"./useEntityForm";import{useEntityField as m}from"./useEntityField";import{useController as i}from"./useController";export{i as useController,m as useEntityField,e as useEntityForm};
@@ -1 +1 @@
1
- "use client";import{useController as r}from"react-hook-form";function o(e){return r(e)}export{o as useController};
1
+ "use client";import{useController as e}from"react-hook-form";function t(r){return e(r)}export{t as useController};
@@ -1 +1 @@
1
- "use client";import{useMemo as o,useCallback as p}from"react";import{useController as v}from"./useController";import{formatValue as h}from"../../components/DisplayFieldRenderer";import{isFieldEditable as D}from"../utils";function g(a,i){const{entity:u,operation:r,viewerRole:n,fields:b}=a,l=u.fields[i],e=o(()=>l?{...l,name:l.name||i,label:l.label||i}:{name:i,type:"text",label:i,visibility:"user"},[i,l]),s=o(()=>b.some(d=>d.name===i),[b,i]),c=o(()=>!s||r==="edit"&&e.visibility==="technical"&&e.editable===void 0?!1:D(e.editable,n,r),[s,r,e.visibility,e.editable,n]),{field:m,fieldState:t}=v({name:i,control:a.control}),f=o(()=>({error:t.error?.message,touched:t.isTouched,isDirty:t.isDirty}),[t.error?.message,t.isTouched,t.isDirty]),y=p(d=>h(m.value,e,a.t,d),[m.value,e,a.t]);return{field:m,meta:f,config:e,isEditable:c,isVisible:s,display:y}}export{g as useEntityField};
1
+ "use client";import{useMemo as o,useCallback as p}from"react";import{useController as v}from"./useController";import{formatValue as h}from"../../components/DisplayFieldRenderer";import{isFieldEditable as D}from"../utils";function F(s,e){const{entity:d,operation:n,viewerRole:c,fields:b}=s,r=d.fields[e],t=o(()=>r?{...r,name:r.name||e,label:r.label||e}:{name:e,type:"text",label:e,visibility:"user"},[e,r]),l=o(()=>b.some(u=>u.name===e),[b,e]),y=o(()=>!l||n==="edit"&&t.visibility==="technical"&&t.editable===void 0?!1:D(t.editable,c,n),[l,n,t.visibility,t.editable,c]),{field:a,fieldState:i}=v({name:e,control:s.control}),f=o(()=>({error:i.error?.message,touched:i.isTouched,isDirty:i.isDirty}),[i.error?.message,i.isTouched,i.isDirty]),m=p(u=>h(a.value,t,s.t,u),[a.value,t,s.t]);return{field:a,meta:f,config:t,isEditable:y,isVisible:l,display:m}}export{F as useEntityField};
@@ -1 +1 @@
1
- "use client";import{valibotResolver as M}from"@hookform/resolvers/valibot";import{useMemo as d,useEffect as T,useRef as v,useCallback as w,createElement as se}from"react";import{useForm as oe}from"react-hook-form";import{toast as ie,ToastAction as ne}from"@donotdev/components";import{useLocalStorage as ue,BACKEND_GENERATED_FIELD_NAMES as ce,createSchemas as le}from"@donotdev/core";import{useFormStore as j,useFormStatus as de,useUploadProgress as fe}from"../../stores";import{useUploadStore as q}from"../../stores/UploadStore";import{checkForBlobUrls as z}from"../../utils/uploadValidation";import{getFieldsForOperation as me}from"../utils";import{buildInitialFromRecord as pe,buildSchemaDefaults as ge}from"../utils/buildInitialValues";const Se=i=>i;function G(i,E){const e={...i};for(const p of Object.keys(E)){const c=i[p],f=E[p];f!==null&&typeof f=="object"&&!Array.isArray(f)&&c!==null&&typeof c=="object"&&!Array.isArray(c)?e[p]=G(c,f):e[p]=f}return e}function be(i,E={}){const{formId:e,operation:p,defaultValues:c,viewerRole:f,mode:K="onBlur",t:Y}=E,g=Y??Se,U=f??"guest",n=p??(c?"edit":"create"),H=de(e??""),J=fe(e??""),V=d(()=>le(i),[i.name]),P=d(()=>M(V.create),[V.create]),C=d(()=>M(V.draft),[V.draft]),Q=d(()=>async(t,a,s)=>((t?.status??c?.status)==="draft"?C:P)(t,a,s),[P,C,c?.status]),F=d(()=>ge(i),[i]),$=c,u=d(()=>{if(n==="create")return F;if($)return pe(i,$)},[n,F,i,$]),o=oe({defaultValues:n==="create"?u:void 0,mode:K,resolver:Q,shouldUnregister:!1,shouldFocusError:!0}),A=v(o);T(()=>{A.current=o},[o]);const D=v(null);T(()=>{if(n==="edit"&&u){const t=u.id??null;t&&t!==D.current?(A.current.reset(u),D.current=t):!t&&D.current===null&&(A.current.reset(u),D.current="initialized")}},[n,u]);const k=c?.id,W=d(()=>{const t=`${i.name.toLowerCase()}-form-draft`;return n==="create"?t:k?`${t}-${k}`:`${t}-edit`},[i.name,n,k]),{value:b,setValue:x,removeValue:S}=ue(W,{defaultValue:null,syncAcrossTabs:!0}),y=v(!1);T(()=>{if(y.current)return;const t=a=>{const s=()=>{S(),a&&A.current.reset(a)};ie({toastType:"info",title:g("draft.restored",{defaultValue:"Draft restored"}),description:g("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:se(ne,{altText:g("draft.discard",{defaultValue:"Discard"}),onClick:s},g("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(n==="create"&&!c){b&&(o.reset(b),t(F)),y.current=!0;return}if(n==="edit"&&u){if(b){const a=G(u,b);o.reset(a),t(u)}y.current=!0}},[n,c,b,o,u,S,g,F]);const O=v(!1),h=v(null);T(()=>{const t=o.watch(a=>{O.current||!y.current||(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{a&&Object.values(a).some(s=>s!=null&&s!=="")&&x(a)},3e3))});return()=>{t.unsubscribe(),h.current&&clearTimeout(h.current)}},[o,x]);const B=w(async()=>{if(!e)return!0;const t=q.getState(),a=j.getState();if(!t.hasPendingUploads(e))return!0;try{a.setUploading(e,0),await t.uploadAll(e),await new Promise(m=>setTimeout(m,50));let s=o.getValues(),r=z(s),l=0;const R=5;for(;r.length>0&&l<R;)l++,await new Promise(m=>setTimeout(m,100)),s=o.getValues(),r=z(s);if(r.length>0){const m=`Upload incomplete: files still pending at ${r.join(", ")}`;return a.setError(e,m),!1}return!0}catch(s){const r=s instanceof Error?s.message:"File upload failed";return j.getState().setError(e,r),!1}},[e,o]),L=w(t=>n!=="create"?t:Object.fromEntries(Object.entries(t).filter(([a])=>!ce.includes(a))),[n]),N=w(t=>{if(typeof window>"u")return;const a=Object.keys(t).find(r=>r!=="root"&&t[r]);if(!a)return;const s=document.querySelector(`input[name="${a}"][aria-invalid="true"], textarea[name="${a}"][aria-invalid="true"], select[name="${a}"][aria-invalid="true"]`);s&&(s.scrollIntoView({behavior:"smooth",block:"center"}),s.focus())},[]),_=o.handleSubmit,X=d(()=>((t,a)=>async s=>{s?.preventDefault?.();const r=e?j.getState():null;e&&r&&r.startSubmit(e),O.current=!0;try{if(!await B()){e&&r&&r.setError(e,"Upload failed");return}e&&r&&r.setValidating(e),await _(async(l,R)=>{e&&r&&r.setSubmitting(e);const m=L(l);try{await t(m,R),S(),e&&r&&r.setSuccess(e)}catch(I){const ae=I instanceof Error?I.message:"Submission failed";throw e&&r&&r.setError(e,ae),I}},l=>{e&&r&&r.setError(e,"Validation failed"),N(l),a?.(l)})(s)}catch{if(e&&r){const l=r.getStatus(e);l!=="error"&&l!=="idle"&&l!=="success"&&r.reset(e)}}finally{O.current=!1}}),[_,e,B,L,N,n,S]),Z=w(()=>{S(),o.reset(u),y.current=!1},[S,o,u]),ee=w(()=>{e&&(j.getState().cleanup(e),q.getState().cleanup(e))},[e]),te=d(()=>me(i,{operation:n,viewerRole:U,availableFields:void 0}),[i,n,U]),re=o.formState.isSubmitted||Object.keys(o.formState.touchedFields||{}).length>0;return{...o,handleSubmit:X,fields:te,operation:n,entity:i,t:g,viewerRole:U,formId:e,formStatus:e?H:"idle",uploadProgress:e?J:0,cleanup:ee,isDirty:o.formState.isDirty,hasUserInteracted:re,resetForm:Z,originalValues:u}}export{be as useEntityForm};
1
+ "use client";import{valibotResolver as K}from"@hookform/resolvers/valibot";import{useMemo as l,useEffect as A,useRef as V,useCallback as v,createElement as ae}from"react";import{useForm as ne}from"react-hook-form";import{toast as ie,ToastAction as ue}from"@donotdev/components";import{useLocalStorage as ce,BACKEND_GENERATED_FIELD_NAMES as le,createSchemas as fe}from"@donotdev/core";import{useFormStore as P,useFormStatus as de,useUploadProgress as me}from"../../stores";import{useUploadStore as N}from"../../stores/UploadStore";import{checkForBlobUrls as q}from"../../utils/uploadValidation";import{getFieldsForOperation as pe}from"../utils";import{buildInitialFromRecord as Se,buildSchemaDefaults as ge}from"../utils/buildInitialValues";const he=n=>n;function z(n,E){const e={...n};for(const S of Object.keys(E)){const c=n[S],d=E[S];d!==null&&typeof d=="object"&&!Array.isArray(d)&&c!==null&&typeof c=="object"&&!Array.isArray(c)?e[S]=z(c,d):e[S]=d}return e}function Ae(n,E={}){const{formId:e,operation:S,defaultValues:c,viewerRole:d,mode:G="onBlur",t:H}=E,g=H??he,U=d??"guest",i=S??(c?"edit":"create"),W=de(e??""),Y=me(e??""),F=l(()=>fe(n),[n.name]),O=l(()=>K(F.create),[F.create]),$=l(()=>K(F.draft),[F.draft]),J=l(()=>async(r,s,a)=>((r?.status??c?.status)==="draft"?$:O)(r,s,a),[O,$,c?.status]),y=l(()=>ge(n),[n]),j=c,u=l(()=>{if(i==="create")return y;if(j)return Se(n,j)},[i,y,n,j]),o=ne({defaultValues:i==="create"?u:void 0,mode:G,resolver:J,shouldUnregister:!1,shouldFocusError:!0}),R=V(o);A(()=>{R.current=o},[o]);const T=V(null);A(()=>{if(i==="edit"&&u){const r=u.id??null;r&&r!==T.current?(R.current.reset(u),T.current=r):!r&&T.current===null&&(R.current.reset(u),T.current="initialized")}},[i,u]);const k=c?.id,Q=l(()=>{const r=`${n.name.toLowerCase()}-form-draft`;return i==="create"?r:k?`${r}-${k}`:`${r}-edit`},[n.name,i,k]),{value:b,setValue:x,removeValue:h}=ce(Q,{defaultValue:null,syncAcrossTabs:!0}),D=V(!1);A(()=>{if(D.current)return;const r=s=>{const a=()=>{h(),s&&R.current.reset(s)};ie({toastType:"info",title:g("draft.restored",{defaultValue:"Draft restored"}),description:g("draft.restoredDescription",{defaultValue:"Your unsaved changes were recovered"}),action:ae(ue,{altText:g("draft.discard",{defaultValue:"Discard"}),onClick:a},g("draft.discard",{defaultValue:"Discard"})),duration:8e3})};if(i==="create"&&!c){b&&(o.reset(b),r(y)),D.current=!0;return}if(i==="edit"&&u){if(b){const s=z(u,b);o.reset(s),r(u)}D.current=!0}},[i,c,b,o,u,h,g,y]);const I=V(!1),w=V(null);A(()=>{const r=o.watch(s=>{I.current||!D.current||(w.current&&clearTimeout(w.current),w.current=setTimeout(()=>{if(!s)return;Object.values(s).some(t=>t!=null&&t!=="")&&x(s)},3e3))});return()=>{r.unsubscribe(),w.current&&clearTimeout(w.current)}},[o,x]);const B=v(async()=>{if(!e)return!0;const r=N.getState(),s=P.getState();if(!r.hasPendingUploads(e))return!0;try{s.setUploading(e,0),await r.uploadAll(e),await new Promise(p=>setTimeout(p,50));let a=o.getValues(),t=q(a),f=0;const m=5;for(;t.length>0&&f<m;)f++,await new Promise(p=>setTimeout(p,100)),a=o.getValues(),t=q(a);if(t.length>0){const p=`Upload incomplete: files still pending at ${t.join(", ")}`;return s.setError(e,p),!1}return!0}catch(a){const t=a instanceof Error?a.message:"File upload failed";return P.getState().setError(e,t),!1}},[e,o]),C=v(r=>i!=="create"?r:Object.fromEntries(Object.entries(r).filter(([s])=>!le.includes(s))),[i]),L=v(r=>{if(typeof window>"u")return;const s=Object.keys(r).find(t=>t!=="root"&&r[t]);if(!s)return;const a=document.querySelector(`input[name="${s}"][aria-invalid="true"], textarea[name="${s}"][aria-invalid="true"], select[name="${s}"][aria-invalid="true"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.focus())},[]),_=o.handleSubmit,X=l(()=>((r,s)=>async a=>{a?.preventDefault?.();const t=e?P.getState():null;e&&t&&t.startSubmit(e),I.current=!0;try{if(!await B()){e&&t&&t.setError(e,"Upload failed");return}e&&t&&t.setValidating(e),await _(async(m,p)=>{e&&t&&t.setSubmitting(e);const se=C(m);try{await r(se,p),h(),e&&t&&t.setSuccess(e)}catch(M){const oe=M instanceof Error?M.message:"Submission failed";throw e&&t&&t.setError(e,oe),M}},m=>{e&&t&&t.setError(e,"Validation failed"),L(m),s?.(m)})(a)}catch{if(e&&t){const f=t.getStatus(e);f!=="error"&&f!=="idle"&&f!=="success"&&t.reset(e)}}finally{I.current=!1}}),[_,e,B,C,L,i,h]),Z=v(()=>{h(),o.reset(u),D.current=!1},[h,o,u]),ee=v(()=>{e&&(P.getState().cleanup(e),N.getState().cleanup(e))},[e]),te=l(()=>pe(n,{operation:i,viewerRole:U,availableFields:void 0}),[n,i,U]),re=o.formState.isSubmitted||Object.keys(o.formState.touchedFields||{}).length>0;return{...o,handleSubmit:X,fields:te,operation:i,entity:n,t:g,viewerRole:U,formId:e,formStatus:e?W:"idle",uploadProgress:e?Y:0,cleanup:ee,isDirty:o.formState.isDirty,hasUserInteracted:re,resetForm:Z,originalValues:u}}export{Ae as useEntityForm};
@@ -1 +1 @@
1
- import{useEntityForm as a}from"./hooks/useEntityForm";import{useEntityField as t}from"./hooks/useEntityField";import{useController as e}from"./hooks/useController";import{isFieldEditable as s,getFieldsForOperation as i,validateEntity as l,translateFieldLabel as r,translateLabel as o}from"./utils";export{i as getFieldsForOperation,s as isFieldEditable,r as translateFieldLabel,o as translateLabel,e as useController,t as useEntityField,a as useEntityForm,l as validateEntity};
1
+ import{useEntityForm as r}from"./hooks/useEntityForm";import{useEntityField as l}from"./hooks/useEntityField";import{useController as a}from"./hooks/useController";import{isFieldEditable as s,getFieldsForOperation as d,validateEntity as F,translateFieldLabel as m,translateLabel as p}from"./utils";export{d as getFieldsForOperation,s as isFieldEditable,m as translateFieldLabel,p as translateLabel,a as useController,l as useEntityField,r as useEntityForm,F as validateEntity};
@@ -1 +1 @@
1
- function l(r,i){if(i in r)return r[i];const o=i.replace(/_([a-z])/g,(t,n)=>n.toUpperCase());if(o!==i&&o in r)return r[o]}function s(r,i){if(i in r)return!0;const o=i.replace(/_([a-z])/g,(t,n)=>n.toUpperCase());return o!==i&&o in r}function u(r,i){const o=i??{},t={...o};return Object.entries(r.fields).forEach(([n,e])=>{const p=l(t,n);p!==void 0&&!(n in t)&&(t[n]=p);const c=!s(o,n)||p===null||p===void 0;if(e.type==="switch"){if(p==null){const a=e.options?.fieldSpecific;t[n]=a?.uncheckedValue??!1}}else c&&(e.type==="price"?t[n]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:e.type==="checkbox"||e.type==="boolean"?t[n]=!1:e.type==="text"||e.type==="textarea"||e.type==="email"||e.type==="url"||e.type==="tel"||e.type==="iban"||e.type==="password"||e.type==="color"?t[n]="":(e.type==="number"||e.type==="range"||e.type==="rating")&&(t[n]=void 0))}),t}function y(r){return u(r,{})}export{u as buildInitialFromRecord,y as buildSchemaDefaults};
1
+ function y(n,c){if(c in n)return n[c];const r=c.replace(/_([a-z])/g,(u,e)=>e.toUpperCase());if(r!==c&&r in n)return n[r]}function o(n,c){if(c in n)return!0;const r=c.replace(/_([a-z])/g,(u,e)=>e.toUpperCase());return r!==c&&r in n}function b(n,c){const r=c??{},u={...r};return Object.entries(n.fields).forEach(([e,t])=>{const s=y(u,e);s!==void 0&&!(e in u)&&(u[e]=s);const p=!o(r,e)||s===null||s===void 0;if(t.type==="switch"){if(s==null){const a=t.options?.fieldSpecific;u[e]=a?.uncheckedValue??!1}}else p&&(t.type==="price"?u[e]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:t.type==="checkbox"||t.type==="boolean"?u[e]=!1:t.type==="text"||t.type==="textarea"||t.type==="email"||t.type==="url"||t.type==="tel"||t.type==="iban"||t.type==="password"||t.type==="color"?u[e]="":(t.type==="number"||t.type==="range"||t.type==="rating")&&(u[e]=void 0))}),u}function h(n){return b(n,{})}export{b as buildInitialFromRecord,h as buildSchemaDefaults};
@@ -1 +1 @@
1
- import{isFieldVisible as u}from"@donotdev/core";import{isFieldEditable as m}from"./isFieldEditable";function g(i,d){const{operation:e,viewerRole:r,availableFields:l}=d,n=r??"guest",f=i&&typeof i=="object"&&"fields"in i&&"name"in i?i.fields:i,b=Object.entries(f),s=[];for(const[a,p]of b){const t=p,o=t.visibility||"guest";if(!u(o,n)||e==="create"&&o==="technical"||e==="edit"&&l&&!l.includes(a))continue;let c=m(t.editable,n,e);e==="edit"&&o==="technical"&&t.editable===void 0&&(c=!1),s.push({name:a,config:t,editable:c})}return s}export{g as getFieldsForOperation};
1
+ import{isFieldVisible as p}from"@donotdev/core";import{isFieldEditable as m}from"./isFieldEditable";function g(e,r){const{operation:i,viewerRole:d,availableFields:l}=r,n=d??"guest",a=e&&typeof e=="object"&&"fields"in e&&"name"in e?e.fields:e,u=Object.entries(a),s=[];for(const[c,b]of u){const o=b,t=o.visibility||"guest";if(!p(t,n)||i==="create"&&t==="technical"||i==="edit"&&l&&!l.includes(c))continue;let f=m(o.editable,n,i);i==="edit"&&t==="technical"&&o.editable===void 0&&(f=!1),s.push({name:c,config:o,editable:f})}return s}export{g as getFieldsForOperation};
@@ -1 +1 @@
1
- import{isFieldEditable as a}from"./isFieldEditable";import{getFieldsForOperation as t}from"./getFieldsForOperation";import{validateEntity as e}from"./validateEntity";import{translateFieldLabel as i,translateLabel as l}from"./translateFieldLabel";export{t as getFieldsForOperation,a as isFieldEditable,i as translateFieldLabel,l as translateLabel,e as validateEntity};
1
+ import{isFieldEditable as r}from"./isFieldEditable";import{getFieldsForOperation as o}from"./getFieldsForOperation";import{validateEntity as i}from"./validateEntity";import{translateFieldLabel as p,translateLabel as f}from"./translateFieldLabel";export{o as getFieldsForOperation,r as isFieldEditable,p as translateFieldLabel,f as translateLabel,i as validateEntity};
@@ -1 +1 @@
1
- import{hasRoleAccess as t,USER_ROLES as o}from"@donotdev/core";function s(e,a,i){return e===void 0||e===!0?!0:e===!1?!1:e==="admin"?t(a,o.ADMIN):e==="create-only"?i==="create":!0}export{s as isFieldEditable};
1
+ import{hasRoleAccess as t,USER_ROLES as u}from"@donotdev/core";function i(r,e,n){return r===void 0||r===!0?!0:r===!1?!1:r==="admin"?t(e,u.ADMIN):r==="create-only"?n==="create":!0}export{i as isFieldEditable};
@@ -1 +1 @@
1
- function i(e,r){if(typeof e=="string"&&e.includes(":")){const n=e.split(":"),t=n[1]??e,s=n[0];if(t.startsWith("status.")){const a=r(t);return a!==t&&a!==`${s}:${t}`?a:r(t,{ns:s})}return r(t,{ns:s})}return r(e)}function l(e,r,n){const t=r?.label||e;return i(t,n)}export{l as translateFieldLabel,i as translateLabel};
1
+ function a(n,s){if(typeof n=="string"&&n.includes(":")){const r=n.split(":"),t=r[1]??n,e=r[0];if(t.startsWith("status.")){const i=s(t);return i!==t&&i!==`${e}:${t}`?i:s(t,{ns:e})}return s(t,{ns:e})}return s(n)}function o(n,s,r){const t=s?.label||n;return a(t,r)}export{o as translateFieldLabel,a as translateLabel};
@@ -1 +1 @@
1
- import*as o from"valibot";import{createSchemas as m}from"@donotdev/core";function i(t,r,c="create"){const e=m(t),u={create:e.create,draft:e.draft,update:e.update,full:e.get}[c],s=o.safeParse(u,r);return s.success?{success:!0,data:s.output}:{success:!1,issues:s.issues.map(a=>({path:a.path?.map(p=>p.key).join(".")||"",message:a.message}))}}export{i as validateEntity};
1
+ import*as o from"valibot";import{createSchemas as p}from"@donotdev/core";function h(a,c,r="create"){const s=p(a),u={create:s.create,draft:s.draft,update:s.update,full:s.get}[r],e=o.safeParse(u,c);return e.success?{success:!0,data:e.output}:{success:!1,issues:e.issues.map(t=>({path:t.path?.map(m=>m.key).join(".")||"",message:t.message}))}}export{h as validateEntity};
@@ -1 +1 @@
1
- import{useFileUpload as e}from"./useFileUpload";import{useUnsavedChangesWarning as s}from"./useUnsavedChangesWarning";import{useEntityFavorites as a}from"./useEntityFavorites";import{useCrudFilters as r}from"./useCrudFilters";import{useRelatedItems as o}from"./useRelatedItems";import{useFieldConditions as i}from"./useFieldConditions";import{useReferenceResolver as t}from"./useReferenceResolver";export{r as useCrudFilters,a as useEntityFavorites,i as useFieldConditions,e as useFileUpload,t as useReferenceResolver,o as useRelatedItems,s as useUnsavedChangesWarning};
1
+ import{useFileUpload as o}from"./useFileUpload";import{useUnsavedChangesWarning as t}from"./useUnsavedChangesWarning";import{useEntityFavorites as i}from"./useEntityFavorites";import{useCrudFilters as n}from"./useCrudFilters";import{useRelatedItems as u}from"./useRelatedItems";import{useFieldConditions as a}from"./useFieldConditions";import{useReferenceResolver as l}from"./useReferenceResolver";export{n as useCrudFilters,i as useEntityFavorites,a as useFieldConditions,o as useFileUpload,l as useReferenceResolver,u as useRelatedItems,t as useUnsavedChangesWarning};
@@ -1 +1 @@
1
- import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";const c={};function u(r){const{collection:e}=r,i=s(t=>t.collections[e]?.ui?.filters??c),l=o(t=>{s.getState().setFilters(e,t)},[e]),n=s(t=>t.collections[e]?.ui?.showFavoritesOnly??!1),a=o(t=>{s.getState().setShowFavoritesOnly(e,t)},[e]);return{filters:i,setFilters:l,showFavoritesOnly:n,setShowFavoritesOnly:a}}export{u as useCrudFilters};
1
+ import{useCallback as o}from"react";import{useCrudStore as s}from"../CrudStore";const a={};function f(r){const{collection:e}=r,l=s(t=>t.collections[e]?.ui?.filters??a),i=o(t=>{s.getState().setFilters(e,t)},[e]),n=s(t=>t.collections[e]?.ui?.showFavoritesOnly??!1),c=o(t=>{s.getState().setShowFavoritesOnly(e,t)},[e]);return{filters:l,setFilters:i,showFavoritesOnly:n,setShowFavoritesOnly:c}}export{f as useCrudFilters};
@@ -1 +1 @@
1
- import{useCallback as o}from"react";import{useLocalStorage as p}from"@donotdev/core";function y(s={}){const{storageKey:l,collection:u="entities"}=s,d=l||`favorites-${u}`,{value:t,setValue:a,isLoaded:c}=p(d,{defaultValue:[]}),v=o(e=>t.includes(e),[t]),n=o(e=>{a(i=>i.includes(e)?i.filter(r=>r!==e):[...i,e])},[a]),f=o(e=>{a(i=>i.includes(e)?i:[...i,e])},[a]),F=o(e=>{a(i=>i.filter(r=>r!==e))},[a]),m=o(()=>{a([])},[a]),g=o(e=>t.includes(e.id),[t]);return{favorites:t,isFavorite:v,toggleFavorite:n,addFavorite:f,removeFavorite:F,clearFavorites:m,favoritesFilter:g,isLoaded:c}}export{y as useEntityFavorites};
1
+ import{useCallback as r}from"react";import{useLocalStorage as y}from"@donotdev/core";function V(n={}){const{storageKey:a,collection:c="entities"}=n,u=a||`favorites-${c}`,{value:s,setValue:o,isLoaded:l}=y(u,{defaultValue:[]}),f=r(t=>s.includes(t),[s]),v=r(t=>{o(e=>e.includes(t)?e.filter(i=>i!==t):[...e,t])},[o]),F=r(t=>{o(e=>e.includes(t)?e:[...e,t])},[o]),d=r(t=>{o(e=>e.filter(i=>i!==t))},[o]),m=r(()=>{o([])},[o]),g=r(t=>s.includes(t.id),[s]);return{favorites:s,isFavorite:f,toggleFavorite:v,addFavorite:F,removeFavorite:d,clearFavorites:m,favoritesFilter:g,isLoaded:l}}export{V as useEntityFavorites};
@@ -1 +1 @@
1
- "use client";import{useMemo as s}from"react";import{useWatch as c}from"react-hook-form";import{evaluateFieldConditions as f}from"@donotdev/core";function u(o,r){const t=c({control:r}),e=s(()=>o.some(n=>n.config.conditions),[o]);return s(()=>{if(!e)return{};const n={};for(const i of o)i.config.conditions&&(n[i.name]=f(i.config.conditions,t));return n},[o,t,e])}export{u as useFieldConditions};
1
+ "use client";import{useMemo as r}from"react";import{useWatch as c}from"react-hook-form";import{evaluateFieldConditions as u}from"@donotdev/core";function d(o,s){const t=c({control:s}),e=r(()=>o.some(n=>n.config.conditions),[o]);return r(()=>{if(!e)return{};const n={};for(const i of o)i.config.conditions&&(n[i.name]=u(i.config.conditions,t));return n},[o,t,e])}export{d as useFieldConditions};
@@ -1 +1 @@
1
- "use client";import{useState as T,useCallback as v,useEffect as A,useRef as g,startTransition as q}from"react";import{handleError as C}from"@donotdev/core";import{useUploadContext as G}from"../contexts/UploadContext";import{useUploadStore as N}from"../stores/UploadStore";let W=0;function k(s){if(s){const u=s.split("/").pop()?.split("?")[0];if(u)return`file-${u}`}W+=1;const a=typeof performance<"u"?performance.now():Date.now(),p=Math.random().toString(36).slice(2,11);return`file-${W}-${a}-${p}`}function H(s){return URL.createObjectURL(s)}function B(s){s.startsWith("blob:")&&URL.revokeObjectURL(s)}function K(s,a,p){return a.length>0&&!a.some(u=>{if(u.endsWith("/*")){const h=u.slice(0,-2);return s.type.startsWith(h)}return s.type===u})?{valid:!1,error:`File type ${s.type} not accepted`}:s.size>p?{valid:!1,error:`File exceeds ${(p/1048576).toFixed(0)}MB limit`}:{valid:!0}}function Q({name:s,value:a,onChange:p,multiple:u=!1,maxFiles:h=10,maxSize:$=10*1024*1024,accept:S=[],storagePath:V="uploads",uploadFn:U}){const y=G(),w=!!y,[d,c]=T([]),R=g(!1),b=g(null),L=g(a),x=g([]),F=g(!1),E=g(null);A(()=>{if(R.current){R.current=!1;return}const n=a?JSON.stringify((Array.isArray(a)?a:[a]).map(i=>i.fullUrl).filter(Boolean)):null;n!==b.current&&(b.current=n,L.current=a,q(()=>{if(a){const i=(Array.isArray(a)?a:[a]).filter(t=>t.fullUrl).map((t,r)=>({id:`${k(t.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:t.thumbUrl||t.fullUrl,progress:100,uploaded:t,error:null}));c(i)}else c([])}))},[a]),A(()=>{x.current=d},[d]),A(()=>{F.current&&(F.current=!1,E.current?.(d,!0))},[d]),A(()=>()=>{x.current.forEach(n=>B(n.previewURL))},[]);const f=v((n,i=!1)=>{const t=(i?n.filter(l=>!l.error):n.filter(l=>l.uploaded&&!l.error)).map(l=>l.uploaded?l.uploaded:i&&w?{fullUrl:l.previewURL,thumbUrl:l.previewURL}:null).filter(l=>l!==null);let r;u?r=t.length>0?t:null:r=t[0]||null;const e=L.current;(()=>{if(!r&&!e)return!1;if(!r||!e)return!0;if(u&&Array.isArray(r)&&Array.isArray(e)){if(r.length!==e.length)return!0;const l=r.map(m=>m.fullUrl).join(","),o=e.map(m=>m.fullUrl).join(",");return l!==o}return!u&&!Array.isArray(r)&&!Array.isArray(e)?r.fullUrl!==e.fullUrl:!0})()&&(R.current=!0,L.current=r,p(r))},[u,p,w]);E.current=f;const M=v(async()=>{if(!U)return;let n=[];if(c(t=>(n=t.filter(r=>!r.uploaded&&!r.error),n.length===0?t:t.map(r=>n.some(e=>e.id===r.id)?{...r,progress:0}:r))),n.length===0)return;const i=await Promise.allSettled(n.map(async t=>{try{const r=await U(t.file,e=>{c(l=>l.map(o=>o.id===t.id?{...o,progress:e}:o))});return{id:t.id,picture:r,error:null}}catch(r){const e=r instanceof Error?r.message:"Upload failed";return{id:t.id,picture:null,error:e}}}));c(t=>{const r=t.map(e=>{const l=i.find(o=>o.status==="fulfilled"&&o.value.id===e.id);if(l&&l.status==="fulfilled"){const o=l.value;return{...e,uploaded:o.picture,progress:o.picture?100:null,error:o.error}}return e});return f(r,!1),r})},[U,f]),j=g(M);j.current=M,A(()=>{if(!(!y||!s))return N.getState().registerUpload(y,s,async()=>{await j.current()},()=>x.current.some(n=>!n.uploaded&&!n.error)),()=>{N.getState().unregisterUpload(y,s)}},[y,s]);const O=v(async n=>{if(U){c(i=>i.map(t=>t.id===n.id?{...t,progress:0}:t));try{const i=await U(n.file,t=>{c(r=>r.map(e=>e.id===n.id?{...e,progress:t}:e))});c(t=>{const r=t.map(e=>e.id===n.id?{...e,uploaded:i,progress:100,error:null}:e);return f(r,!1),r})}catch(i){const t=i instanceof Error?i.message:"Upload failed";c(r=>r.map(e=>e.id===n.id?{...e,error:t,progress:null}:e))}}},[U,f]),D=v(n=>{c(i=>{const t=(u?h:1)-i.length;if(t<=0)return C(new Error("Maximum files reached"),{userMessage:u?`Maximum ${h} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),i;const r=n.slice(0,t),e=[];for(const o of r){const m=K(o,S,$);if(!m.valid){C(new Error(m.error),{userMessage:m.error,severity:"warning",showNotification:!0});continue}e.push({id:k(),file:o,previewURL:H(o),progress:null,uploaded:null,error:null})}if(e.length===0)return i;const l=u?[...i,...e]:e;return w?F.current=!0:e.forEach(o=>O(o)),l})},[u,h,S,$,w,O,f]),z=v(n=>{c(i=>{const t=i.find(e=>e.id===n);t&&B(t.previewURL);const r=i.filter(e=>e.id!==n);return f(r,!1),r})},[f]),I=d.some(n=>!n.uploaded&&!n.error),J=d.some(n=>n.progress!==null&&n.progress<100),P=d.length>0?d.reduce((n,i)=>n+(i.progress??0),0)/d.length:0;return{files:d,addFiles:D,removeFile:z,hasPending:I,isUploading:J,progress:P,formId:y,isDeferred:w}}export{Q as useFileUpload};
1
+ "use client";import{useState as G,useCallback as A,useEffect as L,useRef as U,startTransition as H}from"react";import{handleError as k}from"@donotdev/core";import{useUploadContext as K}from"../contexts/UploadContext";import{useUploadStore as B}from"../stores/UploadStore";let D=0;function M(l){if(l){const a=l.split("/").pop()?.split("?")[0];if(a)return`file-${a}`}D+=1;const u=typeof performance<"u"?performance.now():Date.now(),g=Math.random().toString(36).slice(2,11);return`file-${D}-${u}-${g}`}function Q(l){return URL.createObjectURL(l)}function T(l){l.startsWith("blob:")&&URL.revokeObjectURL(l)}function X(l,u,g){return u.length>0&&!u.some(m=>{if(m.endsWith("/*")){const E=m.slice(0,-2);return l.type.startsWith(E)}return l.type===m})?{valid:!1,error:`File type ${l.type} not accepted`}:l.size>g?{valid:!1,error:`File exceeds ${(g/1048576).toFixed(0)}MB limit`}:{valid:!0}}function er({name:l,value:u,onChange:g,multiple:a=!1,maxFiles:m=10,maxSize:E=10*1024*1024,accept:P=[],storagePath:Y="uploads",uploadFn:h}){const w=K(),y=!!w,[f,d]=G([]),v=U(!1),S=U(null),F=U(u),$=U([]),b=U(!1),C=U(null);L(()=>{if(v.current){v.current=!1;return}const t=u?JSON.stringify((Array.isArray(u)?u:[u]).map(s=>s.fullUrl).filter(Boolean)):null;t!==S.current&&(S.current=t,F.current=u,H(()=>{if(u){const n=(Array.isArray(u)?u:[u]).filter(e=>e.fullUrl).map((e,r)=>({id:`${M(e.fullUrl)}-existing-${r}`,file:new File([],"existing"),previewURL:e.thumbUrl||e.fullUrl,progress:100,uploaded:e,error:null}));d(n)}else d([])}))},[u]),L(()=>{$.current=f},[f]),L(()=>{b.current&&(b.current=!1,C.current?.(f,!0))},[f]),L(()=>()=>{$.current.forEach(t=>T(t.previewURL))},[]);const p=A((t,s=!1)=>{const e=(s?t.filter(o=>!o.error):t.filter(o=>o.uploaded&&!o.error)).map(o=>o.uploaded?o.uploaded:s&&y?{fullUrl:o.previewURL,thumbUrl:o.previewURL}:null).filter(o=>o!==null);let r;a?r=e.length>0?e:null:r=e[0]||null;const i=F.current;(()=>{if(!r&&!i)return!1;if(!r||!i)return!0;if(a&&Array.isArray(r)&&Array.isArray(i)){if(r.length!==i.length)return!0;const o=r.map(x=>x.fullUrl).join(","),R=i.map(x=>x.fullUrl).join(",");return o!==R}return!a&&!Array.isArray(r)&&!Array.isArray(i)?r.fullUrl!==i.fullUrl:!0})()&&(v.current=!0,F.current=r,g(r))},[a,g,y]);C.current=p;const I=A(async()=>{if(!h)return;let t=[];if(d(n=>(t=n.filter(e=>!e.uploaded&&!e.error),t.length===0?n:n.map(e=>t.some(r=>r.id===e.id)?{...e,progress:0}:e))),t.length===0)return;const s=await Promise.allSettled(t.map(async n=>{try{const e=await h(n.file,r=>{d(i=>i.map(c=>c.id===n.id?{...c,progress:r}:c))});return{id:n.id,picture:e,error:null}}catch(e){const r=e instanceof Error?e.message:"Upload failed";return{id:n.id,picture:null,error:r}}}));d(n=>{const e=n.map(r=>{const i=s.find(c=>c.status==="fulfilled"&&c.value.id===r.id);if(i&&i.status==="fulfilled"){const c=i.value;return{...r,uploaded:c.picture,progress:c.picture?100:null,error:c.error}}return r});return p(e,!1),e})},[h,p]),N=U(I);N.current=I,L(()=>{if(!(!w||!l))return B.getState().registerUpload(w,l,async()=>{await N.current()},()=>$.current.some(t=>!t.uploaded&&!t.error)),()=>{B.getState().unregisterUpload(w,l)}},[w,l]);const j=A(async t=>{if(h){d(s=>s.map(n=>n.id===t.id?{...n,progress:0}:n));try{const s=await h(t.file,n=>{d(e=>e.map(r=>r.id===t.id?{...r,progress:n}:r))});d(n=>{const e=n.map(r=>r.id===t.id?{...r,uploaded:s,progress:100,error:null}:r);return p(e,!1),e})}catch(s){const n=s instanceof Error?s.message:"Upload failed";d(e=>e.map(r=>r.id===t.id?{...r,error:n,progress:null}:r))}}},[h,p]),V=A(t=>{d(s=>{const e=(a?m:1)-s.length;if(e<=0)return k(new Error("Maximum files reached"),{userMessage:a?`Maximum ${m} files allowed`:"Only one file allowed",severity:"warning",showNotification:!0}),s;const r=t.slice(0,e),i=[];for(const o of r){const R=X(o,P,E);if(!R.valid){k(new Error(R.error),{userMessage:R.error,severity:"warning",showNotification:!0});continue}i.push({id:M(),file:o,previewURL:Q(o),progress:null,uploaded:null,error:null})}if(i.length===0)return s;const c=a?[...s,...i]:i;return y?b.current=!0:i.forEach(o=>j(o)),c})},[a,m,P,E,y,j,p]),O=A(t=>{d(s=>{const n=s.find(r=>r.id===t);n&&T(n.previewURL);const e=s.filter(r=>r.id!==t);return p(e,!1),e})},[p]),W=f.some(t=>!t.uploaded&&!t.error),J=f.some(t=>t.progress!==null&&t.progress<100),q=f.length>0?f.reduce((t,s)=>t+(s.progress??0),0)/f.length:0;return{files:f,addFiles:V,removeFile:O,hasPending:W,isUploading:J,progress:q,formId:w,isDeferred:y}}export{er as useFileUpload};
@@ -1 +1 @@
1
- "use client";import{useMemo as p}from"react";import{buildReferenceLabel as v}from"../components/controlled/select/ControlledReferenceField";import{useCrudList as c}from"../useCrudList";function R(n){const o=new Map;for(const i of Object.values(n.fields)){const e=i.validation?.reference;if(typeof e=="string"&&!o.has(e)){const l=i.options?.fieldSpecific;o.set(e,{collection:e,labelFields:l?.labelFields,displayField:l?.displayField})}}return Array.from(o.values())}function M(n){const o=p(()=>R(n),[n]),i=o[0],e=o[1],l=o[2],s=o[3],{items:d}=c(i?.collection??"__disabled_0__",{enabled:!!i}),{items:a}=c(e?.collection??"__disabled_1__",{enabled:!!e}),{items:f}=c(l?.collection??"__disabled_2__",{enabled:!!l}),{items:r}=c(s?.collection??"__disabled_3__",{enabled:!!s}),F=[{info:i,items:d},{info:e,items:a},{info:l,items:f},{info:s,items:r}];return p(()=>{const _={};for(const{info:t,items:m}of F){if(!t||!m.length)continue;const b={};for(const y of m){const u=y;b[u.id]=v(u,t.labelFields,t.displayField)}_[t.collection]=b}return _},[i?.collection,d,e?.collection,a,l?.collection,f,s?.collection,r])}export{M as useReferenceResolver};
1
+ "use client";import{useMemo as p}from"react";import{buildReferenceLabel as v}from"../components/controlled/select/ControlledReferenceField";import{useCrudList as c}from"../useCrudList";function y(t){const o=new Map;for(const i of Object.values(t.fields)){const e=i.validation?.reference;if(typeof e=="string"&&!o.has(e)){const l=i.options?.fieldSpecific;o.set(e,{collection:e,labelFields:l?.labelFields,displayField:l?.displayField})}}return Array.from(o.values())}function M(t){const o=p(()=>y(t),[t]),i=o[0],e=o[1],l=o[2],s=o[3],{items:f}=c(i?.collection??"__disabled_0__",{enabled:!!i}),{items:r}=c(e?.collection??"__disabled_1__",{enabled:!!e}),{items:d}=c(l?.collection??"__disabled_2__",{enabled:!!l}),{items:a}=c(s?.collection??"__disabled_3__",{enabled:!!s}),F=[{info:i,items:f},{info:e,items:r},{info:l,items:d},{info:s,items:a}];return p(()=>{const m={};for(const{info:n,items:_}of F){if(!n||!_.length)continue;const u={};for(const R of _){const b=R;u[b.id]=v(b,n.labelFields,n.displayField)}m[n.collection]=u}return m},[i?.collection,f,e?.collection,r,l?.collection,d,s?.collection,a])}export{M as useReferenceResolver};
@@ -1 +1 @@
1
- "use client";import{useMemo as g}from"react";function p(a,e,t,n,N={}){const{limit:o=3,tolerance:m=.2}=N,c=g(()=>{if(!e||!t||t.length===0||n.length===0)return[];const b=e.id;return t.filter(f=>f.id===b?!1:n.some(i=>{const r=a.fields[i];if(!r)return!1;const s=e[i],u=f[i];if(s==null||u==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const l=Number(s),h=Number(u);if(isNaN(l)||isNaN(h))return!1;const d=Math.abs(l*m);return Math.abs(h-l)<=d}return String(s)===String(u)})).slice(0,o)},[e,t,n,a.fields,o,m]);return{items:c,hasItems:c.length>0}}export{p as useRelatedItems};
1
+ "use client";import{useMemo as N}from"react";function y(f,e,n,t,p={}){const{limit:l=3,tolerance:a=.2}=p,c=N(()=>{if(!e||!n||n.length===0||t.length===0)return[];const h=e.id;return n.filter(g=>g.id===h?!1:t.some(s=>{const r=f.fields[s];if(!r)return!1;const u=e[s],i=g[s];if(u==null||i==null)return!1;if(r.type==="number"||r.type==="range"||r.type==="year"){const o=Number(u),b=Number(i);if(isNaN(o)||isNaN(b))return!1;const m=Math.abs(o*a);return Math.abs(b-o)<=m}return String(u)===String(i)})).slice(0,l)},[e,n,t,f.fields,l,a]);return{items:c,hasItems:c.length>0}}export{y as useRelatedItems};
@@ -1 +1 @@
1
- "use client";import{useEffect as t}from"react";import{isClient as s}from"@donotdev/core";function u({isDirty:n,enabled:r=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}){t(()=>{if(!r||!n||!s())return;const a=o=>(o.preventDefault(),o.returnValue=e,e);return window.addEventListener("beforeunload",a),()=>{window.removeEventListener("beforeunload",a)}},[n,r,e])}export{u as useUnsavedChangesWarning};
1
+ "use client";import{useEffect as u}from"react";import{isClient as a}from"@donotdev/core";function d({isDirty:n,enabled:r=!0,message:e="You have unsaved changes. Are you sure you want to leave?"}){u(()=>{if(!r||!n||!a())return;const o=t=>(t.preventDefault(),t.returnValue=e,e);return window.addEventListener("beforeunload",o),()=>{window.removeEventListener("beforeunload",o)}},[n,r,e])}export{d as useUnsavedChangesWarning};
package/dist/index.d.ts CHANGED
@@ -20,6 +20,11 @@ export { OPTIMISTIC_STATUSES, CRUD_OPERATION } from './types';
20
20
  export { loadDeterministicRange, upsertDeterministic, appendToCollection, } from './utils/collections';
21
21
  export { getFieldRegistry, registerFieldType, isFieldTypeRegistered, type FieldTypeRegistration, type ControlledFieldProps, type UncontrolledFieldProps, } from './FieldRegistry';
22
22
  export { registerBuiltinFieldType, getFieldTypeMetadata, getFilterType, getDisplayFormatter, isFilterable, getValueType, clearFieldTypeRegistry, type FieldTypeMetadata, type FilterType, type ValueType, type DisplayFormatter, type ComponentRegistration, } from './fieldTypeRegistry';
23
+ /**
24
+ * @deprecated No-op shim. Built-in field types are now auto-registered via
25
+ * `fieldTypeRegistry.ts` → `registerBuiltinFieldTypes.tsx` side-effect chain.
26
+ * Exported for backward compatibility with consumers that call it at startup.
27
+ */
23
28
  export { registerBuiltinFieldTypes } from './builtinFieldTypes';
24
29
  export { useEntityForm, useEntityField, useController, isFieldEditable, getFieldsForOperation, validateEntity, translateFieldLabel, translateLabel, } from './forms';
25
30
  export type { ViewerRole, RenderableField, GetFieldsForOperationOptions, EntityFieldsInput, SchemaOperation, ValidationIssue, ValidationResult, InferEntityData, InferEntityInput, InferEntityOutput, UseEntityFormOptions, EntityFormReturn, EntityFieldReturn, UseControllerProps, UseControllerReturn, ControllerRenderProps, ControllerFieldState, } from './forms';
@@ -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,EACd,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAGhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAG9F,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"}
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;AAE7B;;;;GAIG;AACH,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,EACd,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAGhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAG9F,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 e}from"./adapters/FunctionsAdapter";import{getCrudService as a}from"./CrudService";import{useCrudStore as s}from"./CrudStore";import{OPTIMISTIC_STATUSES as t,CRUD_OPERATION as r}from"./types";import{loadDeterministicRange as i,upsertDeterministic as l,appendToCollection as o}from"./utils/collections";import{getFieldRegistry as d,registerFieldType as p,isFieldTypeRegistered as n}from"./FieldRegistry";import{registerBuiltinFieldType as m,getFieldTypeMetadata as F,getFilterType as u,getDisplayFormatter as f,isFilterable as y,getValueType as g,clearFieldTypeRegistry as c}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as T}from"./builtinFieldTypes";import{useEntityForm as S,useEntityField as C,useController as R,isFieldEditable as U,getFieldsForOperation as b,validateEntity as v,translateFieldLabel as E,translateLabel as h}from"./forms";import{UploadProvider as k,useUploadContext as W}from"./contexts";import{useFileUpload as w,useUnsavedChangesWarning as I,useEntityFavorites as x,useRelatedItems as B,useCrudFilters as O,useFieldConditions as P,useReferenceResolver as D}from"./hooks";import{isStorageUrl as A,validatePicture as L,checkForBlobUrls as M,hasBlobUrls as V}from"./utils/uploadValidation";import{defineWorkflow as _,useEntityWorkflow as N,saveWorkflowState as q,loadWorkflowState as z,clearWorkflowState as H}from"./workflows";import{formatValue as J}from"./components/DisplayFieldRenderer";import{buildReferenceLabel as K}from"./components/controlled/select/ControlledReferenceField";import{matchesFilter as Q}from"./utils/matchesFilter";import{applyFilters as X,applySearch as Y,applySort as Z,getSearchableFields as j}from"./utils/clientListProcessing";export{r as CRUD_OPERATION,e as FunctionsAdapter,t as OPTIMISTIC_STATUSES,k as UploadProvider,o as appendToCollection,X as applyFilters,Y as applySearch,Z as applySort,K as buildReferenceLabel,M as checkForBlobUrls,c as clearFieldTypeRegistry,H as clearWorkflowState,_ as defineWorkflow,J as formatValue,a as getCrudService,f as getDisplayFormatter,d as getFieldRegistry,F as getFieldTypeMetadata,b as getFieldsForOperation,u as getFilterType,j as getSearchableFields,g as getValueType,V as hasBlobUrls,U as isFieldEditable,n as isFieldTypeRegistered,y as isFilterable,A as isStorageUrl,i as loadDeterministicRange,z as loadWorkflowState,Q as matchesFilter,m as registerBuiltinFieldType,T as registerBuiltinFieldTypes,p as registerFieldType,q as saveWorkflowState,E as translateFieldLabel,h as translateLabel,l as upsertDeterministic,R as useController,O as useCrudFilters,s as useCrudStore,x as useEntityFavorites,C as useEntityField,S as useEntityForm,N as useEntityWorkflow,P as useFieldConditions,w as useFileUpload,D as useReferenceResolver,B as useRelatedItems,I as useUnsavedChangesWarning,W as useUploadContext,v as validateEntity,L as validatePicture};
1
+ export*from"./useCrud";export*from"./useCrudList";export*from"./useCrudCardList";export*from"./components";export*from"./stores";import{FunctionsAdapter as s}from"./adapters/FunctionsAdapter";import{getCrudService as d}from"./CrudService";import{useCrudStore as m}from"./CrudStore";import{OPTIMISTIC_STATUSES as F,CRUD_OPERATION as u}from"./types";import{loadDeterministicRange as y,upsertDeterministic as g,appendToCollection as c}from"./utils/collections";import{getFieldRegistry as S,registerFieldType as C,isFieldTypeRegistered as R}from"./FieldRegistry";import{registerBuiltinFieldType as U,getFieldTypeMetadata as v,getFilterType as E,getDisplayFormatter as h,isFilterable as k,getValueType as W,clearFieldTypeRegistry as w}from"./fieldTypeRegistry";import{registerBuiltinFieldTypes as B}from"./builtinFieldTypes";import{useEntityForm as O,useEntityField as P,useController as A,isFieldEditable as L,getFieldsForOperation as M,validateEntity as V,translateFieldLabel as _,translateLabel as N}from"./forms";import{UploadProvider as q,useUploadContext as z}from"./contexts";import{useFileUpload as H,useUnsavedChangesWarning as J,useEntityFavorites as K,useRelatedItems as Q,useCrudFilters as X,useFieldConditions as Y,useReferenceResolver as Z}from"./hooks";import{isStorageUrl as ee,validatePicture as re,checkForBlobUrls as te,hasBlobUrls as oe}from"./utils/uploadValidation";import{defineWorkflow as ie,useEntityWorkflow as ae,saveWorkflowState as se,loadWorkflowState as pe,clearWorkflowState as de}from"./workflows";import{formatValue as me}from"./components/DisplayFieldRenderer";import{buildReferenceLabel as Fe}from"./components/controlled/select/ControlledReferenceField";import{matchesFilter as xe}from"./utils/matchesFilter";import{applyFilters as ge,applySearch as ce,applySort as Te,getSearchableFields as Se}from"./utils/clientListProcessing";export{u as CRUD_OPERATION,s as FunctionsAdapter,F as OPTIMISTIC_STATUSES,q as UploadProvider,c as appendToCollection,ge as applyFilters,ce as applySearch,Te as applySort,Fe as buildReferenceLabel,te as checkForBlobUrls,w as clearFieldTypeRegistry,de as clearWorkflowState,ie as defineWorkflow,me as formatValue,d as getCrudService,h as getDisplayFormatter,S as getFieldRegistry,v as getFieldTypeMetadata,M as getFieldsForOperation,E as getFilterType,Se as getSearchableFields,W as getValueType,oe as hasBlobUrls,L as isFieldEditable,R as isFieldTypeRegistered,k as isFilterable,ee as isStorageUrl,y as loadDeterministicRange,pe as loadWorkflowState,xe as matchesFilter,U as registerBuiltinFieldType,B as registerBuiltinFieldTypes,C as registerFieldType,se as saveWorkflowState,_ as translateFieldLabel,N as translateLabel,g as upsertDeterministic,A as useController,X as useCrudFilters,m as useCrudStore,K as useEntityFavorites,P as useEntityField,O as useEntityForm,ae as useEntityWorkflow,Y as useFieldConditions,H as useFileUpload,Z as useReferenceResolver,Q as useRelatedItems,J as useUnsavedChangesWarning,z as useUploadContext,V as validateEntity,re as validatePicture};
@@ -1 +1 @@
1
- "use client";import{jsx as p,jsxs as u}from"react/jsx-runtime";import{Text as f,Stack as b,ImageGallery as $,Rating as I,CopyToClipboard as j}from"@donotdev/components";import{formatCurrency as F,maybeTranslate as N}from"@donotdev/core";import{ControlledCheckboxField as A,ControlledComboboxField as M,ControlledDateField as v,ControlledDropdownField as P,ControlledFileField as B,ControlledMultiFileField as R,ControlledDocumentField as _,ControlledMultiDocumentField as E,ControlledGeoPointField as U,ControlledImageField as H,ControlledMapField as K,ControlledMultiDropdownField as Y,ControlledMultiInputField as G,ControlledNumberField as O,ControlledPasswordField as J,ControlledPhoneField as W,ControlledRangeField as q,ControlledRatingField as Q,ControlledDurationField as X,ControlledRadioField as Z,ControlledReferenceField as ee,ControlledYearField as te,ControlledTextField as m,ControlledTextareaField as re,ControlledRichTextField as oe,ControlledTimestampField as ne,ControlledAddressField as le,ControlledFieldArrayField as ae,ControlledSwitchField as ie,ControlledMultiImageField as ce,ControlledGdprConsentField as se,ControlledCurrencyField as pe,ControlledPriceField as de}from"./components/controlled";import{AvatarFieldComponent as ue,BadgeFieldComponent as ye,ButtonFieldComponent as D,HiddenFieldComponent as fe,TextAreaComponent as me,RichTextComponent as ge,TextFieldComponent as T}from"./components/form/fields";import{registerBuiltinFieldType as i}from"./fieldTypeRegistry";import{translateLabel as h}from"./forms/utils";import{sanitizeHtml as be}from"./utils/sanitizeHtml";function d(e){return e?p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p(f,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,o,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,o,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,o,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,o,n,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,o,n,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},month:(e,o,n,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},boolean:(e,o,n)=>e?"Yes":"No",checkbox:(e,o,n)=>e?"Yes":"No",switch:(e,o,n)=>{const t=o.options?.fieldSpecific;if(t){const r=t.uncheckedValue??!1,l=t.checkedValue??!0;if(e===l&&t.checkedLabel)return h(t.checkedLabel,n);if(e===r&&t.uncheckedLabel)return h(t.uncheckedLabel,n)}return e?"Yes":"No"},year:(e,o,n)=>String(e),number:(e,o,n)=>{if(e==null||e==="")return"\u2014";const t=o.options?.unit??"",r=N(n,o.options?.suffix);return[(typeof e=="number"?e.toLocaleString():String(e))+t,r].filter(Boolean).join(" ")},currency:(e,o,n)=>{if(e==null||isNaN(e))return"";const t=(o.options||{}).fieldSpecific?.currency||"EUR";return F(e,t)},price:(e,o,n,t)=>{const r=t?.compact??!1,l=t?.asString??!1,a=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(a==null||typeof a!="object")return d(r);const s=a.amount;if(s==null||isNaN(s))return d(r);const y=a.currency||"EUR",x=a.vatIncluded??!0,g=a.discountPercent??0,S=g>0?s*(1-g/100):s,C=x?` ${n("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(g>0){const L=F(s,y),w=F(S,y),k=` ${n("crud:price.discountPercent",{percent:Math.round(g),defaultValue:"-{{percent}}%"})}`;return l?`${w}${C}${k}`:r?u(f,{variant:"success",weight:"bold",children:[w,C,k]}):u(b,{direction:"column",gap:"tight",align:"end",children:[p(f,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:L}),u(f,{variant:"success",weight:"bold",children:[w,C]})]})}return`${F(s,y)}${C}`},range:(e,o,n)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,o,n,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const l=typeof e=="number"?e:parseFloat(e);if(isNaN(l))return d(r);const a=o.validation?.max??5;return p(I,{value:l,max:a,readonly:!0,"aria-label":`${l} out of ${a} stars`})},duration:(e,o,n,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const l=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(l))return d(r);if(l===0)return n("crud:duration.zero",{defaultValue:"\u2014"});if(l<60)return n("crud:duration.minutes",{count:l,defaultValue:`${l} min`});const a=Math.floor(l/60),s=l%60;return n("crud:duration.hoursMinutes",{hours:a,minutes:s,defaultValue:s===0?`${a}h`:`${a}h ${s}min`})},gdprConsent:(e,o,n,t)=>{const r=t?.compact??!1;if(!e||typeof e!="object")return d(r);const l=e.gdprConsent===!0,a=e.gdprConsentDate,s=e.gdprConsentVersion,y=n("crud:gdprConsent.display.yes",{defaultValue:"Consented"}),x=n("crud:gdprConsent.display.no",{defaultValue:"Not consented"});if(!l)return x;const g=[y];if(a)try{const S=new Date(a);g.push(S.toLocaleDateString())}catch{g.push(a)}return s&&g.push(`v${s}`),g.join(" \xB7 ")},select:(e,o,n)=>{const t=o.validation?.options;if(Array.isArray(t)){const r=t.find(l=>l.value===e)?.label;return r?h(r,n):String(e)}return String(e)},radio:(e,o,n)=>{const t=o.validation?.options;if(Array.isArray(t)){const r=t.find(l=>l.value===e)?.label;return r?h(r,n):String(e)}return String(e)},combobox:(e,o,n)=>{const t=o.validation?.options;if(Array.isArray(t)){const r=t.find(l=>l.value===e)?.label;return r?h(r,n):String(e)}return String(e)},multiselect:(e,o,n)=>{if(Array.isArray(e)){const t=o.validation?.options;if(Array.isArray(t))return e.map(r=>{const l=t.find(a=>a.value===r)?.label;return l?h(l,n):r}).join(", ")}return String(e)},image:(e,o,n,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):typeof e=="string"?p("img",{src:e,alt:o.label||"",style:{width:r?"40px":void 0,height:r?"40px":void 0,maxWidth:r?void 0:"200px",maxHeight:r?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):d(r)},images:(e,o,n,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const l=e[0],a=typeof l=="object"&&l.thumbUrl?l.thumbUrl:l;return r?u("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[p("img",{src:a,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&u("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):p($,{images:e,altPrefix:o.label||"Image"})},files:(e,o,n,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(b,{gap:"tight",children:e.map((l,a)=>u("a",{href:l.url||l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[l.filename||`File ${a+1}`,l.size&&u(f,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(l.size/1024)," KB)"]})]},a))})},documents:(e,o,n,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(b,{gap:"tight",children:e.map((l,a)=>u("a",{href:l.url||l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[l.filename||`File ${a+1}`,l.size&&u(f,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(l.size/1024)," KB)"]})]},a))})},file:(e,o,n,t)=>{const r=t?.compact??!1;if(!e)return d(r);const l=typeof e=="string"?e:e.url,a=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[a,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,o,n,t)=>{const r=t?.compact??!1;if(!e)return d(r);const l=typeof e=="string"?e:e.url,a=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:l,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[a,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,o,n,t)=>{const r=t?.compact??!1;if(!e)return d(r);const l=o.validation?.reference;if(t?.referenceData&&typeof l=="string"){const a=t.referenceData[l]?.[String(e)];if(a)return a}if(typeof e=="object"&&e!==null){const a=e.displayName||e.name||e.id||String(e);return String(a)}return String(e)},geopoint:(e,o,n,t)=>{const r=t?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:d(r)},address:(e,o,n)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,o,n,t)=>{const r=t?.compact??!1;if(e&&typeof e=="object"){const l=Object.entries(e);return l.length===0?d(r):u(b,{direction:"column",gap:"tight",children:[l.slice(0,5).map(([a,s])=>u(f,{style:{fontSize:"var(--font-size-sm)"},children:[u("strong",{children:[a,":"]})," ",String(s)]},a)),l.length>5&&u(f,{variant:"muted",children:["+",l.length-5," more"]})]})}return d(r)},array:(e,o,n,t)=>{const r=t?.compact??!1;return Array.isArray(e)?e.length===0?d(r):e.join(", "):d(r)},"field-array":(e,o,n,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const l=o.options?.fieldSpecific?.fields;return e.map(a=>{if(typeof a!="object"||a==null)return"";const s=a;return(l?l.map(y=>y.name):Object.keys(s)).map(y=>s[y]).filter(y=>y!=null&&y!=="").map(y=>typeof y=="object"?JSON.stringify(y):String(y)).join(" \xB7 ")}).filter(Boolean).join(", ")},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,o,n)=>u(b,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`mailto:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),p(j,{text:e,tooltipText:n("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:n("crud:actions.copyEmail",{defaultValue:"Copy email"}),onClick:t=>t.stopPropagation()})]}),tel:(e,o,n)=>u(b,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`tel:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),p(j,{text:e,tooltipText:n("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:n("crud:actions.copyPhone",{defaultValue:"Copy phone"}),onClick:t=>t.stopPropagation()})]}),iban:(e,o,n,t)=>{const r=t?.compact??!1;return e?u(b,{direction:"row",gap:"tight",align:"center",children:[p(f,{style:{flex:1},children:e}),p(j,{text:e,tooltipText:n("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:n("crud:actions.copyIban",{defaultValue:"Copy IBAN"}),onClick:l=>l.stopPropagation()})]}):d(r)},url:(e,o,n)=>p("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,o,n)=>u(b,{direction:"row",gap:"tight",align:"center",children:[p("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),p(f,{children:e})]}),textarea:(e,o,n)=>String(e),text:(e,o,n)=>String(e),richtext:(e,o,n,t)=>{const r=t?.compact??!1;return e&&typeof e=="string"?r?e.replace(/<[^>]*>/g,"").trim()||p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p("div",{dangerouslySetInnerHTML:{__html:be(e)},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):d(r)}};function he(e){return e.type==="avatar"}function ve(e){return e.type==="badge"}let z=!1;function V(){z||(z=!0,i({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(T,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,...l.options})}}}),i({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(T,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,type:"email",...l.options})}}}),i({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(T,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,type:"url",...l.options})}}}),i({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(T,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,type:"color",...l.options})}}}),i({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:re,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(me,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,...l.options})}}}),i({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:oe,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(ge,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value;n(s)},error:r,...l.options})}}}),i({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:J}}),i({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:W}}),i({type:"iban",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.iban,components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,label:t,error:r,config:l}=e;return p(T,{label:t||"",value:typeof o=="string"?o:"",onChange:a=>{const s=a.target.value.replace(/\s/g,"").toUpperCase();n(s)},error:r,...l.options})}}}),i({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:O}}),i({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:pe}}),i({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:de}}),i({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:q}}),i({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:te}}),i({type:"rating",filterable:!0,filterType:"rating",valueType:"number",displayFormatter:c.rating,components:{controlled:Q}}),i({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.duration,components:{controlled:X}}),i({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:A}}),i({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:A}}),i({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",displayFormatter:c.gdprConsent,components:{controlled:se}}),i({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:ie}}),i({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:v}}),i({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:v}}),i({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:v}}),i({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:v}}),i({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:v}}),i({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:ne}}),i({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:B}}),i({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:R}}),i({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:_}}),i({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:E}}),i({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:H}}),i({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:ce}}),i({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:U}}),i({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:le}}),i({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:K}}),i({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:G}}),i({type:"field-array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c["field-array"],components:{controlled:ae}}),i({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:P}}),i({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:M}}),i({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:Y}}),i({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:Z}}),i({type:"reference",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.reference,components:{controlled:ee}}),i({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:o,value:n}=e;return p(fe,{name:o,value:typeof n=="string"?n:""})}}}),i({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,error:t,config:r,t:l}=e;if(!he(r))throw new Error("Invalid config type for avatar field");return p(ue,{config:r,value:typeof o=="string"?o:"",onChange:a=>{n(a)},error:!!t,helperText:t||void 0,t:l,...r.options})}}}),i({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{value:o,onChange:n,error:t,config:r,t:l}=e;if(!ve(r))throw new Error("Invalid config type for badge field");return p(ye,{config:r,value:typeof o=="string"?o:"",onChange:a=>{n(a)},error:!!t,helperText:t||void 0,t:l,...r.options})}}}),i({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:o,label:n,config:t}=e;return p(D,{label:n||o,type:"submit",onClick:()=>{},...t.options})}}}),i({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:m,uncontrolled:e=>{const{name:o,label:n,config:t}=e;return p(D,{label:n||o,type:"reset",onClick:()=>{},...t.options})}}}))}V();export{V as registerAllBuiltinFieldTypes};
1
+ "use client";import{jsx as p,jsxs as u}from"react/jsx-runtime";import{Text as m,Stack as h,ImageGallery as I,Rating as $,CopyToClipboard as j}from"@donotdev/components";import{formatCurrency as S,maybeTranslate as N}from"@donotdev/core";import{ControlledCheckboxField as A,ControlledComboboxField as P,ControlledDateField as C,ControlledDropdownField as M,ControlledFileField as R,ControlledMultiFileField as _,ControlledDocumentField as v,ControlledMultiDocumentField as B,ControlledGeoPointField as E,ControlledImageField as O,ControlledMapField as U,ControlledMultiDropdownField as H,ControlledMultiInputField as K,ControlledNumberField as Y,ControlledPasswordField as G,ControlledPhoneField as J,ControlledRangeField as W,ControlledRatingField as q,ControlledDurationField as Q,ControlledRadioField as X,ControlledReferenceField as Z,ControlledYearField as ee,ControlledTextField as g,ControlledTextareaField as te,ControlledRichTextField as re,ControlledTimestampField as ne,ControlledAddressField as oe,ControlledFieldArrayField as le,ControlledSwitchField as ie,ControlledMultiImageField as ae,ControlledGdprConsentField as ce,ControlledCurrencyField as se,ControlledPriceField as pe}from"./components/controlled";import{AvatarFieldComponent as de,BadgeFieldComponent as fe,ButtonFieldComponent as D,HiddenFieldComponent as ue,TextAreaComponent as ye,RichTextComponent as me,TextFieldComponent as F}from"./components/form/fields";import{registerBuiltinFieldType as a}from"./fieldTypeRegistry";import{translateLabel as T}from"./forms/utils";import{sanitizeHtml as ge}from"./utils/sanitizeHtml";function d(e){return e?p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p(m,{variant:"muted",children:"\u2014"})}const c={timestamp:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},date:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleDateString()}catch{return String(e)}},"datetime-local":(e,o,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleString()}catch{return String(e)}},time:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null||e==="")return d(r);try{return(e instanceof Date?e:new Date(e)).toLocaleTimeString()}catch{return String(e)}},week:(e,o,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},month:(e,o,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):String(e)},boolean:(e,o,l)=>e?"Yes":"No",checkbox:(e,o,l)=>e?"Yes":"No",switch:(e,o,l)=>{const t=o.options?.fieldSpecific;if(t){const r=t.uncheckedValue??!1,n=t.checkedValue??!0;if(e===n&&t.checkedLabel)return T(t.checkedLabel,l);if(e===r&&t.uncheckedLabel)return T(t.uncheckedLabel,l)}return e?"Yes":"No"},year:(e,o,l)=>String(e),number:(e,o,l)=>{if(e==null||e==="")return"\u2014";const t=o.options?.unit??"",r=N(l,o.options?.suffix);return[(typeof e=="number"?e.toLocaleString():String(e))+t,r].filter(Boolean).join(" ")},currency:(e,o,l)=>{if(e==null||isNaN(e))return"";const n=(o.options||{}).fieldSpecific?.currency||"EUR";return S(e,n)},price:(e,o,l,t)=>{const r=t?.compact??!1,n=t?.asString??!1,i=e!=null&&typeof e=="number"?{amount:e,currency:"EUR",vatIncluded:!0,discountPercent:0}:e;if(i==null||typeof i!="object")return d(r);const s=i.amount;if(s==null||isNaN(s))return d(r);const f=i.currency||"EUR",y=i.vatIncluded??!0,b=i.discountPercent??0,V=b>0?s*(1-b/100):s,x=y?` ${l("crud:price.vatIncluded",{defaultValue:"VAT Incl."})}`:"";if(b>0){const L=S(s,f),w=S(V,f),k=` ${l("crud:price.discountPercent",{percent:Math.round(b),defaultValue:"-{{percent}}%"})}`;return n?`${w}${x}${k}`:r?u(m,{variant:"success",weight:"bold",children:[w,x,k]}):u(h,{direction:"column",gap:"tight",align:"end",children:[p(m,{variant:"muted",style:{textDecoration:"line-through",fontSize:"var(--font-size-sm)"},children:L}),u(m,{variant:"success",weight:"bold",children:[w,x]})]})}return`${S(s,f)}${x}`},range:(e,o,l)=>typeof e=="number"?e.toLocaleString():String(e),rating:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const n=typeof e=="number"?e:parseFloat(e);if(isNaN(n))return d(r);const i=o.validation?.max??5;return p($,{value:n,max:i,readonly:!0,"aria-label":`${n} out of ${i} stars`})},duration:(e,o,l,t)=>{const r=t?.compact??!1;if(e==null)return d(r);const n=typeof e=="number"?e:parseInt(String(e),10);if(Number.isNaN(n))return d(r);if(n===0)return l("crud:duration.zero",{defaultValue:"\u2014"});if(n<60)return l("crud:duration.minutes",{count:n,defaultValue:`${n} min`});const i=Math.floor(n/60),s=n%60;return l("crud:duration.hoursMinutes",{hours:i,minutes:s,defaultValue:s===0?`${i}h`:`${i}h ${s}min`})},gdprConsent:(e,o,l,t)=>{const r=t?.compact??!1;if(!e||typeof e!="object")return d(r);const n=e.gdprConsent===!0,i=e.gdprConsentDate,s=e.gdprConsentVersion,f=l("crud:gdprConsent.display.yes",{defaultValue:"Consented"}),y=l("crud:gdprConsent.display.no",{defaultValue:"Not consented"});if(!n)return y;const b=[f];if(i)try{const V=new Date(i);b.push(V.toLocaleDateString())}catch{b.push(i)}return s&&b.push(`v${s}`),b.join(" \xB7 ")},select:(e,o,l)=>{const t=o.validation?.options;if(Array.isArray(t)){const n=t.find(i=>i.value===e)?.label;return n?T(n,l):String(e)}return String(e)},radio:(e,o,l)=>{const t=o.validation?.options;if(Array.isArray(t)){const n=t.find(i=>i.value===e)?.label;return n?T(n,l):String(e)}return String(e)},combobox:(e,o,l)=>{const t=o.validation?.options;if(Array.isArray(t)){const n=t.find(i=>i.value===e)?.label;return n?T(n,l):String(e)}return String(e)},multiselect:(e,o,l)=>{if(Array.isArray(e)){const t=o.validation?.options;if(Array.isArray(t))return e.map(n=>{const s=t.find(f=>f.value===n)?.label;return s?T(s,l):n}).join(", ")}return String(e)},image:(e,o,l,t)=>{const r=t?.compact??!1;return e==null||e===""?d(r):typeof e=="string"?p("img",{src:e,alt:o.label||"",style:{width:r?"40px":void 0,height:r?"40px":void 0,maxWidth:r?void 0:"200px",maxHeight:r?void 0:"150px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}):d(r)},images:(e,o,l,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const n=e[0],i=typeof n=="object"&&n.thumbUrl?n.thumbUrl:n;return r?u("div",{style:{display:"flex",alignItems:"center",gap:"var(--gap-xs)"},children:[p("img",{src:i,alt:"",style:{width:"40px",height:"40px",objectFit:"cover",borderRadius:"var(--radius-sm)"}}),e.length>1&&u("span",{style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:["+",e.length-1]})]}):p(I,{images:e,altPrefix:o.label||"Image"})},files:(e,o,l,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(h,{gap:"tight",children:e.map((n,i)=>u("a",{href:n.url||n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[n.filename||`File ${i+1}`,n.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(n.size/1024)," KB)"]})]},i))})},documents:(e,o,l,t)=>{const r=t?.compact??!1;return!Array.isArray(e)||e.length===0?d(r):p(h,{gap:"tight",children:e.map((n,i)=>u("a",{href:n.url||n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none",display:"flex",alignItems:"center",fontSize:"var(--font-size-sm)"},children:[n.filename||`File ${i+1}`,n.size&&u(m,{level:"caption",variant:"muted",style:{marginLeft:"var(--gap-sm)"},children:["(",Math.round(n.size/1024)," KB)"]})]},i))})},file:(e,o,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);const n=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[i,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},document:(e,o,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);const n=typeof e=="string"?e:e.url,i=typeof e=="string"?"View file":e.filename||"View file";return u("a",{href:n,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)",textDecoration:"none"},children:[i,typeof e=="object"&&e.size&&u("span",{style:{color:"var(--muted-foreground)",marginLeft:"var(--gap-sm)"},children:["(",Math.round(e.size/1024)," KB)"]})]})},reference:(e,o,l,t)=>{const r=t?.compact??!1;if(!e)return d(r);const n=o.validation?.reference;if(t?.referenceData&&typeof n=="string"){const i=t.referenceData[n]?.[String(e)];if(i)return i}if(typeof e=="object"&&e!==null){const i=e.displayName||e.name||e.id||String(e);return String(i)}return String(e)},geopoint:(e,o,l,t)=>{const r=t?.compact??!1;return e&&typeof e=="object"&&"lat"in e&&"lng"in e?`${e.lat.toFixed(6)}, ${e.lng.toFixed(6)}`:d(r)},address:(e,o,l)=>e&&typeof e=="object"&&"formatted_address"in e?e.formatted_address:String(e),map:(e,o,l,t)=>{const r=t?.compact??!1;if(e&&typeof e=="object"){const n=Object.entries(e);return n.length===0?d(r):u(h,{direction:"column",gap:"tight",children:[n.slice(0,5).map(([i,s])=>u(m,{style:{fontSize:"var(--font-size-sm)"},children:[u("strong",{children:[i,":"]})," ",String(s)]},i)),n.length>5&&u(m,{variant:"muted",children:["+",n.length-5," more"]})]})}return d(r)},array:(e,o,l,t)=>{const r=t?.compact??!1;return Array.isArray(e)?e.length===0?d(r):e.join(", "):d(r)},"field-array":(e,o,l,t)=>{const r=t?.compact??!1;if(!Array.isArray(e)||e.length===0)return d(r);const n=o.options?.fieldSpecific?.fields;return e.map(i=>{if(typeof i!="object"||i==null)return"";const s=i;return(n?n.map(y=>y.name):Object.keys(s)).map(y=>s[y]).filter(y=>y!=null&&y!=="").map(y=>typeof y=="object"?JSON.stringify(y):String(y)).join(" \xB7 ")}).filter(Boolean).join(", ")},password:()=>"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",email:(e,o,l)=>u(h,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`mailto:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),p(j,{text:e,tooltipText:l("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:l("crud:actions.copyEmail",{defaultValue:"Copy email"}),onClick:t=>t.stopPropagation()})]}),tel:(e,o,l)=>u(h,{direction:"row",gap:"tight",align:"center",children:[p("a",{href:`tel:${e}`,style:{color:"var(--primary)",flex:1},onClick:t=>t.stopPropagation(),children:e}),p(j,{text:e,tooltipText:l("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:l("crud:actions.copyPhone",{defaultValue:"Copy phone"}),onClick:t=>t.stopPropagation()})]}),iban:(e,o,l,t)=>{const r=t?.compact??!1;return e?u(h,{direction:"row",gap:"tight",align:"center",children:[p(m,{style:{flex:1},children:e}),p(j,{text:e,tooltipText:l("crud:copyToClipboard",{defaultValue:"Copy to clipboard"}),ariaLabel:l("crud:actions.copyIban",{defaultValue:"Copy IBAN"}),onClick:n=>n.stopPropagation()})]}):d(r)},url:(e,o,l)=>p("a",{href:e,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--primary)"},children:e}),color:(e,o,l)=>u(h,{direction:"row",gap:"tight",align:"center",children:[p("div",{style:{width:"20px",height:"20px",backgroundColor:e,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)"}}),p(m,{children:e})]}),textarea:(e,o,l)=>String(e),text:(e,o,l)=>String(e),richtext:(e,o,l,t)=>{const r=t?.compact??!1;return e&&typeof e=="string"?r?e.replace(/<[^>]*>/g,"").trim()||p("span",{style:{color:"var(--muted-foreground)"},children:"\u2014"}):p("div",{dangerouslySetInnerHTML:{__html:ge(e)},style:{padding:"var(--gap-sm)",fontSize:"var(--font-size-sm)",lineHeight:"1.6"}}):d(r)}};function be(e){return e.type==="avatar"}function he(e){return e.type==="badge"}let z=!1;function Te(){z||(z=!0,a({type:"text",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.text,components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,...n.options})}}}),a({type:"email",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.email,components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,type:"email",...n.options})}}}),a({type:"url",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.url,components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,type:"url",...n.options})}}}),a({type:"color",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.color,components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,type:"color",...n.options})}}}),a({type:"textarea",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.textarea,components:{controlled:te,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(ye,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,...n.options})}}}),a({type:"richtext",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.richtext,components:{controlled:re,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(me,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value;l(f)},error:r,...n.options})}}}),a({type:"password",filterable:!1,filterType:"none",valueType:"string",displayFormatter:c.password,components:{controlled:G}}),a({type:"tel",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.tel,components:{controlled:J}}),a({type:"iban",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.iban,components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,label:t,error:r,config:n}=e;return p(F,{label:t||"",value:typeof o=="string"?o:"",onChange:s=>{const f=s.target.value.replace(/\s/g,"").toUpperCase();l(f)},error:r,...n.options})}}}),a({type:"number",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.number,components:{controlled:Y}}),a({type:"currency",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.currency,components:{controlled:se}}),a({type:"price",filterable:!0,filterType:"range",valueType:"object",displayFormatter:c.price,components:{controlled:pe}}),a({type:"range",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.range,components:{controlled:W}}),a({type:"year",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.year,components:{controlled:ee}}),a({type:"rating",filterable:!0,filterType:"rating",valueType:"number",displayFormatter:c.rating,components:{controlled:q}}),a({type:"duration",filterable:!0,filterType:"range",valueType:"number",displayFormatter:c.duration,components:{controlled:Q}}),a({type:"boolean",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.boolean,components:{controlled:A}}),a({type:"checkbox",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.checkbox,components:{controlled:A}}),a({type:"gdprConsent",filterable:!0,filterType:"select",valueType:"object",displayFormatter:c.gdprConsent,components:{controlled:ce}}),a({type:"switch",filterable:!0,filterType:"select",valueType:"boolean",displayFormatter:c.switch,components:{controlled:ie}}),a({type:"date",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.date,components:{controlled:C}}),a({type:"datetime-local",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c["datetime-local"],components:{controlled:C}}),a({type:"time",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.time,components:{controlled:C}}),a({type:"week",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.week,components:{controlled:C}}),a({type:"month",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.month,components:{controlled:C}}),a({type:"timestamp",filterable:!0,filterType:"range",valueType:"date",displayFormatter:c.timestamp,components:{controlled:ne}}),a({type:"file",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.file,components:{controlled:R}}),a({type:"files",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.files,components:{controlled:_}}),a({type:"document",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.document,components:{controlled:v}}),a({type:"documents",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.documents,components:{controlled:B}}),a({type:"image",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.image,components:{controlled:O}}),a({type:"images",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.images,components:{controlled:ae}}),a({type:"geopoint",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.geopoint,components:{controlled:E}}),a({type:"address",filterable:!0,filterType:"address",valueType:"object",displayFormatter:c.address,components:{controlled:oe}}),a({type:"map",filterable:!1,filterType:"none",valueType:"object",displayFormatter:c.map,components:{controlled:U}}),a({type:"array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c.array,components:{controlled:K}}),a({type:"field-array",filterable:!1,filterType:"none",valueType:"array",displayFormatter:c["field-array"],components:{controlled:le}}),a({type:"select",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.select,components:{controlled:M}}),a({type:"combobox",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.combobox,components:{controlled:P}}),a({type:"multiselect",filterable:!0,filterType:"multiselect",valueType:"array",displayFormatter:c.multiselect,components:{controlled:H}}),a({type:"radio",filterable:!0,filterType:"select",valueType:"string",displayFormatter:c.radio,components:{controlled:X}}),a({type:"reference",filterable:!0,filterType:"text",valueType:"string",displayFormatter:c.reference,components:{controlled:Z}}),a({type:"hidden",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:e=>{const{name:o,value:l}=e;return p(ue,{name:o,value:typeof l=="string"?l:""})}}}),a({type:"avatar",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,error:t,config:r,t:n}=e;if(!be(r))throw new Error("Invalid config type for avatar field");return p(de,{config:r,value:typeof o=="string"?o:"",onChange:s=>{l(s)},error:!!t,helperText:t||void 0,t:n,...r.options})}}}),a({type:"badge",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:e=>{const{value:o,onChange:l,error:t,config:r,t:n}=e;if(!he(r))throw new Error("Invalid config type for badge field");return p(fe,{config:r,value:typeof o=="string"?o:"",onChange:s=>{l(s)},error:!!t,helperText:t||void 0,t:n,...r.options})}}}),a({type:"submit",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:e=>{const{name:o,label:l,config:t}=e;return p(D,{label:l||o,type:"submit",onClick:()=>{},...t.options})}}}),a({type:"reset",filterable:!1,filterType:"none",valueType:"string",components:{controlled:g,uncontrolled:e=>{const{name:o,label:l,config:t}=e;return p(D,{label:l||o,type:"reset",onClick:()=>{},...t.options})}}}))}Te();export{Te as registerAllBuiltinFieldTypes};