@donotdev/crud 0.0.10 → 0.0.12

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 (39) hide show
  1. package/dist/components/EntityDisplayRenderer.d.ts +2 -2
  2. package/dist/components/EntityDisplayRenderer.d.ts.map +1 -1
  3. package/dist/components/EntityFilters.d.ts.map +1 -1
  4. package/dist/components/EntityFilters.js +1 -1
  5. package/dist/components/EntityFormRenderer.d.ts.map +1 -1
  6. package/dist/components/EntityFormRenderer.js +1 -1
  7. package/dist/components/controlled/input/ControlledDurationField.d.ts +7 -0
  8. package/dist/components/controlled/input/ControlledDurationField.d.ts.map +1 -0
  9. package/dist/components/controlled/input/ControlledDurationField.js +1 -0
  10. package/dist/components/controlled/input/index.d.ts +1 -0
  11. package/dist/components/controlled/input/index.d.ts.map +1 -1
  12. package/dist/components/controlled/input/index.js +1 -1
  13. package/dist/components/form/fields/DurationFieldComponent.d.ts +42 -0
  14. package/dist/components/form/fields/DurationFieldComponent.d.ts.map +1 -0
  15. package/dist/components/form/fields/DurationFieldComponent.js +1 -0
  16. package/dist/components/form/fields/PhoneNumberComponent.d.ts.map +1 -1
  17. package/dist/components/form/fields/PhoneNumberComponent.js +1 -1
  18. package/dist/components/form/fields/index.d.ts +3 -0
  19. package/dist/components/form/fields/index.d.ts.map +1 -1
  20. package/dist/components/form/fields/index.js +1 -1
  21. package/dist/forms/hooks/useEntityForm.d.ts.map +1 -1
  22. package/dist/forms/hooks/useEntityForm.js +1 -1
  23. package/dist/forms/types.d.ts +13 -4
  24. package/dist/forms/types.d.ts.map +1 -1
  25. package/dist/forms/utils/buildInitialValues.d.ts +30 -0
  26. package/dist/forms/utils/buildInitialValues.d.ts.map +1 -0
  27. package/dist/forms/utils/buildInitialValues.js +1 -0
  28. package/dist/forms/utils/getFieldsForOperation.d.ts +2 -3
  29. package/dist/forms/utils/getFieldsForOperation.d.ts.map +1 -1
  30. package/dist/forms/utils/getFieldsForOperation.js +1 -1
  31. package/dist/forms/utils/isFieldEditable.d.ts +1 -1
  32. package/dist/forms/utils/isFieldEditable.d.ts.map +1 -1
  33. package/dist/forms/utils/translateFieldLabel.d.ts +11 -5
  34. package/dist/forms/utils/translateFieldLabel.d.ts.map +1 -1
  35. package/dist/forms/utils/translateFieldLabel.js +1 -1
  36. package/dist/registerBuiltinFieldTypes.d.ts.map +1 -1
  37. package/dist/registerBuiltinFieldTypes.js +1 -1
  38. package/dist/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +4 -4
@@ -1,4 +1,4 @@
1
- import type { Entity, UserRole } from '@donotdev/core';
1
+ import type { Entity } from '@donotdev/core';
2
2
  export interface EntityDisplayRendererProps<T extends Record<string, unknown> = Record<string, unknown>> {
3
3
  /** Entity definition - pass the full entity from defineEntity() */
4
4
  entity: Entity;
@@ -20,7 +20,7 @@ export interface EntityDisplayRendererProps<T extends Record<string, unknown> =
20
20
  * If not provided, defaults to 'guest' (most restrictive - shows only public fields)
21
21
  * @default 'guest'
22
22
  */
23
- viewerRole?: UserRole;
23
+ viewerRole?: string;
24
24
  }
