@object-ui/fields 11.4.0 → 11.5.0
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.
- package/CHANGELOG.md +16 -0
- package/dist/__tests__/DateCellRenderer.test.d.ts +0 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.js +36 -28
- package/package.json +7 -7
- package/src/__tests__/DateCellRenderer.test.tsx +50 -0
- package/src/index.tsx +29 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @object-ui/fields
|
|
2
2
|
|
|
3
|
+
## 11.5.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [544d8eb]
|
|
8
|
+
- Updated dependencies [6fffd3d]
|
|
9
|
+
- Updated dependencies [9255686]
|
|
10
|
+
- Updated dependencies [fae75e2]
|
|
11
|
+
- Updated dependencies [1072701]
|
|
12
|
+
- @object-ui/i18n@11.5.0
|
|
13
|
+
- @object-ui/react@11.5.0
|
|
14
|
+
- @object-ui/components@11.5.0
|
|
15
|
+
- @object-ui/types@11.5.0
|
|
16
|
+
- @object-ui/core@11.5.0
|
|
17
|
+
- @object-ui/providers@11.5.0
|
|
18
|
+
|
|
3
19
|
## 11.4.0
|
|
4
20
|
|
|
5
21
|
### Minor Changes
|
|
File without changes
|
package/dist/index.cjs
CHANGED
|
@@ -6,4 +6,4 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.
|
|
|
6
6
|
`,role:`button`,tabIndex:0,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),a.current?.click())},children:[(0,g.jsx)(m.Upload,{className:`size-8 ${b?`text-primary`:`text-muted-foreground`}`}),(0,g.jsxs)(`div`,{className:`text-center`,children:[(0,g.jsx)(`p`,{className:`text-sm font-medium`,children:b?`Drop files here`:`Drag & drop files here`}),(0,g.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:[`or click to browse`,y?` • use the camera button below`:``]})]})]}),y&&(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,className:`w-full`,onClick:e=>{e.stopPropagation(),o.current?.click()},"data-testid":`file-field-camera-button`,children:[(0,g.jsx)(m.Camera,{className:`size-4 mr-2`}),y===`user`?`Take selfie`:`Take photo`]}),ee&&(0,g.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,"data-testid":`file-field-uploading`,children:[(0,g.jsx)(m.Loader2,{className:`size-3 animate-spin`}),(0,g.jsxs)(`span`,{children:[`Uploading…`,Object.keys(T).length>0&&` (${Math.round(Object.values(T).reduce((e,t)=>e+t,0)/Object.keys(T).length*100)}%)`]})]}),S.length>0&&(0,g.jsx)(`div`,{className:`space-y-0.5`,children:S.map((e,t)=>(0,g.jsx)(`p`,{className:`text-xs text-destructive`,children:e},t))}),O.length>0&&(0,g.jsx)(`div`,{className:`space-y-1`,children:O.map((e,t)=>(0,g.jsxs)(`div`,{className:`flex items-center justify-between gap-2 p-2 bg-muted/50 rounded-md border`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2 flex-1 min-w-0`,children:[N(e)&&e.url?(0,g.jsx)(`img`,{src:e.url,alt:e.name,className:`size-8 object-cover rounded shrink-0`}):N(e)?(0,g.jsx)(m.ImageIcon,{className:`size-4 text-muted-foreground shrink-0`}):(0,g.jsx)(m.File,{className:`size-4 text-muted-foreground shrink-0`}),(0,g.jsx)(`span`,{className:`text-sm truncate`,children:e.name||e.original_name||`File`}),e.size&&(0,g.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`(`,(e.size/1024).toFixed(1),` KB)`]})]}),(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`sm`,onClick:e=>{e.stopPropagation(),M(t)},className:`h-6 w-6 p-0`,children:(0,g.jsx)(m.X,{className:`size-3`})})]},t))})]})]})}var xt=o((()=>{})),St=s({ImageCropperDialog:()=>Ct}),Ct,wt=o((()=>{Ct=({open:e,onOpenChange:t,src:n,outputType:r=`image/png`,outputName:i=`cropped.png`,onConfirm:a})=>{let o=(0,u.useRef)(null),s=(0,u.useRef)(null),[c,l]=(0,u.useState)(0),[d,f]=(0,u.useState)({x:0,y:0,width:100,height:100}),[h,_]=(0,u.useState)(null),[v,y]=(0,u.useState)(!1);(0,u.useEffect)(()=>{if(!e||!n)return;y(!1);let t=new Image;t.crossOrigin=`anonymous`,t.onload=()=>{s.current=t;let e=t.naturalWidth*.8,n=t.naturalHeight*.8;f({x:(t.naturalWidth-e)/2,y:(t.naturalHeight-n)/2,width:e,height:n}),l(0),y(!0)},t.onerror=()=>y(!1),t.src=n},[e,n]),(0,u.useEffect)(()=>{if(!v||!s.current||!o.current)return;let e=s.current,t=o.current,n=t.getContext(`2d`);if(!n)return;let r=480/e.naturalWidth,i=e.naturalHeight*r;t.width=480,t.height=i,n.clearRect(0,0,480,i),n.save(),n.translate(480/2,i/2),n.rotate(c*Math.PI/180);let a=c%180==0?480:i,l=c%180==0?i:480;n.drawImage(e,-a/2,-l/2,a,l),n.restore();let u=d.x*r,f=d.y*r,p=d.width*r,m=d.height*r;n.fillStyle=`rgba(0,0,0,0.45)`,n.fillRect(0,0,480,f),n.fillRect(0,f+m,480,i-f-m),n.fillRect(0,f,u,m),n.fillRect(u+p,f,480-u-p,m),n.strokeStyle=`#3b82f6`,n.lineWidth=2,n.strokeRect(u,f,p,m)},[v,d,c]);let b=(0,u.useCallback)(e=>{if(!s.current||!o.current)return;let t=o.current.getBoundingClientRect(),n=s.current.naturalWidth/t.width;_({ox:(e.clientX-t.left)*n,oy:(e.clientY-t.top)*n,cx:d.x,cy:d.y}),e.target.setPointerCapture(e.pointerId)},[d]),x=(0,u.useCallback)(e=>{if(!h||!s.current||!o.current)return;let t=o.current.getBoundingClientRect(),n=s.current.naturalWidth/t.width,r=(e.clientX-t.left)*n-h.ox,i=(e.clientY-t.top)*n-h.oy,a=Math.max(0,Math.min(h.cx+r,s.current.naturalWidth-d.width)),c=Math.max(0,Math.min(h.cy+i,s.current.naturalHeight-d.height));f(e=>({...e,x:a,y:c}))},[h,d.width,d.height]),S=(0,u.useCallback)(()=>_(null),[]),C=(0,u.useCallback)(()=>l(e=>(e+90)%360),[]),w=(0,u.useCallback)(async()=>{if(!s.current)return;let e=s.current,n=document.createElement(`canvas`),o=d.width,l=d.height;n.width=c%180==0?o:l,n.height=c%180==0?l:o;let u=n.getContext(`2d`);if(!u)return;u.save(),u.translate(n.width/2,n.height/2),u.rotate(c*Math.PI/180),u.drawImage(e,d.x,d.y,o,l,-o/2,-l/2,o,l),u.restore();let f=await new Promise(e=>n.toBlob(e,r));f&&(a(f,i),t(!1))},[d,c,i,r,a,t]);return(0,g.jsx)(p.Dialog,{open:e,onOpenChange:t,children:(0,g.jsxs)(p.DialogContent,{className:`max-w-xl`,children:[(0,g.jsxs)(p.DialogHeader,{children:[(0,g.jsx)(p.DialogTitle,{children:`Crop & rotate image`}),(0,g.jsx)(p.DialogDescription,{children:`Drag the highlighted box to reposition the crop. Use the rotate button to spin the image in 90° increments.`})]}),(0,g.jsxs)(`div`,{className:`flex flex-col items-center gap-3`,children:[v?(0,g.jsx)(`canvas`,{ref:o,"data-testid":`image-cropper-canvas`,role:`img`,"aria-label":`Image crop preview`,className:`border rounded-md cursor-move touch-none max-w-full`,onPointerDown:b,onPointerMove:x,onPointerUp:S,onPointerCancel:S}):(0,g.jsx)(`div`,{className:`flex h-[270px] w-full items-center justify-center text-sm text-muted-foreground`,children:`Loading image…`}),(0,g.jsxs)(`div`,{className:`flex w-full items-center justify-between text-xs text-muted-foreground`,children:[(0,g.jsxs)(`span`,{children:[`Crop: `,Math.round(d.width),` × `,Math.round(d.height),` px`]}),(0,g.jsxs)(`span`,{children:[`Rotation: `,c,`°`]})]})]}),(0,g.jsxs)(p.DialogFooter,{className:`flex justify-between sm:justify-between`,children:[(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,onClick:C,"data-testid":`image-cropper-rotate`,children:[(0,g.jsx)(m.RotateCw,{className:`size-4 mr-2`}),`Rotate 90°`]}),(0,g.jsxs)(`div`,{className:`flex gap-2`,children:[(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,onClick:()=>t(!1),children:`Cancel`}),(0,g.jsxs)(p.Button,{type:`button`,onClick:w,disabled:!v,"data-testid":`image-cropper-confirm`,children:[(0,g.jsx)(m.Crop,{className:`size-4 mr-2`}),`Apply crop`]})]})]})]})})}})),Tt=s({ImageField:()=>Et});function Et({value:e,onChange:t,field:n,readonly:r,...i}){let a=(0,u.useRef)(null),o=n||i.schema,s=o?.multiple||!1,c=o?.accept?o.accept.join(`,`):`image/*`,l=o?.crop!==!1,[d,f]=(0,u.useState)(null),{upload:h}=(0,_.useUpload)(),[v,y]=(0,u.useState)(!1);if(r)return e?(0,g.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:(Array.isArray(e)?e:[e]).map((e,t)=>(0,g.jsx)(`img`,{src:e.url||``,alt:e.name||`Image ${t+1}`,className:`size-20 rounded-md object-cover border border-gray-200`},t))}):(0,g.jsx)(p.EmptyValue,{});let b=e?Array.isArray(e)?e:[e]:[],x=async e=>{let n=Array.from(e.target.files||[]);if(n.length!==0){y(!0);try{let e=await Promise.all(n.map(async e=>{let t=await h(e);return{name:t.name,original_name:e.name,size:t.size,mime_type:t.mimeType,url:t.url}}));t(s?[...b,...e]:e[0])}finally{y(!1),a.current&&(a.current.value=``)}}},S=e=>{if(s){let n=b.filter((t,n)=>n!==e);t(n.length>0?n:null)}else t(null)},C=(0,u.useCallback)(async(e,n)=>{if(d){y(!0);try{let r=await h(e),i={name:r.name||n,original_name:n,size:r.size,mime_type:r.mimeType,url:r.url};if(s){let e=[...b];e[d.index]=i,t(e)}else t(i)}finally{y(!1),f(null)}}},[d,b,s,t,h]),w=(0,u.useCallback)(e=>{let t=b[e];t?.url&&f({index:e,src:t.url,name:t.name||`image-${e}.png`})},[b]);return(0,g.jsxs)(`div`,{className:i.className,children:[(0,g.jsx)(`input`,{ref:a,type:`file`,multiple:s,accept:c,onChange:x,className:`hidden`}),(0,g.jsxs)(`div`,{className:`space-y-2`,children:[b.length>0&&(0,g.jsx)(`div`,{className:`grid grid-cols-4 gap-2`,children:b.map((e,t)=>(0,g.jsxs)(`div`,{className:`relative group`,children:[(0,g.jsx)(`img`,{src:e.url||``,alt:e.name||`Image ${t+1}`,className:`size-20 rounded-md object-cover border border-gray-200`}),(0,g.jsxs)(`div`,{className:`absolute top-1 right-1 flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity`,children:[l&&(0,g.jsx)(p.Button,{type:`button`,variant:`secondary`,size:`sm`,onClick:()=>w(t),className:`h-6 w-6 p-0`,"aria-label":`Crop image ${t+1}`,"data-testid":`image-field-crop-${t}`,children:(0,g.jsx)(m.Crop,{className:`size-3`})}),(0,g.jsx)(p.Button,{type:`button`,variant:`destructive`,size:`sm`,onClick:()=>S(t),className:`h-6 w-6 p-0`,children:(0,g.jsx)(m.X,{className:`size-3`})})]})]},t))}),(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,onClick:()=>a.current?.click(),className:`w-full`,disabled:v,"data-testid":`image-field-upload-button`,children:[v?(0,g.jsx)(m.Loader2,{className:`size-4 mr-2 animate-spin`}):(0,g.jsx)(m.Image,{className:`size-4 mr-2`}),v?`Uploading…`:b.length>0?`Add More Images`:`Upload Image`]})]}),l&&d&&(0,g.jsx)(u.Suspense,{fallback:null,children:(0,g.jsx)(Dt,{open:!0,onOpenChange:e=>!e&&f(null),src:d.src,outputName:d.name,onConfirm:C})})]})}var Dt,Ot=o((()=>{Dt=(0,u.lazy)(()=>Promise.resolve().then(()=>(wt(),St)).then(e=>({default:e.ImageCropperDialog})))})),kt=s({LocationField:()=>At});function At({value:e,onChange:t,field:n,readonly:r,...i}){let a=n||i.schema,o=e&&typeof e==`object`?`${e.latitude||0}, ${e.longitude||0}`:``;return r?(0,g.jsx)(`span`,{className:`text-sm`,children:o||(0,g.jsx)(p.EmptyValue,{})}):(0,g.jsx)(p.Input,{type:`text`,value:o,onChange:e=>{let n=e.target.value;if(!n.trim()){t(null);return}let r=n.split(`,`).map(e=>e.trim());if(r.length===2){let e=parseFloat(r[0]),n=parseFloat(r[1]);!isNaN(e)&&!isNaN(n)&&t({latitude:e,longitude:n})}},placeholder:a?.placeholder||`latitude, longitude`,disabled:r||i.disabled,className:i.className})}var jt=o((()=>{})),Mt=s({FormulaField:()=>Nt});function Nt({value:e,field:t,...n}){let r=(t||n.schema)?.return_type||`text`;if(e==null)return(0,g.jsx)(p.EmptyValue,{className:n.className});let i;return i=r===`number`||r===`currency`?typeof e==`number`?e.toFixed(2):String(e):r===`boolean`?e?`Yes`:`No`:r===`date`?new Date(e).toLocaleDateString():String(e),(0,g.jsx)(`span`,{className:`text-sm font-mono text-gray-700 ${n.className||``}`,children:i})}var Pt=o((()=>{})),Ft=s({SummaryField:()=>It});function It({value:e,field:t,...n}){let r=(t||n.schema)?.summary_type||`count`;if(e==null)return(0,g.jsx)(p.EmptyValue,{className:n.className});let i;return i=r===`count`?String(e):[`sum`,`avg`,`min`,`max`].includes(r)&&typeof e==`number`?e.toFixed(2):String(e),(0,g.jsx)(`span`,{className:`text-sm font-medium tabular-nums text-gray-700 ${n.className||``}`,children:i})}var Lt=o((()=>{})),Rt=s({AutoNumberField:()=>zt});function zt({value:e,field:t,...n}){return e==null?(0,g.jsx)(p.EmptyValue,{className:n.className}):(0,g.jsx)(`span`,{className:`text-sm font-mono text-gray-700 ${n.className||``}`,children:String(e)})}var Bt=o((()=>{})),Vt=s({UserField:()=>Ut});function Ht(e){let t=Array.isArray(e)?e:[];return t.some(e=>e?.field===`banned`)?t:[...t,{field:`banned`,operator:`ne`,value:!0}]}function Ut(e){let t=e.field||e.schema,n=t?.field&&typeof t.field==`object`&&(`reference`in t.field||`reference_to`in t.field||`type`in t.field),r=n?t.field:t,i={...r||{},reference:r?.reference||r?.reference_to||`sys_user`,display_field:r?.display_field||r?.displayField||r?.reference_field||`name`,picker:r?.picker??`search`,subtitle:r?.subtitle??[`primary_business_unit_id.name`,`email`],avatar_field:r?.avatar_field??r?.avatarField??`image`,lookup_filters:Ht(r?.lookup_filters??r?.lookupFilters)},a=n?{...t,field:i}:i;return(0,g.jsx)(tt,{...e,field:a})}var Wt=o((()=>{ot()})),Gt=s({ObjectField:()=>Kt});function Kt({value:e,onChange:t,field:n,readonly:r,...i}){let a=n||i.schema,[o,s]=(0,u.useState)(()=>e==null?``:JSON.stringify(e,null,2)),[c,l]=(0,u.useState)(null);return(0,u.useEffect)(()=>{try{if(e==null){s(``);return}let t=o?JSON.parse(o):null;JSON.stringify(t)!==JSON.stringify(e)&&s(JSON.stringify(e,null,2))}catch{s(JSON.stringify(e,null,2))}},[e,o]),r?e?(0,g.jsx)(`pre`,{className:(0,p.cn)(`text-xs bg-gray-50 p-2 rounded border border-gray-200 overflow-auto max-h-40`,i.className),children:JSON.stringify(e,null,2)}):(0,g.jsx)(p.EmptyValue,{}):(0,g.jsxs)(`div`,{className:`space-y-1`,children:[(0,g.jsx)(p.Textarea,{value:o,onChange:e=>{let n=e.target.value;if(s(n),l(null),!n.trim()){t(null);return}try{t(JSON.parse(n))}catch{l(`Invalid JSON`)}},placeholder:a?.placeholder||`{
|
|
7
7
|
"key": "value"
|
|
8
8
|
}`,disabled:r||i.disabled,className:(0,p.cn)(`font-mono text-xs`,c?`border-red-500 focus-visible:ring-red-500`:``,i.className),rows:6}),c&&(0,g.jsx)(`p`,{className:`text-xs text-red-500`,children:c})]})}var qt=o((()=>{})),Jt=s({VectorField:()=>Yt});function Yt({value:e,field:t,...n}){let r=(t||n.schema)?.dimensions||(Array.isArray(e)?e.length:0);if(!e||!Array.isArray(e))return(0,g.jsx)(p.EmptyValue,{});let i=e.slice(0,3).map(e=>{let t=Number(e);return isNaN(t)?`0`:t.toFixed(4)}).join(`, `);return(0,g.jsxs)(`div`,{className:`text-sm ${n.className||``}`,children:[(0,g.jsxs)(`span`,{className:`font-mono text-gray-700`,children:[`[`,i,`...]`]}),(0,g.jsxs)(`span`,{className:`text-gray-500 ml-2`,children:[`(`,r,`D)`]})]})}var Xt=o((()=>{})),Zt=s({GridField:()=>cn,LineItemsField:()=>fn,computeRow:()=>rn,evalArith:()=>tn,lookupAutofillPatch:()=>nn,sumColumn:()=>sn});function Qt(e){if(e.width)return{width:e.width,minWidth:e.width};if((e.type??`text`)===`text`)return{minWidth:180};let t=un[e.type??`text`]??132;return{width:t,minWidth:t}}function $t(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(r===` `||r===` `||r===`
|
|
9
|
-
`){n++;continue}if(r>=`0`&&r<=`9`||r===`.`){let r=n+1;for(;r<e.length&&(e[r]>=`0`&&e[r]<=`9`||e[r]===`.`);)r++;t.push({t:`num`,v:e.slice(n,r)}),n=r;continue}if(/[a-zA-Z_]/.test(r)){let r=n+1;for(;r<e.length&&/[a-zA-Z0-9_.]/.test(e[r]);)r++;t.push({t:`id`,v:e.slice(n,r)}),n=r;continue}if(r===`+`||r===`-`||r===`*`||r===`/`||r===`%`){t.push({t:`op`,v:r}),n++;continue}if(r===`(`){t.push({t:`lp`,v:r}),n++;continue}if(r===`)`){t.push({t:`rp`,v:r}),n++;continue}return null}return t}function en(e,t){let n=e.startsWith(`record.`)?e.slice(7):e,r=t?.[n];if(r==null||r===``)return null;let i=Number(r);return Number.isFinite(i)?i:null}function tn(e,t){let n=$t(e);if(!n||n.length===0)return null;let r=0,i=!1,a=()=>n[r],o=()=>n[r++];function s(){let e=a();if(!e)return i=!0,NaN;if(e.t===`op`&&e.v===`-`)return o(),-s();if(e.t===`op`&&e.v===`+`)return o(),s();if(e.t===`num`)return o(),Number(e.v);if(e.t===`id`){o();let n=en(e.v,t);return n===null?(i=!0,NaN):n}if(e.t===`lp`){o();let e=l(),t=o();return(!t||t.t!==`rp`)&&(i=!0),e}return i=!0,NaN}function c(){let e=s();for(;a()&&a().t===`op`&&(a().v===`*`||a().v===`/`||a().v===`%`);){let t=o().v,n=s();e=t===`*`?e*n:t===`/`?e/n:e%n}return e}function l(){let e=c();for(;a()&&a().t===`op`&&(a().v===`+`||a().v===`-`);){let t=o().v,n=c();e=t===`+`?e+n:e-n}return e}let u=l();return i||r!==n.length||!Number.isFinite(u)?null:u}function nn(e,t,n){let r={[t.field]:n?.value??n?.id??n?._id};if(t.autofill!==!1&&n&&typeof n==`object`)for(let i of e){if(i.field===t.field||i.computed||i.type===`lookup`)continue;let e=n[i.field];e!=null&&e!==``&&(r[i.field]=e)}return r}function rn(e,t){let n=e.filter(e=>e.computed&&e.expr);if(n.length===0)return t;let r={...t};for(let e of n){let t=tn(e.expr,r);if(t===null){r[e.field]=null;continue}let n=e.scale??(e.type===`currency`?2:void 0);r[e.field]=n==null?t:Number(t.toFixed(n))}return r}function an(e,t){if(t==null||t===``)return`—`;if(e.type===`select`&&Array.isArray(e.options)){let n=e.options.find(e=>String(e.value)===String(t));return n?n.label:String(t)}if(ln(e.type)){let n=Number(t);if(Number.isFinite(n))return e.type===`currency`?`${e.prefix||`¥`}${n.toLocaleString()}`:n.toLocaleString()}return Array.isArray(t)?t.join(`, `):String(t)}function on(e,t){if(ln(e)){if(t===``||t==null)return null;let e=Number(t);return Number.isNaN(e)?t:e}return t}function sn(e,t){return Array.isArray(e)?e.reduce((e,n)=>{let r=Number(n?.[t]);return e+(Number.isFinite(r)?r:0)},0):0}function cn({value:e,onChange:t,field:n,readonly:r,disabled:i,className:a,onRowExpand:o,displayMode:s,onAdd:c,...l}){let f=n||l.schema||{},h=f.columns||[],_=Array.isArray(e)?e:[],v=l.contextRecord,y=(0,u.useCallback)((e,t)=>{if(!e.readonlyWhen&&!e.requiredWhen)return{readonly:!1,required:!!e.required};let n=(0,d.resolveFieldRuleState)({readonlyWhen:e.readonlyWhen,requiredWhen:e.requiredWhen},t||{},{required:!!e.required,readonly:!1},void 0,v?{parent:v}:void 0);return{readonly:n.readonly,required:n.required}},[v]),b=s===`list`&&!r,[x,S]=u.default.useState(()=>new Set),C=h.filter(e=>e.defaultHidden&&!e.required),w=h.filter(e=>!e.defaultHidden||e.required||x.has(e.field)),T=(0,u.useCallback)(e=>{S(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),E=f.allow_add!==!1&&!r&&!i,ee=f.allow_delete!==!1&&!r&&!i,D=f.allow_duplicate!==!1&&E,O=typeof o==`function`&&!r,k=f.show_line_numbers!==!1,te=f.min_rows??0,A=f.max_rows,ne=f.total_field||f.amount_field||f.amountField,j=f.sort_field,M=f.reorderable!==!1&&!r&&!i,N=(0,u.useCallback)(e=>{t?.(j?e.map((e,t)=>({...e,[j]:t})):e)},[t,j]),P=(0,u.useCallback)(()=>{let e={};for(let t of w)e[t.field]=null;return e},[w]),F=(0,u.useCallback)((e,t)=>{if(e>=_.length){if(A!=null&&_.length>=A)return;N([..._,rn(w,{...P(),...t})]);return}N(_.map((n,r)=>r===e?rn(w,{...n,...t}):n))},[_,w,A,P,N]),I=(0,u.useCallback)((e,t,n)=>F(e,{[t]:n}),[F]),re=(0,u.useCallback)((e,t,n)=>{F(e,nn(w,t,n))},[w,F]),L=(0,u.useCallback)((e,t,n)=>I(e,t,n),[I]),ie=(0,u.useCallback)((e,t,n)=>{I(e,t.field,on(t.type,n))},[I]),R=(0,u.useCallback)(()=>{A!=null&&_.length>=A||N([..._,P()])},[_,P,A,N]),z=(0,u.useRef)(null),B=(0,u.useCallback)((e,t)=>{let n=z.current?.querySelector(`[data-cell="${e}-${t}"]`);n&&(n.focus(),n instanceof HTMLInputElement&&n.select())},[]),V=(0,u.useCallback)((e,t,n)=>{e.key===`ArrowDown`||e.key===`Enter`?(e.preventDefault(),B(t+1,n)):e.key===`ArrowUp`&&(e.preventDefault(),t>0&&B(t-1,n))},[B]),H=(0,u.useCallback)(e=>{_.length<=te||N(_.filter((t,n)=>n!==e))},[_,te,N]),U=(0,u.useCallback)(e=>{if(A!=null&&_.length>=A)return;let t=_[e];if(!t)return;let{id:n,_id:r,recordId:i,...a}=t,o=[..._];o.splice(e+1,0,{...a}),N(o)},[_,A,N]),W=(0,u.useCallback)((e,t)=>{if(e===t||e<0||t<0||e>=_.length||t>=_.length)return;let n=[..._],[r]=n.splice(e,1);n.splice(t,0,r),N(n)},[_,N]),G=(0,u.useRef)(null),K=O||ee||D,ae=(+!!O+ +!!D+ +!!ee)*34+12,q=!!ne,oe=q?sn(_,ne):0,J=q?Math.max(0,w.findIndex(e=>e.field===ne)):-1,Y=C.length>0?(0,g.jsxs)(p.Popover,{children:[(0,g.jsx)(p.PopoverTrigger,{asChild:!0,children:(0,g.jsxs)(p.Button,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 gap-1.5 text-xs text-muted-foreground`,"data-testid":`line-items-columns`,children:[(0,g.jsx)(m.SlidersHorizontal,{className:`h-3.5 w-3.5`}),`Columns`,x.size>0&&(0,g.jsxs)(`span`,{className:`rounded-full bg-primary/10 px-1.5 text-[10px] font-medium text-primary`,children:[`+`,x.size]})]})}),(0,g.jsxs)(p.PopoverContent,{align:`end`,className:`w-56 p-2`,children:[(0,g.jsx)(`div`,{className:`px-1 pb-1.5 text-xs font-medium text-muted-foreground`,children:`Optional columns`}),(0,g.jsx)(`div`,{className:`max-h-64 space-y-0.5 overflow-y-auto`,children:C.map(e=>{let t=`col-toggle-${e.field}`;return(0,g.jsxs)(p.Label,{htmlFor:t,className:`flex cursor-pointer items-center gap-2 rounded-md px-1.5 py-1.5 text-sm font-normal hover:bg-muted`,children:[(0,g.jsx)(p.Checkbox,{id:t,checked:x.has(e.field),onCheckedChange:()=>T(e.field)}),(0,g.jsx)(`span`,{className:`truncate`,children:e.label||e.field})]},e.field)})})]})]}):null;if(r)return(0,g.jsxs)(`div`,{className:(0,p.cn)(`space-y-2`,a),children:[Y&&(0,g.jsx)(`div`,{className:`flex justify-end`,children:Y}),(0,g.jsx)(`div`,{className:`border border-border rounded-lg overflow-x-auto`,"data-testid":`line-items-readonly`,children:(0,g.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,g.jsx)(`thead`,{className:`bg-muted border-b border-border`,children:(0,g.jsxs)(`tr`,{children:[k&&(0,g.jsx)(`th`,{className:`w-10 px-2 py-2 text-right text-xs font-medium text-muted-foreground`,children:`#`}),w.map(e=>(0,g.jsx)(`th`,{style:{minWidth:dn(e)},className:(0,p.cn)(`px-3 py-2 text-xs font-medium text-muted-foreground whitespace-nowrap`,ln(e.type)?`text-right`:`text-left`),children:e.label||e.field},e.field))]})}),(0,g.jsx)(`tbody`,{className:`divide-y divide-border`,children:_.length===0?(0,g.jsx)(`tr`,{children:(0,g.jsx)(`td`,{colSpan:Math.max(w.length+ +!!k,1),className:`px-3 py-6 text-center text-muted-foreground`,children:`No items`})}):_.map((e,t)=>(0,g.jsxs)(`tr`,{children:[k&&(0,g.jsx)(`td`,{className:`px-2 py-2 text-right text-muted-foreground tabular-nums`,children:t+1}),w.map(t=>(0,g.jsx)(`td`,{className:(0,p.cn)(`px-3 py-2 text-foreground`,ln(t.type)&&`text-right tabular-nums`),children:t.type===`lookup`&&e[t.field]!=null&&e[t.field]!==``?(0,g.jsx)(tt,{value:e[t.field],onChange:()=>{},readonly:!0,field:{reference:t.reference,display_field:t.displayField,id_field:t.idField}}):e[t.field]!=null&&e[t.field]!==``?String(e[t.field]):`—`},t.field))]},t))}),q&&(0,g.jsx)(`tfoot`,{className:`border-t border-border bg-muted/40`,children:(0,g.jsxs)(`tr`,{children:[(0,g.jsx)(`td`,{colSpan:Math.max(+!!k+J,1),className:`px-3 py-2 text-right text-xs font-medium text-muted-foreground`,children:`Total`}),(0,g.jsx)(`td`,{className:`px-3 py-2 text-right font-semibold text-foreground tabular-nums`,children:oe.toLocaleString()}),w.length-J-1>0&&(0,g.jsx)(`td`,{colSpan:w.length-J-1})]})})]})})]});let se=!b&&E&&(A==null||_.length<A),X=se?[..._,P()]:_,ce=(e,t,n,r)=>{let a=r?.[e.field],o=i||y(e,r).readonly;return b?e.type===`lookup`&&a!=null&&a!==``?(0,g.jsx)(tt,{value:a,onChange:()=>{},readonly:!0,field:{reference:e.reference,display_field:e.displayField,id_field:e.idField}}):(0,g.jsx)(`span`,{className:(0,p.cn)(`px-2 text-sm text-foreground`,ln(e.type)&&`tabular-nums`,(a==null||a===``)&&`text-muted-foreground`),children:an(e,a)}):e.computed?(0,g.jsx)(`span`,{className:(0,p.cn)(`block px-2 text-sm tabular-nums`,ln(e.type)?`text-right`:`text-left`,a==null||a===``?`text-muted-foreground`:`text-foreground`),title:`Computed`,"data-computed":e.field,children:an(e,a)}):e.type===`lookup`?(0,g.jsx)(tt,{value:a,onChange:t=>L(n,e.field,t),onSelectRecord:t=>re(n,e,t),compact:!0,field:{reference:e.reference,display_field:e.displayField,id_field:e.idField,multiple:e.multiple,options:e.options,placeholder:`—`},disabled:o}):e.type===`select`?(0,g.jsxs)(p.Select,{value:a==null?``:String(a),onValueChange:t=>ie(n,e,t),disabled:o,children:[(0,g.jsx)(p.SelectTrigger,{className:`h-8 rounded-none border-0 bg-transparent px-2 shadow-none focus:ring-1 focus:ring-ring/60`,"aria-label":e.label||e.field,children:(0,g.jsx)(p.SelectValue,{placeholder:`—`})}),(0,g.jsx)(p.SelectContent,{children:(e.options||[]).map(e=>(0,g.jsx)(p.SelectItem,{value:e.value,children:e.label},e.value))})]}):(0,g.jsxs)(`div`,{className:`relative`,children:[e.type===`currency`&&(0,g.jsx)(`span`,{className:`pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground`,children:e.prefix||`¥`}),(0,g.jsx)(p.Input,{"data-cell":`${n}-${t}`,onKeyDown:e=>V(e,n,t),className:(0,p.cn)(`h-8 rounded-none border-0 bg-transparent px-2 shadow-none focus-visible:ring-1 focus-visible:ring-ring/60`,e.type===`currency`&&`pl-6`,ln(e.type)&&`text-right tabular-nums`),type:e.type===`date`?`date`:ln(e.type)?`number`:`text`,step:ln(e.type)?e.step??`any`:void 0,"aria-label":e.label||e.field,value:a==null?``:String(a),onChange:t=>ie(n,e,t.target.value),disabled:o})]})};return(0,g.jsxs)(`div`,{className:(0,p.cn)(`space-y-2`,a),"data-testid":`line-items`,children:[Y&&(0,g.jsx)(`div`,{className:`flex justify-end`,children:Y}),(0,g.jsx)(`div`,{className:`border border-border rounded-lg overflow-x-auto`,children:(0,g.jsxs)(`table`,{ref:z,className:`w-full text-sm`,children:[(0,g.jsx)(`thead`,{className:`bg-muted/60 border-b border-border`,children:(0,g.jsxs)(`tr`,{children:[k&&(0,g.jsx)(`th`,{className:(0,p.cn)(`px-2 py-2 text-right text-xs font-medium text-muted-foreground`,M?`w-14`:`w-10`),children:`#`}),w.map(e=>(0,g.jsxs)(`th`,{className:(0,p.cn)(`px-2 py-2 text-xs font-medium text-muted-foreground whitespace-nowrap`,ln(e.type)?`text-right`:`text-left`),style:Qt(e),children:[e.label||e.field,e.required&&!e.computed&&(0,g.jsx)(`span`,{className:`text-destructive`,children:` *`})]},e.field)),K&&(0,g.jsx)(`th`,{style:{width:ae}})]})}),(0,g.jsx)(`tbody`,{className:`divide-y divide-border`,children:b&&_.length===0?(0,g.jsx)(`tr`,{children:(0,g.jsxs)(`td`,{colSpan:w.length+ +!!K+ +!!k,className:`px-3 py-6 text-center text-muted-foreground`,children:[`No items yet — click “`,f.add_label||`Add`,`” to begin.`]})}):X.map((e,t)=>{let n=se&&t===_.length,r=M&&!n&&!b;return(0,g.jsxs)(`tr`,{className:(0,p.cn)(`group`,!n&&`hover:bg-muted/30`),...M&&!n?{onDragOver:e=>{G.current!=null&&e.preventDefault()},onDrop:e=>{e.preventDefault(),G.current!=null&&(W(G.current,t),G.current=null)}}:{},children:[k&&(0,g.jsx)(`td`,{className:`px-1 py-1 text-right align-middle text-xs text-muted-foreground tabular-nums`,children:(0,g.jsxs)(`span`,{className:`inline-flex items-center justify-end gap-0.5`,children:[r&&(0,g.jsx)(`span`,{draggable:!0,onDragStart:()=>{G.current=t},onDragEnd:()=>{G.current=null},className:`cursor-grab text-muted-foreground/40 opacity-0 transition-opacity group-hover:opacity-100`,title:`Drag to reorder`,"aria-label":`Drag to reorder`,"data-testid":`line-items-drag-${t}`,children:(0,g.jsx)(m.GripVertical,{className:`h-3.5 w-3.5`})}),(0,g.jsx)(`span`,{className:(0,p.cn)(n&&`opacity-30`),children:t+1})]})}),w.map((r,i)=>{let a=y(r,e).required,o=!n&&!b&&a&&!r.computed&&(e[r.field]==null||e[r.field]===``);return(0,g.jsx)(`td`,{"aria-invalid":o||void 0,title:o?`${r.label||r.field} is required`:void 0,"data-testid":o?`line-items-invalid-${t}-${r.field}`:void 0,className:(0,p.cn)(`border-r border-border/40 px-1 py-0.5 align-middle last:border-r-0`,b&&`px-2 py-1.5`,o&&`bg-destructive/5 ring-1 ring-inset ring-destructive/50`),children:ce(r,i,t,e)},r.field)}),K&&(0,g.jsx)(`td`,{className:`px-1 py-0.5 align-middle whitespace-nowrap`,children:(0,g.jsxs)(`div`,{className:`flex items-center justify-center gap-0.5`,children:[!n&&O&&(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`icon`,className:`h-8 w-8 text-muted-foreground hover:text-foreground`,"aria-label":`Open row`,title:`Open full form`,"data-testid":`line-items-expand-${t}`,onClick:()=>o(t),children:(0,g.jsx)(m.Maximize2,{className:`h-3.5 w-3.5`})}),!n&&D&&(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`icon`,className:`h-8 w-8 text-muted-foreground hover:text-foreground`,"aria-label":`Duplicate row`,title:`Duplicate line`,"data-testid":`line-items-duplicate-${t}`,onClick:()=>U(t),disabled:i||A!=null&&_.length>=A,children:(0,g.jsx)(m.Copy,{className:`h-3.5 w-3.5`})}),!n&&ee&&(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`icon`,className:`h-8 w-8 text-muted-foreground hover:text-destructive`,"aria-label":`Remove row`,"data-testid":`line-items-remove-${t}`,onClick:()=>H(t),disabled:i||_.length<=te,children:(0,g.jsx)(m.Trash2,{className:`h-4 w-4`})})]})})]},t)})}),q&&(0,g.jsx)(`tfoot`,{className:`border-t border-border bg-muted/40`,children:(0,g.jsxs)(`tr`,{children:[(0,g.jsx)(`td`,{colSpan:Math.max(+!!k+J,1),className:`px-3 py-2 text-right text-xs font-medium text-muted-foreground`,children:`Total`}),(0,g.jsx)(`td`,{className:`px-3 py-2 text-right font-semibold text-foreground tabular-nums`,"data-testid":`line-items-total`,children:oe.toLocaleString()}),w.length-J-1+ +!!K>0&&(0,g.jsx)(`td`,{colSpan:w.length-J-1+ +!!K})]})})]})}),E&&(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:b&&c?c:R,disabled:A!=null&&_.length>=A,"data-testid":`line-items-add`,children:[(0,g.jsx)(m.Plus,{className:`mr-1.5 h-4 w-4`}),f.add_label||`Add line`]})]})}var ln,un,dn,fn,pn=o((()=>{ot(),ln=e=>e===`number`||e===`currency`,un={text:160,select:132,lookup:168,number:104,currency:116,date:150},dn=e=>e.width??un[e.type??`text`]??132,fn=cn})),mn=s({ColorField:()=>hn});function hn({value:e,onChange:t,field:n,readonly:r,...i}){let a=n||i.schema;return r?(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`div`,{className:`w-6 h-6 rounded border border-input`,style:{backgroundColor:e||`#000000`}}),(0,g.jsx)(`span`,{className:`text-sm`,children:e||(0,g.jsx)(p.EmptyValue,{})})]}):(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`input`,{type:`color`,value:e||`#000000`,onChange:e=>t(e.target.value),disabled:r||i.disabled,className:`w-10 h-10 rounded border border-input cursor-pointer`}),(0,g.jsx)(p.Input,{type:`text`,value:e||``,onChange:e=>t(e.target.value),placeholder:a?.placeholder||`#000000`,disabled:r||i.disabled,className:i.className,pattern:`^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$`})]})}var gn=o((()=>{})),_n=s({SliderField:()=>vn});function vn({value:e,onChange:t,field:n,readonly:r,...i}){let a=n||i.schema,o=a?.min??0,s=a?.max??100,c=a?.step??1;return r?(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`span`,{className:`text-sm font-medium`,children:e??o}),(0,g.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`/ `,s]})]}):(0,g.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,g.jsx)(p.Slider,{value:[e??o],onValueChange:e=>t(e[0]),min:o,max:s,step:c,disabled:r||i.disabled,className:i.className}),(0,g.jsx)(`span`,{className:`text-sm font-medium w-12 text-right`,children:e??o})]})}var yn=o((()=>{})),bn=s({RatingField:()=>xn});function xn({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=(n||a.schema)?.max??5,s=e??0,[c,l]=u.default.useState(null),d=c===null?s:c;return r?(0,g.jsxs)(`div`,{className:(0,p.cn)(`flex items-center gap-1`,i),children:[Array.from({length:o},(e,t)=>(0,g.jsx)(m.Star,{className:`w-5 h-5 ${t<s?`fill-yellow-400 text-yellow-400`:`text-muted-foreground`}`},t)),(0,g.jsxs)(`span`,{className:`ml-2 text-sm text-muted-foreground`,children:[s,` / `,o]})]}):(0,g.jsxs)(`div`,{className:(0,p.cn)(`flex items-center gap-1`,i),children:[Array.from({length:o},(e,n)=>(0,g.jsx)(`button`,{type:`button`,onClick:()=>t(n+1),onMouseEnter:()=>l(n+1),onMouseLeave:()=>l(null),className:`focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 rounded`,disabled:r||a.disabled,children:(0,g.jsx)(m.Star,{className:`w-5 h-5 transition-colors ${n<d?`fill-yellow-400 text-yellow-400 hover:fill-yellow-500 hover:text-yellow-500`:`text-muted-foreground hover:text-yellow-400`}`})},n)),(0,g.jsxs)(`span`,{className:`ml-2 text-sm text-muted-foreground`,children:[s,` / `,o]})]})}var Sn=o((()=>{})),Cn=s({CodeField:()=>wn});function wn({value:e,onChange:t,field:n,readonly:r,...i}){let a=n||i.schema,o=a?.language??`javascript`;return r?(0,g.jsx)(`pre`,{className:(0,p.cn)(`text-sm bg-muted p-2 rounded overflow-x-auto border`,i.className),children:(0,g.jsx)(`code`,{children:e||(0,g.jsx)(p.EmptyValue,{})})}):(0,g.jsx)(p.Textarea,{value:e||``,onChange:e=>t(e.target.value),placeholder:a?.placeholder||`// Write ${o} code here...`,disabled:r||i.disabled,className:(0,p.cn)(`font-mono text-sm`,i.className),rows:12,spellCheck:!1})}var Tn=o((()=>{})),En=s({AvatarField:()=>Dn});function Dn({value:e,onChange:t,field:n,readonly:r,...i}){let[a,o]=u.default.useState(!1),s=u.default.useRef(null),c=n||i.schema,l=e=>{let n=e.target.files?.[0];if(!n)return;if(!n.type.startsWith(`image/`)){console.error(`Please select an image file`);return}if(n.size>5*1024*1024){console.error(`File size must be less than 5MB`);return}let r=new FileReader;r.onloadend=()=>{t(r.result)},r.readAsDataURL(n)},d=()=>{t(``)},f=()=>(c?.defaultName||c?.label||`User`).split(` `).map(e=>e[0]).join(``).toUpperCase().slice(0,2);return r?(0,g.jsxs)(p.Avatar,{className:`w-16 h-16`,children:[e&&(0,g.jsx)(p.AvatarImage,{src:e,alt:c?.label}),(0,g.jsx)(p.AvatarFallback,{children:f()})]}):(0,g.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,g.jsxs)(`div`,{className:`relative`,onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),children:[(0,g.jsxs)(p.Avatar,{className:`w-16 h-16`,children:[e&&(0,g.jsx)(p.AvatarImage,{src:e,alt:c?.label}),(0,g.jsx)(p.AvatarFallback,{children:f()})]}),!r&&a&&e&&(0,g.jsx)(`button`,{type:`button`,onClick:d,className:`absolute -top-1 -right-1 bg-destructive text-destructive-foreground rounded-full p-1 hover:bg-destructive/90`,children:(0,g.jsx)(m.X,{className:`w-3 h-3`})})]}),(0,g.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,g.jsx)(`input`,{ref:s,type:`file`,accept:`image/*`,onChange:l,className:`hidden`}),(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>s.current?.click(),disabled:r||i.disabled,children:[(0,g.jsx)(m.Upload,{className:`w-4 h-4 mr-2`}),e?`Change`:`Upload`,` Avatar`]}),(0,g.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`PNG, JPG up to 5MB`})]})]})}var On=o((()=>{})),kn=s({AddressField:()=>An});function An({value:e,onChange:t,field:n,readonly:r,...i}){let a=e||{},o=(e,n)=>{t({...a,[e]:n})},s=e=>[e.street,e.city,[e.state,e.zipCode].filter(Boolean).join(` `),e.country].filter(Boolean).join(`, `);if(r){let e=s(a);return e?(0,g.jsx)(`span`,{className:`text-sm`,children:e}):(0,g.jsx)(p.EmptyValue,{})}return(0,g.jsxs)(`div`,{className:`space-y-3`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`street`,className:`text-xs`,children:`Street Address`}),(0,g.jsx)(p.Input,{id:`street`,type:`text`,value:a.street||``,onChange:e=>o(`street`,e.target.value),placeholder:`123 Main St`,disabled:r||i.disabled,className:i.className})]}),(0,g.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`city`,className:`text-xs`,children:`City`}),(0,g.jsx)(p.Input,{id:`city`,type:`text`,value:a.city||``,onChange:e=>o(`city`,e.target.value),placeholder:`San Francisco`,disabled:r||i.disabled})]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`state`,className:`text-xs`,children:`State / Province`}),(0,g.jsx)(p.Input,{id:`state`,type:`text`,value:a.state||``,onChange:e=>o(`state`,e.target.value),placeholder:`CA`,disabled:r||i.disabled})]})]}),(0,g.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`zipCode`,className:`text-xs`,children:`ZIP / Postal Code`}),(0,g.jsx)(p.Input,{id:`zipCode`,type:`text`,value:a.zipCode||``,onChange:e=>o(`zipCode`,e.target.value),placeholder:`94102`,disabled:r||i.disabled})]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`country`,className:`text-xs`,children:`Country`}),(0,g.jsx)(p.Input,{id:`country`,type:`text`,value:a.country||``,onChange:e=>o(`country`,e.target.value),placeholder:`United States`,disabled:r||i.disabled})]})]})]})}var jn=o((()=>{})),Mn=s({GeolocationField:()=>Nn});function Nn({value:e,onChange:t,field:n,readonly:r,...i}){let[a,o]=u.default.useState(!1),s=e||{},c=(e,n)=>{t({...s,[e]:n?Number(n):void 0})},l=()=>{if(!navigator.geolocation){console.error(`Geolocation is not supported by this browser`);return}o(!0),navigator.geolocation.getCurrentPosition(e=>{t({latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy}),o(!1)},e=>{console.error(`Error getting location:`,e.message),o(!1)},{enableHighAccuracy:!0,timeout:5e3,maximumAge:0})},d=e=>!e.latitude||!e.longitude?``:`${e.latitude.toFixed(6)}, ${e.longitude.toFixed(6)}`,f=()=>{if(!s.latitude||!s.longitude)return;let e=`https://www.google.com/maps?q=${s.latitude},${s.longitude}`;window.open(e,`_blank`)};if(r){let e=d(s);return(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(m.MapPin,{className:`w-4 h-4 text-muted-foreground`}),e?(0,g.jsx)(`span`,{className:`text-sm`,children:e}):(0,g.jsx)(p.EmptyValue,{}),s.latitude&&s.longitude&&(0,g.jsx)(p.Button,{type:`button`,variant:`link`,size:`sm`,onClick:f,className:`p-0 h-auto`,children:`View on map`})]})}return(0,g.jsxs)(`div`,{className:`space-y-3`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:l,disabled:r||a,children:[(0,g.jsx)(m.Crosshair,{className:`w-4 h-4 mr-2`}),a?`Getting location...`:`Use Current Location`]}),s.latitude&&s.longitude&&(0,g.jsxs)(p.Button,{type:`button`,variant:`link`,size:`sm`,onClick:f,children:[(0,g.jsx)(m.MapPin,{className:`w-4 h-4 mr-2`}),`View on map`]})]}),(0,g.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`latitude`,className:`text-xs`,children:`Latitude`}),(0,g.jsx)(p.Input,{id:`latitude`,type:`number`,value:s.latitude??``,onChange:e=>c(`latitude`,e.target.value),placeholder:`37.7749`,disabled:r||i.disabled,step:`any`,className:i.className})]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`longitude`,className:`text-xs`,children:`Longitude`}),(0,g.jsx)(p.Input,{id:`longitude`,type:`number`,value:s.longitude??``,onChange:e=>c(`longitude`,e.target.value),placeholder:`-122.4194`,disabled:r||i.disabled,step:`any`})]})]}),s.accuracy&&(0,g.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Accuracy: ±`,s.accuracy.toFixed(0),`m`]})]})}var Pn=o((()=>{})),Fn=s({SignatureField:()=>In});function In({value:e,onChange:t,readonly:n}){let r=(0,u.useRef)(null),[i,a]=u.default.useState(!1),[o,s]=u.default.useState(!e);(0,u.useEffect)(()=>{if(e&&r.current){let t=r.current.getContext(`2d`);if(t){let n=new Image;n.onload=()=>{t.drawImage(n,0,0),s(!1)},n.src=e}}},[e]);let c=e=>{if(n)return;a(!0),s(!1);let t=r.current;if(!t)return;let i=t.getContext(`2d`);if(!i)return;let o=t.getBoundingClientRect(),c=`touches`in e?e.touches[0].clientX-o.left:e.clientX-o.left,l=`touches`in e?e.touches[0].clientY-o.top:e.clientY-o.top;i.beginPath(),i.moveTo(c,l)},l=e=>{if(!i||n)return;let t=r.current;if(!t)return;let a=t.getContext(`2d`);if(!a)return;let o=t.getBoundingClientRect(),s=`touches`in e?e.touches[0].clientX-o.left:e.clientX-o.left,c=`touches`in e?e.touches[0].clientY-o.top:e.clientY-o.top;a.lineTo(s,c),a.strokeStyle=`#000`,a.lineWidth=2,a.lineCap=`round`,a.lineJoin=`round`,a.stroke()},d=()=>{if(!i)return;a(!1);let e=r.current;e&&t(e.toDataURL(`image/png`))};return n&&e?(0,g.jsx)(`div`,{className:`border rounded p-2 bg-white`,children:(0,g.jsx)(`img`,{src:e,alt:`Signature`,loading:`lazy`,className:`max-w-full h-auto`})}):n&&!e?(0,g.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:`No signature`}):(0,g.jsxs)(`div`,{className:`space-y-2`,children:[(0,g.jsx)(`div`,{className:`border rounded bg-white`,children:(0,g.jsx)(`canvas`,{ref:r,width:400,height:200,className:`w-full touch-none cursor-crosshair`,onMouseDown:c,onMouseMove:l,onMouseUp:d,onMouseLeave:d,onTouchStart:c,onTouchMove:l,onTouchEnd:d})}),(0,g.jsxs)(`div`,{className:`flex justify-between items-center`,children:[(0,g.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:o?`Sign above`:`Signature captured`}),(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{let e=r.current;if(!e)return;let n=e.getContext(`2d`);n&&(n.clearRect(0,0,e.width,e.height),s(!0),t(``))},disabled:n||o,children:[(0,g.jsx)(m.Eraser,{className:`w-4 h-4 mr-2`}),`Clear`]})]})]})}var Ln=o((()=>{})),Rn=s({QRCodeField:()=>zn});function zn({value:e,onChange:t,field:n,readonly:r,...i}){let[a,o]=u.default.useState(!1),s=n||i.schema;return r?(0,g.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,g.jsx)(`span`,{className:`text-sm flex-1 truncate`,children:e||(0,g.jsx)(p.EmptyValue,{})}),e&&(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>o(!a),children:[(0,g.jsx)(m.QrCode,{className:`w-4 h-4 mr-2`}),a?`Hide`:`Show`,` QR`]})]}):(0,g.jsxs)(`div`,{className:`space-y-3`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(p.Input,{type:`text`,value:e||``,onChange:e=>t(e.target.value),placeholder:s?.placeholder||`Enter text for QR code`,disabled:r||i.disabled,className:i.className}),e&&(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{e&&navigator.clipboard.writeText(e)},children:(0,g.jsx)(m.Copy,{className:`w-4 h-4`})}),(0,g.jsx)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>o(!a),children:(0,g.jsx)(m.QrCode,{className:`w-4 h-4`})})]})]}),a&&e&&(0,g.jsx)(`div`,{className:`border rounded p-4 bg-white flex justify-center`,children:(0,g.jsx)(`img`,{src:(e=>`https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(e)}`)(e),alt:`QR Code`,className:`w-48 h-48`})}),e&&(0,g.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`QR code contains: `,e.length,` characters`]})]})}var Bn=o((()=>{})),Vn=s({MultiSelectField:()=>Hn});function Hn({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=(n||a.schema)?.options||[],s=Array.isArray(e)?e:e==null?[]:[e];if(r)return s.length===0?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:s.map(e=>(0,g.jsx)(p.Badge,{variant:`outline`,children:o.find(t=>t.value===e)?.label||e},e))});let c=e=>{t(s.includes(e)?s.filter(t=>t!==e):[...s,e])};return(0,g.jsx)(`div`,{className:(0,p.cn)(`flex flex-wrap gap-1.5`,i),children:o.map(e=>{let t=s.includes(e.value);return(0,g.jsx)(`button`,{type:`button`,onClick:()=>c(e.value),disabled:a.disabled,"aria-pressed":t,className:(0,p.cn)(`rounded-full border px-3 py-1 text-sm transition-colors`,t?`border-primary bg-primary text-primary-foreground`:`border-input bg-background text-foreground hover:bg-accent`),children:e.label},e.value)})})}var Un=o((()=>{})),Wn=s({RadioField:()=>Gn});function Gn({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=(n||a.schema)?.options||[],s=(0,u.useId)();return r?e==null||e===``?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`span`,{className:`text-sm`,children:o.find(t=>t.value===e)?.label||String(e)}):(0,g.jsx)(p.RadioGroup,{value:e??``,onValueChange:t,disabled:a.disabled,className:i,children:o.map(e=>{let t=`${s}-${e.value}`;return(0,g.jsxs)(`div`,{className:`flex items-center space-x-2`,children:[(0,g.jsx)(p.RadioGroupItem,{value:e.value,id:t}),(0,g.jsx)(p.Label,{htmlFor:t,className:`font-normal`,children:e.label})]},e.value)})})}var Kn=o((()=>{})),qn=s({CheckboxesField:()=>Jn});function Jn({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=(n||a.schema)?.options||[],s=Array.isArray(e)?e:e==null?[]:[e],c=(0,u.useId)();if(r)return s.length===0?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:s.map(e=>(0,g.jsx)(p.Badge,{variant:`outline`,children:o.find(t=>t.value===e)?.label||e},e))});let l=(e,n)=>{t(n?[...s.filter(t=>t!==e),e]:s.filter(t=>t!==e))};return(0,g.jsx)(`div`,{className:i,children:o.map(e=>{let t=`${c}-${e.value}`;return(0,g.jsxs)(`div`,{className:`flex items-center space-x-2 py-0.5`,children:[(0,g.jsx)(p.Checkbox,{id:t,checked:s.includes(e.value),onCheckedChange:t=>l(e.value,!!t),disabled:a.disabled}),(0,g.jsx)(p.Label,{htmlFor:t,className:`font-normal`,children:e.label})]},e.value)})})}var Yn=o((()=>{})),Xn=s({TagsField:()=>Zn});function Zn({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=Array.isArray(e)?e:e==null?[]:[e],[s,c]=u.default.useState(``);if(r)return o.length===0?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:o.map(e=>(0,g.jsx)(p.Badge,{variant:`secondary`,children:e},e))});let l=e=>{let n=e.trim();!n||o.includes(n)||(t([...o,n]),c(``))},d=e=>t(o.filter(t=>t!==e));return(0,g.jsxs)(`div`,{className:(0,p.cn)(`flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-background p-1.5`,i),children:[o.map(e=>(0,g.jsxs)(p.Badge,{variant:`secondary`,className:`gap-1`,children:[e,(0,g.jsx)(`button`,{type:`button`,onClick:()=>d(e),className:`ml-0.5 rounded-full text-muted-foreground hover:text-foreground`,"aria-label":`Remove ${e}`,children:`×`})]},e)),(0,g.jsx)(p.Input,{value:s,onChange:e=>c(e.target.value),onKeyDown:e=>{e.key===`Enter`||e.key===`,`?(e.preventDefault(),l(s)):e.key===`Backspace`&&s===``&&o.length>0&&d(o[o.length-1])},onBlur:()=>l(s),disabled:a.disabled,placeholder:o.length===0?`输入后回车添加…`:``,className:`h-7 flex-1 border-0 bg-transparent p-0 px-1 shadow-none focus-visible:ring-0 min-w-[8ch]`})]})}var Qn=o((()=>{}));X(),vt(),xt(),Ot(),Pt(),Lt(),Bt(),qt(),Xt(),pn(),On(),Ln(),C(),J(),E(),ae(),ht(),yn(),Sn(),O(),M(),Un(),Kn(),Yn(),Qn(),F(),lt(),ft(),L(),z(),H(),ot(),Wt(),gn(),jn(),jt(),Pn(),Tn(),Bn();var $n={text:S,textarea:oe,number:T,currency:K,percent:mt,slider:vn,progress:vn,rating:xn,boolean:D,toggle:D,select:j,status:j,multiselect:Hn,radio:Gn,checkboxes:Jn,tags:Zn,date:P,datetime:ct,time:dt,email:re,phone:R,url:V,lookup:tt,master_detail:tt,user:Ut,owner:Ut,color:hn,address:An,location:At,geolocation:Nn,code:wn,qrcode:zn},er=new Set([`formula`,`summary`,`auto_number`,`file`,`image`,`avatar`,`signature`,`markdown`,`html`,`richtext`,`password`,`object`,`grid`,`vector`]),tr=new Set([`boolean`,`toggle`,`select`,`status`,`radio`,`rating`]);function nr(e){return!!e&&e in $n}var rr=new Set([`lookup`,`master_detail`,`user`,`owner`]);function ir({field:e,value:t,onChange:n,readonly:r}){let i=e?.type?$n[e.type]:void 0;return i?(0,g.jsx)(i,{field:e,value:t,onChange:n,readonly:r,...e?.type&&rr.has(e.type)?{compact:!0}:{}}):null}wt();function ar({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=e||[],s=n||a.schema,c=()=>{let e={id:`new-${Date.now()}`,label:`New Related Record`};t([...o,e])},l=e=>{t(o.filter(t=>t.id!==e))},u=e=>{console.log(`View detail:`,e)};return r?(0,g.jsxs)(`div`,{className:(0,p.cn)(`space-y-2`,i),children:[o.length===0?(0,g.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:`No related records`}):o.map(e=>(0,g.jsxs)(`div`,{className:`flex items-center justify-between p-2 border rounded hover:bg-muted/50`,children:[(0,g.jsx)(`span`,{className:`text-sm`,children:e.label}),(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>u(e),children:(0,g.jsx)(m.ExternalLink,{className:`w-4 h-4`})})]},e.id)),(0,g.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[o.length,` `,o.length===1?`record`:`records`]})]}):(0,g.jsxs)(`div`,{className:(0,p.cn)(`space-y-3`,i),children:[(0,g.jsxs)(`div`,{className:`space-y-2`,children:[o.map(e=>(0,g.jsxs)(`div`,{className:`flex items-center justify-between gap-2 p-2 border rounded hover:bg-muted/50`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2 flex-1`,children:[(0,g.jsx)(p.Badge,{variant:`outline`,children:e.id}),(0,g.jsx)(`span`,{className:`text-sm flex-1`,children:e.label})]}),(0,g.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>u(e),children:(0,g.jsx)(m.ExternalLink,{className:`w-4 h-4`})}),(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>l(e.id),disabled:a.disabled,children:(0,g.jsx)(m.X,{className:`w-4 h-4`})})]})]},e.id)),o.length===0&&(0,g.jsx)(`div`,{className:`text-sm text-muted-foreground text-center py-4 border border-dashed rounded bg-muted/20`,children:`No related records`})]}),(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,className:`w-full`,onClick:c,disabled:a.disabled,children:[(0,g.jsx)(m.Plus,{className:`w-4 h-4 mr-2`}),`Add `,s?.label||`Record`]})]})}var or=s({default:()=>sr});function sr({value:e}){return(0,g.jsx)(`div`,{className:`prose prose-sm max-w-none dark:prose-invert break-words`,children:(0,g.jsx)(v.default,{remarkPlugins:[y.default],rehypePlugins:[b.default],children:e})})}var cr=o((()=>{}));C(),E(),O(),M(),F(),L(),z(),H(),ae(),J(),ot(),lt(),ft(),ht(),jt(),Wt(),gn(),yn(),Sn(),Tn(),jn(),Pn(),Bn(),U(),Je(),C(),E(),O(),M(),F(),lt(),ft(),L(),z(),H(),ae(),ht(),vt(),J(),X(),ot(),_e(),xt(),Ot(),jt(),Pt(),Lt(),Bt(),Wt(),qt(),Xt(),pn(),gn(),yn(),Sn(),Tn(),On(),jn(),Pn(),Ln(),Bn(),Un(),Kn(),Yn(),Qn();var lr=new Map;function ur(e,t){if(!e||typeof e!=`object`)return;if(t){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim();if(typeof n==`number`)return String(n)}for(let t of[`name`,`full_name`,`display_name`,`label`,`title`,`subject`,`username`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim();if(typeof n==`number`)return String(n)}let n=e.first_name,r=e.last_name,i=[e.salutation,n,r].filter(e=>typeof e==`string`&&e.trim()).map(e=>e.trim()).join(` `);if(i)return i;let a=e.email;if(typeof a==`string`&&a.trim())return a.trim();let o=new Set([`id`,`_id`,`organization_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`tenant_id`]),s=[`_name`,`_title`,`_number`,`_code`,`_label`];for(let[t,n]of Object.entries(e))if(!o.has(t)&&!t.endsWith(`_id`)&&s.some(e=>t.endsWith(e))){if(typeof n==`string`&&n.trim())return n.trim();if(typeof n==`number`)return String(n)}}function dr(e){if(typeof e!=`string`||!/^[A-Za-z0-9_-]{12,32}$/.test(e))return!1;let t=/[A-Z]/.test(e),n=/[a-z]/.test(e),r=/[0-9_-]/.test(e);return t&&n||t&&r||n&&r}function fr(e,t){let n=u.default.useContext(h.SchemaRendererContext)?.dataSource,[,r]=u.default.useState(0),i=!!e&&!!n&&typeof n.find==`function`&&(typeof t==`string`||typeof t==`number`)&&t!==``,a=i?`${e}:${String(t)}`:``;if(u.default.useEffect(()=>{if(!i)return;let o=lr.get(a);if(o&&o.state!==`pending`&&o.promise==null||o?.state===`pending`)return;let s=(async()=>{try{let r;if(typeof n.findOne==`function`)r=await n.findOne(e,t);else{let i=await n.find(e,{$filter:{id:t},options:{$top:1}});r=(Array.isArray(i)?i:i?.value||i?.data||[])[0]}let i=ur(r);lr.set(a,{state:`ok`,name:i})}catch{lr.set(a,{state:`err`})}r(e=>e+1)})();lr.set(a,{state:`pending`,promise:s})},[a,i,e,t,n]),!i)return;let o=lr.get(a);return o?.state===`ok`?o.name:void 0}function pr(){try{let{t:e}=(0,h.useObjectTranslation)();return(t,n)=>{let r=e(t);return!r||r===t?n:r}}catch{return(e,t)=>t}}function mr(e){if(e==null||typeof e==`number`||typeof e==`boolean`)return e;if(typeof e==`string`){let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`))try{return mr(JSON.parse(t))}catch{}return e}if(e instanceof Date)return e.toISOString();if(Array.isArray(e))return e.map(e=>{if(typeof e==`object`&&e){let t=e;return String(t.name||t.label||t.externalId||t.id||t._id||`[Object]`)}return String(e)}).join(`, `);if(typeof e==`object`){let t=e;return`$numberDecimal`in t?Number(t.$numberDecimal):`$oid`in t?String(t.$oid):`$date`in t?String(t.$date):String(t.name||t.label||t.externalId||t.id||t._id||`[Object]`)}return String(e)}function hr(e,t){let n=Number.isFinite(e)&&e===Math.trunc(e)?0:2;if(!t)return _r(e,n);try{return new Intl.NumberFormat(`en-US`,{style:`currency`,currency:t,minimumFractionDigits:0,maximumFractionDigits:n}).format(e)}catch{return`${t} ${e.toFixed(n)}`}}function gr(e,t){if(!t)try{return new Intl.NumberFormat(`en-US`,{notation:`compact`,maximumFractionDigits:1}).format(e).replace(/\.0(?=[KMBT])/,``)}catch{return String(e)}try{return new Intl.NumberFormat(`en-US`,{style:`currency`,currency:t,notation:`compact`,maximumFractionDigits:1}).format(e).replace(/\.0(?=[KMBT])/,``)}catch{return`${t} ${e}`}}function _r(e,t=2){try{return new Intl.NumberFormat(`en-US`,{minimumFractionDigits:t,maximumFractionDigits:t}).format(e)}catch{return e.toFixed(t)}}function vr(e,t=0){return`${(0,d.percentDisplayValue)(e).toFixed(t)}%`}function yr(e){return e.replace(/[_-]/g,` `).replace(/\b\w/g,e=>e.toUpperCase())}function br(e){if(e==null||e===``)return`—`;let t=e instanceof Date?e:new Date(e);if(!(t instanceof Date)||isNaN(t.getTime()))return`—`;let n=new Date,r=new Date(n.getFullYear(),n.getMonth(),n.getDate()),i=new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-r.getTime(),a=Math.round(i/(1e3*60*60*24));if(a===0)return`Today`;if(a===1)return`Tomorrow`;if(a===-1)return`Yesterday`;if(a<-1){let e=Math.abs(a);return e<=7?`Overdue ${e}d`:xr(t)}return a>1&&a<=7?`In ${a} days`:xr(t)}function xr(e,t){if(e==null||e===``)return`—`;let n=e instanceof Date?e:new Date(e);if(!(n instanceof Date)||isNaN(n.getTime()))return`—`;if(t===`short`)return`${n.toLocaleDateString(`en-US`,{month:`short`})} ${n.getDate()}, '${String(n.getFullYear()).slice(-2)}`;if(t===`relative`)return br(n);let r=n.getFullYear()===new Date().getFullYear();return n.toLocaleDateString(void 0,{year:r?void 0:`numeric`,month:`short`,day:`numeric`})}function Sr(e){if(e==null||e===``)return`—`;let t=e instanceof Date?e:new Date(e);return!(t instanceof Date)||isNaN(t.getTime())?`—`:t.toLocaleDateString(void 0,{year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}function Cr({value:e}){let t=mr(e);return t==null||t===``?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`span`,{className:`truncate`,children:String(t)})}function wr({value:e,field:t}){if(e==null)return(0,g.jsx)(p.EmptyValue,{});let n=mr(e),r=t,i=typeof r.scale==`number`?r.scale:void 0,a=Number(n);return(0,g.jsx)(`span`,{className:`tabular-nums`,children:isNaN(a)?String(n):new Intl.NumberFormat(`en-US`,{minimumFractionDigits:i??0,maximumFractionDigits:i??20}).format(a)})}function Tr({value:e,field:t}){if(e==null)return(0,g.jsx)(p.EmptyValue,{});let n=mr(e),{currency:r}=(0,f.useLocalization)(),i=(0,f.resolveFieldCurrency)(t,r),a=Number(n);return(0,g.jsx)(`span`,{className:`tabular-nums font-medium whitespace-nowrap`,children:isNaN(a)?String(n):hr(a,i)})}var Er=/progress|completion/;function Dr({value:e,field:t}){if(e==null)return(0,g.jsx)(p.EmptyValue,{});let n=mr(e),r=t.precision??0,i=Number(n);if(isNaN(i))return(0,g.jsx)(`span`,{className:`tabular-nums whitespace-nowrap`,children:String(n)});let a=Er.test(t?.name?.toLowerCase()||``),o=a?i:i>-1&&i<1?i*100:i,s=a?`${i.toFixed(r)}%`:vr(i,r),c=Math.max(0,Math.min(100,o));return(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`div`,{className:`h-1.5 w-16 rounded-full bg-muted ring-1 ring-inset ring-border/60 overflow-hidden shrink-0`,role:`progressbar`,"aria-valuenow":c,"aria-valuemin":0,"aria-valuemax":100,children:(0,g.jsx)(`div`,{className:`h-full rounded-full bg-primary transition-all`,style:{width:`${c}%`}})}),(0,g.jsx)(`span`,{className:`tabular-nums whitespace-nowrap`,children:s})]})}var Or=new Set([`active`,`is_active`,`enabled`,`is_enabled`,`verified`,`is_verified`]);function kr({value:e,field:t}){if(e==null)return(0,g.jsx)(`span`,{className:`flex items-center justify-center`,children:(0,g.jsx)(p.EmptyValue,{})});let n=t?.name?.toLowerCase()||``;return n===`completed`||n===`is_completed`||n===`done`||n===`is_done`?(0,g.jsx)(`div`,{className:`flex items-center justify-center`,children:e?(0,g.jsx)(`div`,{className:`size-5 rounded-full bg-green-500 flex items-center justify-center`,role:`img`,"aria-label":`Completed`,"data-testid":`completion-indicator`,children:(0,g.jsx)(m.Check,{className:`size-3 text-white`})}):(0,g.jsx)(`div`,{className:`size-5 rounded-full border-2 border-muted-foreground/30`,role:`img`,"aria-label":`Not completed`,"data-testid":`completion-indicator`})}):Or.has(n)&&!e?(0,g.jsxs)(p.Badge,{variant:`destructive`,className:`text-xs`,"data-testid":`boolean-warning-badge`,children:[t?.label||yr(n),` — Off`]}):(0,g.jsx)(`div`,{className:`flex items-center justify-start`,children:(0,g.jsx)(p.Checkbox,{checked:!!e,disabled:!0,className:`pointer-events-none`})})}function Ar({value:e,field:t}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let n=mr(e),r=t,i=xr(n,r.format||`relative`),a=n==null?null:new Date(n),o=a!==null&&!isNaN(a.getTime()),s=new Date;s.setHours(0,0,0,0);let c=String(r?.name||r?.accessorKey||r?.key||``).toLowerCase(),l=(r?.dueLike===!0||/(^|_)(due|deadline|expires?|expiry|expiration|expected_close|target_close|sla|return_by|renewal|next_action)(_|$)/.test(c))&&o&&a<s,u=o?a.toISOString():String(n);return(0,g.jsx)(`span`,{className:`tabular-nums${l?` text-red-600`:``}`,title:u,children:i})}function jr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let t=mr(e),n=t==null?null:new Date(t);if(n===null||isNaN(n.getTime()))return(0,g.jsx)(p.EmptyValue,{});let r=n.toLocaleDateString(void 0,{month:`numeric`,day:`numeric`,year:`numeric`}),i=n.toLocaleTimeString(void 0,{hour:`numeric`,minute:`2-digit`,hour12:!0}).toLowerCase();return(0,g.jsxs)(`span`,{className:`tabular-nums text-sm whitespace-nowrap`,children:[(0,g.jsx)(`span`,{children:r}),(0,g.jsx)(`span`,{className:`ml-2 text-muted-foreground`,children:i})]})}var Mr={critical:`red`,urgent:`red`,high:`orange`,medium:`yellow`,normal:`blue`,low:`gray`,none:`gray`,paid:`green`,completed:`green`,done:`green`,active:`green`,approved:`green`,resolved:`green`,pending:`yellow`,waiting:`yellow`,on_hold:`yellow`,shipped:`blue`,in_progress:`blue`,open:`blue`,processing:`blue`,draft:`gray`,new:`gray`,inactive:`gray`,closed:`gray`,cancelled:`red`,canceled:`red`,rejected:`red`,failed:`red`,overdue:`red`,delivered:`purple`,archived:`indigo`,contacted:`blue`,qualified:`purple`,converted:`green`,won:`green`,lost:`red`,紧急:`red`,严重:`red`,高:`orange`,中:`yellow`,普通:`blue`,低:`gray`,无:`gray`,新建:`gray`,草稿:`gray`,待处理:`yellow`,待审核:`yellow`,待联系:`yellow`,挂起:`yellow`,进行中:`blue`,处理中:`blue`,已联系:`blue`,跟进中:`blue`,已发货:`blue`,打开:`blue`,已确认:`green`,已审核:`green`,已通过:`green`,已完成:`green`,已支付:`green`,已签收:`green`,已转化:`green`,成单:`green`,赢得:`green`,已签约:`green`,已交付:`purple`,已归档:`indigo`,已关闭:`gray`,已取消:`red`,已拒绝:`red`,失败:`red`,逾期:`red`,流失:`red`,丢失:`red`},Nr={gray:`bg-gray-50 text-gray-700 border-gray-200 dark:bg-gray-800/50 dark:text-gray-200 dark:border-gray-700/60`,red:`bg-red-50 text-red-700 border-red-200 dark:bg-red-950/40 dark:text-red-300 dark:border-red-900/60`,orange:`bg-orange-50 text-orange-700 border-orange-200 dark:bg-orange-950/40 dark:text-orange-300 dark:border-orange-900/60`,yellow:`bg-yellow-50 text-yellow-800 border-yellow-200 dark:bg-yellow-950/40 dark:text-yellow-300 dark:border-yellow-900/60`,green:`bg-green-50 text-green-700 border-green-200 dark:bg-green-950/40 dark:text-green-300 dark:border-green-900/60`,blue:`bg-blue-50 text-blue-700 border-blue-200 dark:bg-blue-950/40 dark:text-blue-300 dark:border-blue-900/60`,indigo:`bg-indigo-50 text-indigo-700 border-indigo-200 dark:bg-indigo-950/40 dark:text-indigo-300 dark:border-indigo-900/60`,purple:`bg-purple-50 text-purple-700 border-purple-200 dark:bg-purple-950/40 dark:text-purple-300 dark:border-purple-900/60`,pink:`bg-pink-50 text-pink-700 border-pink-200 dark:bg-pink-950/40 dark:text-pink-300 dark:border-pink-900/60`},Pr={gray:`bg-gray-400 dark:bg-gray-500`,red:`bg-red-500`,orange:`bg-orange-500`,yellow:`bg-yellow-500`,green:`bg-green-500`,blue:`bg-blue-500`,indigo:`bg-indigo-500`,purple:`bg-purple-500`,pink:`bg-pink-500`},Fr=[`blue`,`green`,`purple`,`orange`,`pink`,`indigo`,`yellow`,`red`];function Ir(e){let t=5381;for(let n=0;n<e.length;n++)t=(t<<5)+t^e.charCodeAt(n);return Fr[Math.abs(t)%Fr.length]}function Lr(e){let t=/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(e.trim());if(!t)return;let n=t[1];n.length===3&&(n=n.split(``).map(e=>e+e).join(``));let r=parseInt(n.slice(0,2),16)/255,i=parseInt(n.slice(2,4),16)/255,a=parseInt(n.slice(4,6),16)/255,o=Math.max(r,i,a),s=Math.min(r,i,a),c=o-s,l=(o+s)/2;if((c===0?0:c/(1-Math.abs(2*l-1)))<.22)return`gray`;let u;return u=o===r?((i-a)/c%6+6)%6:o===i?(a-r)/c+2:(r-i)/c+4,u*=60,u>=345||u<15?`red`:u<30?`orange`:u<60?`yellow`:u<170?`green`:u<238?`blue`:u<250?`indigo`:u<295?`purple`:`pink`}function Rr(e){if(e){if(Nr[e])return e;if(e.charAt(0)===`#`)return Lr(e)}}function zr(e,t){let n=Rr(e);if(n&&Nr[n])return Nr[n];if(t==null||t===``)return`bg-muted text-muted-foreground border-border`;let r=String(t).toLowerCase().replace(/[\s-]/g,`_`),i=Mr[r];return i&&Nr[i]?Nr[i]:Nr[Ir(r)]}function Br(e,t){let n=Rr(e);if(n&&Nr[n])return n;if(t==null||t===``)return;let r=String(t).toLowerCase().replace(/[\s-]/g,`_`);return Mr[r]||Ir(r)}var Vr={gray:`#6b7280`,red:`#ef4444`,orange:`#f97316`,yellow:`#eab308`,green:`#22c55e`,blue:`#3b82f6`,indigo:`#6366f1`,purple:`#a855f7`,pink:`#ec4899`};function Hr(e,t=`#3b82f6`){return e?Vr[e]??t:t}function Ur({value:e,field:t}){let n=t,r=n.options||[],i=n.appearance===`dot`?`dot`:`badge`;if(e==null||e===``)return(0,g.jsx)(p.EmptyValue,{});let a=e=>{let t=r.find(t=>t.value===e);if(t)return t;let n=String(e).toLowerCase();return r.find(e=>String(e.value).toLowerCase()===n)},o=(e,t)=>{let n=a(e),r=n?.label||yr(String(e));return i===`dot`?(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 text-sm`,children:[(0,g.jsx)(`span`,{className:(0,p.cn)(`h-1.5 w-1.5 rounded-full shrink-0`,Pr[Rr(n?.color)||Mr[String(e).toLowerCase().replace(/[\s-]/g,`_`)]||Ir(String(e).toLowerCase().replace(/[\s-]/g,`_`))]||Pr.gray),"aria-hidden":`true`}),(0,g.jsx)(`span`,{className:`truncate`,children:r})]},t):(0,g.jsx)(p.Badge,{variant:`outline`,className:zr(n?.color,e),children:r},t)};return Array.isArray(e)?(0,g.jsx)(`div`,{className:(0,p.cn)(`flex flex-wrap`,i===`dot`?`gap-x-3 gap-y-1`:`gap-1`),children:e.map((e,t)=>o(e,t))}):o(e)}function Wr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let t=pr(),n=String(mr(e)??``),[r,i]=u.default.useState(!1);return(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1 group/email`,children:[(0,g.jsx)(p.Button,{variant:`link`,className:`p-0 h-auto font-normal text-blue-600 hover:text-blue-800`,asChild:!0,children:(0,g.jsx)(`a`,{href:`mailto:${n}`,onClick:e=>e.stopPropagation(),children:n})}),(0,g.jsx)(`button`,{type:`button`,className:`opacity-0 group-hover/email:opacity-100 transition-opacity p-0.5 rounded hover:bg-muted`,onClick:e=>{e.stopPropagation(),e.preventDefault(),navigator.clipboard.writeText(n).then(()=>{i(!0),setTimeout(()=>i(!1),2e3)}).catch(()=>{})},"aria-label":t(`detail.copyEmail`,`Copy email`),children:r?(0,g.jsx)(m.Check,{className:`h-3 w-3 text-green-600`}):(0,g.jsx)(m.Copy,{className:`h-3 w-3 text-muted-foreground`})})]})}function Gr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let t=String(mr(e)??``);return(0,g.jsx)(p.Button,{variant:`link`,className:`p-0 h-auto font-normal text-blue-600 hover:text-blue-800`,asChild:!0,children:(0,g.jsx)(`a`,{href:t,target:`_blank`,rel:`noopener noreferrer`,onClick:e=>e.stopPropagation(),children:t})})}function Kr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let t=pr(),n=String(mr(e)??``),[r,i]=u.default.useState(!1);return(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1 group/phone`,children:[(0,g.jsxs)(`a`,{href:`tel:${n}`,className:`inline-flex items-center gap-1 text-blue-600 hover:text-blue-800`,onClick:e=>e.stopPropagation(),children:[(0,g.jsx)(m.Phone,{className:`h-3 w-3`}),n]}),(0,g.jsx)(`button`,{type:`button`,className:`opacity-0 group-hover/phone:opacity-100 transition-opacity p-0.5 rounded hover:bg-muted`,onClick:e=>{e.stopPropagation(),e.preventDefault(),navigator.clipboard.writeText(n).then(()=>{i(!0),setTimeout(()=>i(!1),2e3)}).catch(()=>{})},"aria-label":t(`detail.copyPhone`,`Copy phone number`),children:r?(0,g.jsx)(m.Check,{className:`h-3 w-3 text-green-600`}):(0,g.jsx)(m.Copy,{className:`h-3 w-3 text-muted-foreground`})})]})}function qr({value:e,field:t}){if(!e)return(0,g.jsx)(p.EmptyValue,{});if(t.multiple,Array.isArray(e)){let t=e.length;return(0,g.jsxs)(`span`,{className:`text-sm text-gray-600`,children:[t,` `,t===1?`file`:`files`]})}return(0,g.jsx)(`span`,{className:`text-sm truncate`,children:e.name||e.original_name||`File`})}function Jr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let t=e=>typeof e==`string`?e:e?.url||e?.src||e?.href||e?.thumbnailUrl||``,n=(e,t)=>e&&typeof e==`object`&&(e.name||e.original_name)||t;if(Array.isArray(e)){let r=e.map(e=>({url:t(e),name:n(e,`Image`)})).filter(e=>e.url);return r.length===0?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsxs)(`div`,{className:`flex -space-x-2`,children:[r.slice(0,3).map((e,t)=>(0,g.jsx)(`img`,{src:e.url,alt:e.name||`Image ${t+1}`,className:`size-8 rounded-md border-2 border-white object-cover`},t)),r.length>3&&(0,g.jsxs)(`div`,{className:`size-8 rounded-md border-2 border-white bg-gray-100 flex items-center justify-center text-xs font-medium text-gray-600`,children:[`+`,r.length-3]})]})}let r=t(e);return r?(0,g.jsx)(`img`,{src:r,alt:n(e,`Image`),className:`size-10 rounded-md object-cover`}):(0,g.jsx)(p.EmptyValue,{})}function Yr({value:e,field:t}){let n=t.reference_to||t.reference,r=(()=>{if(Array.isArray(e))return e.find(e=>e!=null&&(typeof e==`string`||typeof e==`number`)&&e!==``);if(e!=null&&e!==``&&(typeof e==`string`||typeof e==`number`)&&typeof e!=`object`)return e})(),i=fr(n,r);if(e==null||e===``)return(0,g.jsx)(p.EmptyValue,{});if(typeof e==`string`){let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`))try{let e=JSON.parse(t);if(e&&typeof e==`object`){let t=ur(e)||String(e.externalId??e.id??e._id??``);if(t)return(0,g.jsx)(`span`,{className:`truncate`,children:t})}}catch{}}if(!Array.isArray(e)&&typeof e==`object`){let t=e,n=ur(t)||String(t.id||t._id||``);if(n)return(0,g.jsx)(`span`,{className:`truncate`,children:n})}let a=t.options||[],o=e=>{if(a.length>0){let t=a.find(t=>String(t.value)===String(e));if(t)return{text:t.label,muted:!1}}return e===r&&i?{text:i,muted:!1}:dr(e)?{text:`—`,muted:!0}:{text:String(e),muted:!1}};if(Array.isArray(e))return(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.map((e,t)=>{let n,r=!1;if(typeof e==`object`&&e)n=ur(e)||String(e.id||e._id||`[Object]`);else{let t=o(e);n=t.text,r=t.muted}return(0,g.jsx)(`span`,{className:(0,p.cn)(`inline-flex items-center px-2 py-0.5 rounded text-xs font-medium`,r?`bg-muted/40 text-muted-foreground`:`bg-gray-50 text-gray-700 dark:bg-gray-800/50 dark:text-gray-200`),children:n},t)})});if(typeof e==`object`&&e)return(0,g.jsx)(`span`,{className:`truncate`,children:ur(e)||String(e.id||e._id||`[Object]`)});let{text:s,muted:c}=o(e);return(0,g.jsx)(`span`,{className:(0,p.cn)(`truncate`,c&&`text-muted-foreground`),children:s})}function Xr({value:e}){let t=mr(e);return t==null||t===``?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`span`,{className:`text-gray-700 font-mono text-sm`,children:String(t)})}function Zr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});if(typeof e!=`object`)return(0,g.jsx)(`span`,{className:`truncate`,children:String(e)});if(Array.isArray(e))return(0,g.jsxs)(`div`,{className:`flex -space-x-2`,children:[e.slice(0,3).map((e,t)=>{if(typeof e!=`object`||!e)return(0,g.jsx)(`span`,{className:`truncate text-sm`,children:String(e)},t);let n=e.name||e.username||`User`,r=n.split(` `).map(e=>e[0]).join(``).toUpperCase().slice(0,2);return(0,g.jsxs)(p.Avatar,{className:`size-8 border-2 border-white`,title:n,children:[e.image&&(0,g.jsx)(p.AvatarImage,{src:e.image,alt:n}),(0,g.jsx)(p.AvatarFallback,{className:`bg-blue-500 text-white text-xs`,children:r})]},t)}),e.length>3&&(0,g.jsx)(p.Avatar,{className:`size-8 border-2 border-white`,children:(0,g.jsxs)(p.AvatarFallback,{className:`bg-gray-200 text-gray-600 text-xs`,children:[`+`,e.length-3]})})]});let t=e.name||e.username||`User`,n=t.split(` `).map(e=>e[0]).join(``).toUpperCase().slice(0,2);return(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsxs)(p.Avatar,{className:`size-8`,children:[e.image&&(0,g.jsx)(p.AvatarImage,{src:e.image,alt:t}),(0,g.jsx)(p.AvatarFallback,{className:`bg-blue-500 text-white text-xs`,children:n})]}),(0,g.jsx)(`span`,{className:`truncate`,children:t})]})}var Qr=new Map;function $r(e,t){Qr.set(e,t)}var ei={phone:`phone`,tel:`phone`,telephone:`phone`,email:`email`,url:`url`,uri:`url`,link:`url`,currency:`currency`,money:`currency`,percent:`percent`,percentage:`percent`},ti=new Set([`text`,`textarea`,`string`,`longtext`,``]);function ni(e){if(!e)return`text`;if(typeof e==`string`)return e;let t=(e.type||``).toLowerCase(),n=e.format,r=typeof n==`string`?n.toLowerCase():``;return r&&ei[r]&&ti.has(t)?ei[r]:e.type||`text`}function ri({value:e}){if(e==null||e===``)return(0,g.jsx)(p.EmptyValue,{});let t;if(typeof e==`object`)try{t=JSON.stringify(e)}catch{t=String(e)}else t=String(e);return(0,g.jsx)(`span`,{className:`font-mono text-xs text-gray-600 truncate`,title:t,children:t})}function ii({value:e}){if(e==null||e===``)return(0,g.jsx)(p.EmptyValue,{});let t=String(e);return(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 text-sm`,children:[(0,g.jsx)(`span`,{className:`h-3.5 w-3.5 rounded border border-black/10 shrink-0`,style:{backgroundColor:t},"aria-hidden":`true`}),(0,g.jsx)(`span`,{className:`font-mono text-xs`,children:t})]})}var ai=u.default.lazy(()=>Promise.resolve().then(()=>(cr(),or)));function oi({value:e}){return e==null||e===``?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(u.default.Suspense,{fallback:(0,g.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:String(e).slice(0,80)}),children:(0,g.jsx)(ai,{value:String(e)})})}function si(e){return e.replace(/<\s*(script|style|iframe|object|embed)[^>]*>[\s\S]*?<\s*\/\s*\1\s*>/gi,``).replace(/\son\w+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi,``).replace(/(href|src)\s*=\s*("javascript:[^"]*"|'javascript:[^']*')/gi,`$1="#"`)}function ci({value:e}){return e==null||e===``?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`div`,{className:`prose prose-sm max-w-none dark:prose-invert break-words`,dangerouslySetInnerHTML:{__html:si(String(e))}})}function li({value:e}){if(e==null||e===``)return(0,g.jsx)(p.EmptyValue,{});let t,n;if(typeof e==`object`&&!Array.isArray(e)){let r=e;t=typeof r.lat==`number`?r.lat:typeof r.latitude==`number`?r.latitude:void 0,n=typeof r.lng==`number`?r.lng:typeof r.lon==`number`?r.lon:typeof r.longitude==`number`?r.longitude:void 0}else if(Array.isArray(e)&&e.length===2)t=Number(e[0]),n=Number(e[1]);else if(typeof e==`string`){let r=e.split(`,`).map(e=>parseFloat(e.trim()));r.length===2&&!isNaN(r[0])&&!isNaN(r[1])&&([t,n]=r)}return typeof t==`number`&&typeof n==`number`&&!isNaN(t)&&!isNaN(n)?(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-sm tabular-nums`,children:[(0,g.jsx)(m.MapPin,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`,"aria-hidden":`true`}),t.toFixed(4),`, `,n.toFixed(4)]}):(0,g.jsx)(ri,{value:e,field:{}})}function ui(e){return Qr.has(e)?Qr.get(e):{text:Cr,textarea:Cr,markdown:oi,html:ci,richtext:oi,code:Cr,qrcode:Cr,number:wr,currency:Tr,percent:Dr,progress:Dr,slider:wr,rating:wr,boolean:kr,toggle:kr,date:Ar,datetime:jr,time:Cr,select:Ur,status:Ur,multiselect:Ur,radio:Ur,checkboxes:Ur,tags:Ur,lookup:Yr,master_detail:Yr,tree:Yr,email:Wr,url:Gr,phone:Kr,file:qr,video:qr,audio:qr,image:Jr,avatar:Jr,signature:Jr,formula:Xr,summary:Xr,auto_number:Cr,user:Zr,owner:Zr,password:()=>(0,g.jsx)(`span`,{children:`••••••`}),secret:()=>(0,g.jsx)(`span`,{children:`••••••`}),location:li,geolocation:li,address:ri,color:ii,json:ri,object:ri,composite:ri,record:ri,repeater:({value:e})=>{let t=Array.isArray(e)?e.length:0;return t>0?(0,g.jsxs)(`span`,{className:`text-gray-500 italic`,children:[t,` 项`]}):(0,g.jsx)(p.EmptyValue,{})},vector:()=>(0,g.jsx)(`span`,{className:`text-gray-500 italic`,children:`[Vector]`}),grid:()=>(0,g.jsx)(`span`,{className:`text-gray-500 italic`,children:`[Grid]`})}[e]||Cr}$r(`lookup`,Yr),$r(`master_detail`,Yr),$r(`select`,Ur),$r(`status`,Ur),$r(`user`,Zr),$r(`owner`,Zr),Ge(ui);function di(e){return{text:`field:text`,textarea:`field:textarea`,markdown:`field:markdown`,html:`field:html`,richtext:`field:richtext`,secret:`field:password`,number:`field:number`,currency:`field:currency`,percent:`field:percent`,slider:`field:slider`,progress:`field:slider`,rating:`field:rating`,date:`field:date`,datetime:`field:datetime`,time:`field:time`,boolean:`field:boolean`,toggle:`field:boolean`,select:`field:select`,multiselect:`field:multiselect`,radio:`field:radio`,checkboxes:`field:checkboxes`,tags:`field:tags`,lookup:`field:lookup`,master_detail:`field:master_detail`,tree:`field:lookup`,user:`field:user`,owner:`field:owner`,email:`field:email`,phone:`field:phone`,url:`field:url`,file:`field:file`,image:`field:image`,avatar:`field:avatar`,video:`field:file`,audio:`field:file`,signature:`field:signature`,password:`field:password`,location:`field:location`,geolocation:`field:geolocation`,address:`field:address`,color:`field:color`,code:`field:code`,json:`field:code`,qrcode:`field:qrcode`,vector:`field:vector`,object:`field:object`,composite:`field:object`,record:`field:object`,repeater:`field:grid`,formula:`field:formula`,summary:`field:summary`,auto_number:`field:auto_number`}[e]||`field:text`}function fi(e){if(e<0||!Number.isFinite(e)||e===0)return`0 B`;let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${n.toFixed(+(r>0))} ${t[r]}`}function pi(e){let t={};return e.required&&(t.required=typeof e.required_message==`string`?e.required_message:`${e.label||e.name} is required`),e.min_length&&(t.minLength={value:e.min_length,message:e.min_length_message||`Minimum length is ${e.min_length} characters`}),e.max_length&&(t.maxLength={value:e.max_length,message:e.max_length_message||`Maximum length is ${e.max_length} characters`}),e.min!==void 0&&(t.min={value:e.min,message:e.min_message||`Minimum value is ${e.min}`}),e.max!==void 0&&(t.max={value:e.max,message:e.max_message||`Maximum value is ${e.max}`}),e.pattern&&(t.pattern={value:typeof e.pattern==`string`?new RegExp(e.pattern):e.pattern,message:e.pattern_message||`Invalid format`}),e.type===`email`&&(t.pattern={value:/^[^\s@]+@[^\s@]+\.[^\s@]+$/,message:`Please enter a valid email address`}),e.type===`url`&&(t.pattern={value:/^https?:\/\/.+/,message:`Please enter a valid URL`}),e.validate&&(t.validate=e.validate),Object.keys(t).length>0?t:void 0}function mi(e,t){if(!e)return!0;if(e.field&&e.value!==void 0){let n=t[e.field];if(e.operator===`=`||e.operator===`==`)return n===e.value;if(e.operator===`!=`)return n!==e.value;if(e.operator===`>`)return n>e.value;if(e.operator===`>=`)return n>=e.value;if(e.operator===`<`)return n<e.value;if(e.operator===`<=`)return n<=e.value;if(e.operator===`in`)return Array.isArray(e.value)&&e.value.includes(n)}return e.and&&Array.isArray(e.and)?e.and.every(e=>mi(e,t)):e.or&&Array.isArray(e.or)?e.or.some(e=>mi(e,t)):!0}function $(e){let t=({schema:t,className:n,value:r,...i})=>{let[a,o]=u.default.useState(r??t?.value??``),s={name:t?.name||`field`,label:t?.label,type:t?.type,placeholder:t?.placeholder,required:t?.required,readonly:t?.readonly||t?.readOnly,help:t?.help,description:t?.description,defaultValue:t?.defaultValue||t?.value,...t},c=u.default.useCallback(e=>{o(e),i.onChange&&i.onChange(e)},[i]),l=t?.readonly||t?.readOnly||!1;return(0,g.jsxs)(`div`,{className:`grid w-full items-center gap-1.5`,"data-obj-id":t?.id,"data-obj-type":t?.type,children:[t?.label&&(0,g.jsx)(`label`,{htmlFor:t.id,className:t.required?`after:content-['*'] after:ml-0.5 after:text-red-500`:``,children:t.label}),(0,g.jsx)(e,{value:a,onChange:c,field:s,readonly:l,className:n}),t?.description&&(0,g.jsx)(`p`,{className:`text-sm text-gray-500`,children:t.description})]})};return t.displayName=`FieldRenderer(${e.displayName||e.name||`Component`})`,t}var hi={text:()=>Promise.resolve().then(()=>(C(),x)).then(e=>({default:e.TextField})),textarea:()=>Promise.resolve().then(()=>(J(),q)).then(e=>({default:e.TextAreaField})),number:()=>Promise.resolve().then(()=>(E(),w)).then(e=>({default:e.NumberField})),boolean:()=>Promise.resolve().then(()=>(O(),ee)).then(e=>({default:e.BooleanField})),select:()=>Promise.resolve().then(()=>(M(),ne)).then(e=>({default:e.SelectField})),date:()=>Promise.resolve().then(()=>(F(),N)).then(e=>({default:e.DateField})),datetime:()=>Promise.resolve().then(()=>(lt(),st)).then(e=>({default:e.DateTimeField})),time:()=>Promise.resolve().then(()=>(ft(),ut)).then(e=>({default:e.TimeField})),email:()=>Promise.resolve().then(()=>(L(),I)).then(e=>({default:e.EmailField})),phone:()=>Promise.resolve().then(()=>(z(),ie)).then(e=>({default:e.PhoneField})),url:()=>Promise.resolve().then(()=>(H(),B)).then(e=>({default:e.UrlField})),multiselect:()=>Promise.resolve().then(()=>(Un(),Vn)).then(e=>({default:e.MultiSelectField})),radio:()=>Promise.resolve().then(()=>(Kn(),Wn)).then(e=>({default:e.RadioField})),checkboxes:()=>Promise.resolve().then(()=>(Yn(),qn)).then(e=>({default:e.CheckboxesField})),tags:()=>Promise.resolve().then(()=>(Qn(),Xn)).then(e=>({default:e.TagsField})),currency:()=>Promise.resolve().then(()=>(ae(),W)).then(e=>({default:e.CurrencyField})),percent:()=>Promise.resolve().then(()=>(ht(),pt)).then(e=>({default:e.PercentField})),password:()=>Promise.resolve().then(()=>(vt(),gt)).then(e=>({default:e.PasswordField})),markdown:()=>Promise.resolve().then(()=>(X(),Y)).then(e=>({default:e.RichTextField})),html:()=>Promise.resolve().then(()=>(X(),Y)).then(e=>({default:e.RichTextField})),richtext:()=>Promise.resolve().then(()=>(X(),Y)).then(e=>({default:e.RichTextField})),lookup:()=>Promise.resolve().then(()=>(ot(),Ye)).then(e=>({default:e.LookupField})),master_detail:()=>Promise.resolve().then(()=>(ot(),Ye)).then(e=>({default:e.LookupField})),file:()=>Promise.resolve().then(()=>(xt(),yt)).then(e=>({default:e.FileField})),image:()=>Promise.resolve().then(()=>(Ot(),Tt)).then(e=>({default:e.ImageField})),location:()=>Promise.resolve().then(()=>(jt(),kt)).then(e=>({default:e.LocationField})),formula:()=>Promise.resolve().then(()=>(Pt(),Mt)).then(e=>({default:e.FormulaField})),summary:()=>Promise.resolve().then(()=>(Lt(),Ft)).then(e=>({default:e.SummaryField})),auto_number:()=>Promise.resolve().then(()=>(Bt(),Rt)).then(e=>({default:e.AutoNumberField})),user:()=>Promise.resolve().then(()=>(Wt(),Vt)).then(e=>({default:e.UserField})),owner:()=>Promise.resolve().then(()=>(Wt(),Vt)).then(e=>({default:e.UserField})),object:()=>Promise.resolve().then(()=>(qt(),Gt)).then(e=>({default:e.ObjectField})),vector:()=>Promise.resolve().then(()=>(Xt(),Jt)).then(e=>({default:e.VectorField})),grid:()=>Promise.resolve().then(()=>(pn(),Zt)).then(e=>({default:e.GridField})),color:()=>Promise.resolve().then(()=>(gn(),mn)).then(e=>({default:e.ColorField})),slider:()=>Promise.resolve().then(()=>(yn(),_n)).then(e=>({default:e.SliderField})),rating:()=>Promise.resolve().then(()=>(Sn(),bn)).then(e=>({default:e.RatingField})),code:()=>Promise.resolve().then(()=>(Tn(),Cn)).then(e=>({default:e.CodeField})),avatar:()=>Promise.resolve().then(()=>(On(),En)).then(e=>({default:e.AvatarField})),address:()=>Promise.resolve().then(()=>(jn(),kn)).then(e=>({default:e.AddressField})),geolocation:()=>Promise.resolve().then(()=>(Pn(),Mn)).then(e=>({default:e.GeolocationField})),signature:()=>Promise.resolve().then(()=>(Ln(),Fn)).then(e=>({default:e.SignatureField})),qrcode:()=>Promise.resolve().then(()=>(Bn(),Rn)).then(e=>({default:e.QRCodeField}))},gi=Object.freeze(Object.keys(hi)),_i=new Set([`text`,`html`,`image`,`avatar`,`grid`,`textarea`,`select`,`email`,`password`,`slider`,`markdown`]);function vi(e){let t=hi[e];if(!t){console.warn(`Unknown field type: ${e}`);return}let n=u.default.lazy(t);d.ComponentRegistry.register(e,n,{namespace:`field`,skipFallback:_i.has(e)})}function yi(){Object.keys(hi).forEach(e=>{vi(e)})}function bi(){d.ComponentRegistry.register(`text`,$(S),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`textarea`,$(oe),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`number`,$(T),{namespace:`field`}),d.ComponentRegistry.register(`boolean`,$(D),{namespace:`field`}),d.ComponentRegistry.register(`select`,$(j),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`date`,$(P),{namespace:`field`}),d.ComponentRegistry.register(`datetime`,$(ct),{namespace:`field`}),d.ComponentRegistry.register(`time`,$(dt),{namespace:`field`}),d.ComponentRegistry.register(`email`,$(re),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`phone`,$(R),{namespace:`field`}),d.ComponentRegistry.register(`url`,$(V),{namespace:`field`}),d.ComponentRegistry.register(`currency`,$(K),{namespace:`field`}),d.ComponentRegistry.register(`percent`,$(mt),{namespace:`field`}),d.ComponentRegistry.register(`password`,$(_t),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`markdown`,$(se),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`html`,$(se),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`lookup`,$(tt),{namespace:`field`}),d.ComponentRegistry.register(`master_detail`,$(tt),{namespace:`field`}),d.ComponentRegistry.register(`file`,$(bt),{namespace:`field`}),d.ComponentRegistry.register(`image`,$(Et),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`location`,$(At),{namespace:`field`}),d.ComponentRegistry.register(`formula`,$(Nt),{namespace:`field`}),d.ComponentRegistry.register(`summary`,$(It),{namespace:`field`}),d.ComponentRegistry.register(`auto_number`,$(zt),{namespace:`field`}),d.ComponentRegistry.register(`user`,$(Ut),{namespace:`field`}),d.ComponentRegistry.register(`owner`,$(Ut),{namespace:`field`}),d.ComponentRegistry.register(`object`,$(Kt),{namespace:`field`}),d.ComponentRegistry.register(`vector`,$(Yt),{namespace:`field`}),d.ComponentRegistry.register(`grid`,$(cn),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`color`,$(hn),{namespace:`field`}),d.ComponentRegistry.register(`slider`,$(vn),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`rating`,$(xn),{namespace:`field`}),d.ComponentRegistry.register(`code`,$(wn),{namespace:`field`}),d.ComponentRegistry.register(`avatar`,$(Dn),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`address`,$(An),{namespace:`field`}),d.ComponentRegistry.register(`geolocation`,$(Nn),{namespace:`field`}),d.ComponentRegistry.register(`signature`,$(In),{namespace:`field`}),d.ComponentRegistry.register(`qrcode`,$(zn),{namespace:`field`})}yi(),exports.AddressField=An,exports.AutoNumberField=zt,exports.AvatarField=Dn,exports.BooleanCellRenderer=kr,exports.BooleanField=D,exports.CheckboxesField=Jn,exports.CodeField=wn,exports.ColorField=hn,exports.ColorSwatchCellRenderer=ii,exports.CurrencyCellRenderer=Tr,exports.CurrencyField=K,exports.DISCRETE_EDIT_TYPES=tr,exports.DateCellRenderer=Ar,exports.DateField=P,exports.DateTimeCellRenderer=jr,exports.DateTimeField=ct,exports.EmailCellRenderer=Wr,exports.EmailField=re,exports.FORM_FIELD_TYPES=gi,exports.FieldEditWidget=ir,exports.FileCellRenderer=qr,exports.FileField=bt,exports.FormulaCellRenderer=Xr,exports.FormulaField=Nt,exports.GeolocationField=Nn,exports.GridField=cn,exports.HtmlCellRenderer=ci,exports.INLINE_EXCLUDED_FIELD_TYPES=er,exports.ImageCellRenderer=Jr,exports.ImageCropperDialog=Ct,exports.ImageField=Et,exports.JsonCellRenderer=ri,exports.LineItemsField=fn,exports.LocationCellRenderer=li,exports.LocationField=At,exports.LookupCellRenderer=Yr,exports.LookupField=tt,exports.MarkdownCellRenderer=oi,exports.MasterDetailField=ar,exports.MultiSelectField=Hn,exports.NumberCellRenderer=wr,exports.NumberField=T,exports.ObjectField=Kt,exports.PasswordField=_t,exports.PercentCellRenderer=Dr,exports.PercentField=mt,exports.PhoneCellRenderer=Kr,exports.PhoneField=R,exports.QRCodeField=zn,exports.RadioField=Gn,exports.RatingField=xn,exports.RecordPickerDialog=pe,exports.RichTextField=se,exports.SelectCellRenderer=Ur,exports.SelectField=j,exports.SignatureField=In,exports.SliderField=vn,exports.SummaryField=It,exports.TagsField=Zn,exports.TextAreaField=oe,exports.TextCellRenderer=Cr,exports.TextField=S,exports.TimeField=dt,exports.UrlCellRenderer=Gr,exports.UrlField=V,exports.UserCellRenderer=Zr,exports.UserField=Ut,exports.VectorField=Yt,exports.buildValidationRules=pi,exports.coerceToSafeValue=mr,exports.computeRow=rn,exports.evalArith=tn,exports.evaluateCondition=mi,exports.formatCompactCurrency=gr,exports.formatCurrency=hr,exports.formatDate=xr,exports.formatDateTime=Sr,exports.formatFileSize=fi,exports.formatNumber=_r,exports.formatPercent=vr,exports.formatRelativeDate=br,exports.getBadgeColorClasses=zr,exports.getCellRenderer=ui,exports.getSemanticColorName=Br,exports.getSemanticHex=Hr,exports.hasFieldEditWidget=nr,exports.humanizeLabel=yr,exports.isLikelyOpaqueId=dr,exports.lookupAutofillPatch=nn,exports.lookupFiltersToRecord=de,exports.mapFieldTypeToFormType=di,exports.registerAllFields=yi,exports.registerField=vi,exports.registerFieldRenderer=$r,exports.registerFields=bi,exports.resolveCellRendererType=ni,Object.defineProperty(exports,"resolveFieldCurrency",{enumerable:!0,get:function(){return f.resolveFieldCurrency}}),exports.sumColumn=sn;
|
|
9
|
+
`){n++;continue}if(r>=`0`&&r<=`9`||r===`.`){let r=n+1;for(;r<e.length&&(e[r]>=`0`&&e[r]<=`9`||e[r]===`.`);)r++;t.push({t:`num`,v:e.slice(n,r)}),n=r;continue}if(/[a-zA-Z_]/.test(r)){let r=n+1;for(;r<e.length&&/[a-zA-Z0-9_.]/.test(e[r]);)r++;t.push({t:`id`,v:e.slice(n,r)}),n=r;continue}if(r===`+`||r===`-`||r===`*`||r===`/`||r===`%`){t.push({t:`op`,v:r}),n++;continue}if(r===`(`){t.push({t:`lp`,v:r}),n++;continue}if(r===`)`){t.push({t:`rp`,v:r}),n++;continue}return null}return t}function en(e,t){let n=e.startsWith(`record.`)?e.slice(7):e,r=t?.[n];if(r==null||r===``)return null;let i=Number(r);return Number.isFinite(i)?i:null}function tn(e,t){let n=$t(e);if(!n||n.length===0)return null;let r=0,i=!1,a=()=>n[r],o=()=>n[r++];function s(){let e=a();if(!e)return i=!0,NaN;if(e.t===`op`&&e.v===`-`)return o(),-s();if(e.t===`op`&&e.v===`+`)return o(),s();if(e.t===`num`)return o(),Number(e.v);if(e.t===`id`){o();let n=en(e.v,t);return n===null?(i=!0,NaN):n}if(e.t===`lp`){o();let e=l(),t=o();return(!t||t.t!==`rp`)&&(i=!0),e}return i=!0,NaN}function c(){let e=s();for(;a()&&a().t===`op`&&(a().v===`*`||a().v===`/`||a().v===`%`);){let t=o().v,n=s();e=t===`*`?e*n:t===`/`?e/n:e%n}return e}function l(){let e=c();for(;a()&&a().t===`op`&&(a().v===`+`||a().v===`-`);){let t=o().v,n=c();e=t===`+`?e+n:e-n}return e}let u=l();return i||r!==n.length||!Number.isFinite(u)?null:u}function nn(e,t,n){let r={[t.field]:n?.value??n?.id??n?._id};if(t.autofill!==!1&&n&&typeof n==`object`)for(let i of e){if(i.field===t.field||i.computed||i.type===`lookup`)continue;let e=n[i.field];e!=null&&e!==``&&(r[i.field]=e)}return r}function rn(e,t){let n=e.filter(e=>e.computed&&e.expr);if(n.length===0)return t;let r={...t};for(let e of n){let t=tn(e.expr,r);if(t===null){r[e.field]=null;continue}let n=e.scale??(e.type===`currency`?2:void 0);r[e.field]=n==null?t:Number(t.toFixed(n))}return r}function an(e,t){if(t==null||t===``)return`—`;if(e.type===`select`&&Array.isArray(e.options)){let n=e.options.find(e=>String(e.value)===String(t));return n?n.label:String(t)}if(ln(e.type)){let n=Number(t);if(Number.isFinite(n))return e.type===`currency`?`${e.prefix||`¥`}${n.toLocaleString()}`:n.toLocaleString()}return Array.isArray(t)?t.join(`, `):String(t)}function on(e,t){if(ln(e)){if(t===``||t==null)return null;let e=Number(t);return Number.isNaN(e)?t:e}return t}function sn(e,t){return Array.isArray(e)?e.reduce((e,n)=>{let r=Number(n?.[t]);return e+(Number.isFinite(r)?r:0)},0):0}function cn({value:e,onChange:t,field:n,readonly:r,disabled:i,className:a,onRowExpand:o,displayMode:s,onAdd:c,...l}){let f=n||l.schema||{},h=f.columns||[],_=Array.isArray(e)?e:[],v=l.contextRecord,y=(0,u.useCallback)((e,t)=>{if(!e.readonlyWhen&&!e.requiredWhen)return{readonly:!1,required:!!e.required};let n=(0,d.resolveFieldRuleState)({readonlyWhen:e.readonlyWhen,requiredWhen:e.requiredWhen},t||{},{required:!!e.required,readonly:!1},void 0,v?{parent:v}:void 0);return{readonly:n.readonly,required:n.required}},[v]),b=s===`list`&&!r,[x,S]=u.default.useState(()=>new Set),C=h.filter(e=>e.defaultHidden&&!e.required),w=h.filter(e=>!e.defaultHidden||e.required||x.has(e.field)),T=(0,u.useCallback)(e=>{S(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),E=f.allow_add!==!1&&!r&&!i,ee=f.allow_delete!==!1&&!r&&!i,D=f.allow_duplicate!==!1&&E,O=typeof o==`function`&&!r,k=f.show_line_numbers!==!1,te=f.min_rows??0,A=f.max_rows,ne=f.total_field||f.amount_field||f.amountField,j=f.sort_field,M=f.reorderable!==!1&&!r&&!i,N=(0,u.useCallback)(e=>{t?.(j?e.map((e,t)=>({...e,[j]:t})):e)},[t,j]),P=(0,u.useCallback)(()=>{let e={};for(let t of w)e[t.field]=null;return e},[w]),F=(0,u.useCallback)((e,t)=>{if(e>=_.length){if(A!=null&&_.length>=A)return;N([..._,rn(w,{...P(),...t})]);return}N(_.map((n,r)=>r===e?rn(w,{...n,...t}):n))},[_,w,A,P,N]),I=(0,u.useCallback)((e,t,n)=>F(e,{[t]:n}),[F]),re=(0,u.useCallback)((e,t,n)=>{F(e,nn(w,t,n))},[w,F]),L=(0,u.useCallback)((e,t,n)=>I(e,t,n),[I]),ie=(0,u.useCallback)((e,t,n)=>{I(e,t.field,on(t.type,n))},[I]),R=(0,u.useCallback)(()=>{A!=null&&_.length>=A||N([..._,P()])},[_,P,A,N]),z=(0,u.useRef)(null),B=(0,u.useCallback)((e,t)=>{let n=z.current?.querySelector(`[data-cell="${e}-${t}"]`);n&&(n.focus(),n instanceof HTMLInputElement&&n.select())},[]),V=(0,u.useCallback)((e,t,n)=>{e.key===`ArrowDown`||e.key===`Enter`?(e.preventDefault(),B(t+1,n)):e.key===`ArrowUp`&&(e.preventDefault(),t>0&&B(t-1,n))},[B]),H=(0,u.useCallback)(e=>{_.length<=te||N(_.filter((t,n)=>n!==e))},[_,te,N]),U=(0,u.useCallback)(e=>{if(A!=null&&_.length>=A)return;let t=_[e];if(!t)return;let{id:n,_id:r,recordId:i,...a}=t,o=[..._];o.splice(e+1,0,{...a}),N(o)},[_,A,N]),W=(0,u.useCallback)((e,t)=>{if(e===t||e<0||t<0||e>=_.length||t>=_.length)return;let n=[..._],[r]=n.splice(e,1);n.splice(t,0,r),N(n)},[_,N]),G=(0,u.useRef)(null),K=O||ee||D,ae=(+!!O+ +!!D+ +!!ee)*34+12,q=!!ne,oe=q?sn(_,ne):0,J=q?Math.max(0,w.findIndex(e=>e.field===ne)):-1,Y=C.length>0?(0,g.jsxs)(p.Popover,{children:[(0,g.jsx)(p.PopoverTrigger,{asChild:!0,children:(0,g.jsxs)(p.Button,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 gap-1.5 text-xs text-muted-foreground`,"data-testid":`line-items-columns`,children:[(0,g.jsx)(m.SlidersHorizontal,{className:`h-3.5 w-3.5`}),`Columns`,x.size>0&&(0,g.jsxs)(`span`,{className:`rounded-full bg-primary/10 px-1.5 text-[10px] font-medium text-primary`,children:[`+`,x.size]})]})}),(0,g.jsxs)(p.PopoverContent,{align:`end`,className:`w-56 p-2`,children:[(0,g.jsx)(`div`,{className:`px-1 pb-1.5 text-xs font-medium text-muted-foreground`,children:`Optional columns`}),(0,g.jsx)(`div`,{className:`max-h-64 space-y-0.5 overflow-y-auto`,children:C.map(e=>{let t=`col-toggle-${e.field}`;return(0,g.jsxs)(p.Label,{htmlFor:t,className:`flex cursor-pointer items-center gap-2 rounded-md px-1.5 py-1.5 text-sm font-normal hover:bg-muted`,children:[(0,g.jsx)(p.Checkbox,{id:t,checked:x.has(e.field),onCheckedChange:()=>T(e.field)}),(0,g.jsx)(`span`,{className:`truncate`,children:e.label||e.field})]},e.field)})})]})]}):null;if(r)return(0,g.jsxs)(`div`,{className:(0,p.cn)(`space-y-2`,a),children:[Y&&(0,g.jsx)(`div`,{className:`flex justify-end`,children:Y}),(0,g.jsx)(`div`,{className:`border border-border rounded-lg overflow-x-auto`,"data-testid":`line-items-readonly`,children:(0,g.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,g.jsx)(`thead`,{className:`bg-muted border-b border-border`,children:(0,g.jsxs)(`tr`,{children:[k&&(0,g.jsx)(`th`,{className:`w-10 px-2 py-2 text-right text-xs font-medium text-muted-foreground`,children:`#`}),w.map(e=>(0,g.jsx)(`th`,{style:{minWidth:dn(e)},className:(0,p.cn)(`px-3 py-2 text-xs font-medium text-muted-foreground whitespace-nowrap`,ln(e.type)?`text-right`:`text-left`),children:e.label||e.field},e.field))]})}),(0,g.jsx)(`tbody`,{className:`divide-y divide-border`,children:_.length===0?(0,g.jsx)(`tr`,{children:(0,g.jsx)(`td`,{colSpan:Math.max(w.length+ +!!k,1),className:`px-3 py-6 text-center text-muted-foreground`,children:`No items`})}):_.map((e,t)=>(0,g.jsxs)(`tr`,{children:[k&&(0,g.jsx)(`td`,{className:`px-2 py-2 text-right text-muted-foreground tabular-nums`,children:t+1}),w.map(t=>(0,g.jsx)(`td`,{className:(0,p.cn)(`px-3 py-2 text-foreground`,ln(t.type)&&`text-right tabular-nums`),children:t.type===`lookup`&&e[t.field]!=null&&e[t.field]!==``?(0,g.jsx)(tt,{value:e[t.field],onChange:()=>{},readonly:!0,field:{reference:t.reference,display_field:t.displayField,id_field:t.idField}}):e[t.field]!=null&&e[t.field]!==``?String(e[t.field]):`—`},t.field))]},t))}),q&&(0,g.jsx)(`tfoot`,{className:`border-t border-border bg-muted/40`,children:(0,g.jsxs)(`tr`,{children:[(0,g.jsx)(`td`,{colSpan:Math.max(+!!k+J,1),className:`px-3 py-2 text-right text-xs font-medium text-muted-foreground`,children:`Total`}),(0,g.jsx)(`td`,{className:`px-3 py-2 text-right font-semibold text-foreground tabular-nums`,children:oe.toLocaleString()}),w.length-J-1>0&&(0,g.jsx)(`td`,{colSpan:w.length-J-1})]})})]})})]});let se=!b&&E&&(A==null||_.length<A),X=se?[..._,P()]:_,ce=(e,t,n,r)=>{let a=r?.[e.field],o=i||y(e,r).readonly;return b?e.type===`lookup`&&a!=null&&a!==``?(0,g.jsx)(tt,{value:a,onChange:()=>{},readonly:!0,field:{reference:e.reference,display_field:e.displayField,id_field:e.idField}}):(0,g.jsx)(`span`,{className:(0,p.cn)(`px-2 text-sm text-foreground`,ln(e.type)&&`tabular-nums`,(a==null||a===``)&&`text-muted-foreground`),children:an(e,a)}):e.computed?(0,g.jsx)(`span`,{className:(0,p.cn)(`block px-2 text-sm tabular-nums`,ln(e.type)?`text-right`:`text-left`,a==null||a===``?`text-muted-foreground`:`text-foreground`),title:`Computed`,"data-computed":e.field,children:an(e,a)}):e.type===`lookup`?(0,g.jsx)(tt,{value:a,onChange:t=>L(n,e.field,t),onSelectRecord:t=>re(n,e,t),compact:!0,field:{reference:e.reference,display_field:e.displayField,id_field:e.idField,multiple:e.multiple,options:e.options,placeholder:`—`},disabled:o}):e.type===`select`?(0,g.jsxs)(p.Select,{value:a==null?``:String(a),onValueChange:t=>ie(n,e,t),disabled:o,children:[(0,g.jsx)(p.SelectTrigger,{className:`h-8 rounded-none border-0 bg-transparent px-2 shadow-none focus:ring-1 focus:ring-ring/60`,"aria-label":e.label||e.field,children:(0,g.jsx)(p.SelectValue,{placeholder:`—`})}),(0,g.jsx)(p.SelectContent,{children:(e.options||[]).map(e=>(0,g.jsx)(p.SelectItem,{value:e.value,children:e.label},e.value))})]}):(0,g.jsxs)(`div`,{className:`relative`,children:[e.type===`currency`&&(0,g.jsx)(`span`,{className:`pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground`,children:e.prefix||`¥`}),(0,g.jsx)(p.Input,{"data-cell":`${n}-${t}`,onKeyDown:e=>V(e,n,t),className:(0,p.cn)(`h-8 rounded-none border-0 bg-transparent px-2 shadow-none focus-visible:ring-1 focus-visible:ring-ring/60`,e.type===`currency`&&`pl-6`,ln(e.type)&&`text-right tabular-nums`),type:e.type===`date`?`date`:ln(e.type)?`number`:`text`,step:ln(e.type)?e.step??`any`:void 0,"aria-label":e.label||e.field,value:a==null?``:String(a),onChange:t=>ie(n,e,t.target.value),disabled:o})]})};return(0,g.jsxs)(`div`,{className:(0,p.cn)(`space-y-2`,a),"data-testid":`line-items`,children:[Y&&(0,g.jsx)(`div`,{className:`flex justify-end`,children:Y}),(0,g.jsx)(`div`,{className:`border border-border rounded-lg overflow-x-auto`,children:(0,g.jsxs)(`table`,{ref:z,className:`w-full text-sm`,children:[(0,g.jsx)(`thead`,{className:`bg-muted/60 border-b border-border`,children:(0,g.jsxs)(`tr`,{children:[k&&(0,g.jsx)(`th`,{className:(0,p.cn)(`px-2 py-2 text-right text-xs font-medium text-muted-foreground`,M?`w-14`:`w-10`),children:`#`}),w.map(e=>(0,g.jsxs)(`th`,{className:(0,p.cn)(`px-2 py-2 text-xs font-medium text-muted-foreground whitespace-nowrap`,ln(e.type)?`text-right`:`text-left`),style:Qt(e),children:[e.label||e.field,e.required&&!e.computed&&(0,g.jsx)(`span`,{className:`text-destructive`,children:` *`})]},e.field)),K&&(0,g.jsx)(`th`,{style:{width:ae}})]})}),(0,g.jsx)(`tbody`,{className:`divide-y divide-border`,children:b&&_.length===0?(0,g.jsx)(`tr`,{children:(0,g.jsxs)(`td`,{colSpan:w.length+ +!!K+ +!!k,className:`px-3 py-6 text-center text-muted-foreground`,children:[`No items yet — click “`,f.add_label||`Add`,`” to begin.`]})}):X.map((e,t)=>{let n=se&&t===_.length,r=M&&!n&&!b;return(0,g.jsxs)(`tr`,{className:(0,p.cn)(`group`,!n&&`hover:bg-muted/30`),...M&&!n?{onDragOver:e=>{G.current!=null&&e.preventDefault()},onDrop:e=>{e.preventDefault(),G.current!=null&&(W(G.current,t),G.current=null)}}:{},children:[k&&(0,g.jsx)(`td`,{className:`px-1 py-1 text-right align-middle text-xs text-muted-foreground tabular-nums`,children:(0,g.jsxs)(`span`,{className:`inline-flex items-center justify-end gap-0.5`,children:[r&&(0,g.jsx)(`span`,{draggable:!0,onDragStart:()=>{G.current=t},onDragEnd:()=>{G.current=null},className:`cursor-grab text-muted-foreground/40 opacity-0 transition-opacity group-hover:opacity-100`,title:`Drag to reorder`,"aria-label":`Drag to reorder`,"data-testid":`line-items-drag-${t}`,children:(0,g.jsx)(m.GripVertical,{className:`h-3.5 w-3.5`})}),(0,g.jsx)(`span`,{className:(0,p.cn)(n&&`opacity-30`),children:t+1})]})}),w.map((r,i)=>{let a=y(r,e).required,o=!n&&!b&&a&&!r.computed&&(e[r.field]==null||e[r.field]===``);return(0,g.jsx)(`td`,{"aria-invalid":o||void 0,title:o?`${r.label||r.field} is required`:void 0,"data-testid":o?`line-items-invalid-${t}-${r.field}`:void 0,className:(0,p.cn)(`border-r border-border/40 px-1 py-0.5 align-middle last:border-r-0`,b&&`px-2 py-1.5`,o&&`bg-destructive/5 ring-1 ring-inset ring-destructive/50`),children:ce(r,i,t,e)},r.field)}),K&&(0,g.jsx)(`td`,{className:`px-1 py-0.5 align-middle whitespace-nowrap`,children:(0,g.jsxs)(`div`,{className:`flex items-center justify-center gap-0.5`,children:[!n&&O&&(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`icon`,className:`h-8 w-8 text-muted-foreground hover:text-foreground`,"aria-label":`Open row`,title:`Open full form`,"data-testid":`line-items-expand-${t}`,onClick:()=>o(t),children:(0,g.jsx)(m.Maximize2,{className:`h-3.5 w-3.5`})}),!n&&D&&(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`icon`,className:`h-8 w-8 text-muted-foreground hover:text-foreground`,"aria-label":`Duplicate row`,title:`Duplicate line`,"data-testid":`line-items-duplicate-${t}`,onClick:()=>U(t),disabled:i||A!=null&&_.length>=A,children:(0,g.jsx)(m.Copy,{className:`h-3.5 w-3.5`})}),!n&&ee&&(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`icon`,className:`h-8 w-8 text-muted-foreground hover:text-destructive`,"aria-label":`Remove row`,"data-testid":`line-items-remove-${t}`,onClick:()=>H(t),disabled:i||_.length<=te,children:(0,g.jsx)(m.Trash2,{className:`h-4 w-4`})})]})})]},t)})}),q&&(0,g.jsx)(`tfoot`,{className:`border-t border-border bg-muted/40`,children:(0,g.jsxs)(`tr`,{children:[(0,g.jsx)(`td`,{colSpan:Math.max(+!!k+J,1),className:`px-3 py-2 text-right text-xs font-medium text-muted-foreground`,children:`Total`}),(0,g.jsx)(`td`,{className:`px-3 py-2 text-right font-semibold text-foreground tabular-nums`,"data-testid":`line-items-total`,children:oe.toLocaleString()}),w.length-J-1+ +!!K>0&&(0,g.jsx)(`td`,{colSpan:w.length-J-1+ +!!K})]})})]})}),E&&(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:b&&c?c:R,disabled:A!=null&&_.length>=A,"data-testid":`line-items-add`,children:[(0,g.jsx)(m.Plus,{className:`mr-1.5 h-4 w-4`}),f.add_label||`Add line`]})]})}var ln,un,dn,fn,pn=o((()=>{ot(),ln=e=>e===`number`||e===`currency`,un={text:160,select:132,lookup:168,number:104,currency:116,date:150},dn=e=>e.width??un[e.type??`text`]??132,fn=cn})),mn=s({ColorField:()=>hn});function hn({value:e,onChange:t,field:n,readonly:r,...i}){let a=n||i.schema;return r?(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`div`,{className:`w-6 h-6 rounded border border-input`,style:{backgroundColor:e||`#000000`}}),(0,g.jsx)(`span`,{className:`text-sm`,children:e||(0,g.jsx)(p.EmptyValue,{})})]}):(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`input`,{type:`color`,value:e||`#000000`,onChange:e=>t(e.target.value),disabled:r||i.disabled,className:`w-10 h-10 rounded border border-input cursor-pointer`}),(0,g.jsx)(p.Input,{type:`text`,value:e||``,onChange:e=>t(e.target.value),placeholder:a?.placeholder||`#000000`,disabled:r||i.disabled,className:i.className,pattern:`^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$`})]})}var gn=o((()=>{})),_n=s({SliderField:()=>vn});function vn({value:e,onChange:t,field:n,readonly:r,...i}){let a=n||i.schema,o=a?.min??0,s=a?.max??100,c=a?.step??1;return r?(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`span`,{className:`text-sm font-medium`,children:e??o}),(0,g.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`/ `,s]})]}):(0,g.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,g.jsx)(p.Slider,{value:[e??o],onValueChange:e=>t(e[0]),min:o,max:s,step:c,disabled:r||i.disabled,className:i.className}),(0,g.jsx)(`span`,{className:`text-sm font-medium w-12 text-right`,children:e??o})]})}var yn=o((()=>{})),bn=s({RatingField:()=>xn});function xn({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=(n||a.schema)?.max??5,s=e??0,[c,l]=u.default.useState(null),d=c===null?s:c;return r?(0,g.jsxs)(`div`,{className:(0,p.cn)(`flex items-center gap-1`,i),children:[Array.from({length:o},(e,t)=>(0,g.jsx)(m.Star,{className:`w-5 h-5 ${t<s?`fill-yellow-400 text-yellow-400`:`text-muted-foreground`}`},t)),(0,g.jsxs)(`span`,{className:`ml-2 text-sm text-muted-foreground`,children:[s,` / `,o]})]}):(0,g.jsxs)(`div`,{className:(0,p.cn)(`flex items-center gap-1`,i),children:[Array.from({length:o},(e,n)=>(0,g.jsx)(`button`,{type:`button`,onClick:()=>t(n+1),onMouseEnter:()=>l(n+1),onMouseLeave:()=>l(null),className:`focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 rounded`,disabled:r||a.disabled,children:(0,g.jsx)(m.Star,{className:`w-5 h-5 transition-colors ${n<d?`fill-yellow-400 text-yellow-400 hover:fill-yellow-500 hover:text-yellow-500`:`text-muted-foreground hover:text-yellow-400`}`})},n)),(0,g.jsxs)(`span`,{className:`ml-2 text-sm text-muted-foreground`,children:[s,` / `,o]})]})}var Sn=o((()=>{})),Cn=s({CodeField:()=>wn});function wn({value:e,onChange:t,field:n,readonly:r,...i}){let a=n||i.schema,o=a?.language??`javascript`;return r?(0,g.jsx)(`pre`,{className:(0,p.cn)(`text-sm bg-muted p-2 rounded overflow-x-auto border`,i.className),children:(0,g.jsx)(`code`,{children:e||(0,g.jsx)(p.EmptyValue,{})})}):(0,g.jsx)(p.Textarea,{value:e||``,onChange:e=>t(e.target.value),placeholder:a?.placeholder||`// Write ${o} code here...`,disabled:r||i.disabled,className:(0,p.cn)(`font-mono text-sm`,i.className),rows:12,spellCheck:!1})}var Tn=o((()=>{})),En=s({AvatarField:()=>Dn});function Dn({value:e,onChange:t,field:n,readonly:r,...i}){let[a,o]=u.default.useState(!1),s=u.default.useRef(null),c=n||i.schema,l=e=>{let n=e.target.files?.[0];if(!n)return;if(!n.type.startsWith(`image/`)){console.error(`Please select an image file`);return}if(n.size>5*1024*1024){console.error(`File size must be less than 5MB`);return}let r=new FileReader;r.onloadend=()=>{t(r.result)},r.readAsDataURL(n)},d=()=>{t(``)},f=()=>(c?.defaultName||c?.label||`User`).split(` `).map(e=>e[0]).join(``).toUpperCase().slice(0,2);return r?(0,g.jsxs)(p.Avatar,{className:`w-16 h-16`,children:[e&&(0,g.jsx)(p.AvatarImage,{src:e,alt:c?.label}),(0,g.jsx)(p.AvatarFallback,{children:f()})]}):(0,g.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,g.jsxs)(`div`,{className:`relative`,onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),children:[(0,g.jsxs)(p.Avatar,{className:`w-16 h-16`,children:[e&&(0,g.jsx)(p.AvatarImage,{src:e,alt:c?.label}),(0,g.jsx)(p.AvatarFallback,{children:f()})]}),!r&&a&&e&&(0,g.jsx)(`button`,{type:`button`,onClick:d,className:`absolute -top-1 -right-1 bg-destructive text-destructive-foreground rounded-full p-1 hover:bg-destructive/90`,children:(0,g.jsx)(m.X,{className:`w-3 h-3`})})]}),(0,g.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,g.jsx)(`input`,{ref:s,type:`file`,accept:`image/*`,onChange:l,className:`hidden`}),(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>s.current?.click(),disabled:r||i.disabled,children:[(0,g.jsx)(m.Upload,{className:`w-4 h-4 mr-2`}),e?`Change`:`Upload`,` Avatar`]}),(0,g.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`PNG, JPG up to 5MB`})]})]})}var On=o((()=>{})),kn=s({AddressField:()=>An});function An({value:e,onChange:t,field:n,readonly:r,...i}){let a=e||{},o=(e,n)=>{t({...a,[e]:n})},s=e=>[e.street,e.city,[e.state,e.zipCode].filter(Boolean).join(` `),e.country].filter(Boolean).join(`, `);if(r){let e=s(a);return e?(0,g.jsx)(`span`,{className:`text-sm`,children:e}):(0,g.jsx)(p.EmptyValue,{})}return(0,g.jsxs)(`div`,{className:`space-y-3`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`street`,className:`text-xs`,children:`Street Address`}),(0,g.jsx)(p.Input,{id:`street`,type:`text`,value:a.street||``,onChange:e=>o(`street`,e.target.value),placeholder:`123 Main St`,disabled:r||i.disabled,className:i.className})]}),(0,g.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`city`,className:`text-xs`,children:`City`}),(0,g.jsx)(p.Input,{id:`city`,type:`text`,value:a.city||``,onChange:e=>o(`city`,e.target.value),placeholder:`San Francisco`,disabled:r||i.disabled})]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`state`,className:`text-xs`,children:`State / Province`}),(0,g.jsx)(p.Input,{id:`state`,type:`text`,value:a.state||``,onChange:e=>o(`state`,e.target.value),placeholder:`CA`,disabled:r||i.disabled})]})]}),(0,g.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`zipCode`,className:`text-xs`,children:`ZIP / Postal Code`}),(0,g.jsx)(p.Input,{id:`zipCode`,type:`text`,value:a.zipCode||``,onChange:e=>o(`zipCode`,e.target.value),placeholder:`94102`,disabled:r||i.disabled})]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`country`,className:`text-xs`,children:`Country`}),(0,g.jsx)(p.Input,{id:`country`,type:`text`,value:a.country||``,onChange:e=>o(`country`,e.target.value),placeholder:`United States`,disabled:r||i.disabled})]})]})]})}var jn=o((()=>{})),Mn=s({GeolocationField:()=>Nn});function Nn({value:e,onChange:t,field:n,readonly:r,...i}){let[a,o]=u.default.useState(!1),s=e||{},c=(e,n)=>{t({...s,[e]:n?Number(n):void 0})},l=()=>{if(!navigator.geolocation){console.error(`Geolocation is not supported by this browser`);return}o(!0),navigator.geolocation.getCurrentPosition(e=>{t({latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy}),o(!1)},e=>{console.error(`Error getting location:`,e.message),o(!1)},{enableHighAccuracy:!0,timeout:5e3,maximumAge:0})},d=e=>!e.latitude||!e.longitude?``:`${e.latitude.toFixed(6)}, ${e.longitude.toFixed(6)}`,f=()=>{if(!s.latitude||!s.longitude)return;let e=`https://www.google.com/maps?q=${s.latitude},${s.longitude}`;window.open(e,`_blank`)};if(r){let e=d(s);return(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(m.MapPin,{className:`w-4 h-4 text-muted-foreground`}),e?(0,g.jsx)(`span`,{className:`text-sm`,children:e}):(0,g.jsx)(p.EmptyValue,{}),s.latitude&&s.longitude&&(0,g.jsx)(p.Button,{type:`button`,variant:`link`,size:`sm`,onClick:f,className:`p-0 h-auto`,children:`View on map`})]})}return(0,g.jsxs)(`div`,{className:`space-y-3`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:l,disabled:r||a,children:[(0,g.jsx)(m.Crosshair,{className:`w-4 h-4 mr-2`}),a?`Getting location...`:`Use Current Location`]}),s.latitude&&s.longitude&&(0,g.jsxs)(p.Button,{type:`button`,variant:`link`,size:`sm`,onClick:f,children:[(0,g.jsx)(m.MapPin,{className:`w-4 h-4 mr-2`}),`View on map`]})]}),(0,g.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`latitude`,className:`text-xs`,children:`Latitude`}),(0,g.jsx)(p.Input,{id:`latitude`,type:`number`,value:s.latitude??``,onChange:e=>c(`latitude`,e.target.value),placeholder:`37.7749`,disabled:r||i.disabled,step:`any`,className:i.className})]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Label,{htmlFor:`longitude`,className:`text-xs`,children:`Longitude`}),(0,g.jsx)(p.Input,{id:`longitude`,type:`number`,value:s.longitude??``,onChange:e=>c(`longitude`,e.target.value),placeholder:`-122.4194`,disabled:r||i.disabled,step:`any`})]})]}),s.accuracy&&(0,g.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Accuracy: ±`,s.accuracy.toFixed(0),`m`]})]})}var Pn=o((()=>{})),Fn=s({SignatureField:()=>In});function In({value:e,onChange:t,readonly:n}){let r=(0,u.useRef)(null),[i,a]=u.default.useState(!1),[o,s]=u.default.useState(!e);(0,u.useEffect)(()=>{if(e&&r.current){let t=r.current.getContext(`2d`);if(t){let n=new Image;n.onload=()=>{t.drawImage(n,0,0),s(!1)},n.src=e}}},[e]);let c=e=>{if(n)return;a(!0),s(!1);let t=r.current;if(!t)return;let i=t.getContext(`2d`);if(!i)return;let o=t.getBoundingClientRect(),c=`touches`in e?e.touches[0].clientX-o.left:e.clientX-o.left,l=`touches`in e?e.touches[0].clientY-o.top:e.clientY-o.top;i.beginPath(),i.moveTo(c,l)},l=e=>{if(!i||n)return;let t=r.current;if(!t)return;let a=t.getContext(`2d`);if(!a)return;let o=t.getBoundingClientRect(),s=`touches`in e?e.touches[0].clientX-o.left:e.clientX-o.left,c=`touches`in e?e.touches[0].clientY-o.top:e.clientY-o.top;a.lineTo(s,c),a.strokeStyle=`#000`,a.lineWidth=2,a.lineCap=`round`,a.lineJoin=`round`,a.stroke()},d=()=>{if(!i)return;a(!1);let e=r.current;e&&t(e.toDataURL(`image/png`))};return n&&e?(0,g.jsx)(`div`,{className:`border rounded p-2 bg-white`,children:(0,g.jsx)(`img`,{src:e,alt:`Signature`,loading:`lazy`,className:`max-w-full h-auto`})}):n&&!e?(0,g.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:`No signature`}):(0,g.jsxs)(`div`,{className:`space-y-2`,children:[(0,g.jsx)(`div`,{className:`border rounded bg-white`,children:(0,g.jsx)(`canvas`,{ref:r,width:400,height:200,className:`w-full touch-none cursor-crosshair`,onMouseDown:c,onMouseMove:l,onMouseUp:d,onMouseLeave:d,onTouchStart:c,onTouchMove:l,onTouchEnd:d})}),(0,g.jsxs)(`div`,{className:`flex justify-between items-center`,children:[(0,g.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:o?`Sign above`:`Signature captured`}),(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{let e=r.current;if(!e)return;let n=e.getContext(`2d`);n&&(n.clearRect(0,0,e.width,e.height),s(!0),t(``))},disabled:n||o,children:[(0,g.jsx)(m.Eraser,{className:`w-4 h-4 mr-2`}),`Clear`]})]})]})}var Ln=o((()=>{})),Rn=s({QRCodeField:()=>zn});function zn({value:e,onChange:t,field:n,readonly:r,...i}){let[a,o]=u.default.useState(!1),s=n||i.schema;return r?(0,g.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,g.jsx)(`span`,{className:`text-sm flex-1 truncate`,children:e||(0,g.jsx)(p.EmptyValue,{})}),e&&(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>o(!a),children:[(0,g.jsx)(m.QrCode,{className:`w-4 h-4 mr-2`}),a?`Hide`:`Show`,` QR`]})]}):(0,g.jsxs)(`div`,{className:`space-y-3`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(p.Input,{type:`text`,value:e||``,onChange:e=>t(e.target.value),placeholder:s?.placeholder||`Enter text for QR code`,disabled:r||i.disabled,className:i.className}),e&&(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{e&&navigator.clipboard.writeText(e)},children:(0,g.jsx)(m.Copy,{className:`w-4 h-4`})}),(0,g.jsx)(p.Button,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>o(!a),children:(0,g.jsx)(m.QrCode,{className:`w-4 h-4`})})]})]}),a&&e&&(0,g.jsx)(`div`,{className:`border rounded p-4 bg-white flex justify-center`,children:(0,g.jsx)(`img`,{src:(e=>`https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(e)}`)(e),alt:`QR Code`,className:`w-48 h-48`})}),e&&(0,g.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`QR code contains: `,e.length,` characters`]})]})}var Bn=o((()=>{})),Vn=s({MultiSelectField:()=>Hn});function Hn({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=(n||a.schema)?.options||[],s=Array.isArray(e)?e:e==null?[]:[e];if(r)return s.length===0?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:s.map(e=>(0,g.jsx)(p.Badge,{variant:`outline`,children:o.find(t=>t.value===e)?.label||e},e))});let c=e=>{t(s.includes(e)?s.filter(t=>t!==e):[...s,e])};return(0,g.jsx)(`div`,{className:(0,p.cn)(`flex flex-wrap gap-1.5`,i),children:o.map(e=>{let t=s.includes(e.value);return(0,g.jsx)(`button`,{type:`button`,onClick:()=>c(e.value),disabled:a.disabled,"aria-pressed":t,className:(0,p.cn)(`rounded-full border px-3 py-1 text-sm transition-colors`,t?`border-primary bg-primary text-primary-foreground`:`border-input bg-background text-foreground hover:bg-accent`),children:e.label},e.value)})})}var Un=o((()=>{})),Wn=s({RadioField:()=>Gn});function Gn({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=(n||a.schema)?.options||[],s=(0,u.useId)();return r?e==null||e===``?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`span`,{className:`text-sm`,children:o.find(t=>t.value===e)?.label||String(e)}):(0,g.jsx)(p.RadioGroup,{value:e??``,onValueChange:t,disabled:a.disabled,className:i,children:o.map(e=>{let t=`${s}-${e.value}`;return(0,g.jsxs)(`div`,{className:`flex items-center space-x-2`,children:[(0,g.jsx)(p.RadioGroupItem,{value:e.value,id:t}),(0,g.jsx)(p.Label,{htmlFor:t,className:`font-normal`,children:e.label})]},e.value)})})}var Kn=o((()=>{})),qn=s({CheckboxesField:()=>Jn});function Jn({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=(n||a.schema)?.options||[],s=Array.isArray(e)?e:e==null?[]:[e],c=(0,u.useId)();if(r)return s.length===0?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:s.map(e=>(0,g.jsx)(p.Badge,{variant:`outline`,children:o.find(t=>t.value===e)?.label||e},e))});let l=(e,n)=>{t(n?[...s.filter(t=>t!==e),e]:s.filter(t=>t!==e))};return(0,g.jsx)(`div`,{className:i,children:o.map(e=>{let t=`${c}-${e.value}`;return(0,g.jsxs)(`div`,{className:`flex items-center space-x-2 py-0.5`,children:[(0,g.jsx)(p.Checkbox,{id:t,checked:s.includes(e.value),onCheckedChange:t=>l(e.value,!!t),disabled:a.disabled}),(0,g.jsx)(p.Label,{htmlFor:t,className:`font-normal`,children:e.label})]},e.value)})})}var Yn=o((()=>{})),Xn=s({TagsField:()=>Zn});function Zn({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=Array.isArray(e)?e:e==null?[]:[e],[s,c]=u.default.useState(``);if(r)return o.length===0?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:o.map(e=>(0,g.jsx)(p.Badge,{variant:`secondary`,children:e},e))});let l=e=>{let n=e.trim();!n||o.includes(n)||(t([...o,n]),c(``))},d=e=>t(o.filter(t=>t!==e));return(0,g.jsxs)(`div`,{className:(0,p.cn)(`flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-background p-1.5`,i),children:[o.map(e=>(0,g.jsxs)(p.Badge,{variant:`secondary`,className:`gap-1`,children:[e,(0,g.jsx)(`button`,{type:`button`,onClick:()=>d(e),className:`ml-0.5 rounded-full text-muted-foreground hover:text-foreground`,"aria-label":`Remove ${e}`,children:`×`})]},e)),(0,g.jsx)(p.Input,{value:s,onChange:e=>c(e.target.value),onKeyDown:e=>{e.key===`Enter`||e.key===`,`?(e.preventDefault(),l(s)):e.key===`Backspace`&&s===``&&o.length>0&&d(o[o.length-1])},onBlur:()=>l(s),disabled:a.disabled,placeholder:o.length===0?`输入后回车添加…`:``,className:`h-7 flex-1 border-0 bg-transparent p-0 px-1 shadow-none focus-visible:ring-0 min-w-[8ch]`})]})}var Qn=o((()=>{}));X(),vt(),xt(),Ot(),Pt(),Lt(),Bt(),qt(),Xt(),pn(),On(),Ln(),C(),J(),E(),ae(),ht(),yn(),Sn(),O(),M(),Un(),Kn(),Yn(),Qn(),F(),lt(),ft(),L(),z(),H(),ot(),Wt(),gn(),jn(),jt(),Pn(),Tn(),Bn();var $n={text:S,textarea:oe,number:T,currency:K,percent:mt,slider:vn,progress:vn,rating:xn,boolean:D,toggle:D,select:j,status:j,multiselect:Hn,radio:Gn,checkboxes:Jn,tags:Zn,date:P,datetime:ct,time:dt,email:re,phone:R,url:V,lookup:tt,master_detail:tt,user:Ut,owner:Ut,color:hn,address:An,location:At,geolocation:Nn,code:wn,qrcode:zn},er=new Set([`formula`,`summary`,`auto_number`,`file`,`image`,`avatar`,`signature`,`markdown`,`html`,`richtext`,`password`,`object`,`grid`,`vector`]),tr=new Set([`boolean`,`toggle`,`select`,`status`,`radio`,`rating`]);function nr(e){return!!e&&e in $n}var rr=new Set([`lookup`,`master_detail`,`user`,`owner`]);function ir({field:e,value:t,onChange:n,readonly:r}){let i=e?.type?$n[e.type]:void 0;return i?(0,g.jsx)(i,{field:e,value:t,onChange:n,readonly:r,...e?.type&&rr.has(e.type)?{compact:!0}:{}}):null}wt();function ar({value:e,onChange:t,field:n,readonly:r,className:i,...a}){let o=e||[],s=n||a.schema,c=()=>{let e={id:`new-${Date.now()}`,label:`New Related Record`};t([...o,e])},l=e=>{t(o.filter(t=>t.id!==e))},u=e=>{console.log(`View detail:`,e)};return r?(0,g.jsxs)(`div`,{className:(0,p.cn)(`space-y-2`,i),children:[o.length===0?(0,g.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:`No related records`}):o.map(e=>(0,g.jsxs)(`div`,{className:`flex items-center justify-between p-2 border rounded hover:bg-muted/50`,children:[(0,g.jsx)(`span`,{className:`text-sm`,children:e.label}),(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>u(e),children:(0,g.jsx)(m.ExternalLink,{className:`w-4 h-4`})})]},e.id)),(0,g.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[o.length,` `,o.length===1?`record`:`records`]})]}):(0,g.jsxs)(`div`,{className:(0,p.cn)(`space-y-3`,i),children:[(0,g.jsxs)(`div`,{className:`space-y-2`,children:[o.map(e=>(0,g.jsxs)(`div`,{className:`flex items-center justify-between gap-2 p-2 border rounded hover:bg-muted/50`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2 flex-1`,children:[(0,g.jsx)(p.Badge,{variant:`outline`,children:e.id}),(0,g.jsx)(`span`,{className:`text-sm flex-1`,children:e.label})]}),(0,g.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>u(e),children:(0,g.jsx)(m.ExternalLink,{className:`w-4 h-4`})}),(0,g.jsx)(p.Button,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>l(e.id),disabled:a.disabled,children:(0,g.jsx)(m.X,{className:`w-4 h-4`})})]})]},e.id)),o.length===0&&(0,g.jsx)(`div`,{className:`text-sm text-muted-foreground text-center py-4 border border-dashed rounded bg-muted/20`,children:`No related records`})]}),(0,g.jsxs)(p.Button,{type:`button`,variant:`outline`,className:`w-full`,onClick:c,disabled:a.disabled,children:[(0,g.jsx)(m.Plus,{className:`w-4 h-4 mr-2`}),`Add `,s?.label||`Record`]})]})}var or=s({default:()=>sr});function sr({value:e}){return(0,g.jsx)(`div`,{className:`prose prose-sm max-w-none dark:prose-invert break-words`,children:(0,g.jsx)(v.default,{remarkPlugins:[y.default],rehypePlugins:[b.default],children:e})})}var cr=o((()=>{}));C(),E(),O(),M(),F(),L(),z(),H(),ae(),J(),ot(),lt(),ft(),ht(),jt(),Wt(),gn(),yn(),Sn(),Tn(),jn(),Pn(),Bn(),U(),Je(),C(),E(),O(),M(),F(),lt(),ft(),L(),z(),H(),ae(),ht(),vt(),J(),X(),ot(),_e(),xt(),Ot(),jt(),Pt(),Lt(),Bt(),Wt(),qt(),Xt(),pn(),gn(),yn(),Sn(),Tn(),On(),jn(),Pn(),Ln(),Bn(),Un(),Kn(),Yn(),Qn();var lr=new Map;function ur(e,t){if(!e||typeof e!=`object`)return;if(t){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim();if(typeof n==`number`)return String(n)}for(let t of[`name`,`full_name`,`display_name`,`label`,`title`,`subject`,`username`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim();if(typeof n==`number`)return String(n)}let n=e.first_name,r=e.last_name,i=[e.salutation,n,r].filter(e=>typeof e==`string`&&e.trim()).map(e=>e.trim()).join(` `);if(i)return i;let a=e.email;if(typeof a==`string`&&a.trim())return a.trim();let o=new Set([`id`,`_id`,`organization_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`tenant_id`]),s=[`_name`,`_title`,`_number`,`_code`,`_label`];for(let[t,n]of Object.entries(e))if(!o.has(t)&&!t.endsWith(`_id`)&&s.some(e=>t.endsWith(e))){if(typeof n==`string`&&n.trim())return n.trim();if(typeof n==`number`)return String(n)}}function dr(e){if(typeof e!=`string`||!/^[A-Za-z0-9_-]{12,32}$/.test(e))return!1;let t=/[A-Z]/.test(e),n=/[a-z]/.test(e),r=/[0-9_-]/.test(e);return t&&n||t&&r||n&&r}function fr(e,t){let n=u.default.useContext(h.SchemaRendererContext)?.dataSource,[,r]=u.default.useState(0),i=!!e&&!!n&&typeof n.find==`function`&&(typeof t==`string`||typeof t==`number`)&&t!==``,a=i?`${e}:${String(t)}`:``;if(u.default.useEffect(()=>{if(!i)return;let o=lr.get(a);if(o&&o.state!==`pending`&&o.promise==null||o?.state===`pending`)return;let s=(async()=>{try{let r;if(typeof n.findOne==`function`)r=await n.findOne(e,t);else{let i=await n.find(e,{$filter:{id:t},options:{$top:1}});r=(Array.isArray(i)?i:i?.value||i?.data||[])[0]}let i=ur(r);lr.set(a,{state:`ok`,name:i})}catch{lr.set(a,{state:`err`})}r(e=>e+1)})();lr.set(a,{state:`pending`,promise:s})},[a,i,e,t,n]),!i)return;let o=lr.get(a);return o?.state===`ok`?o.name:void 0}function pr(){try{let{t:e}=(0,h.useObjectTranslation)();return(t,n)=>{let r=e(t);return!r||r===t?n:r}}catch{return(e,t)=>t}}function mr(e){if(e==null||typeof e==`number`||typeof e==`boolean`)return e;if(typeof e==`string`){let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`))try{return mr(JSON.parse(t))}catch{}return e}if(e instanceof Date)return e.toISOString();if(Array.isArray(e))return e.map(e=>{if(typeof e==`object`&&e){let t=e;return String(t.name||t.label||t.externalId||t.id||t._id||`[Object]`)}return String(e)}).join(`, `);if(typeof e==`object`){let t=e;return`$numberDecimal`in t?Number(t.$numberDecimal):`$oid`in t?String(t.$oid):`$date`in t?String(t.$date):String(t.name||t.label||t.externalId||t.id||t._id||`[Object]`)}return String(e)}function hr(e,t){let n=Number.isFinite(e)&&e===Math.trunc(e)?0:2;if(!t)return _r(e,n);try{return new Intl.NumberFormat(`en-US`,{style:`currency`,currency:t,minimumFractionDigits:0,maximumFractionDigits:n}).format(e)}catch{return`${t} ${e.toFixed(n)}`}}function gr(e,t){if(!t)try{return new Intl.NumberFormat(`en-US`,{notation:`compact`,maximumFractionDigits:1}).format(e).replace(/\.0(?=[KMBT])/,``)}catch{return String(e)}try{return new Intl.NumberFormat(`en-US`,{style:`currency`,currency:t,notation:`compact`,maximumFractionDigits:1}).format(e).replace(/\.0(?=[KMBT])/,``)}catch{return`${t} ${e}`}}function _r(e,t=2){try{return new Intl.NumberFormat(`en-US`,{minimumFractionDigits:t,maximumFractionDigits:t}).format(e)}catch{return e.toFixed(t)}}function vr(e,t=0){return`${(0,d.percentDisplayValue)(e).toFixed(t)}%`}function yr(e){return e.replace(/[_-]/g,` `).replace(/\b\w/g,e=>e.toUpperCase())}function br(e,t){if(e==null||e===``)return`—`;let n=e instanceof Date?e:new Date(e);if(!(n instanceof Date)||isNaN(n.getTime()))return`—`;let r=new Date,i=new Date(r.getFullYear(),r.getMonth(),r.getDate()),a=new Date(n.getFullYear(),n.getMonth(),n.getDate()).getTime()-i.getTime(),o=Math.round(a/(1e3*60*60*24));if(o===0)return`Today`;if(o===1)return`Tomorrow`;if(o===-1)return`Yesterday`;if(o<-1){let e=Math.abs(o);return e<=7?t?.dueLike?`Overdue ${e}d`:`${e}d ago`:xr(n)}return o>1&&o<=7?`In ${o} days`:xr(n)}function xr(e,t,n){if(e==null||e===``)return`—`;let r=e instanceof Date?e:new Date(e);if(!(r instanceof Date)||isNaN(r.getTime()))return`—`;if(t===`short`)return`${r.toLocaleDateString(`en-US`,{month:`short`})} ${r.getDate()}, '${String(r.getFullYear()).slice(-2)}`;if(t===`relative`)return br(r,n);let i=r.getFullYear()===new Date().getFullYear();return r.toLocaleDateString(void 0,{year:i?void 0:`numeric`,month:`short`,day:`numeric`})}function Sr(e){if(e==null||e===``)return`—`;let t=e instanceof Date?e:new Date(e);return!(t instanceof Date)||isNaN(t.getTime())?`—`:t.toLocaleDateString(void 0,{year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}function Cr({value:e}){let t=mr(e);return t==null||t===``?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`span`,{className:`truncate`,children:String(t)})}function wr({value:e,field:t}){if(e==null)return(0,g.jsx)(p.EmptyValue,{});let n=mr(e),r=t,i=typeof r.scale==`number`?r.scale:void 0,a=Number(n);return(0,g.jsx)(`span`,{className:`tabular-nums`,children:isNaN(a)?String(n):new Intl.NumberFormat(`en-US`,{minimumFractionDigits:i??0,maximumFractionDigits:i??20}).format(a)})}function Tr({value:e,field:t}){if(e==null)return(0,g.jsx)(p.EmptyValue,{});let n=mr(e),{currency:r}=(0,f.useLocalization)(),i=(0,f.resolveFieldCurrency)(t,r),a=Number(n);return(0,g.jsx)(`span`,{className:`tabular-nums font-medium whitespace-nowrap`,children:isNaN(a)?String(n):hr(a,i)})}var Er=/progress|completion/;function Dr({value:e,field:t}){if(e==null)return(0,g.jsx)(p.EmptyValue,{});let n=mr(e),r=t.precision??0,i=Number(n);if(isNaN(i))return(0,g.jsx)(`span`,{className:`tabular-nums whitespace-nowrap`,children:String(n)});let a=Er.test(t?.name?.toLowerCase()||``),o=a?i:i>-1&&i<1?i*100:i,s=a?`${i.toFixed(r)}%`:vr(i,r),c=Math.max(0,Math.min(100,o));return(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`div`,{className:`h-1.5 w-16 rounded-full bg-muted ring-1 ring-inset ring-border/60 overflow-hidden shrink-0`,role:`progressbar`,"aria-valuenow":c,"aria-valuemin":0,"aria-valuemax":100,children:(0,g.jsx)(`div`,{className:`h-full rounded-full bg-primary transition-all`,style:{width:`${c}%`}})}),(0,g.jsx)(`span`,{className:`tabular-nums whitespace-nowrap`,children:s})]})}var Or=new Set([`active`,`is_active`,`enabled`,`is_enabled`,`verified`,`is_verified`]);function kr({value:e,field:t}){if(e==null)return(0,g.jsx)(`span`,{className:`flex items-center justify-center`,children:(0,g.jsx)(p.EmptyValue,{})});let n=t?.name?.toLowerCase()||``;return n===`completed`||n===`is_completed`||n===`done`||n===`is_done`?(0,g.jsx)(`div`,{className:`flex items-center justify-center`,children:e?(0,g.jsx)(`div`,{className:`size-5 rounded-full bg-green-500 flex items-center justify-center`,role:`img`,"aria-label":`Completed`,"data-testid":`completion-indicator`,children:(0,g.jsx)(m.Check,{className:`size-3 text-white`})}):(0,g.jsx)(`div`,{className:`size-5 rounded-full border-2 border-muted-foreground/30`,role:`img`,"aria-label":`Not completed`,"data-testid":`completion-indicator`})}):Or.has(n)&&!e?(0,g.jsxs)(p.Badge,{variant:`destructive`,className:`text-xs`,"data-testid":`boolean-warning-badge`,children:[t?.label||yr(n),` — Off`]}):(0,g.jsx)(`div`,{className:`flex items-center justify-start`,children:(0,g.jsx)(p.Checkbox,{checked:!!e,disabled:!0,className:`pointer-events-none`})})}function Ar({value:e,field:t}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let n=mr(e),r=t,i=r.format||`relative`,a=String(r?.name||r?.accessorKey||r?.key||``).toLowerCase(),o=r?.dueLike===!0||/(^|_)(due|deadline|expires?|expiry|expiration|expected_close|target_close|sla|return_by|renewal|next_action)(_|$)/.test(a),s=xr(n,i,{dueLike:o}),c=n==null?null:new Date(n),l=c!==null&&!isNaN(c.getTime()),u=new Date;u.setHours(0,0,0,0);let d=o&&l&&c<u,f=l?c.toISOString():String(n);return(0,g.jsx)(`span`,{className:`tabular-nums${d?` text-red-600`:``}`,title:f,children:s})}function jr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let t=mr(e),n=t==null?null:new Date(t);if(n===null||isNaN(n.getTime()))return(0,g.jsx)(p.EmptyValue,{});let r=n.toLocaleDateString(void 0,{month:`numeric`,day:`numeric`,year:`numeric`}),i=n.toLocaleTimeString(void 0,{hour:`numeric`,minute:`2-digit`,hour12:!0}).toLowerCase();return(0,g.jsxs)(`span`,{className:`tabular-nums text-sm whitespace-nowrap`,children:[(0,g.jsx)(`span`,{children:r}),(0,g.jsx)(`span`,{className:`ml-2 text-muted-foreground`,children:i})]})}var Mr={critical:`red`,urgent:`red`,high:`orange`,medium:`yellow`,normal:`blue`,low:`gray`,none:`gray`,paid:`green`,completed:`green`,done:`green`,active:`green`,approved:`green`,resolved:`green`,pending:`yellow`,waiting:`yellow`,on_hold:`yellow`,shipped:`blue`,in_progress:`blue`,open:`blue`,processing:`blue`,draft:`gray`,new:`gray`,inactive:`gray`,closed:`gray`,cancelled:`red`,canceled:`red`,rejected:`red`,failed:`red`,overdue:`red`,delivered:`purple`,archived:`indigo`,contacted:`blue`,qualified:`purple`,converted:`green`,won:`green`,lost:`red`,紧急:`red`,严重:`red`,高:`orange`,中:`yellow`,普通:`blue`,低:`gray`,无:`gray`,新建:`gray`,草稿:`gray`,待处理:`yellow`,待审核:`yellow`,待联系:`yellow`,挂起:`yellow`,进行中:`blue`,处理中:`blue`,已联系:`blue`,跟进中:`blue`,已发货:`blue`,打开:`blue`,已确认:`green`,已审核:`green`,已通过:`green`,已完成:`green`,已支付:`green`,已签收:`green`,已转化:`green`,成单:`green`,赢得:`green`,已签约:`green`,已交付:`purple`,已归档:`indigo`,已关闭:`gray`,已取消:`red`,已拒绝:`red`,失败:`red`,逾期:`red`,流失:`red`,丢失:`red`},Nr={gray:`bg-gray-50 text-gray-700 border-gray-200 dark:bg-gray-800/50 dark:text-gray-200 dark:border-gray-700/60`,red:`bg-red-50 text-red-700 border-red-200 dark:bg-red-950/40 dark:text-red-300 dark:border-red-900/60`,orange:`bg-orange-50 text-orange-700 border-orange-200 dark:bg-orange-950/40 dark:text-orange-300 dark:border-orange-900/60`,yellow:`bg-yellow-50 text-yellow-800 border-yellow-200 dark:bg-yellow-950/40 dark:text-yellow-300 dark:border-yellow-900/60`,green:`bg-green-50 text-green-700 border-green-200 dark:bg-green-950/40 dark:text-green-300 dark:border-green-900/60`,blue:`bg-blue-50 text-blue-700 border-blue-200 dark:bg-blue-950/40 dark:text-blue-300 dark:border-blue-900/60`,indigo:`bg-indigo-50 text-indigo-700 border-indigo-200 dark:bg-indigo-950/40 dark:text-indigo-300 dark:border-indigo-900/60`,purple:`bg-purple-50 text-purple-700 border-purple-200 dark:bg-purple-950/40 dark:text-purple-300 dark:border-purple-900/60`,pink:`bg-pink-50 text-pink-700 border-pink-200 dark:bg-pink-950/40 dark:text-pink-300 dark:border-pink-900/60`},Pr={gray:`bg-gray-400 dark:bg-gray-500`,red:`bg-red-500`,orange:`bg-orange-500`,yellow:`bg-yellow-500`,green:`bg-green-500`,blue:`bg-blue-500`,indigo:`bg-indigo-500`,purple:`bg-purple-500`,pink:`bg-pink-500`},Fr=[`blue`,`green`,`purple`,`orange`,`pink`,`indigo`,`yellow`,`red`];function Ir(e){let t=5381;for(let n=0;n<e.length;n++)t=(t<<5)+t^e.charCodeAt(n);return Fr[Math.abs(t)%Fr.length]}function Lr(e){let t=/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(e.trim());if(!t)return;let n=t[1];n.length===3&&(n=n.split(``).map(e=>e+e).join(``));let r=parseInt(n.slice(0,2),16)/255,i=parseInt(n.slice(2,4),16)/255,a=parseInt(n.slice(4,6),16)/255,o=Math.max(r,i,a),s=Math.min(r,i,a),c=o-s,l=(o+s)/2;if((c===0?0:c/(1-Math.abs(2*l-1)))<.22)return`gray`;let u;return u=o===r?((i-a)/c%6+6)%6:o===i?(a-r)/c+2:(r-i)/c+4,u*=60,u>=345||u<15?`red`:u<30?`orange`:u<60?`yellow`:u<170?`green`:u<238?`blue`:u<250?`indigo`:u<295?`purple`:`pink`}function Rr(e){if(e){if(Nr[e])return e;if(e.charAt(0)===`#`)return Lr(e)}}function zr(e,t){let n=Rr(e);if(n&&Nr[n])return Nr[n];if(t==null||t===``)return`bg-muted text-muted-foreground border-border`;let r=String(t).toLowerCase().replace(/[\s-]/g,`_`),i=Mr[r];return i&&Nr[i]?Nr[i]:Nr[Ir(r)]}function Br(e,t){let n=Rr(e);if(n&&Nr[n])return n;if(t==null||t===``)return;let r=String(t).toLowerCase().replace(/[\s-]/g,`_`);return Mr[r]||Ir(r)}var Vr={gray:`#6b7280`,red:`#ef4444`,orange:`#f97316`,yellow:`#eab308`,green:`#22c55e`,blue:`#3b82f6`,indigo:`#6366f1`,purple:`#a855f7`,pink:`#ec4899`};function Hr(e,t=`#3b82f6`){return e?Vr[e]??t:t}function Ur({value:e,field:t}){let n=t,r=n.options||[],i=n.appearance===`dot`?`dot`:`badge`;if(e==null||e===``)return(0,g.jsx)(p.EmptyValue,{});let a=e=>{let t=r.find(t=>t.value===e);if(t)return t;let n=String(e).toLowerCase();return r.find(e=>String(e.value).toLowerCase()===n)},o=(e,t)=>{let n=a(e),r=n?.label||yr(String(e));return i===`dot`?(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 text-sm`,children:[(0,g.jsx)(`span`,{className:(0,p.cn)(`h-1.5 w-1.5 rounded-full shrink-0`,Pr[Rr(n?.color)||Mr[String(e).toLowerCase().replace(/[\s-]/g,`_`)]||Ir(String(e).toLowerCase().replace(/[\s-]/g,`_`))]||Pr.gray),"aria-hidden":`true`}),(0,g.jsx)(`span`,{className:`truncate`,children:r})]},t):(0,g.jsx)(p.Badge,{variant:`outline`,className:zr(n?.color,e),children:r},t)};return Array.isArray(e)?(0,g.jsx)(`div`,{className:(0,p.cn)(`flex flex-wrap`,i===`dot`?`gap-x-3 gap-y-1`:`gap-1`),children:e.map((e,t)=>o(e,t))}):o(e)}function Wr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let t=pr(),n=String(mr(e)??``),[r,i]=u.default.useState(!1);return(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1 group/email`,children:[(0,g.jsx)(p.Button,{variant:`link`,className:`p-0 h-auto font-normal text-blue-600 hover:text-blue-800`,asChild:!0,children:(0,g.jsx)(`a`,{href:`mailto:${n}`,onClick:e=>e.stopPropagation(),children:n})}),(0,g.jsx)(`button`,{type:`button`,className:`opacity-0 group-hover/email:opacity-100 transition-opacity p-0.5 rounded hover:bg-muted`,onClick:e=>{e.stopPropagation(),e.preventDefault(),navigator.clipboard.writeText(n).then(()=>{i(!0),setTimeout(()=>i(!1),2e3)}).catch(()=>{})},"aria-label":t(`detail.copyEmail`,`Copy email`),children:r?(0,g.jsx)(m.Check,{className:`h-3 w-3 text-green-600`}):(0,g.jsx)(m.Copy,{className:`h-3 w-3 text-muted-foreground`})})]})}function Gr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let t=String(mr(e)??``);return(0,g.jsx)(p.Button,{variant:`link`,className:`p-0 h-auto font-normal text-blue-600 hover:text-blue-800`,asChild:!0,children:(0,g.jsx)(`a`,{href:t,target:`_blank`,rel:`noopener noreferrer`,onClick:e=>e.stopPropagation(),children:t})})}function Kr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let t=pr(),n=String(mr(e)??``),[r,i]=u.default.useState(!1);return(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1 group/phone`,children:[(0,g.jsxs)(`a`,{href:`tel:${n}`,className:`inline-flex items-center gap-1 text-blue-600 hover:text-blue-800`,onClick:e=>e.stopPropagation(),children:[(0,g.jsx)(m.Phone,{className:`h-3 w-3`}),n]}),(0,g.jsx)(`button`,{type:`button`,className:`opacity-0 group-hover/phone:opacity-100 transition-opacity p-0.5 rounded hover:bg-muted`,onClick:e=>{e.stopPropagation(),e.preventDefault(),navigator.clipboard.writeText(n).then(()=>{i(!0),setTimeout(()=>i(!1),2e3)}).catch(()=>{})},"aria-label":t(`detail.copyPhone`,`Copy phone number`),children:r?(0,g.jsx)(m.Check,{className:`h-3 w-3 text-green-600`}):(0,g.jsx)(m.Copy,{className:`h-3 w-3 text-muted-foreground`})})]})}function qr({value:e,field:t}){if(!e)return(0,g.jsx)(p.EmptyValue,{});if(t.multiple,Array.isArray(e)){let t=e.length;return(0,g.jsxs)(`span`,{className:`text-sm text-gray-600`,children:[t,` `,t===1?`file`:`files`]})}return(0,g.jsx)(`span`,{className:`text-sm truncate`,children:e.name||e.original_name||`File`})}function Jr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});let t=e=>typeof e==`string`?e:e?.url||e?.src||e?.href||e?.thumbnailUrl||``,n=(e,t)=>e&&typeof e==`object`&&(e.name||e.original_name)||t;if(Array.isArray(e)){let r=e.map(e=>({url:t(e),name:n(e,`Image`)})).filter(e=>e.url);return r.length===0?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsxs)(`div`,{className:`flex -space-x-2`,children:[r.slice(0,3).map((e,t)=>(0,g.jsx)(`img`,{src:e.url,alt:e.name||`Image ${t+1}`,className:`size-8 rounded-md border-2 border-white object-cover`},t)),r.length>3&&(0,g.jsxs)(`div`,{className:`size-8 rounded-md border-2 border-white bg-gray-100 flex items-center justify-center text-xs font-medium text-gray-600`,children:[`+`,r.length-3]})]})}let r=t(e);return r?(0,g.jsx)(`img`,{src:r,alt:n(e,`Image`),className:`size-10 rounded-md object-cover`}):(0,g.jsx)(p.EmptyValue,{})}function Yr({value:e,field:t}){let n=t.reference_to||t.reference,r=(()=>{if(Array.isArray(e))return e.find(e=>e!=null&&(typeof e==`string`||typeof e==`number`)&&e!==``);if(e!=null&&e!==``&&(typeof e==`string`||typeof e==`number`)&&typeof e!=`object`)return e})(),i=fr(n,r);if(e==null||e===``)return(0,g.jsx)(p.EmptyValue,{});if(typeof e==`string`){let t=e.trim();if(t.startsWith(`{`)&&t.endsWith(`}`))try{let e=JSON.parse(t);if(e&&typeof e==`object`){let t=ur(e)||String(e.externalId??e.id??e._id??``);if(t)return(0,g.jsx)(`span`,{className:`truncate`,children:t})}}catch{}}if(!Array.isArray(e)&&typeof e==`object`){let t=e,n=ur(t)||String(t.id||t._id||``);if(n)return(0,g.jsx)(`span`,{className:`truncate`,children:n})}let a=t.options||[],o=e=>{if(a.length>0){let t=a.find(t=>String(t.value)===String(e));if(t)return{text:t.label,muted:!1}}return e===r&&i?{text:i,muted:!1}:dr(e)?{text:`—`,muted:!0}:{text:String(e),muted:!1}};if(Array.isArray(e))return(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.map((e,t)=>{let n,r=!1;if(typeof e==`object`&&e)n=ur(e)||String(e.id||e._id||`[Object]`);else{let t=o(e);n=t.text,r=t.muted}return(0,g.jsx)(`span`,{className:(0,p.cn)(`inline-flex items-center px-2 py-0.5 rounded text-xs font-medium`,r?`bg-muted/40 text-muted-foreground`:`bg-gray-50 text-gray-700 dark:bg-gray-800/50 dark:text-gray-200`),children:n},t)})});if(typeof e==`object`&&e)return(0,g.jsx)(`span`,{className:`truncate`,children:ur(e)||String(e.id||e._id||`[Object]`)});let{text:s,muted:c}=o(e);return(0,g.jsx)(`span`,{className:(0,p.cn)(`truncate`,c&&`text-muted-foreground`),children:s})}function Xr({value:e}){let t=mr(e);return t==null||t===``?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`span`,{className:`text-gray-700 font-mono text-sm`,children:String(t)})}function Zr({value:e}){if(!e)return(0,g.jsx)(p.EmptyValue,{});if(typeof e!=`object`)return(0,g.jsx)(`span`,{className:`truncate`,children:String(e)});if(Array.isArray(e))return(0,g.jsxs)(`div`,{className:`flex -space-x-2`,children:[e.slice(0,3).map((e,t)=>{if(typeof e!=`object`||!e)return(0,g.jsx)(`span`,{className:`truncate text-sm`,children:String(e)},t);let n=e.name||e.username||`User`,r=n.split(` `).map(e=>e[0]).join(``).toUpperCase().slice(0,2);return(0,g.jsxs)(p.Avatar,{className:`size-8 border-2 border-white`,title:n,children:[e.image&&(0,g.jsx)(p.AvatarImage,{src:e.image,alt:n}),(0,g.jsx)(p.AvatarFallback,{className:`bg-blue-500 text-white text-xs`,children:r})]},t)}),e.length>3&&(0,g.jsx)(p.Avatar,{className:`size-8 border-2 border-white`,children:(0,g.jsxs)(p.AvatarFallback,{className:`bg-gray-200 text-gray-600 text-xs`,children:[`+`,e.length-3]})})]});let t=e.name||e.username||`User`,n=t.split(` `).map(e=>e[0]).join(``).toUpperCase().slice(0,2);return(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsxs)(p.Avatar,{className:`size-8`,children:[e.image&&(0,g.jsx)(p.AvatarImage,{src:e.image,alt:t}),(0,g.jsx)(p.AvatarFallback,{className:`bg-blue-500 text-white text-xs`,children:n})]}),(0,g.jsx)(`span`,{className:`truncate`,children:t})]})}var Qr=new Map;function $r(e,t){Qr.set(e,t)}var ei={phone:`phone`,tel:`phone`,telephone:`phone`,email:`email`,url:`url`,uri:`url`,link:`url`,currency:`currency`,money:`currency`,percent:`percent`,percentage:`percent`},ti=new Set([`text`,`textarea`,`string`,`longtext`,``]);function ni(e){if(!e)return`text`;if(typeof e==`string`)return e;let t=(e.type||``).toLowerCase(),n=e.format,r=typeof n==`string`?n.toLowerCase():``;return r&&ei[r]&&ti.has(t)?ei[r]:e.type||`text`}function ri({value:e}){if(e==null||e===``)return(0,g.jsx)(p.EmptyValue,{});let t;if(typeof e==`object`)try{t=JSON.stringify(e)}catch{t=String(e)}else t=String(e);return(0,g.jsx)(`span`,{className:`font-mono text-xs text-gray-600 truncate`,title:t,children:t})}function ii({value:e}){if(e==null||e===``)return(0,g.jsx)(p.EmptyValue,{});let t=String(e);return(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 text-sm`,children:[(0,g.jsx)(`span`,{className:`h-3.5 w-3.5 rounded border border-black/10 shrink-0`,style:{backgroundColor:t},"aria-hidden":`true`}),(0,g.jsx)(`span`,{className:`font-mono text-xs`,children:t})]})}var ai=u.default.lazy(()=>Promise.resolve().then(()=>(cr(),or)));function oi({value:e}){return e==null||e===``?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(u.default.Suspense,{fallback:(0,g.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:String(e).slice(0,80)}),children:(0,g.jsx)(ai,{value:String(e)})})}function si(e){return e.replace(/<\s*(script|style|iframe|object|embed)[^>]*>[\s\S]*?<\s*\/\s*\1\s*>/gi,``).replace(/\son\w+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi,``).replace(/(href|src)\s*=\s*("javascript:[^"]*"|'javascript:[^']*')/gi,`$1="#"`)}function ci({value:e}){return e==null||e===``?(0,g.jsx)(p.EmptyValue,{}):(0,g.jsx)(`div`,{className:`prose prose-sm max-w-none dark:prose-invert break-words`,dangerouslySetInnerHTML:{__html:si(String(e))}})}function li({value:e}){if(e==null||e===``)return(0,g.jsx)(p.EmptyValue,{});let t,n;if(typeof e==`object`&&!Array.isArray(e)){let r=e;t=typeof r.lat==`number`?r.lat:typeof r.latitude==`number`?r.latitude:void 0,n=typeof r.lng==`number`?r.lng:typeof r.lon==`number`?r.lon:typeof r.longitude==`number`?r.longitude:void 0}else if(Array.isArray(e)&&e.length===2)t=Number(e[0]),n=Number(e[1]);else if(typeof e==`string`){let r=e.split(`,`).map(e=>parseFloat(e.trim()));r.length===2&&!isNaN(r[0])&&!isNaN(r[1])&&([t,n]=r)}return typeof t==`number`&&typeof n==`number`&&!isNaN(t)&&!isNaN(n)?(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-sm tabular-nums`,children:[(0,g.jsx)(m.MapPin,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`,"aria-hidden":`true`}),t.toFixed(4),`, `,n.toFixed(4)]}):(0,g.jsx)(ri,{value:e,field:{}})}function ui(e){return Qr.has(e)?Qr.get(e):{text:Cr,textarea:Cr,markdown:oi,html:ci,richtext:oi,code:Cr,qrcode:Cr,number:wr,currency:Tr,percent:Dr,progress:Dr,slider:wr,rating:wr,boolean:kr,toggle:kr,date:Ar,datetime:jr,time:Cr,select:Ur,status:Ur,multiselect:Ur,radio:Ur,checkboxes:Ur,tags:Ur,lookup:Yr,master_detail:Yr,tree:Yr,email:Wr,url:Gr,phone:Kr,file:qr,video:qr,audio:qr,image:Jr,avatar:Jr,signature:Jr,formula:Xr,summary:Xr,auto_number:Cr,user:Zr,owner:Zr,password:()=>(0,g.jsx)(`span`,{children:`••••••`}),secret:()=>(0,g.jsx)(`span`,{children:`••••••`}),location:li,geolocation:li,address:ri,color:ii,json:ri,object:ri,composite:ri,record:ri,repeater:({value:e})=>{let t=Array.isArray(e)?e.length:0;return t>0?(0,g.jsxs)(`span`,{className:`text-gray-500 italic`,children:[t,` 项`]}):(0,g.jsx)(p.EmptyValue,{})},vector:()=>(0,g.jsx)(`span`,{className:`text-gray-500 italic`,children:`[Vector]`}),grid:()=>(0,g.jsx)(`span`,{className:`text-gray-500 italic`,children:`[Grid]`})}[e]||Cr}$r(`lookup`,Yr),$r(`master_detail`,Yr),$r(`select`,Ur),$r(`status`,Ur),$r(`user`,Zr),$r(`owner`,Zr),Ge(ui);function di(e){return{text:`field:text`,textarea:`field:textarea`,markdown:`field:markdown`,html:`field:html`,richtext:`field:richtext`,secret:`field:password`,number:`field:number`,currency:`field:currency`,percent:`field:percent`,slider:`field:slider`,progress:`field:slider`,rating:`field:rating`,date:`field:date`,datetime:`field:datetime`,time:`field:time`,boolean:`field:boolean`,toggle:`field:boolean`,select:`field:select`,multiselect:`field:multiselect`,radio:`field:radio`,checkboxes:`field:checkboxes`,tags:`field:tags`,lookup:`field:lookup`,master_detail:`field:master_detail`,tree:`field:lookup`,user:`field:user`,owner:`field:owner`,email:`field:email`,phone:`field:phone`,url:`field:url`,file:`field:file`,image:`field:image`,avatar:`field:avatar`,video:`field:file`,audio:`field:file`,signature:`field:signature`,password:`field:password`,location:`field:location`,geolocation:`field:geolocation`,address:`field:address`,color:`field:color`,code:`field:code`,json:`field:code`,qrcode:`field:qrcode`,vector:`field:vector`,object:`field:object`,composite:`field:object`,record:`field:object`,repeater:`field:grid`,formula:`field:formula`,summary:`field:summary`,auto_number:`field:auto_number`}[e]||`field:text`}function fi(e){if(e<0||!Number.isFinite(e)||e===0)return`0 B`;let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${n.toFixed(+(r>0))} ${t[r]}`}function pi(e){let t={};return e.required&&(t.required=typeof e.required_message==`string`?e.required_message:`${e.label||e.name} is required`),e.min_length&&(t.minLength={value:e.min_length,message:e.min_length_message||`Minimum length is ${e.min_length} characters`}),e.max_length&&(t.maxLength={value:e.max_length,message:e.max_length_message||`Maximum length is ${e.max_length} characters`}),e.min!==void 0&&(t.min={value:e.min,message:e.min_message||`Minimum value is ${e.min}`}),e.max!==void 0&&(t.max={value:e.max,message:e.max_message||`Maximum value is ${e.max}`}),e.pattern&&(t.pattern={value:typeof e.pattern==`string`?new RegExp(e.pattern):e.pattern,message:e.pattern_message||`Invalid format`}),e.type===`email`&&(t.pattern={value:/^[^\s@]+@[^\s@]+\.[^\s@]+$/,message:`Please enter a valid email address`}),e.type===`url`&&(t.pattern={value:/^https?:\/\/.+/,message:`Please enter a valid URL`}),e.validate&&(t.validate=e.validate),Object.keys(t).length>0?t:void 0}function mi(e,t){if(!e)return!0;if(e.field&&e.value!==void 0){let n=t[e.field];if(e.operator===`=`||e.operator===`==`)return n===e.value;if(e.operator===`!=`)return n!==e.value;if(e.operator===`>`)return n>e.value;if(e.operator===`>=`)return n>=e.value;if(e.operator===`<`)return n<e.value;if(e.operator===`<=`)return n<=e.value;if(e.operator===`in`)return Array.isArray(e.value)&&e.value.includes(n)}return e.and&&Array.isArray(e.and)?e.and.every(e=>mi(e,t)):e.or&&Array.isArray(e.or)?e.or.some(e=>mi(e,t)):!0}function $(e){let t=({schema:t,className:n,value:r,...i})=>{let[a,o]=u.default.useState(r??t?.value??``),s={name:t?.name||`field`,label:t?.label,type:t?.type,placeholder:t?.placeholder,required:t?.required,readonly:t?.readonly||t?.readOnly,help:t?.help,description:t?.description,defaultValue:t?.defaultValue||t?.value,...t},c=u.default.useCallback(e=>{o(e),i.onChange&&i.onChange(e)},[i]),l=t?.readonly||t?.readOnly||!1;return(0,g.jsxs)(`div`,{className:`grid w-full items-center gap-1.5`,"data-obj-id":t?.id,"data-obj-type":t?.type,children:[t?.label&&(0,g.jsx)(`label`,{htmlFor:t.id,className:t.required?`after:content-['*'] after:ml-0.5 after:text-red-500`:``,children:t.label}),(0,g.jsx)(e,{value:a,onChange:c,field:s,readonly:l,className:n}),t?.description&&(0,g.jsx)(`p`,{className:`text-sm text-gray-500`,children:t.description})]})};return t.displayName=`FieldRenderer(${e.displayName||e.name||`Component`})`,t}var hi={text:()=>Promise.resolve().then(()=>(C(),x)).then(e=>({default:e.TextField})),textarea:()=>Promise.resolve().then(()=>(J(),q)).then(e=>({default:e.TextAreaField})),number:()=>Promise.resolve().then(()=>(E(),w)).then(e=>({default:e.NumberField})),boolean:()=>Promise.resolve().then(()=>(O(),ee)).then(e=>({default:e.BooleanField})),select:()=>Promise.resolve().then(()=>(M(),ne)).then(e=>({default:e.SelectField})),date:()=>Promise.resolve().then(()=>(F(),N)).then(e=>({default:e.DateField})),datetime:()=>Promise.resolve().then(()=>(lt(),st)).then(e=>({default:e.DateTimeField})),time:()=>Promise.resolve().then(()=>(ft(),ut)).then(e=>({default:e.TimeField})),email:()=>Promise.resolve().then(()=>(L(),I)).then(e=>({default:e.EmailField})),phone:()=>Promise.resolve().then(()=>(z(),ie)).then(e=>({default:e.PhoneField})),url:()=>Promise.resolve().then(()=>(H(),B)).then(e=>({default:e.UrlField})),multiselect:()=>Promise.resolve().then(()=>(Un(),Vn)).then(e=>({default:e.MultiSelectField})),radio:()=>Promise.resolve().then(()=>(Kn(),Wn)).then(e=>({default:e.RadioField})),checkboxes:()=>Promise.resolve().then(()=>(Yn(),qn)).then(e=>({default:e.CheckboxesField})),tags:()=>Promise.resolve().then(()=>(Qn(),Xn)).then(e=>({default:e.TagsField})),currency:()=>Promise.resolve().then(()=>(ae(),W)).then(e=>({default:e.CurrencyField})),percent:()=>Promise.resolve().then(()=>(ht(),pt)).then(e=>({default:e.PercentField})),password:()=>Promise.resolve().then(()=>(vt(),gt)).then(e=>({default:e.PasswordField})),markdown:()=>Promise.resolve().then(()=>(X(),Y)).then(e=>({default:e.RichTextField})),html:()=>Promise.resolve().then(()=>(X(),Y)).then(e=>({default:e.RichTextField})),richtext:()=>Promise.resolve().then(()=>(X(),Y)).then(e=>({default:e.RichTextField})),lookup:()=>Promise.resolve().then(()=>(ot(),Ye)).then(e=>({default:e.LookupField})),master_detail:()=>Promise.resolve().then(()=>(ot(),Ye)).then(e=>({default:e.LookupField})),file:()=>Promise.resolve().then(()=>(xt(),yt)).then(e=>({default:e.FileField})),image:()=>Promise.resolve().then(()=>(Ot(),Tt)).then(e=>({default:e.ImageField})),location:()=>Promise.resolve().then(()=>(jt(),kt)).then(e=>({default:e.LocationField})),formula:()=>Promise.resolve().then(()=>(Pt(),Mt)).then(e=>({default:e.FormulaField})),summary:()=>Promise.resolve().then(()=>(Lt(),Ft)).then(e=>({default:e.SummaryField})),auto_number:()=>Promise.resolve().then(()=>(Bt(),Rt)).then(e=>({default:e.AutoNumberField})),user:()=>Promise.resolve().then(()=>(Wt(),Vt)).then(e=>({default:e.UserField})),owner:()=>Promise.resolve().then(()=>(Wt(),Vt)).then(e=>({default:e.UserField})),object:()=>Promise.resolve().then(()=>(qt(),Gt)).then(e=>({default:e.ObjectField})),vector:()=>Promise.resolve().then(()=>(Xt(),Jt)).then(e=>({default:e.VectorField})),grid:()=>Promise.resolve().then(()=>(pn(),Zt)).then(e=>({default:e.GridField})),color:()=>Promise.resolve().then(()=>(gn(),mn)).then(e=>({default:e.ColorField})),slider:()=>Promise.resolve().then(()=>(yn(),_n)).then(e=>({default:e.SliderField})),rating:()=>Promise.resolve().then(()=>(Sn(),bn)).then(e=>({default:e.RatingField})),code:()=>Promise.resolve().then(()=>(Tn(),Cn)).then(e=>({default:e.CodeField})),avatar:()=>Promise.resolve().then(()=>(On(),En)).then(e=>({default:e.AvatarField})),address:()=>Promise.resolve().then(()=>(jn(),kn)).then(e=>({default:e.AddressField})),geolocation:()=>Promise.resolve().then(()=>(Pn(),Mn)).then(e=>({default:e.GeolocationField})),signature:()=>Promise.resolve().then(()=>(Ln(),Fn)).then(e=>({default:e.SignatureField})),qrcode:()=>Promise.resolve().then(()=>(Bn(),Rn)).then(e=>({default:e.QRCodeField}))},gi=Object.freeze(Object.keys(hi)),_i=new Set([`text`,`html`,`image`,`avatar`,`grid`,`textarea`,`select`,`email`,`password`,`slider`,`markdown`,`time`,`address`]);function vi(e){let t=hi[e];if(!t){console.warn(`Unknown field type: ${e}`);return}let n=u.default.lazy(t);d.ComponentRegistry.register(e,n,{namespace:`field`,skipFallback:_i.has(e)})}function yi(){Object.keys(hi).forEach(e=>{vi(e)})}function bi(){d.ComponentRegistry.register(`text`,$(S),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`textarea`,$(oe),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`number`,$(T),{namespace:`field`}),d.ComponentRegistry.register(`boolean`,$(D),{namespace:`field`}),d.ComponentRegistry.register(`select`,$(j),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`date`,$(P),{namespace:`field`}),d.ComponentRegistry.register(`datetime`,$(ct),{namespace:`field`}),d.ComponentRegistry.register(`time`,$(dt),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`email`,$(re),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`phone`,$(R),{namespace:`field`}),d.ComponentRegistry.register(`url`,$(V),{namespace:`field`}),d.ComponentRegistry.register(`currency`,$(K),{namespace:`field`}),d.ComponentRegistry.register(`percent`,$(mt),{namespace:`field`}),d.ComponentRegistry.register(`password`,$(_t),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`markdown`,$(se),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`html`,$(se),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`lookup`,$(tt),{namespace:`field`}),d.ComponentRegistry.register(`master_detail`,$(tt),{namespace:`field`}),d.ComponentRegistry.register(`file`,$(bt),{namespace:`field`}),d.ComponentRegistry.register(`image`,$(Et),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`location`,$(At),{namespace:`field`}),d.ComponentRegistry.register(`formula`,$(Nt),{namespace:`field`}),d.ComponentRegistry.register(`summary`,$(It),{namespace:`field`}),d.ComponentRegistry.register(`auto_number`,$(zt),{namespace:`field`}),d.ComponentRegistry.register(`user`,$(Ut),{namespace:`field`}),d.ComponentRegistry.register(`owner`,$(Ut),{namespace:`field`}),d.ComponentRegistry.register(`object`,$(Kt),{namespace:`field`}),d.ComponentRegistry.register(`vector`,$(Yt),{namespace:`field`}),d.ComponentRegistry.register(`grid`,$(cn),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`color`,$(hn),{namespace:`field`}),d.ComponentRegistry.register(`slider`,$(vn),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`rating`,$(xn),{namespace:`field`}),d.ComponentRegistry.register(`code`,$(wn),{namespace:`field`}),d.ComponentRegistry.register(`avatar`,$(Dn),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`address`,$(An),{namespace:`field`,skipFallback:!0}),d.ComponentRegistry.register(`geolocation`,$(Nn),{namespace:`field`}),d.ComponentRegistry.register(`signature`,$(In),{namespace:`field`}),d.ComponentRegistry.register(`qrcode`,$(zn),{namespace:`field`})}yi(),exports.AddressField=An,exports.AutoNumberField=zt,exports.AvatarField=Dn,exports.BooleanCellRenderer=kr,exports.BooleanField=D,exports.CheckboxesField=Jn,exports.CodeField=wn,exports.ColorField=hn,exports.ColorSwatchCellRenderer=ii,exports.CurrencyCellRenderer=Tr,exports.CurrencyField=K,exports.DISCRETE_EDIT_TYPES=tr,exports.DateCellRenderer=Ar,exports.DateField=P,exports.DateTimeCellRenderer=jr,exports.DateTimeField=ct,exports.EmailCellRenderer=Wr,exports.EmailField=re,exports.FORM_FIELD_TYPES=gi,exports.FieldEditWidget=ir,exports.FileCellRenderer=qr,exports.FileField=bt,exports.FormulaCellRenderer=Xr,exports.FormulaField=Nt,exports.GeolocationField=Nn,exports.GridField=cn,exports.HtmlCellRenderer=ci,exports.INLINE_EXCLUDED_FIELD_TYPES=er,exports.ImageCellRenderer=Jr,exports.ImageCropperDialog=Ct,exports.ImageField=Et,exports.JsonCellRenderer=ri,exports.LineItemsField=fn,exports.LocationCellRenderer=li,exports.LocationField=At,exports.LookupCellRenderer=Yr,exports.LookupField=tt,exports.MarkdownCellRenderer=oi,exports.MasterDetailField=ar,exports.MultiSelectField=Hn,exports.NumberCellRenderer=wr,exports.NumberField=T,exports.ObjectField=Kt,exports.PasswordField=_t,exports.PercentCellRenderer=Dr,exports.PercentField=mt,exports.PhoneCellRenderer=Kr,exports.PhoneField=R,exports.QRCodeField=zn,exports.RadioField=Gn,exports.RatingField=xn,exports.RecordPickerDialog=pe,exports.RichTextField=se,exports.SelectCellRenderer=Ur,exports.SelectField=j,exports.SignatureField=In,exports.SliderField=vn,exports.SummaryField=It,exports.TagsField=Zn,exports.TextAreaField=oe,exports.TextCellRenderer=Cr,exports.TextField=S,exports.TimeField=dt,exports.UrlCellRenderer=Gr,exports.UrlField=V,exports.UserCellRenderer=Zr,exports.UserField=Ut,exports.VectorField=Yt,exports.buildValidationRules=pi,exports.coerceToSafeValue=mr,exports.computeRow=rn,exports.evalArith=tn,exports.evaluateCondition=mi,exports.formatCompactCurrency=gr,exports.formatCurrency=hr,exports.formatDate=xr,exports.formatDateTime=Sr,exports.formatFileSize=fi,exports.formatNumber=_r,exports.formatPercent=vr,exports.formatRelativeDate=br,exports.getBadgeColorClasses=zr,exports.getCellRenderer=ui,exports.getSemanticColorName=Br,exports.getSemanticHex=Hr,exports.hasFieldEditWidget=nr,exports.humanizeLabel=yr,exports.isLikelyOpaqueId=dr,exports.lookupAutofillPatch=nn,exports.lookupFiltersToRecord=de,exports.mapFieldTypeToFormType=di,exports.registerAllFields=yi,exports.registerField=vi,exports.registerFieldRenderer=$r,exports.registerFields=bi,exports.resolveCellRendererType=ni,Object.defineProperty(exports,"resolveFieldCurrency",{enumerable:!0,get:function(){return f.resolveFieldCurrency}}),exports.sumColumn=sn;
|
package/dist/index.d.ts
CHANGED
|
@@ -54,12 +54,20 @@ export declare function formatPercent(value: number, precision?: number): string
|
|
|
54
54
|
export declare function humanizeLabel(value: string): string;
|
|
55
55
|
/**
|
|
56
56
|
* Format date as relative time (e.g., "2 days ago", "Today", "Overdue 3d")
|
|
57
|
+
*
|
|
58
|
+
* `dueLike` gates the "Overdue" wording — a past `start_date`/`created_at`
|
|
59
|
+
* isn't overdue, only a past due/deadline-semantic field is. Non-due-like
|
|
60
|
+
* past dates render as "Nd ago" instead.
|
|
57
61
|
*/
|
|
58
|
-
export declare function formatRelativeDate(value: string | Date | number
|
|
62
|
+
export declare function formatRelativeDate(value: string | Date | number, options?: {
|
|
63
|
+
dueLike?: boolean;
|
|
64
|
+
}): string;
|
|
59
65
|
/**
|
|
60
66
|
* Format date value
|
|
61
67
|
*/
|
|
62
|
-
export declare function formatDate(value: string | Date | number, style?: string
|
|
68
|
+
export declare function formatDate(value: string | Date | number, style?: string, options?: {
|
|
69
|
+
dueLike?: boolean;
|
|
70
|
+
}): string;
|
|
63
71
|
/**
|
|
64
72
|
* Format datetime value
|
|
65
73
|
*/
|
package/dist/index.js
CHANGED
|
@@ -4648,29 +4648,29 @@ function Xi(e, t = 0) {
|
|
|
4648
4648
|
function Zi(e) {
|
|
4649
4649
|
return e.replace(/[_-]/g, " ").replace(/\b\w/g, (e) => e.toUpperCase());
|
|
4650
4650
|
}
|
|
4651
|
-
function Qi(e) {
|
|
4651
|
+
function Qi(e, t) {
|
|
4652
4652
|
if (e == null || e === "") return "—";
|
|
4653
|
-
let
|
|
4654
|
-
if (!(
|
|
4655
|
-
let
|
|
4656
|
-
if (
|
|
4657
|
-
if (
|
|
4658
|
-
if (
|
|
4659
|
-
if (
|
|
4660
|
-
let e = Math.abs(
|
|
4661
|
-
return e <= 7 ? `Overdue ${e}d` : $i(
|
|
4653
|
+
let n = e instanceof Date ? e : new Date(e);
|
|
4654
|
+
if (!(n instanceof Date) || isNaN(n.getTime())) return "—";
|
|
4655
|
+
let r = /* @__PURE__ */ new Date(), i = new Date(r.getFullYear(), r.getMonth(), r.getDate()), a = new Date(n.getFullYear(), n.getMonth(), n.getDate()).getTime() - i.getTime(), o = Math.round(a / (1e3 * 60 * 60 * 24));
|
|
4656
|
+
if (o === 0) return "Today";
|
|
4657
|
+
if (o === 1) return "Tomorrow";
|
|
4658
|
+
if (o === -1) return "Yesterday";
|
|
4659
|
+
if (o < -1) {
|
|
4660
|
+
let e = Math.abs(o);
|
|
4661
|
+
return e <= 7 ? t?.dueLike ? `Overdue ${e}d` : `${e}d ago` : $i(n);
|
|
4662
4662
|
}
|
|
4663
|
-
return
|
|
4663
|
+
return o > 1 && o <= 7 ? `In ${o} days` : $i(n);
|
|
4664
4664
|
}
|
|
4665
|
-
function $i(e, t) {
|
|
4665
|
+
function $i(e, t, n) {
|
|
4666
4666
|
if (e == null || e === "") return "—";
|
|
4667
|
-
let
|
|
4668
|
-
if (!(
|
|
4669
|
-
if (t === "short") return `${
|
|
4670
|
-
if (t === "relative") return Qi(n);
|
|
4671
|
-
let
|
|
4672
|
-
return
|
|
4673
|
-
year:
|
|
4667
|
+
let r = e instanceof Date ? e : new Date(e);
|
|
4668
|
+
if (!(r instanceof Date) || isNaN(r.getTime())) return "—";
|
|
4669
|
+
if (t === "short") return `${r.toLocaleDateString("en-US", { month: "short" })} ${r.getDate()}, '${String(r.getFullYear()).slice(-2)}`;
|
|
4670
|
+
if (t === "relative") return Qi(r, n);
|
|
4671
|
+
let i = r.getFullYear() === (/* @__PURE__ */ new Date()).getFullYear();
|
|
4672
|
+
return r.toLocaleDateString(void 0, {
|
|
4673
|
+
year: i ? void 0 : "numeric",
|
|
4674
4674
|
month: "short",
|
|
4675
4675
|
day: "numeric"
|
|
4676
4676
|
});
|
|
@@ -4783,13 +4783,13 @@ function sa({ value: e, field: t }) {
|
|
|
4783
4783
|
}
|
|
4784
4784
|
function ca({ value: e, field: t }) {
|
|
4785
4785
|
if (!e) return /* @__PURE__ */ Y(D, {});
|
|
4786
|
-
let n = Ki(e), r = t, i =
|
|
4787
|
-
|
|
4788
|
-
let
|
|
4786
|
+
let n = Ki(e), r = t, i = r.format || "relative", a = String(r?.name || r?.accessorKey || r?.key || "").toLowerCase(), o = r?.dueLike === !0 || /(^|_)(due|deadline|expires?|expiry|expiration|expected_close|target_close|sla|return_by|renewal|next_action)(_|$)/.test(a), s = $i(n, i, { dueLike: o }), c = n == null ? null : new Date(n), l = c !== null && !isNaN(c.getTime()), u = /* @__PURE__ */ new Date();
|
|
4787
|
+
u.setHours(0, 0, 0, 0);
|
|
4788
|
+
let d = o && l && c < u, f = l ? c.toISOString() : String(n);
|
|
4789
4789
|
return /* @__PURE__ */ Y("span", {
|
|
4790
|
-
className: `tabular-nums${
|
|
4791
|
-
title:
|
|
4792
|
-
children:
|
|
4790
|
+
className: `tabular-nums${d ? " text-red-600" : ""}`,
|
|
4791
|
+
title: f,
|
|
4792
|
+
children: s
|
|
4793
4793
|
});
|
|
4794
4794
|
}
|
|
4795
4795
|
function la({ value: e }) {
|
|
@@ -5616,7 +5616,9 @@ var qa = {
|
|
|
5616
5616
|
"email",
|
|
5617
5617
|
"password",
|
|
5618
5618
|
"slider",
|
|
5619
|
-
"markdown"
|
|
5619
|
+
"markdown",
|
|
5620
|
+
"time",
|
|
5621
|
+
"address"
|
|
5620
5622
|
]);
|
|
5621
5623
|
function Xa(t) {
|
|
5622
5624
|
let n = qa[t];
|
|
@@ -5645,7 +5647,10 @@ function Qa() {
|
|
|
5645
5647
|
}), u.register("number", $(it), { namespace: "field" }), u.register("boolean", $(st), { namespace: "field" }), u.register("select", $(pt), {
|
|
5646
5648
|
namespace: "field",
|
|
5647
5649
|
skipFallback: !0
|
|
5648
|
-
}), u.register("date", $(gt), { namespace: "field" }), u.register("datetime", $(Vn), { namespace: "field" }), u.register("time", $(Wn), {
|
|
5650
|
+
}), u.register("date", $(gt), { namespace: "field" }), u.register("datetime", $(Vn), { namespace: "field" }), u.register("time", $(Wn), {
|
|
5651
|
+
namespace: "field",
|
|
5652
|
+
skipFallback: !0
|
|
5653
|
+
}), u.register("email", $(yt), {
|
|
5649
5654
|
namespace: "field",
|
|
5650
5655
|
skipFallback: !0
|
|
5651
5656
|
}), u.register("phone", $(St), { namespace: "field" }), u.register("url", $(Tt), { namespace: "field" }), u.register("currency", $(At), { namespace: "field" }), u.register("percent", $(qn), { namespace: "field" }), u.register("password", $(Xn), {
|
|
@@ -5669,7 +5674,10 @@ function Qa() {
|
|
|
5669
5674
|
}), u.register("rating", $($r), { namespace: "field" }), u.register("code", $(ni), { namespace: "field" }), u.register("avatar", $(ai), {
|
|
5670
5675
|
namespace: "field",
|
|
5671
5676
|
skipFallback: !0
|
|
5672
|
-
}), u.register("address", $(ci), {
|
|
5677
|
+
}), u.register("address", $(ci), {
|
|
5678
|
+
namespace: "field",
|
|
5679
|
+
skipFallback: !0
|
|
5680
|
+
}), u.register("geolocation", $(di), { namespace: "field" }), u.register("signature", $(mi), { namespace: "field" }), u.register("qrcode", $(_i), { namespace: "field" });
|
|
5673
5681
|
}
|
|
5674
5682
|
Za();
|
|
5675
5683
|
//#endregion
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@object-ui/fields",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.5.0",
|
|
4
4
|
"description": "Field renderers and registry for Object UI",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -30,12 +30,12 @@
|
|
|
30
30
|
"rehype-sanitize": "^6.0.0",
|
|
31
31
|
"remark-gfm": "^4.0.1",
|
|
32
32
|
"tailwind-merge": "^3.6.0",
|
|
33
|
-
"@object-ui/components": "11.
|
|
34
|
-
"@object-ui/core": "11.
|
|
35
|
-
"@object-ui/i18n": "11.
|
|
36
|
-
"@object-ui/providers": "11.
|
|
37
|
-
"@object-ui/react": "11.
|
|
38
|
-
"@object-ui/types": "11.
|
|
33
|
+
"@object-ui/components": "11.5.0",
|
|
34
|
+
"@object-ui/core": "11.5.0",
|
|
35
|
+
"@object-ui/i18n": "11.5.0",
|
|
36
|
+
"@object-ui/providers": "11.5.0",
|
|
37
|
+
"@object-ui/react": "11.5.0",
|
|
38
|
+
"@object-ui/types": "11.5.0"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
41
|
"react": "^18.0.0 || ^19.0.0",
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, it, expect } from 'vitest';
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import { render, screen } from '@testing-library/react';
|
|
12
|
+
import '@testing-library/jest-dom';
|
|
13
|
+
import { DateCellRenderer, formatRelativeDate } from '../index';
|
|
14
|
+
|
|
15
|
+
function daysAgo(n: number): string {
|
|
16
|
+
const d = new Date();
|
|
17
|
+
d.setDate(d.getDate() - n);
|
|
18
|
+
return d.toISOString();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe('formatRelativeDate', () => {
|
|
22
|
+
it('renders "Overdue Nd" only when dueLike is set', () => {
|
|
23
|
+
expect(formatRelativeDate(daysAgo(3), { dueLike: true })).toBe('Overdue 3d');
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('renders neutral "Nd ago" for a past date that is not due-like', () => {
|
|
27
|
+
expect(formatRelativeDate(daysAgo(3))).toBe('3d ago');
|
|
28
|
+
expect(formatRelativeDate(daysAgo(3), { dueLike: false })).toBe('3d ago');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('DateCellRenderer', () => {
|
|
33
|
+
it('does not label a past start_date as "Overdue" (regression: field-role-agnostic formatter)', () => {
|
|
34
|
+
render(<DateCellRenderer value={daysAgo(6)} field={{ type: 'date', name: 'start_date' } as any} />);
|
|
35
|
+
expect(screen.getByText('6d ago')).toBeInTheDocument();
|
|
36
|
+
expect(screen.queryByText(/Overdue/)).not.toBeInTheDocument();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('labels a past due_date as "Overdue Nd" and colors it red', () => {
|
|
40
|
+
render(<DateCellRenderer value={daysAgo(6)} field={{ type: 'date', name: 'due_date' } as any} />);
|
|
41
|
+
const el = screen.getByText('Overdue 6d');
|
|
42
|
+
expect(el).toBeInTheDocument();
|
|
43
|
+
expect(el.className).toMatch(/text-red-600/);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('respects an explicit dueLike:true override regardless of field name', () => {
|
|
47
|
+
render(<DateCellRenderer value={daysAgo(2)} field={{ type: 'date', name: 'end_date', dueLike: true } as any} />);
|
|
48
|
+
expect(screen.getByText('Overdue 2d')).toBeInTheDocument();
|
|
49
|
+
});
|
|
50
|
+
});
|
package/src/index.tsx
CHANGED
|
@@ -362,8 +362,12 @@ export function humanizeLabel(value: string): string {
|
|
|
362
362
|
|
|
363
363
|
/**
|
|
364
364
|
* Format date as relative time (e.g., "2 days ago", "Today", "Overdue 3d")
|
|
365
|
+
*
|
|
366
|
+
* `dueLike` gates the "Overdue" wording — a past `start_date`/`created_at`
|
|
367
|
+
* isn't overdue, only a past due/deadline-semantic field is. Non-due-like
|
|
368
|
+
* past dates render as "Nd ago" instead.
|
|
365
369
|
*/
|
|
366
|
-
export function formatRelativeDate(value: string | Date | number): string {
|
|
370
|
+
export function formatRelativeDate(value: string | Date | number, options?: { dueLike?: boolean }): string {
|
|
367
371
|
if (value === null || value === undefined || value === '') return '—';
|
|
368
372
|
const date = value instanceof Date ? value : new Date(value as any);
|
|
369
373
|
if (!(date instanceof Date) || isNaN(date.getTime())) return '—';
|
|
@@ -379,7 +383,7 @@ export function formatRelativeDate(value: string | Date | number): string {
|
|
|
379
383
|
if (diffDays === -1) return 'Yesterday';
|
|
380
384
|
if (diffDays < -1) {
|
|
381
385
|
const absDays = Math.abs(diffDays);
|
|
382
|
-
if (absDays <= 7) return `Overdue ${absDays}d`;
|
|
386
|
+
if (absDays <= 7) return options?.dueLike ? `Overdue ${absDays}d` : `${absDays}d ago`;
|
|
383
387
|
return formatDate(date);
|
|
384
388
|
}
|
|
385
389
|
if (diffDays > 1 && diffDays <= 7) return `In ${diffDays} days`;
|
|
@@ -389,7 +393,7 @@ export function formatRelativeDate(value: string | Date | number): string {
|
|
|
389
393
|
/**
|
|
390
394
|
* Format date value
|
|
391
395
|
*/
|
|
392
|
-
export function formatDate(value: string | Date | number, style?: string): string {
|
|
396
|
+
export function formatDate(value: string | Date | number, style?: string, options?: { dueLike?: boolean }): string {
|
|
393
397
|
if (value === null || value === undefined || value === '') return '—';
|
|
394
398
|
const date = value instanceof Date ? value : new Date(value as any);
|
|
395
399
|
if (!(date instanceof Date) || isNaN(date.getTime())) return '—';
|
|
@@ -403,7 +407,7 @@ export function formatDate(value: string | Date | number, style?: string): strin
|
|
|
403
407
|
}
|
|
404
408
|
|
|
405
409
|
if (style === 'relative') {
|
|
406
|
-
return formatRelativeDate(date);
|
|
410
|
+
return formatRelativeDate(date, options);
|
|
407
411
|
}
|
|
408
412
|
|
|
409
413
|
// Default format: locale-aware human-readable. Drop the year when it
|
|
@@ -597,19 +601,20 @@ export function DateCellRenderer({ value, field }: CellRendererProps): React.Rea
|
|
|
597
601
|
const safe = coerceToSafeValue(value);
|
|
598
602
|
const dateField = field as any;
|
|
599
603
|
const style = dateField.format || 'relative';
|
|
600
|
-
const formatted = formatDate(safe as string | Date, style);
|
|
601
604
|
|
|
602
|
-
//
|
|
603
|
-
//
|
|
604
|
-
//
|
|
605
|
-
const date = safe != null ? new Date(safe as string | number) : null;
|
|
606
|
-
const isValidDate = date !== null && !isNaN(date.getTime());
|
|
607
|
-
const startOfToday = new Date();
|
|
608
|
-
startOfToday.setHours(0, 0, 0, 0);
|
|
605
|
+
// A date is only *semantically* a due/deadline when the field says so — a
|
|
606
|
+
// plain "start_date" or "created_at" in the past is neither overdue text
|
|
607
|
+
// nor red, even though it renders in the same relative-time style.
|
|
609
608
|
const fieldName = String(dateField?.name || dateField?.accessorKey || dateField?.key || '').toLowerCase();
|
|
610
609
|
const dueLike =
|
|
611
610
|
dateField?.dueLike === true ||
|
|
612
611
|
/(^|_)(due|deadline|expires?|expiry|expiration|expected_close|target_close|sla|return_by|renewal|next_action)(_|$)/.test(fieldName);
|
|
612
|
+
const formatted = formatDate(safe as string | Date, style, { dueLike });
|
|
613
|
+
|
|
614
|
+
const date = safe != null ? new Date(safe as string | number) : null;
|
|
615
|
+
const isValidDate = date !== null && !isNaN(date.getTime());
|
|
616
|
+
const startOfToday = new Date();
|
|
617
|
+
startOfToday.setHours(0, 0, 0, 0);
|
|
613
618
|
const isOverdue = dueLike && isValidDate && date! < startOfToday;
|
|
614
619
|
const isoString = isValidDate ? date!.toISOString() : String(safe);
|
|
615
620
|
|
|
@@ -2037,6 +2042,12 @@ const FIELD_TYPES_SKIP_FALLBACK = new Set([
|
|
|
2037
2042
|
'slider',
|
|
2038
2043
|
// Display renderer owned by `plugin-markdown:markdown`.
|
|
2039
2044
|
'markdown',
|
|
2045
|
+
// No other package owns the bare `time`/`address` key, but `registerField`
|
|
2046
|
+
// wraps each call in a fresh `React.lazy(...)`, so re-registration (HMR,
|
|
2047
|
+
// re-import) fails the registry's identity check every time and logs the
|
|
2048
|
+
// same "bare-name fallback overwritten" warning at every boot regardless.
|
|
2049
|
+
'time',
|
|
2050
|
+
'address',
|
|
2040
2051
|
]);
|
|
2041
2052
|
|
|
2042
2053
|
export function registerField(fieldType: string): void {
|
|
@@ -2093,7 +2104,10 @@ export function registerFields() {
|
|
|
2093
2104
|
ComponentRegistry.register('select', createFieldRenderer(SelectField), { namespace: 'field', skipFallback: true });
|
|
2094
2105
|
ComponentRegistry.register('date', createFieldRenderer(DateField), { namespace: 'field' });
|
|
2095
2106
|
ComponentRegistry.register('datetime', createFieldRenderer(DateTimeField), { namespace: 'field' });
|
|
2096
|
-
|
|
2107
|
+
// Namespaced-only: no other renderer legitimately owns the bare 'time' key,
|
|
2108
|
+
// but the fallback still triggered noisy "bare-name overwritten" warnings on
|
|
2109
|
+
// every re-registration (e.g. hot reload / re-init in a shared registry).
|
|
2110
|
+
ComponentRegistry.register('time', createFieldRenderer(TimeField), { namespace: 'field', skipFallback: true });
|
|
2097
2111
|
|
|
2098
2112
|
// Contact fields - wrapped for documentation compatibility
|
|
2099
2113
|
// `email` collides with the `ui:email` input variant; namespaced-only so the
|
|
@@ -2151,7 +2165,8 @@ export function registerFields() {
|
|
|
2151
2165
|
ComponentRegistry.register('code', createFieldRenderer(CodeField), { namespace: 'field' });
|
|
2152
2166
|
// `avatar` collides with the display avatar widget; namespaced-only.
|
|
2153
2167
|
ComponentRegistry.register('avatar', createFieldRenderer(AvatarField), { namespace: 'field', skipFallback: true });
|
|
2154
|
-
|
|
2168
|
+
// Namespaced-only — see the 'time' registration above for rationale.
|
|
2169
|
+
ComponentRegistry.register('address', createFieldRenderer(AddressField), { namespace: 'field', skipFallback: true });
|
|
2155
2170
|
ComponentRegistry.register('geolocation', createFieldRenderer(GeolocationField), { namespace: 'field' });
|
|
2156
2171
|
ComponentRegistry.register('signature', createFieldRenderer(SignatureField), { namespace: 'field' });
|
|
2157
2172
|
ComponentRegistry.register('qrcode', createFieldRenderer(QRCodeField), { namespace: 'field' });
|