25
25
  /**
26
26
  * EntityDisplayRenderer - Automatically fetches and displays entity data
@@ -1 +1 @@
1
- {"version":3,"file":"EntityDisplayRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityDisplayRenderer.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAKvD,MAAM,WAAW,0BAA0B,CACzC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,uEAAuE;IACvE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,OAAO,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC;CACvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,EACA,MAAM,EACN,EAAE,EACF,CAAC,EACD,SAAc,EACd,OAAqB,EACrB,cAAc,EACd,eAAe,EACf,UAAoB,GACrB,EAAE,0BAA0B,CAAC,CAAC,CAAC,2CAgM/B;AAED,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"EntityDisplayRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityDisplayRenderer.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK7C,MAAM,WAAW,0BAA0B,CACzC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,uEAAuE;IACvE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,OAAO,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,EACA,MAAM,EACN,EAAE,EACF,CAAC,EACD,SAAc,EACd,OAAqB,EACrB,cAAc,EACd,eAAe,EACf,UAAoB,GACrB,EAAE,0BAA0B,CAAC,CAAC,CAAC,2CAgM/B;AAED,eAAe,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityFilters.d.ts","sourceRoot":"","sources":["../../src/components/EntityFilters.tsx"],"names":[],"mappings":"AAuDA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAM7C;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,GAAG,EAEd,WAAW,EAAE,MAAM,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EAEpD,SAAS,EAAE,MAAM,GAChB,OAAO,CA8MT;AAoOD,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG;IACzC,4BAA4B;IAE5B,MAAM,EAAE,MAAM,CAAC;IAEf,2DAA2D;IAE3D,IAAI,EAAE,CAAC,EAAE,CAAC;IAEV,4BAA4B;IAE5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEjE,mCAAmC;IAEnC,eAAe,EAAE,CACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,KAC7D,IAAI,CAAC;IAEV,oFAAoF;IAEpF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,sFAAsF;IAEtF,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnD,EACA,MAAM,EAEN,IAAI,EAEJ,OAAO,EAEP,eAAe,EAEf,cAAc,EAEd,OAAkB,GACnB,EAAE,kBAAkB,CAAC,CAAC,CAAC,kDAwjBvB"}
1
+ {"version":3,"file":"EntityFilters.d.ts","sourceRoot":"","sources":["../../src/components/EntityFilters.tsx"],"names":[],"mappings":"AAsDA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAM7C;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,GAAG,EAEd,WAAW,EAAE,MAAM,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EAEpD,SAAS,EAAE,MAAM,GAChB,OAAO,CA8MT;AAqND,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG;IACzC,4BAA4B;IAE5B,MAAM,EAAE,MAAM,CAAC;IAEf,2DAA2D;IAE3D,IAAI,EAAE,CAAC,EAAE,CAAC;IAEV,4BAA4B;IAE5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEjE,mCAAmC;IAEnC,eAAe,EAAE,CACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,KAC7D,IAAI,CAAC;IAEV,oFAAoF;IAEpF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,sFAAsF;IAEtF,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnD,EACA,MAAM,EAEN,IAAI,EAEJ,OAAO,EAEP,eAAe,EAEf,cAAc,EAEd,OAAkB,GACnB,EAAE,kBAAkB,CAAC,CAAC,CAAC,kDAyjBvB"}
@@ -1 +1 @@
1
- "use client";import{jsx as f,jsxs as k}from"react/jsx-runtime";import{useMemo as R,useState as J}from"react";import{FilterX as Q}from"lucide-react";import{Button as E,Calendar as U,Combobox as Z,Grid as K,Popover as ee,RangeInput as te,Slider as ie,Stack as W,Text as Y}from"@donotdev/components";import{useTranslation as z,handleError as _}from"@donotdev/core";import{translateFieldLabel as ae,translateLabel as G}from"../forms/utils";import{getFilterType as B,isFilterable as ne}from"../fieldTypeRegistry";function X(e,t,r){if(!t)return!0;if(typeof t=="object"&&"min"in t){const s=B(r);if(!s)throw _(new Error(`Field type "${r}" not registered in field type registry`),{userMessage:`Field type "${r}" is missing from registry`,context:{fieldType:r,operation:"filter_matching",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"}});const F=s==="range"&&(r==="date"||r==="datetime-local"||r==="timestamp"),S=s==="range"&&!F,w=r==="price",c=w&&e!=null&&typeof e=="object"?Number(e.amount):S&&e!=null?typeof e=="number"?e:Number(e):NaN;if(S||w){const d=t.min&&t.min!=="",y=t.max&&t.max!=="";return d&&!y?e==null||isNaN(c)?!1:c>=Number(t.min):!d&&y?e==null?!0:isNaN(c)?!1:c<=Number(t.max):d&&y?e==null||isNaN(c)?!1:c>=Number(t.min)&&c<=Number(t.max):!0}if(F){const d=t.min&&t.min!=="",y=t.max&&t.max!=="";if(d&&!y){if(e==null)return!1;const x=e instanceof Date?e:new Date(e);return isNaN(x.getTime())?!1:x>=new Date(t.min)}if(!d&&y){if(e==null)return!0;const x=e instanceof Date?e:new Date(e);return isNaN(x.getTime())?!1:x<=new Date(t.max)}if(d&&y){if(e==null)return!1;const x=e instanceof Date?e:new Date(e);return isNaN(x.getTime())?!1:x>=new Date(t.min)&&x<=new Date(t.max)}return!0}}const g=B(r);if(!g)throw _(new Error(`Field type "${r}" not registered in field type registry`),{userMessage:`Field type "${r}" is missing from registry`,context:{fieldType:r,operation:"filter_matching",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"}});if(g==="address")return e==null?!1:typeof e=="object"&&"formatted_address"in e?String(e.formatted_address).toLowerCase().includes(String(t).toLowerCase()):!1;if(g==="multiselect"){if(!Array.isArray(e)||e.length===0)return!1;const s=String(t).toLowerCase();return e.some(F=>String(F).toLowerCase().includes(s))}return e==null?!1:String(e).toLowerCase().includes(String(t).toLowerCase())}function re(e,t,r){if(!e&&!t)return r??"From \u2013 To";const g=e?new Date(e+"T00:00:00").toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"}):"",s=t?new Date(t+"T00:00:00").toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"}):"";return g&&s?`${g} \u2013 ${s}`:g?`${g} \u2013 \u2026`:s?`\u2026 \u2013 ${s}`:r??"From \u2013 To"}function le({label:e,rangeFilter:t,onRangeChange:r,onClear:g,tCrud:s}){const[F,S]=J(!1),w=!!(t.min||t.max),c=t.min||t.max?{from:t.min?new Date(t.min+"T00:00:00"):void 0,to:t.max?new Date(t.max+"T00:00:00"):void 0}:void 0,d=l=>{if(!l){g();return}const h=l.from?l.from.toISOString().split("T")[0]:"",N=l.to?l.to.toISOString().split("T")[0]:"";r(h,N),l.from&&l.to&&S(!1)},y=(l,h)=>{r(l,h),S(!1)},x=()=>{g(),S(!1)},C=re(t.min,t.max,s("filter.fromTo",{defaultValue:"From \u2013 To"}));return f(ee,{open:F,onOpenChange:S,trigger:f(E,{variant:"outline",display:"compact",className:"dndev-w-full dndev-justify-between","aria-haspopup":"dialog","aria-expanded":F,"aria-label":e,children:k(Y,{as:"span",level:"small",variant:w?void 0:"muted",children:[e,": ",C]})}),children:k(W,{gap:"medium",style:{padding:"var(--gap-md)"},children:[f(Y,{as:"span",level:"small",variant:"muted",children:e}),k(W,{direction:"row",gap:"tight",children:[f(E,{variant:"outline",display:"compact",onClick:()=>{const l=new Date().toISOString().split("T")[0];y(l,l)},children:s("filter.today",{defaultValue:"Today"})}),f(E,{variant:"outline",display:"compact",onClick:()=>{const l=new Date,h=new Date(l);h.setDate(l.getDate()-l.getDay());const N=new Date(h);N.setDate(h.getDate()+6),y(h.toISOString().split("T")[0],N.toISOString().split("T")[0])},children:s("filter.thisWeek",{defaultValue:"This Week"})}),f(E,{variant:"outline",display:"compact",onClick:()=>{const l=new Date,h=new Date(l.getFullYear(),l.getMonth(),1),N=new Date(l.getFullYear(),l.getMonth()+1,0);y(h.toISOString().split("T")[0],N.toISOString().split("T")[0])},children:s("filter.thisMonth",{defaultValue:"This Month"})})]}),f(U,{mode:"range",selected:c,onSelect:d,defaultMonth:c?.from??c?.to??new Date}),f(E,{variant:"ghost",display:"compact",onClick:x,children:s("filter.clearDate",{defaultValue:"Clear"})})]})})}function oe({entity:e,data:t,filters:r,onFiltersChange:g,fieldsToFilter:s,variant:F="inline"}){const S=F==="sidebar",{t:w}=z("crud"),{t:c}=z(e.namespace),d=R(()=>(s&&s.length>0?s:e.listFields||Object.keys(e.fields)).filter(n=>{const i=e.fields[n]?.type||"text";return ne(i)}),[s,e.listFields,e.fields]),y=R(()=>{const n={};return d.forEach(i=>{const p=Object.fromEntries(Object.entries(r).filter(([o])=>o!==i));if(Object.keys(p).length===0){n[i]=t;return}n[i]=t.filter(o=>Object.entries(p).every(([v,O])=>{const V=o[v],j=e.fields[v]?.type||"text";return X(V,O,j)}))}),n},[t,r,e.fields,d]),x=R(()=>{const n={};return d.forEach(i=>{const p=e.fields[i];if(!p)return;const o=p.type||"text",v=B(o);if(!v){_(new Error(`Field type "${o}" not registered in field type registry`),{userMessage:`Field type "${o}" is missing from registry`,context:{fieldType:o,fieldName:i,operation:"minmax_computation",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"},severity:"warning"});return}const O=v==="range"&&(o==="date"||o==="datetime-local"||o==="timestamp"),V=v==="range"&&!O,j=o==="price";if(V||j){const b=t.map(a=>a[i]).filter(a=>a!=null&&a!=="").map(a=>j&&typeof a=="object"&&a!==null?Number(a.amount):typeof a=="number"?a:Number(a)).filter(a=>!isNaN(a));b.length>0&&(n[i]={min:Math.min(...b),max:Math.max(...b)})}else if(O){const b=t.map(a=>a[i]).filter(a=>a!=null&&a!=="").map(a=>a instanceof Date?a:new Date(a)).filter(a=>!isNaN(a.getTime()));if(b.length>0){const a=new Date(Math.min(...b.map(M=>M.getTime()))),I=new Date(Math.max(...b.map(M=>M.getTime()))),P=a.toISOString().split("T")[0],A=I.toISOString().split("T")[0];n[i]={min:P||"",max:A||""}}}}),n},[t,e.fields,d]),C=(n,i)=>{const p={...r};if(!i||i==="")delete p[n];else if(typeof i=="object"&&"min"in i){const o=i.min&&i.min!=="",v=i.max&&i.max!=="";!o&&!v?delete p[n]:p[n]=i}else p[n]=i;g(p)},l=()=>{g({})},h=R(()=>d.length===0?null:d.map(n=>{const i=e.fields[n];if(!i)return null;const p=ae(n,i,c),o=i.type||"text",v=B(o);if(!v)return _(new Error(`Field type "${o}" not registered in field type registry`),{userMessage:`Field type "${o}" is missing from registry`,context:{fieldType:o,fieldName:n,operation:"filter_ui_render",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"},severity:"warning"}),null;const O=v==="range"&&(o==="date"||o==="datetime-local"||o==="timestamp"),V=v==="range"&&!O,j=v==="select",b=r[n],a=typeof b=="object"&&b!==null&&"min"in b?b:{min:"",max:""};if(V){const u=x[n],T=u?.min??0,m=u?.max??100,D=a.min?Number(a.min):T,L=a.max?Number(a.max):m;return k(W,{gap:"tight",style:{gridColumn:"span 2",gridRow:S?void 0:"span 2"},children:[f(te,{type:"number",label:p,minPlaceholder:w("filter.min",{defaultValue:"Min"}),maxPlaceholder:w("filter.max",{defaultValue:"Max"}),minValue:a.min||"",maxValue:a.max||"",actualMin:T,actualMax:m,onChange:($,H)=>{C(n,{min:$,max:H})},onClear:()=>C(n,void 0)}),f(ie,{value:[D,L],min:T,max:m,step:1,onValueChange:$=>{C(n,{min:String($[0]),max:String($[1])})}})]},n)}if(O)return f("div",{style:{gridColumn:"span 2",gridRow:S?void 0:"span 1"},children:f(le,{label:p,rangeFilter:a,onRangeChange:(u,T)=>C(n,{min:u,max:T}),onClear:()=>C(n,void 0),tCrud:w})},n);const I=j&&i.validation&&"options"in i.validation&&i.validation?Array.isArray(i.validation.options)?i.validation.options:typeof i.validation.options=="function"?i.validation.options():[]:[],P=y[n]||t,A=new Set;P.forEach(u=>{const T=u[n];T!=null&&A.add(String(T))});const M=[{value:"all",label:w("filter.selectPlaceholder",{defaultValue:"All"})}];if(I.length>0){const u=[],T=[];I.forEach(m=>{const D=typeof m=="string"?m:m.value,L=typeof m=="string"?m:m.label;A.has(D)?u.push({value:D,label:L}):T.push({value:D,label:L})}),u.sort((m,D)=>m.label.localeCompare(D.label)),T.sort((m,D)=>m.label.localeCompare(D.label)),u.forEach(m=>{M.push({value:m.value,label:G(m.label,c),disabled:!1})}),T.forEach(m=>{M.push({value:m.value,label:G(m.label,c),disabled:!0})})}else Array.from(A).sort().slice(0,100).forEach(u=>{M.push({value:u,label:u})});return f("div",{style:{gridColumn:"span 2",gridRow:"span 1"},children:f(Z,{label:p,value:typeof b=="string"?b:void 0,onValueChange:u=>{C(n,u==="all"||!u?"":String(u))},options:M,placeholder:w("filter.placeholder",{defaultValue:"Filter..."}),clearable:!0})},n)}),[d,e.fields,t,r,c,w,y]);if(!h||h.length===0)return null;const N=h.filter(Boolean),q=Object.keys(r).length>0;return k(K,{cols:F==="sidebar"?2:[2,4,6,8],gap:"medium",style:{gridAutoRows:"min-content"},children:[N,f(E,{variant:"outline",icon:f(Q,{size:18}),onClick:l,disabled:!q,style:{gridColumn:"1 / -1",gridRow:"span 1"},children:w("filter.clear",{defaultValue:"Clear Filters"})})]})}export{oe as EntityFilters,X as matchesFilter};
1
+ "use client";import{jsx as g,jsxs as R}from"react/jsx-runtime";import{useMemo as B,useState as U}from"react";import{FilterX as Z}from"lucide-react";import{Button as j,Calendar as V,Combobox as ee,Grid as te,Popover as ne,RangeInput as re,Slider as ie,Stack as z,Text as X}from"@donotdev/components";import{useTranslation as q,handleError as N,formatDate as H}from"@donotdev/core";import{translateFieldLabel as se,translateLabel as J}from"../forms/utils";import{getFilterType as W,isFilterable as oe}from"../fieldTypeRegistry";function ae(e,t,s){if(!t)return!0;if(typeof t=="object"&&"min"in t){const l=W(s);if(!l)throw N(new Error(`Field type "${s}" not registered in field type registry`),{userMessage:`Field type "${s}" is missing from registry`,context:{fieldType:s,operation:"filter_matching",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"}});const C=l==="range"&&(s==="date"||s==="datetime-local"||s==="timestamp"),F=l==="range"&&!C,D=s==="price",u=D&&e!=null&&typeof e=="object"?Number(e.amount):F&&e!=null?typeof e=="number"?e:Number(e):NaN;if(F||D){const d=t.min&&t.min!=="",y=t.max&&t.max!=="";return d&&!y?e==null||isNaN(u)?!1:u>=Number(t.min):!d&&y?e==null?!0:isNaN(u)?!1:u<=Number(t.max):d&&y?e==null||isNaN(u)?!1:u>=Number(t.min)&&u<=Number(t.max):!0}if(C){const d=t.min&&t.min!=="",y=t.max&&t.max!=="";if(d&&!y){if(e==null)return!1;const b=e instanceof Date?e:new Date(e);return isNaN(b.getTime())?!1:b>=new Date(t.min)}if(!d&&y){if(e==null)return!0;const b=e instanceof Date?e:new Date(e);return isNaN(b.getTime())?!1:b<=new Date(t.max)}if(d&&y){if(e==null)return!1;const b=e instanceof Date?e:new Date(e);return isNaN(b.getTime())?!1:b>=new Date(t.min)&&b<=new Date(t.max)}return!0}}const h=W(s);if(!h)throw N(new Error(`Field type "${s}" not registered in field type registry`),{userMessage:`Field type "${s}" is missing from registry`,context:{fieldType:s,operation:"filter_matching",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"}});if(h==="address")return e==null?!1:typeof e=="object"&&"formatted_address"in e?String(e.formatted_address).toLowerCase().includes(String(t).toLowerCase()):!1;if(h==="multiselect"){if(!Array.isArray(e)||e.length===0)return!1;const l=String(t).toLowerCase();return e.some(C=>String(C).toLowerCase().includes(l))}return e==null?!1:String(e).toLowerCase().includes(String(t).toLowerCase())}function le(e,t,s){if(!e&&!t)return s??"From \u2013 To";const h=e?H(e,void 0,{month:"short",day:"numeric",year:"numeric"}):"",l=t?H(t,void 0,{month:"short",day:"numeric",year:"numeric"}):"";return h&&l?`${h} \u2013 ${l}`:h?`${h} \u2013 \u2026`:l?`\u2026 \u2013 ${l}`:s??"From \u2013 To"}function ce({label:e,rangeFilter:t,onRangeChange:s,onClear:h,tCrud:l}){const[C,F]=U(!1),D=!!(t.min||t.max),u=t.min||t.max?{from:t.min?new Date(t.min+"T00:00:00"):void 0,to:t.max?new Date(t.max+"T00:00:00"):void 0}:void 0,d=a=>{if(!a){h();return}const x=a.from?a.from.toISOString().split("T")[0]:"",O=a.to?a.to.toISOString().split("T")[0]:"";s(x,O),a.from&&a.to&&F(!1)},y=(a,x)=>{s(a,x),F(!1)},b=()=>{h(),F(!1)},E=le(t.min,t.max,l("filter.fromTo",{defaultValue:"From \u2013 To"}));return g(ne,{open:C,onOpenChange:F,trigger:g(j,{variant:"outline","aria-haspopup":"dialog","aria-expanded":C,"aria-label":e,children:R(X,{as:"span",level:"small",variant:D?void 0:"muted",children:[e,": ",E]})}),children:R(z,{gap:"medium",style:{padding:"var(--gap-md)"},children:[g(X,{as:"span",level:"small",variant:"muted",children:e}),R(z,{direction:"row",gap:"tight",children:[g(j,{variant:"outline",display:"compact",onClick:()=>{const a=new Date().toISOString().split("T")[0];y(a,a)},children:l("filter.today",{defaultValue:"Today"})}),g(j,{variant:"outline",display:"compact",onClick:()=>{const a=new Date,x=new Date(a);x.setDate(a.getDate()-a.getDay());const O=new Date(x);O.setDate(x.getDate()+6),y(x.toISOString().split("T")[0],O.toISOString().split("T")[0])},children:l("filter.thisWeek",{defaultValue:"This Week"})}),g(j,{variant:"outline",display:"compact",onClick:()=>{const a=new Date,x=new Date(a.getFullYear(),a.getMonth(),1),O=new Date(a.getFullYear(),a.getMonth()+1,0);y(x.toISOString().split("T")[0],O.toISOString().split("T")[0])},children:l("filter.thisMonth",{defaultValue:"This Month"})})]}),g(V,{mode:"range",selected:u,onSelect:d,defaultMonth:u?.from??u?.to??new Date}),g(j,{variant:"ghost",display:"compact",onClick:b,children:l("filter.clearDate",{defaultValue:"Clear"})})]})})}function ye({entity:e,data:t,filters:s,onFiltersChange:h,fieldsToFilter:l,variant:C="inline"}){const F=C==="sidebar",{t:D}=q("crud"),{t:u}=q([e.namespace,"crud"]),d=B(()=>(l&&l.length>0?l:e.listFields||Object.keys(e.fields)).filter(n=>{const o=e.fields[n]?.type||"text";return oe(o)}),[l,e.listFields,e.fields]),y=B(()=>{const r={};return d.forEach(n=>{const m=Object.fromEntries(Object.entries(s).filter(([o])=>o!==n));if(Object.keys(m).length===0){r[n]=t;return}r[n]=t.filter(o=>Object.entries(m).every(([w,v])=>{const A=o[w],p=e.fields[w]?.type||"text";return ae(A,v,p)}))}),r},[t,s,e.fields,d]),b=B(()=>{const r={};return d.forEach(n=>{const m=e.fields[n];if(!m)return;const o=m.type||"text",w=W(o);if(!w){N(new Error(`Field type "${o}" not registered in field type registry`),{userMessage:`Field type "${o}" is missing from registry`,context:{fieldType:o,fieldName:n,operation:"minmax_computation",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"},severity:"warning"});return}const v=w==="range"&&(o==="date"||o==="datetime-local"||o==="timestamp"),A=w==="range"&&!v,k=o==="price";if(A||k){const p=t.map(i=>i[n]).filter(i=>i!=null&&i!=="").map(i=>k&&typeof i=="object"&&i!==null?Number(i.amount):typeof i=="number"?i:Number(i)).filter(i=>!isNaN(i));p.length>0&&(r[n]={min:Math.min(...p),max:Math.max(...p)})}else if(v){const p=t.map(i=>i[n]).filter(i=>i!=null&&i!=="").map(i=>i instanceof Date?i:new Date(i)).filter(i=>!isNaN(i.getTime()));if(p.length>0){const i=new Date(Math.min(...p.map($=>$.getTime()))),M=new Date(Math.max(...p.map($=>$.getTime()))),G=i.toISOString().split("T")[0],I=M.toISOString().split("T")[0];r[n]={min:G||"",max:I||""}}}}),r},[t,e.fields,d]),E=(r,n)=>{const m={...s};if(!n||n==="")delete m[r];else if(typeof n=="object"&&"min"in n){const o=n.min&&n.min!=="",w=n.max&&n.max!=="";!o&&!w?delete m[r]:m[r]=n}else m[r]=n;h(m)},a=()=>{h({})},x=B(()=>d.length===0?null:d.map(r=>{const n=e.fields[r];if(!n)return null;const m=se(r,n,u),o=n.type||"text",w=W(o);if(!w)return N(new Error(`Field type "${o}" not registered in field type registry`),{userMessage:`Field type "${o}" is missing from registry`,context:{fieldType:o,fieldName:r,operation:"filter_ui_render",fix:"Add to registerBuiltinFieldTypes.ts or registerFieldType()"},severity:"warning"}),null;const v=w==="range"&&(o==="date"||o==="datetime-local"||o==="timestamp"),A=w==="range"&&!v,k=w==="select",p=s[r],M=typeof p=="object"&&p!==null&&"min"in p?p:{min:"",max:""};if(A){const f=b[r],S=f?.min??0,c=f?.max??100,T=M.min?Number(M.min):S,_=M.max?Number(M.max):c;return R(z,{gap:"tight",style:{gridColumn:"span 2",gridRow:F?void 0:"span 2"},children:[g(re,{type:"number",label:m,minPlaceholder:D("filter.min",{defaultValue:"Min"}),maxPlaceholder:D("filter.max",{defaultValue:"Max"}),minValue:M.min||"",maxValue:M.max||"",actualMin:S,actualMax:c,onChange:(L,Q)=>{E(r,{min:L,max:Q})},onClear:()=>E(r,void 0)}),g(ie,{value:[T,_],min:S,max:c,step:1,onValueChange:L=>{E(r,{min:String(L[0]),max:String(L[1])})}})]},r)}if(v)return g("div",{style:{gridColumn:"span 2",gridRow:F?void 0:"span 1"},children:g(ce,{label:m,rangeFilter:M,onRangeChange:(f,S)=>E(r,{min:f,max:S}),onClear:()=>E(r,void 0),tCrud:D})},r);const I=k&&n.validation&&"options"in n.validation&&n.validation?Array.isArray(n.validation.options)?n.validation.options:typeof n.validation.options=="function"?n.validation.options():[]:[],$=y[r]||t,Y=new Set;$.forEach(f=>{const S=f[r];S!=null&&Y.add(String(S))});const P=[{value:"all",label:D("filter.selectPlaceholder",{defaultValue:"All"})}];if(I.length>0){const f=[],S=[];I.forEach(c=>{const T=typeof c=="string"?c:c.value,_=typeof c=="string"?c:c.label;Y.has(T)?f.push({value:T,label:_}):S.push({value:T,label:_})}),f.sort((c,T)=>c.label.localeCompare(T.label)),S.sort((c,T)=>c.label.localeCompare(T.label)),f.forEach(c=>{P.push({value:c.value,label:J(c.label,u),disabled:!1})}),S.forEach(c=>{P.push({value:c.value,label:J(c.label,u),disabled:!0})})}else Array.from(Y).sort().slice(0,100).forEach(f=>{P.push({value:f,label:f})});return g("div",{style:{gridColumn:"span 2",gridRow:"span 1"},children:g(ee,{label:m,value:typeof p=="string"?p:void 0,onValueChange:f=>{E(r,f==="all"||!f?"":String(f))},options:P,placeholder:D("filter.placeholder",{defaultValue:"Filter..."}),clearable:!0})},r)}),[d,e.fields,t,s,u,D,y]);if(!x||x.length===0)return null;const O=x.filter(Boolean),K=Object.keys(s).length>0;return R(te,{cols:C==="sidebar"?2:[2,4,6,8],gap:"medium",style:{gridAutoRows:"min-content"},children:[O,g(j,{variant:"outline",icon:g(Z,{size:18}),onClick:a,disabled:!K,style:{gridColumn:"1 / -1",gridRow:"span 1"},children:D("filter.clear",{defaultValue:"Clear Filters"})})]})}export{ye as EntityFilters,ae as matchesFilter};
@@ -1 +1 @@
1
- {"version":3,"file":"EntityFormRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityFormRenderer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAY7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,UAAU,uBAAuB,CAC/B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,2BAA2B;IAC3B,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,4BAA4B;IAC5B,aAAa,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACzE,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+BAA+B;IAC/B,sBAAsB,CAAC,EACnB,SAAS,GACT,aAAa,GACb,SAAS,GACT,OAAO,GACP,MAAM,CAAC;IACX,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,EACtE,MAAM,EACN,QAAQ,EACR,CAAC,EACD,SAAc,EACd,UAAU,EACV,OAAe,EACf,aAAa,EACb,aAAyB,EACzB,mBAAmB,EACnB,sBAAkC,EAClC,iBAAiB,EACjB,UAAU,EACV,SAA6C,EAC7C,QAAiC,EACjC,MAAM,EAAE,cAAc,EACtB,UAAU,EACV,QAAQ,EACR,oBAA2B,EAC3B,qBAAqB,GACtB,EAAE,uBAAuB,CAAC,CAAC,CAAC,2CA+O5B;AAED,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"EntityFormRenderer.d.ts","sourceRoot":"","sources":["../../src/components/EntityFormRenderer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAY7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,UAAU,uBAAuB,CAC/B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,2BAA2B;IAC3B,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAC/D,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,4BAA4B;IAC5B,aAAa,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACzE,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+BAA+B;IAC/B,sBAAsB,CAAC,EACnB,SAAS,GACT,aAAa,GACb,SAAS,GACT,OAAO,GACP,MAAM,CAAC;IACX,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,EACtE,MAAM,EACN,QAAQ,EACR,CAAC,EACD,SAAc,EACd,UAAU,EACV,OAAe,EACf,aAAa,EACb,aAAyB,EACzB,mBAAmB,EACnB,sBAAkC,EAClC,iBAAiB,EACjB,UAAU,EACV,SAA6C,EAC7C,QAAiC,EACjC,MAAM,EAAE,cAAc,EACtB,UAAU,EACV,QAAQ,EACR,oBAA2B,EAC3B,qBAAqB,GACtB,EAAE,uBAAuB,CAAC,CAAC,CAAC,2CAkP5B;AAED,eAAe,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- "use client";import{jsx as a,jsxs as p}from"react/jsx-runtime";import{useEffect as w,useId as Z,useMemo as f}from"react";import{FormProvider as _}from"react-hook-form";import{Button as v,Stack as ee,Spinner as ae}from"@donotdev/components";import{useTranslation as F}from"@donotdev/core";import{DisplayFieldRenderer as oe}from"./DisplayFieldRenderer";import{FormFieldRenderer as ne}from"./FormFieldRenderer";import{UploadProvider as re}from"../contexts/UploadContext";import{useEntityForm as te}from"../forms/hooks/useEntityForm";import{useUnsavedChangesWarning as ie,useConfirmNavigation as se}from"../hooks/useUnsavedChangesWarning";import{useFormStore as le}from"../stores";function I({entity:u,onSubmit:k,t:D,className:N="",submitText:M,loading:R=!1,defaultValues:s,submitVariant:B="primary",secondaryButtonText:m,secondaryButtonVariant:P="outline",onSecondarySubmit:y,viewerRole:U,operation:g=s?"edit":"create",autoSave:E=g==="create",formId:Y,cancelText:h,onCancel:$,warnOnUnsavedChanges:j=!0,unsavedChangesMessage:l}){const z=Z(),n=Y??`entity-form-${u.name}-${z}`,{t:A}=F(u.namespace),{t:e}=F("crud"),c=D||A,b=te(u,{formId:n,operation:g,defaultValues:s,viewerRole:U,t:c,autoSave:E}),{control:W,handleSubmit:x,formState:{errors:q},fields:G,formStatus:d,uploadProgress:r,cleanup:C,isDirty:t,resetForm:H}=b;w(()=>{n&&le.getState().setIsDirty(n,t)},[n,t]),w(()=>C,[C]);const J=f(()=>l||e("messages.unsavedChangesLeave",{defaultValue:"You have unsaved changes. Are you sure you want to leave?"}),[l,e]),K=f(()=>l||e("messages.unsavedChangesDiscard",{defaultValue:"You have unsaved changes. Discard them?"}),[l,e]);ie({isDirty:t,enabled:j,message:J});const L=se(t,K),O=async()=>{t&&!await L()||(H(),$?.())},S=h!==null,T=h??e("form.cancel",{defaultValue:"Cancel"}),Q=R||g==="edit"&&!s,o=f(()=>d==="uploading"?{loading:!0,loadingText:r<100?e("form.uploading",{progress:Math.round(r),defaultValue:`Uploading ${Math.round(r)}%...`}):e("form.processing",{defaultValue:"Processing..."}),progress:r}:d==="validating"?{loading:!0,loadingText:e("form.validating",{defaultValue:"Validating..."})}:d==="submitting"?{loading:!0,loadingText:e("form.saving",{defaultValue:"Saving..."})}:{loading:!1},[d,r,e]);return a(_,{...b,children:a(re,{formId:n,children:p("div",{style:{position:"relative",width:"100%",gridColumn:"1 / -1",display:"contents"},children:[Q&&a(ae,{overlay:!0}),p("form",{onSubmit:x(k),noValidate:!0,className:N,style:{width:"100%",gridColumn:"1 / -1",display:"contents"},children:[G.map(({name:i,config:V,editable:X})=>X?a(ne,{name:i,config:V,control:W,errors:q,t:c},i):a(oe,{name:i,config:V,value:s?.[i],t:c},i)),p(ee,{direction:m||S?"row":"column",gap:"tight",style:{gridColumn:"1 / -1",position:"sticky",bottom:0,backgroundColor:"var(--background)",borderTop:"1px solid var(--border)",paddingTop:"var(--gap-md)",paddingBottom:"var(--gap-md)",zIndex:10,marginTop:"var(--gap-lg)"},children:[S&&T&&a(v,{type:"button",onClick:O,disabled:o.loading,variant:"outline",className:"dndev-w-full",children:T}),m&&a(v,{type:"button",onClick:()=>y&&x(y)(),loading:o.loading,loadingText:o.loadingText,progress:o.progress,variant:P,className:"dndev-w-full",children:m}),a(v,{type:"submit",loading:o.loading,loadingText:o.loadingText,progress:o.progress,variant:B,className:"dndev-w-full",children:M||e("form.submit",{defaultValue:"Submit"})})]})]})]})})})}var de=I;export{I as EntityFormRenderer,de as default};
1
+ "use client";import{jsx as r,jsxs as f}from"react/jsx-runtime";import{useEffect as T,useId as Z,useMemo as p}from"react";import{FormProvider as ee}from"react-hook-form";import{Button as v,Stack as re,Spinner as oe}from"@donotdev/components";import{useTranslation as D}from"@donotdev/core";import{DisplayFieldRenderer as te}from"./DisplayFieldRenderer";import{FormFieldRenderer as ne}from"./FormFieldRenderer";import{UploadProvider as ae}from"../contexts/UploadContext";import{useEntityForm as ie}from"../forms/hooks/useEntityForm";import{useUnsavedChangesWarning as se,useConfirmNavigation as de}from"../hooks/useUnsavedChangesWarning";import{useFormStore as le}from"../stores";function ue({entity:u,onSubmit:I,t:k,className:V="",submitText:N,loading:j=!1,defaultValues:s,submitVariant:P="primary",secondaryButtonText:m,secondaryButtonVariant:U="outline",onSecondarySubmit:h,viewerRole:B,operation:c=s?"edit":"create",autoSave:E=c==="create",formId:L,cancelText:y,onCancel:R,warnOnUnsavedChanges:$=!0,unsavedChangesMessage:d}){const M=Z(),n=L??`entity-form-${u.name}-${M}`,{t:Y}=D([u.namespace,"crud"]),{t:e}=D("crud"),g=k||Y,b=ie(u,{formId:n,operation:c,defaultValues:s,viewerRole:B,t:g,autoSave:E}),{control:_,handleSubmit:x,formState:{errors:z},fields:A,formStatus:l,uploadProgress:a,cleanup:C,isDirty:W,hasUserInteracted:q,resetForm:G}=b,i=W&&q;T(()=>{n&&le.getState().setIsDirty(n,i)},[n,i]),T(()=>C,[C]);const H=p(()=>d||e("messages.unsavedChangesLeave",{defaultValue:"You have unsaved changes. Are you sure you want to leave?"}),[d,e]),J=p(()=>d||e("messages.unsavedChangesDiscard",{defaultValue:"You have unsaved changes. Discard them?"}),[d,e]);se({isDirty:i,enabled:$,message:H});const K=de(i,J),O=async()=>{i&&!await K()||(G(),R?.())},F=y!==null,S=y??e("form.cancel",{defaultValue:"Cancel"}),Q=j||c==="edit"&&!s,o=p(()=>l==="uploading"?{loading:!0,loadingText:a<100?e("form.uploading",{progress:Math.round(a),defaultValue:`Uploading ${Math.round(a)}%...`}):e("form.processing",{defaultValue:"Processing..."}),progress:a}:l==="validating"?{loading:!0,loadingText:e("form.validating",{defaultValue:"Validating..."})}:l==="submitting"?{loading:!0,loadingText:e("form.saving",{defaultValue:"Saving..."})}:{loading:!1},[l,a,e]);return r(ee,{...b,children:r(ae,{formId:n,children:f("div",{style:{position:"relative",width:"100%",gridColumn:"1 / -1",display:"contents"},children:[Q&&r(oe,{overlay:!0}),f("form",{onSubmit:x(I),noValidate:!0,className:V,style:{width:"100%",gridColumn:"1 / -1",display:"contents"},children:[A.map(({name:t,config:w,editable:X})=>X?r(ne,{name:t,config:w,control:_,errors:z,t:g},t):r(te,{name:t,config:w,value:s?.[t],t:g},t)),f(re,{direction:m||F?"row":"column",gap:"tight",style:{gridColumn:"1 / -1",position:"sticky",bottom:0,backgroundColor:"var(--background)",borderTop:"1px solid var(--border)",paddingTop:"var(--gap-md)",paddingBottom:"var(--gap-md)",zIndex:10,marginTop:"var(--gap-lg)"},children:[F&&S&&r(v,{type:"button",onClick:O,disabled:o.loading,variant:"outline",className:"dndev-w-full",children:S}),m&&r(v,{type:"button",onClick:()=>h&&x(h)(),loading:o.loading,loadingText:o.loadingText,progress:o.progress,variant:U,className:"dndev-w-full",children:m}),r(v,{type:"submit",loading:o.loading,loadingText:o.loadingText,progress:o.progress,variant:P,className:"dndev-w-full",children:N||e("form.submit",{defaultValue:"Submit"})})]})]})]})})})}var Se=ue;export{ue as EntityFormRenderer,Se as default};
@@ -0,0 +1,7 @@
1
+ import { type ControlledFieldProps } from '../types';
2
+ import type { ReactElement } from 'react';
3
+ /**
4
+ * ControlledDurationField - Controlled component for duration (minutes) with preset chips + custom slider
5
+ */
6
+ export declare function ControlledDurationField(props: ControlledFieldProps): ReactElement;
7
+ //# sourceMappingURL=ControlledDurationField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlledDurationField.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/input/ControlledDurationField.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAG7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,GAC1B,YAAY,CA8Bd"}
@@ -0,0 +1 @@
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{Controller as f}from"react-hook-form";import{DurationFieldComponent as p}from"../../form/fields";import{convertValidationRules as c}from"../types";function C(s){const{control:d,errors:n,fieldConfig:l,t}=s,{name:e,label:m,validation:o}=l,r=(l.options||{}).fieldSpecific;return a(f,{name:e,control:d,rules:o?c(o):void 0,render:({field:i})=>a(p,{label:t(m),value:i.value??0,onChange:u=>i.onChange(u),error:!!n[e],helperText:n[e]?.message,required:o?.required,disabled:i.disabled,min:r?.min??0,max:r?.max??480,step:r?.step??5,t})})}export{C as ControlledDurationField};
@@ -6,6 +6,7 @@ export { ControlledPriceField } from './ControlledPriceField';
6
6
  export { ControlledPhoneField } from './ControlledPhoneField';
7
7
  export { ControlledRangeField } from './ControlledRangeField';
8
8
  export { ControlledRatingField } from './ControlledRatingField';
9
+ export { ControlledDurationField } from './ControlledDurationField';
9
10
  export { ControlledSwitchField } from './ControlledSwitchField';
10
11
  export { ControlledTextField } from './ControlledTextField';
11
12
  export { ControlledTextareaField } from './ControlledTextareaField';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/input/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/controlled/input/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC"}
@@ -1 +1 @@
1
- import{ControlledCheckboxField as o}from"./ControlledCheckboxField";import{ControlledCurrencyField as l}from"./ControlledCurrencyField";import{ControlledNumberField as e}from"./ControlledNumberField";import{ControlledPasswordField as r}from"./ControlledPasswordField";import{ControlledPriceField as d}from"./ControlledPriceField";import{ControlledPhoneField as t}from"./ControlledPhoneField";import{ControlledRangeField as i}from"./ControlledRangeField";import{ControlledRatingField as n}from"./ControlledRatingField";import{ControlledSwitchField as a}from"./ControlledSwitchField";import{ControlledTextField as s}from"./ControlledTextField";import{ControlledTextareaField as C}from"./ControlledTextareaField";import{ControlledGdprConsentField as m}from"./ControlledGdprConsentField";export{o as ControlledCheckboxField,l as ControlledCurrencyField,m as ControlledGdprConsentField,e as ControlledNumberField,r as ControlledPasswordField,t as ControlledPhoneField,d as ControlledPriceField,i as ControlledRangeField,n as ControlledRatingField,a as ControlledSwitchField,s as ControlledTextField,C as ControlledTextareaField};
1
+ import{ControlledCheckboxField as o}from"./ControlledCheckboxField";import{ControlledCurrencyField as l}from"./ControlledCurrencyField";import{ControlledNumberField as e}from"./ControlledNumberField";import{ControlledPasswordField as r}from"./ControlledPasswordField";import{ControlledPriceField as d}from"./ControlledPriceField";import{ControlledPhoneField as t}from"./ControlledPhoneField";import{ControlledRangeField as i}from"./ControlledRangeField";import{ControlledRatingField as n}from"./ControlledRatingField";import{ControlledDurationField as a}from"./ControlledDurationField";import{ControlledSwitchField as s}from"./ControlledSwitchField";import{ControlledTextField as C}from"./ControlledTextField";import{ControlledTextareaField as m}from"./ControlledTextareaField";import{ControlledGdprConsentField as F}from"./ControlledGdprConsentField";export{o as ControlledCheckboxField,l as ControlledCurrencyField,a as ControlledDurationField,F as ControlledGdprConsentField,e as ControlledNumberField,r as ControlledPasswordField,t as ControlledPhoneField,d as ControlledPriceField,i as ControlledRangeField,n as ControlledRatingField,s as ControlledSwitchField,C as ControlledTextField,m as ControlledTextareaField};
@@ -0,0 +1,42 @@
1
+ import type { ComponentType } from 'react';
2
+ /** Preset durations in minutes */
3
+ export declare const DURATION_PRESETS: readonly [15, 30, 45, 60, 90, 120, 150, 180];
4
+ export interface DurationFieldComponentProps {
5
+ /** Label for the field */
6
+ label: string;
7
+ /** Current value in minutes */
8
+ value?: number;
9
+ /** Change handler (minutes) */
10
+ onChange: (value: number) => void;
11
+ /** Whether the field is in error state */
12
+ error?: boolean;
13
+ /** Helper text */
14
+ helperText?: string;
15
+ /** Whether the field is disabled */
16
+ disabled?: boolean;
17
+ /** Whether the field is required */
18
+ required?: boolean;
19
+ /** Read-only mode (display only) */
20
+ readonly?: boolean;
21
+ /** Min minutes for custom slider (default 0) */
22
+ min?: number;
23
+ /** Max minutes for custom slider (default 480 = 8h) */
24
+ max?: number;
25
+ /** Step for custom slider (default 5) */
26
+ step?: number;
27
+ /**
28
+ * Translation function for preset labels (e.g. t('crud:duration.30m')).
29
+ * Receives i18n key; return value is the chip label.
30
+ */
31
+ t?: (key: string, options?: Record<string, unknown>) => string;
32
+ }
33
+ /**
34
+ * DurationFieldComponent - Preset chips + Custom slider for duration (minutes)
35
+ *
36
+ * Used by the built-in entity field type `duration`.
37
+ *
38
+ * @see Entity field type: `duration` (registered in registerBuiltinFieldTypes)
39
+ */
40
+ declare const DurationFieldComponent: ComponentType<DurationFieldComponentProps>;
41
+ export default DurationFieldComponent;
42
+ //# sourceMappingURL=DurationFieldComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DurationFieldComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/DurationFieldComponent.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,kCAAkC;AAClC,eAAO,MAAM,gBAAgB,8CAA+C,CAAC;AAE7E,MAAM,WAAW,2BAA2B;IAC1C,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;CAChE;AAoBD;;;;;;GAMG;AACH,QAAA,MAAM,sBAAsB,EAAE,aAAa,CAAC,2BAA2B,CA0HtE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1 @@
1
+ import{jsx as i,jsxs as l}from"react/jsx-runtime";import{useState as T,useMemo as k}from"react";import{Clock as x}from"lucide-react";import{Label as z,Stack as s,Button as S,Slider as w}from"@donotdev/components";const f=[15,30,45,60,90,120,150,180],N={15:"duration.15m",30:"duration.30m",45:"duration.45m",60:"duration.1h",90:"duration.1h30",120:"duration.2h",150:"duration.2h30",180:"duration.3h"};function W(a,o){const n=a<60?`${a}m`:a%60===0?`${a/60}h`:`${Math.floor(a/60)}h${a%60}`,u=N[a];return!o||!u?n:o(`crud:${u}`,{defaultValue:n})??n}const j=({label:a,value:o,onChange:n,error:u,helperText:d,disabled:m,required:p,readonly:C,min:g=0,max:v=480,step:M=5,t})=>{const r=typeof o=="number"&&!Number.isNaN(o)?o:0,h=f.includes(r),[c,b]=T(!h&&r>0),V=k(()=>f.map(e=>({minutes:e,label:W(e,t)})),[t]),y=t?t("crud:duration.custom",{defaultValue:"Custom"}):"Custom";if(C){const e=r===0?t?t("crud:duration.zero",{defaultValue:"\u2014"}):"\u2014":r<60?t?t("crud:duration.minutes",{count:r,defaultValue:`${r} min`}):`${r} min`:t?t("crud:duration.hoursMinutes",{hours:Math.floor(r/60),minutes:r%60,defaultValue:`${Math.floor(r/60)}h${r%60?` ${r%60}min`:""}`}):`${Math.floor(r/60)}h${r%60?` ${r%60}m`:""}`;return l(s,{gap:"tight",children:[i(z,{required:p,style:{fontSize:"var(--font-size-sm)",fontWeight:500},children:a}),l(s,{direction:"row",gap:"tight",align:"center",children:[i(x,{size:18,style:{color:"var(--muted-foreground)"},"aria-hidden":!0}),i("span",{style:{color:"var(--muted-foreground)",fontSize:"var(--font-size-sm)"},children:e})]}),d&&i("p",{style:{fontSize:"var(--font-size-xs)",color:u?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:d})]})}return l(s,{gap:"medium",children:[i(z,{required:p,style:{fontSize:"var(--font-size-sm)",fontWeight:500},children:a}),l(s,{direction:"row",gap:"tight",align:"center",style:{flexWrap:"wrap"},children:[V.map(({minutes:e,label:$})=>l(S,{type:"button",variant:r===e?"primary":"outline",disabled:m,onClick:()=>{b(!1),n(e)},"aria-pressed":r===e,"aria-label":$,children:[i(x,{size:14,style:{marginRight:"var(--gap-xs)"},"aria-hidden":!0}),$]},e)),i(S,{type:"button",variant:c?"primary":"outline",disabled:m,onClick:()=>{b(!0),!h&&r>0?n(r):n(30)},"aria-pressed":c,"aria-label":y,children:y})]}),c&&i(s,{gap:"tight",style:{marginTop:"var(--gap-sm)"},children:i(w,{value:[h?30:r],onValueChange:([e])=>n(Math.max(g,Math.min(v,e??0))),min:g,max:v,step:M,showValue:!0,disabled:m,"aria-label":a})}),d&&i("p",{style:{fontSize:"var(--font-size-xs)",color:u?"var(--destructive-foreground)":"var(--muted-foreground)",marginTop:"var(--gap-sm)"},children:d})]})};var q=j;export{f as DURATION_PRESETS,q as default};
@@ -1 +1 @@
1
- {"version":3,"file":"PhoneNumberComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/PhoneNumberComponent.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,yBAAyB;IACxC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACzD,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,QAAA,MAAM,oBAAoB,EAAE,aAAa,CAAC,yBAAyB,CAiOlE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"PhoneNumberComponent.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/PhoneNumberComponent.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,WAAW,yBAAyB;IACxC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACzD,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,QAAA,MAAM,oBAAoB,EAAE,aAAa,CAAC,yBAAyB,CAiQlE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- "use client";import{jsx as r,jsxs as s}from"react/jsx-runtime";import{useState as W,useMemo as m,useEffect as k,useId as E}from"react";import{Input as M,FloatingLabel as O,Button as U,BUTTON_VARIANT as j,DropdownMenu as q,Stack as f,cn as D}from"@donotdev/components";import{Flag as I,COUNTRIES as C}from"@donotdev/core";const _=({label:$,value:d="",onChange:N,error:R,helperText:g,required:w=!1,disabled:v=!1,defaultCountry:T="FR",showFlags:x=!0,preferredCountries:c,countries:p})=>{const o=E(),h=m(()=>p&&p.length>0?p.map(e=>C.find(t=>t.code===e)).filter(e=>e!==void 0):Array.from(C),[p]),n=m(()=>{if(!c||c.length===0)return h;const e=c.map(i=>h.find(S=>S.code===i)).filter(i=>i!==void 0),t=h.filter(i=>!c.includes(i.code));return[...e,...t]},[h,c]),u=m(()=>n.find(e=>e.code===T)||n[0]||C[0],[T,n]),{country:b,phoneNumber:z}=m(()=>{if(!d)return{country:u,phoneNumber:""};const e=n.find(t=>d.startsWith(t.dialCode));return e?{country:e,phoneNumber:d.slice(e.dialCode.length).trim()}:d.startsWith("+")?{country:u,phoneNumber:d}:{country:u,phoneNumber:d}},[d,u,n]),[a,F]=W(u);k(()=>{b.code!==a.code&&F(b)},[b,a.code]);const y=z,A=e=>{F(e);const t={target:{value:e.dialCode+(y?" "+y:"")}};N(t)},B=e=>{const t=e.target.value,i={target:{value:a.dialCode+(t?" "+t:"")}};N(i)},L=n.map(e=>({label:e.dialCode,onClick:()=>A(e),checked:e.code===a.code,children:x?s(f,{direction:"row",align:"center",gap:"tight",children:[r(I,{code:e.flagCode,title:e.name}),r("span",{children:e.dialCode}),r("span",{style:{color:"var(--muted-foreground)",fontSize:"var(--font-size-xs)"},children:e.name})]}):s("span",{children:[e.dialCode," ",e.name]})})),l=!!R;return s(f,{gap:"tight",children:[r(O,{htmlFor:o,label:$,disabled:v,required:w,children:s("div",{className:"dndev-relative",style:{display:"flex",gap:0},children:[r(q,{trigger:r(U,{type:"button",variant:j.OUTLINE,disabled:v,style:{minWidth:"fit-content",padding:"0 var(--gap-md)",borderRight:"none",borderTopRightRadius:0,borderBottomRightRadius:0,borderRadius:"var(--radius-md) 0 0 var(--radius-md)"},"aria-label":`Country code: ${a.dialCode}`,children:s(f,{direction:"row",align:"center",gap:"tight",children:[x&&r(I,{code:a.flagCode,title:a.name}),r("span",{children:a.dialCode})]})}),items:L,contentWidth:"16rem"}),r(M,{id:o,type:"tel",inputMode:"tel",value:y,onChange:B,disabled:v,placeholder:"6 12 34 56 78",bare:!0,"data-variant":l?"destructive":void 0,className:"dndev-flex-1",style:{borderTopLeftRadius:0,borderBottomLeftRadius:0,borderRadius:"0 var(--radius-md) var(--radius-md) 0"},"aria-describedby":D(l&&`${o}-error`,g&&!l&&`${o}-helper`),"aria-invalid":l})]})}),l&&s(f,{id:`${o}-error`,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[r("span",{children:"\u26A0"}),R]}),g&&!l&&r("p",{id:`${o}-helper`,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:g})]})};var J=_;export{J as default};
1
+ "use client";import{jsx as i,jsxs as s}from"react/jsx-runtime";import{useState as A,useMemo as p,useEffect as B,useId as L}from"react";import{Input as M,FloatingLabel as k,Button as F,BUTTON_VARIANT as O,DropdownMenu as U,Stack as g,cn as _}from"@donotdev/components";import{Flag as z,COUNTRIES as y}from"@donotdev/core";const D=({label:E,value:d="",onChange:N,error:R,helperText:b,required:I=!1,disabled:v=!1,defaultCountry:x="FR",showFlags:W=!0,preferredCountries:c,countries:h})=>{const a=L(),f=p(()=>h&&h.length>0?h.map(e=>y.find(t=>t.code===e)).filter(e=>e!==void 0):Array.from(y),[h]),o=p(()=>{if(!c||c.length===0)return f;const e=c.map(r=>f.find(m=>m.code===r)).filter(r=>r!==void 0),t=f.filter(r=>!c.includes(r.code));return[...e,...t]},[f,c]),u=p(()=>o.find(e=>e.code===x)||o[0]||y[0],[x,o]),{country:C,phoneNumber:w}=p(()=>{if(!d)return{country:u,phoneNumber:""};const e=o.find(r=>d.startsWith(r.dialCode));if(e){let r=d.slice(e.dialCode.length).trim();return r.startsWith("0")&&(r=r.slice(1).trim()),r=r.replace(/\s+/g," ").trim(),{country:e,phoneNumber:r}}if(d.startsWith("+"))return{country:u,phoneNumber:d};let t=d.trim();return t.startsWith("0")&&(t=t.slice(1).trim()),t=t.replace(/\s+/g," ").trim(),{country:u,phoneNumber:t}},[d,u,o]),[n,S]=A(u);B(()=>{C.code!==n.code&&S(C)},[C,n.code]);const V=w,T=e=>{S(e);let t=V;t.startsWith("0")&&(t=t.slice(1).trim()),t=t.replace(/\s+/g," ").trim();const m={target:{value:e.dialCode+(t?" "+t:"")}};N(m)},$=e=>{let t=e.target.value;t.startsWith("0")&&(t=t.slice(1).trim()),t=t.replace(/\s+/g," ").trim();const m={target:{value:n.dialCode+(t?" "+t:"")}};N(m)},j=o.map(e=>({label:e.dialCode,onClick:()=>T(e),checked:e.code===n.code,children:W?s(g,{direction:"row",align:"center",gap:"tight",children:[i(z,{code:e.flagCode,title:e.name}),i("span",{children:e.dialCode}),i("span",{style:{color:"var(--muted-foreground)",fontSize:"var(--font-size-xs)"},children:e.name})]}):s("span",{children:[e.dialCode," ",e.name]})})),l=!!R;return s(g,{gap:"tight",children:[i(k,{htmlFor:a,label:E,disabled:v,required:I,children:s("div",{className:"dndev-relative",style:{display:"flex",gap:0},children:[i(U,{trigger:i(F,{type:"button",variant:O.OUTLINE,disabled:v,style:{minWidth:"fit-content",padding:"0 var(--gap-md)",borderRight:"none",borderTopRightRadius:0,borderBottomRightRadius:0,borderRadius:"var(--radius-md) 0 0 var(--radius-md)"},"aria-label":`Country code: ${n.dialCode}`,children:s(g,{direction:"row",align:"center",gap:"tight",children:[W&&i(z,{code:n.flagCode,title:n.name}),i("span",{children:n.dialCode})]})}),items:j,contentWidth:"16rem"}),i(M,{id:a,type:"tel",inputMode:"tel",value:V,onChange:$,disabled:v,placeholder:"6 12 34 56 78",bare:!0,"data-variant":l?"destructive":void 0,className:"dndev-flex-1",style:{borderTopLeftRadius:0,borderBottomLeftRadius:0,borderRadius:"0 var(--radius-md) var(--radius-md) 0"},"aria-describedby":_(l&&`${a}-error`,b&&!l&&`${a}-helper`),"aria-invalid":l})]})}),l&&s(g,{id:`${a}-error`,direction:"row",align:"center",gap:"tight",style:{fontSize:"var(--font-size-xs)",color:"var(--destructive-foreground)"},role:"alert",children:[i("span",{children:"\u26A0"}),R]}),b&&!l&&i("p",{id:`${a}-helper`,style:{fontSize:"var(--font-size-xs)",color:"var(--muted-foreground)"},children:b})]})};var J=D;export{J as default};
@@ -40,6 +40,9 @@ export { default as RangeFieldComponent } from './RangeFieldComponent';
40
40
  export type { RangeFieldComponentProps } from './RangeFieldComponent';
41
41
  export { default as RatingFieldComponent } from './RatingFieldComponent';
42
42
  export type { RatingFieldComponentProps } from './RatingFieldComponent';
43
+ export { default as DurationFieldComponent } from './DurationFieldComponent';
44
+ export type { DurationFieldComponentProps } from './DurationFieldComponent';
45
+ export { DURATION_PRESETS } from './DurationFieldComponent';
43
46
  export { default as PhoneNumberComponent } from './PhoneNumberComponent';
44
47
  export type { PhoneNumberComponentProps } from './PhoneNumberComponent';
45
48
  export { default as GeoPointFieldComponent } from './GeoPointFieldComponent';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EACV,2BAA2B,EAC3B,QAAQ,GACT,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,YAAY,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAE9E,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,YAAY,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AAExF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAE1E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EACV,wBAAwB,EACxB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACnF,YAAY,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/form/fields/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- import{default as o}from"./AvatarFieldComponent";import{default as e}from"./BadgeFieldComponent";import{default as t}from"./TextFieldComponent";import{default as a}from"./NumberFieldComponent";import{default as m}from"./DateFieldComponent";import{default as n}from"./CheckboxFieldComponent";import{default as r}from"./ComboboxComponent";import{default as p}from"./DropdownComponent";import{default as s}from"./MultiDropdownComponent";import{default as i}from"./FileFieldComponent";import{default as d}from"./ImageFieldComponent";import{default as f}from"./DocumentFieldComponent";import{default as l}from"./TextAreaComponent";import{default as u}from"./SwitchFieldComponent";import{default as C}from"./RadioFieldComponent";import{default as F}from"./RangeFieldComponent";import{default as x}from"./RatingFieldComponent";import{default as b}from"./PhoneNumberComponent";import{default as c}from"./GeoPointFieldComponent";import{default as g}from"./MapFieldComponent";import{default as w}from"./TimestampFieldComponent";import{default as P}from"./MultiInputTextFieldComponent";import{default as T}from"./ButtonFieldComponent";import{default as h}from"./HiddenFieldComponent";import{default as A}from"./PasswordFieldComponent";import{default as D}from"./AddressFieldComponent";import{default as R}from"./CurrencyFieldComponent";import{default as B}from"./PriceFieldComponent";import{default as I}from"./RichTextComponent";import{default as M}from"./GdprConsentFieldComponent";export{D as AddressFieldComponent,o as AvatarFieldComponent,e as BadgeFieldComponent,T as ButtonFieldComponent,n as CheckboxFieldComponent,r as ComboboxComponent,R as CurrencyFieldComponent,m as DateFieldComponent,f as DocumentFieldComponent,p as DropdownComponent,i as FileFieldComponent,M as GdprConsentFieldComponent,c as GeoPointFieldComponent,h as HiddenFieldComponent,d as ImageFieldComponent,g as MapFieldComponent,s as MultiDropdownComponent,P as MultiInputTextFieldComponent,a as NumberFieldComponent,A as PasswordFieldComponent,b as PhoneNumberComponent,B as PriceFieldComponent,C as RadioFieldComponent,F as RangeFieldComponent,x as RatingFieldComponent,I as RichTextComponent,u as SwitchFieldComponent,l as TextAreaComponent,t as TextFieldComponent,w as TimestampFieldComponent};
1
+ import{default as o}from"./AvatarFieldComponent";import{default as t}from"./BadgeFieldComponent";import{default as e}from"./TextFieldComponent";import{default as a}from"./NumberFieldComponent";import{default as m}from"./DateFieldComponent";import{default as n}from"./CheckboxFieldComponent";import{default as r}from"./ComboboxComponent";import{default as s}from"./DropdownComponent";import{default as p}from"./MultiDropdownComponent";import{default as i}from"./FileFieldComponent";import{default as d}from"./ImageFieldComponent";import{default as f}from"./DocumentFieldComponent";import{default as l}from"./TextAreaComponent";import{default as u}from"./SwitchFieldComponent";import{default as C}from"./RadioFieldComponent";import{default as F}from"./RangeFieldComponent";import{default as R}from"./RatingFieldComponent";import{default as T}from"./DurationFieldComponent";import{DURATION_PRESETS as x}from"./DurationFieldComponent";import{default as c}from"./PhoneNumberComponent";import{default as D}from"./GeoPointFieldComponent";import{default as P}from"./MapFieldComponent";import{default as A}from"./TimestampFieldComponent";import{default as S}from"./MultiInputTextFieldComponent";import{default as b}from"./ButtonFieldComponent";import{default as h}from"./HiddenFieldComponent";import{default as E}from"./PasswordFieldComponent";import{default as g}from"./AddressFieldComponent";import{default as w}from"./CurrencyFieldComponent";import{default as I}from"./PriceFieldComponent";import{default as M}from"./RichTextComponent";import{default as N}from"./GdprConsentFieldComponent";export{g as AddressFieldComponent,o as AvatarFieldComponent,t as BadgeFieldComponent,b as ButtonFieldComponent,n as CheckboxFieldComponent,r as ComboboxComponent,w as CurrencyFieldComponent,x as DURATION_PRESETS,m as DateFieldComponent,f as DocumentFieldComponent,s as DropdownComponent,T as DurationFieldComponent,i as FileFieldComponent,N as GdprConsentFieldComponent,D as GeoPointFieldComponent,h as HiddenFieldComponent,d as ImageFieldComponent,P as MapFieldComponent,p as MultiDropdownComponent,S as MultiInputTextFieldComponent,a as NumberFieldComponent,E as PasswordFieldComponent,c as PhoneNumberComponent,I as PriceFieldComponent,C as RadioFieldComponent,F as RangeFieldComponent,R as RatingFieldComponent,M as RichTextComponent,u as SwitchFieldComponent,l as TextAreaComponent,e as TextFieldComponent,A as TimestampFieldComponent};
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAwdrB"}
1
+ {"version":3,"file":"useEntityForm.d.ts","sourceRoot":"","sources":["../../../src/forms/hooks/useEntityForm.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAW7C,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,gBAAgB,CAAC,CAAC,CAAC,CAmdrB"}
@@ -1 +1 @@
1
- "use client";import{valibotResolver as B}from"@hookform/resolvers/valibot";import{useMemo as m,useEffect as k,useRef as g,useCallback as y}from"react";import{useForm as ee,useWatch as te}from"react-hook-form";import{useLocalStorage as re,BACKEND_GENERATED_FIELD_NAMES as ae,createSchemas as oe}from"@donotdev/core";import{useFormStore as O,useFormStatus as ne,useUploadProgress as se}from"../../stores";import{useUploadStore as C}from"../../stores/UploadStore";import{checkForBlobUrls as L}from"../../utils/uploadValidation";import{getFieldsForOperation as ie}from"../utils";function ue(l,_={}){const{formId:e,operation:J,defaultValues:u,viewerRole:U="admin",mode:M="onBlur",t:q,autoSave:f=!1}=_,n=J??(u?"edit":"create"),z=ne(e??""),G=se(e??""),b=m(()=>oe(l),[l.name]),D=m(()=>B(b.create),[b.create]),N=m(()=>B(b.draft),[b.draft]),K=m(()=>async(t,a,o)=>((t?.status??u?.status)==="draft"?N:D)(t,a,o),[D,N,u?.status]),i=m(()=>{if(!u)return u;const t={...u};return Object.entries(l.fields).forEach(([a,o])=>{const r=t[a],c=!(a in u)||r===null||r===void 0;if(o.type==="switch"){if(r==null){const v=o.options?.fieldSpecific;t[a]=v?.uncheckedValue??!1}}else c&&(o.type==="price"?t[a]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:(o.type==="checkbox"||o.type==="boolean")&&(t[a]=!1))}),t},[u,l.fields]),s=ee({defaultValues:i,mode:M,resolver:K,shouldUnregister:!1,shouldFocusError:!0}),h=g(null);k(()=>{if(n==="edit"&&i){const t=i.id??null;t&&t!==h.current?(s.reset(i),h.current=t):!t&&h.current===null&&(s.reset(i),h.current="initialized")}},[n,i,s]);const W=m(()=>`${l.name.toLowerCase()}-form-draft`,[l.name]),{value:R,setValue:P,removeValue:E}=re(W,{defaultValue:null,syncAcrossTabs:!0}),w=g(!1);k(()=>{!f||n!=="create"||u||w.current||(R&&s.reset(R),w.current=!0)},[f,n,u,R,s]);const d=te({control:s.control}),F=g(!1),S=g(null),V=g(void 0),T=g(!0);k(()=>{if(T.current){T.current=!1,V.current=d?JSON.stringify(d):void 0;return}if(!f||n!=="create"||F.current||!w.current)return;const t=d?JSON.stringify(d):void 0;if(V.current!==t)return V.current=t,S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{d&&Object.values(d).some(a=>a!=null&&a!=="")&&P(d)},3e3),()=>{S.current&&clearTimeout(S.current)}},[d,f,n,P]);const A=y(async()=>{if(!e)return!0;const t=C.getState(),a=O.getState();if(!t.hasPendingUploads(e))return!0;try{a.setUploading(e,0),await t.uploadAll(e),await new Promise(p=>setTimeout(p,50));let o=s.getValues(),r=L(o),c=0;const v=5;for(;r.length>0&&c<v;)c++,await new Promise(p=>setTimeout(p,100)),o=s.getValues(),r=L(o);if(r.length>0){const p=`Upload incomplete: files still pending at ${r.join(", ")}`;return a.setError(e,p),!1}return!0}catch(o){const r=o instanceof Error?o.message:"File upload failed";return O.getState().setError(e,r),!1}},[e,s]),I=y(t=>n!=="create"?t:Object.fromEntries(Object.entries(t).filter(([a])=>!ae.includes(a))),[n]),$=y(t=>{if(typeof window>"u")return;const a=Object.keys(t).find(r=>r!=="root"&&t[r]);if(!a)return;const o=document.querySelector(`input[name="${a}"][aria-invalid="true"], textarea[name="${a}"][aria-invalid="true"], select[name="${a}"][aria-invalid="true"]`);o&&(o.scrollIntoView({behavior:"smooth",block:"center"}),o.focus())},[]),x=s.handleSubmit,H=m(()=>((t,a)=>async o=>{o?.preventDefault?.();const r=e?O.getState():null;e&&r&&r.startSubmit(e),F.current=!0;try{if(!await A()){F.current=!1;return}e&&r&&r.setValidating(e),await x(async(c,v)=>{e&&r&&r.setSubmitting(e);const p=I(c);try{await t(p,v),f&&n==="create"&&E(),e&&r&&r.setSuccess(e)}catch(j){const Z=j instanceof Error?j.message:"Submission failed";throw e&&r&&r.setError(e,Z),j}},c=>{e&&r&&r.setError(e,"Validation failed"),$(c),a?.(c)})(o)}finally{F.current=!1}}),[x,e,A,I,$,f,n,E]),Q=y(()=>{f&&n==="create"&&E(),s.reset(i),V.current=i?JSON.stringify(i):void 0,T.current=!0,w.current=!1},[f,n,E,s,i]),X=y(()=>{e&&(O.getState().cleanup(e),C.getState().cleanup(e))},[e]),Y=m(()=>ie(l,{operation:n,viewerRole:U,availableFields:void 0}),[l,n,U]);return{...s,handleSubmit:H,fields:Y,operation:n,entity:l,t:q??(t=>t),viewerRole:U,formId:e,formStatus:e?z:"idle",uploadProgress:e?G:0,cleanup:X,isDirty:s.formState.isDirty,resetForm:Q,originalValues:i}}export{ue as useEntityForm};
1
+ "use client";import{valibotResolver as C}from"@hookform/resolvers/valibot";import{useMemo as c,useEffect as R,useRef as p,useCallback as h}from"react";import{useForm as ue,useWatch as ie}from"react-hook-form";import{useLocalStorage as ce,BACKEND_GENERATED_FIELD_NAMES as le,createSchemas as fe}from"@donotdev/core";import{useFormStore as y,useFormStatus as de,useUploadProgress as me}from"../../stores";import{useUploadStore as J}from"../../stores/UploadStore";import{checkForBlobUrls as _}from"../../utils/uploadValidation";import{getFieldsForOperation as pe}from"../utils";import{buildInitialFromRecord as Se,buildSchemaDefaults as ge}from"../utils/buildInitialValues";function Pe(u,z={}){const{formId:e,operation:K,defaultValues:S,viewerRole:W,mode:q="onBlur",t:G,autoSave:l=!1}=z,P=W??"guest",o=K??(S?"edit":"create"),H=de(e??""),Q=me(e??""),b=c(()=>fe(u),[u.name]),j=c(()=>C(b.create),[b.create]),k=c(()=>C(b.draft),[b.draft]),X=c(()=>async(t,a,s)=>((t?.status??S?.status)==="draft"?k:j)(t,a,s),[j,k,S?.status]),A=c(()=>ge(u),[u]),T=S,i=c(()=>{if(o==="create")return A;if(T)return Se(u,T)},[o,A,u,T]),n=ue({defaultValues:o==="create"?i:void 0,mode:q,resolver:X,shouldUnregister:!1,shouldFocusError:!0}),O=p(n);R(()=>{O.current=n},[n]);const v=p(null);R(()=>{if(o==="edit"&&i){const t=i.id??null;t&&t!==v.current?(O.current.reset(i),v.current=t):!t&&v.current===null&&(O.current.reset(i),v.current="initialized")}},[o,i]);const Y=c(()=>`${u.name.toLowerCase()}-form-draft`,[u.name]),{value:I,setValue:N,removeValue:F}=ce(Y,{defaultValue:null,syncAcrossTabs:!0}),w=p(!1);R(()=>{!l||o!=="create"||S||w.current||(I&&n.reset(I),w.current=!0)},[l,o,S,I,n]);const f=ie({control:n.control}),D=p(!1),g=p(null),V=p(void 0),U=p(!0);R(()=>{if(U.current){U.current=!1,V.current=f?JSON.stringify(f):void 0;return}if(!l||o!=="create"||D.current||!w.current)return;const t=f?JSON.stringify(f):void 0;if(V.current!==t)return V.current=t,g.current&&clearTimeout(g.current),g.current=setTimeout(()=>{if(!f)return;Object.values(f).some(s=>s!=null&&s!=="")&&N(f)},3e3),()=>{g.current&&clearTimeout(g.current)}},[f,l,o,N]);const $=h(async()=>{if(!e)return!0;const t=J.getState(),a=y.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=n.getValues(),r=_(s),E=0;const d=5;for(;r.length>0&&E<d;)E++,await new Promise(m=>setTimeout(m,100)),s=n.getValues(),r=_(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 y.getState().setError(e,r),!1}},[e,n]),B=h(t=>o!=="create"?t:Object.fromEntries(Object.entries(t).filter(([a])=>!le.includes(a))),[o]),L=h(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())},[]),x=n.handleSubmit,Z=c(()=>((t,a)=>async s=>{s?.preventDefault?.();const r=e?y.getState():null;e&&r&&r.startSubmit(e),D.current=!0;try{if(!await $()){D.current=!1;return}e&&r&&r.setValidating(e),await x(async(d,m)=>{e&&r&&r.setSubmitting(e);const ne=B(d);try{await t(ne,m),l&&o==="create"&&F(),e&&r&&r.setSuccess(e)}catch(M){const ae=M instanceof Error?M.message:"Submission failed";throw e&&r&&r.setError(e,ae),M}},d=>{e&&r&&r.setError(e,"Validation failed"),L(d),a?.(d)})(s)}finally{D.current=!1}}),[x,e,$,B,L,l,o,F]),ee=h(()=>{l&&o==="create"&&F(),n.reset(i),V.current=i?JSON.stringify(i):void 0,U.current=!0,w.current=!1},[l,o,F,n,i]),te=h(()=>{e&&(y.getState().cleanup(e),J.getState().cleanup(e))},[e]),re=c(()=>pe(u,{operation:o,viewerRole:P,availableFields:void 0}),[u,o,P]),se=G??(t=>t),oe=n.formState.isSubmitted||Object.keys(n.formState.touchedFields||{}).length>0;return{...n,handleSubmit:Z,fields:re,operation:o,entity:u,t:se,viewerRole:P,formId:e,formStatus:e?H:"idle",uploadProgress:e?Q:0,cleanup:te,isDirty:n.formState.isDirty,hasUserInteracted:oe,resetForm:ee,originalValues:i}}export{Pe as useEntityForm};
@@ -97,9 +97,10 @@ export interface UseEntityFormOptions<E extends Entity> {
97
97
  /**
98
98
  * Viewer role for editability checks.
99
99
  * Determines which fields render as inputs vs read-only.
100
- * @default 'admin'
100
+ * If not provided, defaults to 'guest' (most restrictive)
101
+ * @default 'guest'
101
102
  */
102
- viewerRole?: ViewerRole;
103
+ viewerRole?: string;
103
104
  /**
104
105
  * React Hook Form mode.
105
106
  * @default 'onSubmit'
@@ -150,8 +151,9 @@ export interface EntityFormReturn<E extends Entity> extends UseFormReturn<InferE
150
151
  t: (key: string, options?: Record<string, unknown>) => string;
151
152
  /**
152
153
  * Current viewer role.
154
+ * Always has a value (defaults to 'guest' if not provided).
153
155
  */
154
- viewerRole: ViewerRole;
156
+ viewerRole: string;
155
157
  /**
156
158
  * Form ID for state tracking.
157
159
  * Undefined if not provided in options.
@@ -176,6 +178,12 @@ export interface EntityFormReturn<E extends Entity> extends UseFormReturn<InferE
176
178
  * True if any field value differs from original/default values.
177
179
  */
178
180
  isDirty: boolean;
181
+ /**
182
+ * Whether the user has interacted with the form.
183
+ * True if any field has been touched or the form has been submitted.
184
+ * Used to gate navigation blocking so we don't warn on untouched forms.
185
+ */
186
+ hasUserInteracted: boolean;
179
187
  /**
180
188
  * Reset form to original values and clear any saved draft.
181
189
  * Use this for "Cancel" button functionality.
@@ -183,7 +191,8 @@ export interface EntityFormReturn<E extends Entity> extends UseFormReturn<InferE
183
191
  resetForm: () => void;
184
192
  /**
185
193
  * Original values the form was initialized with.
186
- * Undefined for create mode, the defaultValues for edit mode.
194
+ * For create mode: schema-based defaults.
195
+ * For edit mode: schema defaults overlaid with the DB record.
187
196
  */
188
197
  originalValues: Partial<InferEntityData<E>> | undefined;
189
198
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @fileoverview Initial values builders for CRUD forms
3
+ * @description
4
+ * - buildSchemaDefaults: compute create-mode defaults from entity definition only.
5
+ * - buildInitialFromRecord: overlay schema defaults with an existing DB record
6
+ * and apply type-specific normalizations (switch, price, etc.).
7
+ *
8
+ * These helpers provide a single, canonical "initialValues" snapshot that
9
+ * React Hook Form can use as its dirty baseline.
10
+ */
11
+ import type { Entity } from '@donotdev/core';
12
+ import type { InferEntityData } from '../types';
13
+ /**
14
+ * Build initial values for an existing DB record.
15
+ *
16
+ * - Starts from the raw record (already filtered/masked by the backend).
17
+ * - For each field in the entity:
18
+ * - If the record has a non-null, non-undefined value, keep it.
19
+ * - Otherwise, apply the same type-specific defaults we use in forms.
20
+ */
21
+ export declare function buildInitialFromRecord<E extends Entity>(entity: E, record: Partial<InferEntityData<E>>): Partial<InferEntityData<E>>;
22
+ /**
23
+ * Build schema defaults for create-mode forms.
24
+ *
25
+ * - Starts from an empty record and applies the same type-specific defaults as
26
+ * buildInitialFromRecord.
27
+ * - This represents "what a brand-new object would look like" before any user edits.
28
+ */
29
+ export declare function buildSchemaDefaults<E extends Entity>(entity: E): Partial<InferEntityData<E>>;
30
+ //# sourceMappingURL=buildInitialValues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildInitialValues.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/buildInitialValues.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAwD7B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAG7B"}
@@ -0,0 +1 @@
1
+ function y(s,r){const n=r??{},e={...n};return Object.entries(s.fields).forEach(([c,t])=>{const u=e[c],p=!(c in n)||u===null||u===void 0;if(t.type==="switch"){if(u==null){const a=t.options?.fieldSpecific;e[c]=a?.uncheckedValue??!1}}else p&&(t.type==="price"?e[c]={amount:0,currency:"EUR",vatIncluded:!0,discountPercent:0}:t.type==="checkbox"||t.type==="boolean"?e[c]=!1:t.type==="text"||t.type==="textarea"||t.type==="email"||t.type==="url"||t.type==="tel"||t.type==="iban"||t.type==="password"||t.type==="color"?e[c]="":(t.type==="number"||t.type==="range"||t.type==="rating")&&(e[c]=void 0))}),e}function o(s){return y(s,{})}export{y as buildInitialFromRecord,o as buildSchemaDefaults};
@@ -9,7 +9,6 @@
9
9
  import type { Entity, EntityField, FieldType } from '@donotdev/core';
10
10
  /** Entity fields input - supports Entity, Entity['fields'], or plain Record */
11
11
  export type EntityFieldsInput = Entity | Entity['fields'] | Record<string, EntityField<FieldType>>;
12
- import type { ViewerRole } from './isFieldEditable';
13
12
  /** Field with computed editability for rendering */
14
13
  export interface RenderableField<T extends FieldType = FieldType> {
15
14
  /** Field name/key */
@@ -23,8 +22,8 @@ export interface RenderableField<T extends FieldType = FieldType> {
23
22
  export interface GetFieldsForOperationOptions {
24
23
  /** Form operation type */
25
24
  operation: 'create' | 'edit';
26
- /** Viewer role for editability checks */
27
- viewerRole?: ViewerRole;
25
+ /** Viewer role for editability checks (defaults to 'guest' if undefined) */
26
+ viewerRole?: string;
28
27
  /**
29
28
  * Available field names (for edit mode).
30
29
  * When provided, only fields in this list are returned.
@@ -1 +1 @@
1
- {"version":3,"file":"getFieldsForOperation.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/getFieldsForOperation.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAErE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,MAAM,CAAC,QAAQ,CAAC,GAChB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AAI3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,oDAAoD;AACpD,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC9D,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,kCAAkC;AAClC,MAAM,WAAW,4BAA4B;IAC3C,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,yCAAyC;IACzC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,4BAA4B,GACpC,eAAe,EAAE,CAoDnB"}
1
+ {"version":3,"file":"getFieldsForOperation.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/getFieldsForOperation.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGrE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,MAAM,CAAC,QAAQ,CAAC,GAChB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AAI3C,oDAAoD;AACpD,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC9D,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,kCAAkC;AAClC,MAAM,WAAW,4BAA4B;IAC3C,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,4BAA4B,GACpC,eAAe,EAAE,CAmDnB"}
@@ -1 +1 @@
1
- import{isFieldEditable as u}from"./isFieldEditable";function p(i,s){const{operation:n,viewerRole:c="admin",availableFields:o}=s,r=i&&typeof i=="object"&&"fields"in i&&"name"in i?i.fields:i,f=Object.entries(r),l=[];for(const[a,b]of f){const e=b,t=e.visibility||"user";if(n==="create"){if(t==="technical"||t==="hidden")continue}else if(t==="hidden"||o&&!o.includes(a))continue;let d=u(e.editable,c,n);n==="edit"&&t==="technical"&&e.editable===void 0&&(d=!1),l.push({name:a,config:e,editable:d})}return l}export{p as getFieldsForOperation};
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};
@@ -31,5 +31,5 @@ export type ViewerRole = 'public' | 'guest' | 'user' | 'admin' | 'super';
31
31
  * @since 0.0.1
32
32
  * @author AMBROISE PARK Consulting
33
33
  */
34
- export declare function isFieldEditable(editable: Editable | undefined, viewerRole: ViewerRole, operation: 'create' | 'edit'): boolean;
34
+ export declare function isFieldEditable(editable: Editable | undefined, viewerRole: string, operation: 'create' | 'edit'): boolean;
35
35
  //# sourceMappingURL=isFieldEditable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isFieldEditable.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/isFieldEditable.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,QAAQ,GAAG,MAAM,GAC3B,OAAO,CAcT"}
1
+ {"version":3,"file":"isFieldEditable.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/isFieldEditable.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,QAAQ,GAAG,MAAM,GAC3B,OAAO,CAcT"}
@@ -12,19 +12,25 @@ import type { EntityField, FieldType } from '@donotdev/core';
12
12
  * Translates a label string with namespace support.
13
13
  * Used for translating option labels, field labels, or any label string.
14
14
  *
15
- * Supports namespace:key syntax (e.g., "common:actions.save")
15
+ * Supports namespace:key syntax (e.g., "crud:status.draft")
16
+ *
17
+ * **Translation Fallback Order (for status labels):**
18
+ * 1. Entity namespace (`entity-{name}`) - User overrides take priority
19
+ * 2. CRUD namespace (`crud`) - Framework defaults
20
+ *
21
+ * No dndev fallback - CRUD is optional and shouldn't pollute core framework namespace.
16
22
  *
17
23
  * @param label - Label string to translate (may include namespace:key syntax)
18
- * @param t - Translation function from useTranslation hook
24
+ * @param t - Translation function from useTranslation hook (should be from multi-namespace hook like [entity.namespace, 'crud'])
19
25
  * @returns Translated label string
20
26
  *
21
27
  * @example
22
28
  * ```typescript
23
- * translateLabel('common:status', t); // Translates "status" from "common" namespace
24
- * translateLabel('make', t); // Translates "make" in current namespace
29
+ * translateLabel('crud:status.draft', t); // Tries entity namespace first, then crud
30
+ * translateLabel('make', t); // Translates "make" in current namespace (entity or crud)
25
31
  * ```
26
32
  *
27
- * @version 0.0.1
33
+ * @version 0.0.4
28
34
  * @since 0.0.1
29
35
  * @author AMBROISE PARK Consulting
30
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"translateFieldLabel.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/translateFieldLabel.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,GACxD,MAAM,CAWR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EACjE,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,EAClC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,GACxD,MAAM,CAGR"}
1
+ {"version":3,"file":"translateFieldLabel.d.ts","sourceRoot":"","sources":["../../../src/forms/utils/translateFieldLabel.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,GACxD,MAAM,CA6BR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EACjE,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,EAClC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,MAAM,GACxD,MAAM,CAGR"}
@@ -1 +1 @@
1
- function t(e,n){if(typeof e=="string"&&e.includes(":")){const r=e.split(":"),s=r[1]??e,a=r[0];return n(s,{ns:a})}return n(e)}function l(e,n,r){const s=n?.label||e;return t(s,r)}export{l as translateFieldLabel,t 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};