@vuu-ui/vuu-table-extras 0.8.22 → 0.8.23-debug

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/esm/index.js CHANGED
@@ -1,3 +1,3528 @@
1
- var an=(e,o,t)=>{if(!o.has(e))throw TypeError("Cannot "+t)};var y=(e,o,t)=>(an(e,o,"read from private field"),t?t.call(e):o.get(e)),ee=(e,o,t)=>{if(o.has(e))throw TypeError("Cannot add the same private member more than once");o instanceof WeakSet?o.add(e):o.set(e,t)},pe=(e,o,t,n)=>(an(e,o,"write to private field"),n?n.call(e,t):o.set(e,t),t);import{registerComponent as Zi}from"@vuu-ui/vuu-utils";var _i=e=>typeof e=="string",Yi=(e,o)=>_i(o)?o===""?!0:e.value==="lower"&&o.toLowerCase()!==o?"value must be all lowercase":e.value==="upper"&&o.toUpperCase()!==o?"value must be all uppercase":!0:"value must be a string";Zi("vuu-case",Yi,"data-edit-validator",{});import{registerComponent as Ji}from"@vuu-ui/vuu-utils";var qi=e=>typeof e=="string",ji="value does not match expected pattern",es=(e,o)=>{if(typeof e.value!="string")throw Error("Pattern validation rule must provide pattern");if(qi(o)){if(o==="")return!0;{let{message:t=ji}=e;return new RegExp(e.value).test(o)||t}}else return"value must be a string"};Ji("vuu-pattern",es,"data-edit-validator",{});import{OverflowContainer as fs}from"@vuu-ui/vuu-layout";import{useLayoutEffectSkipFirst as Cs}from"@vuu-ui/vuu-utils";import vs from"clsx";import{useCallback as bs,useRef as hs,useState as xs}from"react";import os from"clsx";import{useCallback as ts}from"react";import{jsx as ns,jsxs as rs}from"react/jsx-runtime";var un="vuuColumnHeaderPill",ke=({children:e,className:o,column:t,onRemove:n,removable:r,...i})=>{if(r&&typeof n!="function")throw Error("ColumnHeaderPill onRemove prop must be provided if Pill is removable");let s=ts(l=>{l.preventDefault(),l.stopPropagation(),n==null||n(t)},[t,n]);return rs("div",{...i,className:os(un,o),children:[e,r?ns("span",{className:`${un}-removeButton`,role:"button","data-icon":"cross",onClick:s}):null]})};import{jsx as Ko,jsxs as is}from"react/jsx-runtime";var cn=({column:e,...o})=>{let{name:t,sorted:n}=e,r=typeof n=="number"?n<0?"arrow-down":"arrow-up":n==="A"?"arrow-up":n==="D"?"arrow-down":void 0;return is(ke,{...o,column:e,children:[Ko("span",{className:"vuuGroupColumnPill-label",children:t}),r!==void 0?Ko("span",{"data-icon":r}):null,typeof n=="number"?Ko("span",{className:"vuuSortPosition",children:Math.abs(n)}):null]})};import{jsx as pn,jsxs as ss}from"react/jsx-runtime";var mn=({column:e})=>{if(!e.sorted)return null;let o=typeof e.sorted=="number"?e.sorted<0?"arrow-down":"arrow-up":e.sorted==="A"?"arrow-up":"arrow-down";return ss(ke,{column:e,children:[pn("span",{"data-icon":o}),typeof e.sorted=="number"?pn("span",{className:"vuuSortPosition",children:Math.abs(e.sorted)}):null]})};import{useCallback as Xo,useRef as ls}from"react";import{jsx as us}from"react/jsx-runtime";var dn=()=>{},as="vuuColumnResizerNext",go=({onDrag:e,onDragEnd:o=dn,onDragStart:t=dn})=>{let n=ls(0),r=Xo(l=>{l.stopPropagation&&l.stopPropagation(),l.preventDefault&&l.preventDefault();let a=Math.round(l.clientX),c=a-n.current;n.current=a,c!==0&&e(l,c)},[e]),i=Xo(l=>{window.removeEventListener("mouseup",i),window.removeEventListener("mousemove",r),o(l)},[o,r]),s=Xo(l=>{t(l),n.current=Math.round(l.clientX),window.addEventListener("mouseup",i),window.addEventListener("mousemove",r),l.stopPropagation&&l.stopPropagation(),l.preventDefault&&l.preventDefault()},[t,r,i]);return us("div",{className:as,onMouseDown:s})};import{useCallback as Zo,useRef as cs,useState as ps}from"react";var fo=({column:e,onResize:o,rootRef:t})=>{let n=cs(0),[r,i]=ps(!1),{name:s}=e,l=Zo(()=>{if(o&&t.current){let{width:p}=t.current.getBoundingClientRect();n.current=Math.round(p),i(!0),o==null||o("begin",s)}},[s,o,t]),a=Zo((p,m)=>{if(t.current&&o){let{width:d}=t.current.getBoundingClientRect(),u=Math.round(d)+m;u!==n.current&&u>0&&(o("resize",s,u),n.current=u)}},[s,o,t]),c=Zo(()=>{o&&(o("end",s,n.current),setTimeout(()=>{i(!1)},80))},[s,o]);return{isResizing:r,onDrag:a,onDragStart:l,onDragEnd:c}};import{getColumnStyle as ms}from"@vuu-ui/vuu-utils";import ds from"clsx";import{useMemo as gs}from"react";var me=(e,o,t)=>gs(()=>{let n=ds(o,{vuuPinFloating:e.pin==="floating",vuuPinLeft:e.pin==="left",vuuPinRight:e.pin==="right",vuuEndPin:t&&e.endPin,[`${o}-editable`]:e.editable,[`${o}-right`]:e.align==="right"}),r=ms(e);return{className:n,style:r}},[e,o,t]);import{jsx as Yo,jsxs as Ts}from"react/jsx-runtime";import{createElement as ws}from"react";var _o="vuuTableGroupHeaderCell",ys=(e,o)=>e===o?e:o,Jo=({column:e,className:o,onMoveColumn:t,onRemoveColumn:n,onResize:r,...i})=>{let s=hs(null),{isResizing:l,...a}=fo({column:e,onResize:r,rootRef:s}),[c,p]=xs(e.columns),{className:m,style:d}=me(e,_o,!0),u=c.length>1?{removable:!0,onRemove:n}:void 0,f=bs((C,g)=>{p(v=>{let h=v.slice(),[T]=h.splice(C,1);if(g===-1){let F=h.concat(T);return t==null||t(F),F}else return h.splice(g,0,T),t==null||t(h),h})},[t]);return Cs(()=>{p(C=>ys(C,e.columns))},[e.columns]),Ts("div",{...i,className:vs(m,o,{[`${_o}-pending`]:e.groupConfirmed===!1}),ref:s,role:"columnheader",style:d,children:[Yo(fs,{allowDragDrop:!0,className:`${_o}-inner`,height:24,onMoveItem:f,overflowPosition:"start",children:c.map(C=>ws(cn,{...u,column:C,key:C.key}))}),Yo(ke,{column:e,removable:!0,onRemove:n}),e.resizeable!==!1?Yo(go,{...a}):null]})};import Hs from"clsx";import{useCallback as Ms,useRef as Ls}from"react";import{useContextMenu as Es}from"@vuu-ui/vuu-popups";import Rs from"clsx";import{useCallback as gn,useRef as Ss,useState as Ds}from"react";import{jsx as ks}from"react/jsx-runtime";var Ps=e=>{if(e){let{bottom:o,left:t}=e.getBoundingClientRect();return{x:t,y:o+6}}},fn=({className:e,column:o,...t})=>{let n=Ss(null),[r,i]=Ds(!1),[s]=Es(),l=gn(()=>{i(!1)},[]),a=gn(c=>{i(!0),s(c,"column-menu",{column:o,ContextMenuProps:{onClose:l,position:Ps(n.current)}})},[o,l,s]);return ks("span",{...t,className:Rs("vuuTable-columnMenu",e,{"vuuTable-columnMenu-open":r}),"data-icon":"more-vert",onClick:a,ref:n})};import{jsx as He,jsxs as Os}from"react/jsx-runtime";var Co="vuuTableHeaderCell",Cn=({className:e,column:o,onClick:t,onResize:n,...r})=>{var h;let{HeaderCellContentRenderer:i,HeaderCellLabelRenderer:s}=o,l=Ls(null),{isResizing:a,...c}=fo({column:o,onResize:n,rootRef:l}),p=Ms(T=>{!a&&(t==null||t(T))},[a,t]),{className:m,style:d}=me(o,Co,!0),u=He(fn,{column:o}),f=s?He(s,{className:`${Co}-label`,column:o}):He("div",{className:`${Co}-label`,children:(h=o.label)!=null?h:o.name}),C=i?[He(i,{column:o},"content")]:[],g=He(mn,{column:o}),v=o.align==="right"?[g,f].concat(C).concat(u):[u,f,g].concat(C);return Os("div",{...r,className:Hs(m,e,{[`${Co}-resizing`]:a}),onClick:p,ref:l,role:"columnheader",style:d,children:[...v,o.resizeable!==!1?He(go,{...c}):null]})};import{MeasuredContainer as ou}from"@vuu-ui/vuu-layout";import{ContextMenuProvider as tu}from"@vuu-ui/vuu-popups";import{metadataKeys as nu,useId as ru}from"@vuu-ui/vuu-utils";import{useForkRef as iu}from"@salt-ds/core";import vr from"clsx";import{forwardRef as su,useRef as lu,useState as au}from"react";import{isGroupColumn as yn,isJsonColumn as Qs,isJsonGroup as Gs,metadataKeys as Us,isNotHidden as Ws,RowSelected as Ks}from"@vuu-ui/vuu-utils";import Xs from"clsx";import{memo as Zs,useCallback as wn}from"react";import{isNumericColumn as Fs}from"@vuu-ui/vuu-utils";import{useCallback as vn}from"react";import{jsx as bn}from"react/jsx-runtime";var Ns="vuuTableCell",hn=({column:e,columnMap:o,onClick:t,onDataEdited:n,row:r})=>{let{className:i,style:s}=me(e,Ns),{CellRenderer:l,name:a,valueFormatter:c}=e,p=o[a],m=vn(u=>{if(n){let f=u;return Fs(e)&&typeof u=="string"&&(f=e.serverDataType==="double"?parseFloat(u):parseInt(u)),n==null?void 0:n(r,a,f)}else throw Error("TableCell onDataEdited prop not supplied for an editable cell")},[e,a,n,r]),d=vn(u=>{t==null||t(u,e)},[e,t]);return bn("div",{className:i,onClick:t?d:void 0,role:"cell",style:s,children:l?bn(l,{column:e,columnMap:o,onCommit:m,row:r}):c(r[p])})};import{getGroupValueAndOffset as Is,metadataKeys as As}from"@vuu-ui/vuu-utils";import{useCallback as Bs}from"react";import Vs from"clsx";import{jsx as jo,jsxs as $s}from"react/jsx-runtime";var{IS_LEAF:zs}=As,qo="vuuTableGroupCell",xn=({column:e,onClick:o,row:t})=>{let{columns:n}=e,[r,i]=Is(n,t),{className:s,style:l}=me(e,qo),a=Bs(m=>{o==null||o(m,e)},[e,o]),c=t[zs],p=Array(i).fill(0).map((m,d)=>jo("span",{className:`${qo}-spacer`},d));return $s("div",{className:Vs(s,"vuuTableCell"),role:"cell",style:l,onClick:c?void 0:a,children:[p,c?null:jo("span",{className:`${qo}-toggle`,"data-icon":"triangle-right"}),jo("span",{children:r})]})};import{jsx as et}from"react/jsx-runtime";import{createElement as qs}from"react";var{IDX:_s,IS_EXPANDED:Ys,SELECTED:Js}=Us,ie="vuuTableRow",ot=Zs(({className:e,columnMap:o,columns:t,highlighted:n,row:r,offset:i,onClick:s,onDataEdited:l,onToggleGroup:a,zebraStripes:c=!1,...p})=>{let{[_s]:m,[Ys]:d,[Js]:u}=r,f=wn(O=>{let N=O.shiftKey,k=O.ctrlKey||O.metaKey;s==null||s(r,N,k)},[s,r]),{True:C,First:g,Last:v}=Ks,h=Xs(ie,e,{[`${ie}-even`]:c&&m%2===0,[`${ie}-expanded`]:d,[`${ie}-highlighted`]:n,[`${ie}-selected`]:u&C,[`${ie}-selectedStart`]:u&g,[`${ie}-selectedEnd`]:u&v}),T={transform:`translate3d(0px, ${i}px, 0px)`},F=wn((O,N)=>{(yn(N)||Gs(N,r))&&(O.stopPropagation(),a==null||a(r,N))},[a,r]);return qs("div",{...p,key:`row-${r[0]}`,role:"row",className:h,onClick:f,style:T},et("span",{className:`${ie}-selectionDecorator vuuStickyLeft`}),t.filter(Ws).map(O=>{let N=yn(O),k=Qs(O);return et(N?xn:hn,{column:O,columnMap:o,onClick:N||k?F:void 0,onDataEdited:l,row:r},O.key)}),et("span",{className:`${ie}-selectionDecorator vuuStickyRight`}))});ot.displayName="Row";import{useDragDrop as Aa}from"@vuu-ui/vuu-ui-controls";import{applySort as Ba,buildColumnMap as Va,getIndexFromRowElement as za,isGroupColumn as $a,isJsonGroup as Qa,isValidNumber as ir,metadataKeys as Ga,updateColumn as sr,useLayoutEffectSkipFirst as lr}from"@vuu-ui/vuu-utils";import{useCallback as V,useEffect as Ua,useMemo as dt,useState as ar}from"react";import{isNumericColumn as js}from"@vuu-ui/vuu-utils";var Tn=e=>(o,t)=>{let n=[];return e===void 0||(o==="header"||o==="column-menu")&&(n.push(...el(t,e)),n.push(...nl(t,e)),n.push(...ol(t,e)),n.push(...tl(t)),n.push({action:"column-settings",icon:"cog",label:"Column Settings",options:t}),n.push({action:"table-settings",icon:"cog",label:"DataGrid Settings",options:t})),n};function el(e,{sort:{sortDefs:o}}){let{column:t}=e,n=[];if(t===void 0)return n;let r=o.length>0;return t.sorted==="A"?n.push({label:"Reverse Sort (DSC)",action:"sort-dsc",options:e}):t.sorted==="D"?n.push({label:"Reverse Sort (ASC)",action:"sort-asc",options:e}):typeof t.sorted=="number"?(t.sorted>0?n.push({label:"Reverse Sort (DSC)",action:"sort-add-dsc",options:e}):n.push({label:"Reverse Sort (ASC)",action:"sort-add-asc",options:e}),r&&Math.abs(t.sorted)<o.length&&n.push({label:"Remove from sort",action:"sort-remove",options:e}),n.push({label:"New Sort",children:[{label:"Ascending",action:"sort-asc",options:e},{label:"Descending",action:"sort-dsc",options:e}]})):r?(n.push({label:"Add to sort",children:[{label:"Ascending",action:"sort-add-asc",options:e},{label:"Descending",action:"sort-add-dsc",options:e}]}),n.push({label:"New Sort",children:[{label:"Ascending",action:"sort-asc",options:e},{label:"Descending",action:"sort-dsc",options:e}]})):n.push({label:"Sort",children:[{label:"Ascending",action:"sort-asc",options:e},{label:"Descending",action:"sort-dsc",options:e}]}),n}function ol(e,o){let{column:t}=e;if(t===void 0||o.groupBy.length===0)return[];let{name:n,label:r=n}=t;return[{label:`Aggregate ${r}`,children:[{label:"Count",action:"agg-count",options:e},{label:"Distinct",action:"agg-distinct",options:e}].concat(js(t)?[{label:"Sum",action:"agg-sum",options:e},{label:"Avg",action:"agg-avg",options:e},{label:"High",action:"agg-high",options:e},{label:"Low",action:"agg-low",options:e}]:[])}]}var it=(e,o)=>({label:`Pin ${o}`,action:`column-pin-${o}`,options:e}),tt=e=>it(e,"left"),nt=e=>it(e,"floating"),rt=e=>it(e,"right");function tl(e){let{column:o}=e;if(o===void 0)return[];let{pin:t}=o,n=[{label:"Hide column",action:"column-hide",options:e},{label:"Remove column",action:"column-remove",options:e}];return t===void 0?n.push({label:"Pin column",children:[tt(e),nt(e),rt(e)]}):t==="left"?n.push({label:"Unpin column",action:"column-unpin",options:e},{label:"Pin column",children:[nt(e),rt(e)]}):t==="right"?n.push({label:"Unpin column",action:"column-unpin",options:e},{label:"Pin column",children:[tt(e),nt(e)]}):t==="floating"&&n.push({label:"Unpin column",action:"column-unpin",options:e},{label:"Pin column",children:[tt(e),rt(e)]}),n}function nl(e,{groupBy:o}){let{column:t}=e,n=[];if(t===void 0)return n;let{name:r,label:i=r}=t;return o.length===0?n.push({label:`Group by ${i}`,action:"group",options:e}):n.push({label:`Add ${i} to group by`,action:"group-add",options:e}),n}import{removeColumnFromFilter as rl}from"@vuu-ui/vuu-utils";import{addGroupColumn as En,addSortColumn as Rn,AggregationType as il,setAggregations as Me,setSortColumn as Sn}from"@vuu-ui/vuu-utils";var sl=(e,o)=>{if(e.filterStruct&&o){let[t,n]=rl(o,e.filterStruct);return{filter:n,filterStruct:t}}else return e},{Average:ll,Count:al,Distinct:ul,High:cl,Low:pl,Sum:ml}=il,Dn=({dataSource:e,onPersistentColumnOperation:o})=>n=>{let r=n.options;if(r.column&&e){let{column:i}=r;switch(n.menuId){case"sort-asc":return e.sort=Sn(e.sort,i,"A"),!0;case"sort-dsc":return e.sort=Sn(e.sort,i,"D"),!0;case"sort-add-asc":return e.sort=Rn(e.sort,i,"A"),!0;case"sort-add-dsc":return e.sort=Rn(e.sort,i,"D"),!0;case"group":return e.groupBy=En(e.groupBy,i),!0;case"group-add":return e.groupBy=En(e.groupBy,i),!0;case"column-hide":return o({type:"hideColumns",columns:[i]}),!0;case"column-remove":return e.columns=e.columns.filter(s=>s!==i.name),!0;case"filter-remove-column":return e.filter=sl(e.filter,i),!0;case"remove-filters":return e.filter={filter:""},!0;case"agg-avg":return e.aggregations=Me(e.aggregations,i,ll),!0;case"agg-high":return e.aggregations=Me(e.aggregations,i,cl),!0;case"agg-low":return e.aggregations=Me(e.aggregations,i,pl),!0;case"agg-count":return e.aggregations=Me(e.aggregations,i,al),!0;case"agg-distinct":return e.aggregations=Me(e.aggregations,i,ul),!0;case"agg-sum":return e.aggregations=Me(e.aggregations,i,ml),!0;case"column-pin-floating":return o({type:"pinColumn",column:i,pin:"floating"}),!0;case"column-pin-left":return o({type:"pinColumn",column:i,pin:"left"}),!0;case"column-pin-right":return o({type:"pinColumn",column:i,pin:"right"}),!0;case"column-unpin":return o({type:"pinColumn",column:i,pin:void 0}),!0;case"column-settings":return o({type:"columnSettings",column:i}),!0;case"table-settings":return o({type:"tableSettings"}),!0;default:}}return!1};var vo=(e,o)=>{switch(o.type){case"col-size":return{...e,columns:e.columns.map(t=>t.name===o.column.name?{...t,width:o.width}:t)};case"column-prop":return{...e,columns:e.columns.map(t=>t.name===o.column.name?{...t,[o.property]:o.value}:t)};default:return e}};import{isCharacterKey as Cl}from"@vuu-ui/vuu-utils";import{useCallback as be}from"react";var st=e=>`.vuuTable-col-headers .vuuTableHeaderCell:nth-child(${e})`,lt=(e,o)=>`.vuuTable-body > [aria-rowindex='${e+1}'] > [role='cell']:nth-child(${o+1})`,Pn=(e,[o,t])=>{var i;let n=o===-1?st(t):lt(o,t),r=(i=e.current)==null?void 0:i.querySelector(n);return dl(r)&&r.querySelector("button")||r},dl=e=>e.classList.contains("vuuTableCell-editable"),kn=e=>e.querySelector(".vuuTableInputCell")!==null;function gl(e){if(e){let o=e.ariaRowIndex;if(o!==null)return parseInt(o,10)-1}return-1}var fl=e=>e.closest('[role="row"]'),Hn=e=>gl(fl(e));var Mn=({navigate:e})=>{let o=be(()=>{e()},[e]),t=be(a=>{let c=a.target,p=c.matches("input")?c:c.querySelector("input");p&&(p.focus(),p.select())},[]),n=be(a=>{let p=a.target.querySelector("input");p&&(p.focus(),p.select())},[]),r=be(a=>{let c=a.target;kn(c)&&(Cl(a.key)?t(a):a.key==="Enter"&&n(a))},[t,n]),i=be(a=>{let c=a.target;(c.matches("input")||c.querySelector("input"))&&(t(a),a.stopPropagation())},[t]),s=be(a=>{a.target.removeEventListener("vuu-commit",o,!0)},[o]),l=be(a=>{a.target.addEventListener("vuu-commit",o,!0)},[o]);return{onBlur:s,onDoubleClick:i,onFocus:l,onKeyDown:r}};import{getFullRange as ut,NULL_RANGE as Ln}from"@vuu-ui/vuu-utils";import{useCallback as ho,useEffect as On,useMemo as xl,useRef as xo,useState as yl}from"react";import{isRowSelectedLast as vl,metadataKeys as bl,WindowRange as hl}from"@vuu-ui/vuu-utils";var{SELECTED:at}=bl,bo=class{constructor({from:o,to:t}){this.rowCount=0;this.setRowCount=o=>{o<this.data.length&&(this.data.length=o),this.rowCount=o};this.range=new hl(o,t),this.data=new Array(Math.max(0,t-o)),this.rowCount=0}add(o){let[t]=o;if(this.isWithinRange(t)){let n=t-this.range.from;if(this.data[n]=o,o[at]){let r=this.data[n-1];vl(r)&&(this.data[n-1]=r.slice(),this.data[n-1][at]-=4)}}}getAtIndex(o){return this.range.isWithin(o)&&this.data[o-this.range.from]!=null?this.data[o-this.range.from]:void 0}isWithinRange(o){return this.range.isWithin(o)}setRange({from:o,to:t}){if(o!==this.range.from||t!==this.range.to){let[n,r]=this.range.overlap(o,t),i=new Array(Math.max(0,t-o));for(let s=n;s<r;s++){let l=this.getAtIndex(s);if(l){let a=s-o;i[a]=l}}this.data=i,this.range.from=o,this.range.to=t}}getSelectedRows(){return this.data.filter(o=>o[at]!==0)}};var wl=e=>e.type==="vuu-link-created"||e.type==="vuu-link-removed",Fn=({dataSource:e,onFeatureInvocation:o,onSizeChange:t,onSubscribed:n,range:r=Ln,renderBufferSize:i=0})=>{let[,s]=yl(null),l=xo([]),a=xo(!0),c=xo(!1),p=xo(Ln),m=xl(()=>new bo(ut(r,i)),[]),d=ho(g=>{for(let v of g)m.add(v);l.current=m.data,a.current?s({}):console.log("ignore update as we're not mounted")},[m]),u=ho(g=>{g.type==="subscribed"?n==null||n(g):g.type==="viewport-update"?(typeof g.size=="number"&&(t==null||t(g.size),m.setRowCount(g.size)),g.rows?d(g.rows):typeof g.size=="number"&&(l.current=m.data,c.current=!0)):wl(g)?o==null||o(g):console.log(`useDataSource unexpected message ${g.type}`)},[m,o,t,n,d]),f=ho(()=>m.getSelectedRows(),[m]);On(()=>{var g;return a.current=!0,(g=e.resume)==null||g.call(e),()=>{var v;a.current=!1,(v=e.suspend)==null||v.call(e)}},[e]),On(()=>{var g;e.status==="disabled"?(g=e.enable)==null||g.call(e,u):e==null||e.subscribe({range:ut(r,i)},u)},[e,u,r,i]);let C=ho(g=>{let v=ut(g,i);m.setRange(v),e.range=p.current=v,e.emit("range",g)},[e,m,i]);return{data:l.current,dataRef:l,getSelectedRows:f,range:p.current,setRange:C}};import{useMemo as Tl,useRef as El}from"react";var Nn=e=>{let o=El(e);return Tl(()=>o.current,[])};import{getIndexFromRowElement as Rl}from"@vuu-ui/vuu-utils";import{useControlled as Sl}from"@salt-ds/core";import{useCallback as Z,useEffect as In,useRef as yo}from"react";var Vn=new Set(["Home","End","PageUp","PageDown","ArrowDown","ArrowUp"]),ct=new Set(Vn);ct.add("ArrowLeft");ct.add("ArrowRight");var Dl=(e,o)=>{switch(o){case"cell":return ct.has(e);case"row":return Vn.has(e);default:return!1}},Pl=["Home","End","PageUp","PageDown"],An=e=>Pl.includes(e),kl=[-1,-1];function Bn(e,[o,t],n,r){return e==="ArrowUp"?o>-1?[o-1,t]:[o,t]:e==="ArrowDown"?o===-1?[0,t]:o===r-1?[o,t]:[o+1,t]:e==="ArrowRight"?t<n?[o,t+1]:[o,t]:e==="ArrowLeft"?t>1?[o,t-1]:[o,t]:[o,t]}var zn=({columnCount:e=0,containerRef:o,disableFocus:t=!1,defaultHighlightedIndex:n,disableHighlightOnFocus:r,highlightedIndex:i,navigationStyle:s,requestScroll:l,onHighlight:a,rowCount:c=0,viewportRowCount:p})=>{var P;let m=yo([-1,-1]),d=yo(),u=yo([-1,0]),f=yo(),[C,g]=Sl({controlled:i,default:n,name:"UseKeyboardNavigation"});f.current=C;let v=Z((x,w=!1)=>{a==null||a(x),g(x)},[a,g]),h=x=>x==null?void 0:x.closest("[role='columnHeader'],[role='cell']"),T=x=>{var w;if(x.role==="columnHeader")return[-1,parseInt((w=x.dataset.idx)!=null?w:"-1",10)];{let H=x.closest("[role='row']");if(H){let I=Rl(H),W=Array.from(H.childNodes).indexOf(x);return[I,W]}}return kl},F=Z(x=>{var w;if(o.current){let H=Pn(o,x);H&&(H!==d.current&&((w=d.current)==null||w.removeAttribute("tabindex"),d.current=H,H.setAttribute("tabindex","0")),console.log(`scroll row ${x[0]}`),l==null||l({type:"scroll-row",rowIndex:x[0]}),H.focus({preventScroll:!0}))}},[o,l]),O=Z((x,w,H=!1)=>{let I=[x,w];u.current=I,s==="row"?g(x):F(I),H&&(m.current=I)},[F,s,g]),N=Z((x,[w,H])=>new Promise(I=>{let W=w;switch(x){case"PageDown":W=Math.min(c-1,w+p),l==null||l({type:"scroll-page",direction:"down"});break;case"PageUp":W=Math.max(0,w-p),l==null||l({type:"scroll-page",direction:"up"});break;case"Home":W=0,l==null||l({type:"scroll-end",direction:"home"});break;case"End":W=c-1,l==null||l({type:"scroll-end",direction:"end"});break}setTimeout(()=>{I([W,H])},90)}),[l,c,p]),k=Z(()=>{var x;if(r!==!0&&(x=o.current)!=null&&x.contains(document.activeElement)){let w=h(document.activeElement);w&&(m.current=T(w),s==="row"&&g(m.current[0]))}},[r,o,s,g]),D=Z(async x=>{let[w,H]=An(x)?await N(x,u.current):Bn(x,u.current,e,c),[I,W]=u.current;(w!==I||H!==W)&&O(w,H,!0)},[e,N,c,O]),$=Z(x=>{l==null||l({type:"scroll-row",rowIndex:x})},[l]),B=Z(async x=>{let{current:w}=f,[H]=An(x)?await N(x,[w!=null?w:-1,0]):Bn(x,[w!=null?w:-1,0],e,c);H!==w&&(v(H),$(H))},[e,N,c,$,v]);In(()=>{i!==void 0&&i!==-1&&$(i)},[i,$]);let A=Z(x=>{c>0&&Dl(x.key,s)&&(x.preventDefault(),x.stopPropagation(),s==="row"?B(x.key):D(x.key))},[c,s,B,D]),R=Z(x=>{let w=x.target,H=h(w);if(H){let[I,W]=T(H);O(I,W)}},[O]),M=Z(()=>{v(-1)},[v]),E=Z(x=>{let w=Hn(x.target);w!==-1&&w!==f.current&&v(w)},[v]),U=Z(()=>{D("ArrowDown")},[D]),G=((P=o.current)==null?void 0:P.firstChild)!=null;return In(()=>{if(G&&d.current===void 0&&!t){let{current:x}=o,w=(x==null?void 0:x.querySelector(st(0)))||(x==null?void 0:x.querySelector(lt(0,0)));w&&(w.setAttribute("tabindex","0"),d.current=w)}},[o,t,G]),{highlightedIndexRef:f,navigate:U,onClick:R,onFocus:k,onKeyDown:A,onMouseLeave:s==="row"?M:void 0,onMouseMove:s==="row"?E:void 0}};import{deselectItem as Hl,dispatchMouseEvent as Ml,isRowSelected as Ll,metadataKeys as Ol,selectItem as Fl}from"@vuu-ui/vuu-utils";import{useCallback as pt,useRef as $n}from"react";var{IDX:Nl}=Ol,Il=[],Al=["Enter"," "],Qn=({highlightedIndexRef:e,selectionKeys:o=Al,selectionModel:t,onSelect:n,onSelectionChange:r})=>{let i=$n(-1),s=$n(Il),l=pt(p=>o.includes(p.key),[o]),a=pt((p,m,d)=>{let{[Nl]:u}=p,{current:f}=i,{current:C}=s,v=(Ll(p)?Hl:Fl)(t,C,u,m,d,f);s.current=v,i.current=u,n==null||n(p),r==null||r(v)},[n,r,t]);return{onKeyDown:pt(p=>{if(l(p)){let{current:m}=e;if(m!==void 0&&m!==-1){let d=p.target.querySelector(`[aria-rowindex="${m}"]`);d&&Ml(d,"click")}}},[e,l]),onRowClick:a}};import{useContextMenu as Bl}from"@vuu-ui/vuu-popups";import{buildColumnMap as Vl,getIndexFromRowElement as zl}from"@vuu-ui/vuu-utils";import{useCallback as $l}from"react";var Ql=[],Gn=({columns:e,data:o,dataSource:t,getSelectedRows:n})=>{let[r]=Bl();return $l(s=>{let l=s.target,a=l==null?void 0:l.closest("div[role='cell']"),c=l==null?void 0:l.closest("div[role='row']");if(a&&c){let{selectedRowsCount:p}=t,m=Vl(e),d=zl(c),u=Array.from(c.childNodes).indexOf(a),f=o.find(([g])=>g===d),C=e[u];r(s,"grid",{columnMap:m,columnName:C,row:f,selectedRows:p===0?Ql:n(),viewport:t.viewport})}},[e,o,t,n,r])};import{applyFilterToColumns as Gl,applyGroupByToColumns as Ul,applySortToColumns as Wl,getCellRenderer as Kl,getColumnHeaderContentRenderer as Xl,getColumnHeaderLabelRenderer as Zl,getColumnLabel as _l,getTableHeadings as Yl,getValueFormatter as Jl,hasValidationRules as ql,isFilteredColumn as jl,isGroupColumn as ea,isPinned as oa,logger as ta,metadataKeys as na,replaceColumn as he,sortPinnedColumns as Un,stripFilterFromColumns as ra,subscribedOnly as ia}from"@vuu-ui/vuu-utils";import{buildValidationChecker as sa}from"@vuu-ui/vuu-ui-controls";import{useReducer as la}from"react";var{info:mt}=ta("useTableModel"),aa=100,ua=na.count,ca=({serverDataType:e})=>e===void 0,Wn=(e,o)=>{let t=o==null?void 0:o.columns.find(({name:n})=>n===e.name);return t?t.serverDataType:e.serverDataType},pa=["int","long","double"],Kn=e=>e===void 0?void 0:pa.includes(e)?"right":"left",Xn=e=>e.type==="columnSettings",Zn=e=>e.type==="tableSettings",ma=(e,o)=>{switch(mt==null||mt(`TableModelReducer ${o.type}`),o.type){case"init":return Yn(o);case"moveColumn":return ga(e,o);case"resizeColumn":return va(e,o);case"setTableSchema":return ba(e,o);case"hideColumns":return fa(e,o);case"showColumns":return Ca(e,o);case"pinColumn":return ha(e,o);case"updateColumnProp":return Le(e,o);case"tableConfig":return qn(e,o);default:return console.log(`unhandled action ${o.type}`),e}},_n=(e,o)=>{let[t,n]=la(ma,{tableConfig:e,dataSource:o},Yn),{columns:r,headings:i,tableConfig:s,...l}=t;return{columns:r,dispatchColumnAction:n,headings:i,tableAttributes:l,tableConfig:s}};function Yn({dataSource:e,tableConfig:o}){let{columns:t,...n}=o,{config:r,tableSchema:i}=e,s=t.filter(ia(r==null?void 0:r.columns)).map(Jn(n,i)),l=s.some(oa)?Un(s):s,a={columns:l,headings:Yl(l),tableConfig:o,...n};if(r){let{columns:c,...p}=r;a=qn(a,{type:"tableConfig",...p})}return a}var da=(e,o)=>o==="uppercase"?e.toUpperCase():o==="capitalize"?e[0].toUpperCase()+e.slice(1).toLowerCase():e,Jn=(e,o)=>(t,n)=>{let{columnDefaultWidth:r=aa,columnFormatHeader:i}=e,s=Wn(t,o),{align:l=Kn(s),key:a,name:c,label:p=_l(t),width:m=r,...d}=t,u={...d,align:l,CellRenderer:Kl(t),HeaderCellContentRenderer:Xl(t),HeaderCellLabelRenderer:Zl(t),clientSideEditValidationCheck:ql(t.type)?sa(t.type.renderer.rules):void 0,label:da(p,i),key:a!=null?a:n+ua,name:c,originalIdx:n,serverDataType:s,valueFormatter:Jl(t,s),width:m};return ea(u)&&(u.columns=u.columns.map(f=>Jn(e)(f,f.key))),u};function ga(e,{column:o,moveBy:t}){let{columns:n}=e;if(typeof t=="number"){let r=n.indexOf(o),i=n.slice(),[s]=i.splice(r,1);return i.splice(r+t,0,s),{...e,columns:i}}return e}function fa(e,{columns:o}){return o.some(t=>t.hidden!==!0)?o.reduce((t,n)=>n.hidden!==!0?Le(t,{type:"updateColumnProp",column:n,hidden:!0}):t,e):e}function Ca(e,{columns:o}){return o.some(t=>t.hidden)?o.reduce((t,n)=>n.hidden?Le(t,{type:"updateColumnProp",column:n,hidden:!1}):t,e):e}function va(e,{column:o,phase:t,width:n}){let r="updateColumnProp",i=t!=="end";switch(t){case"begin":return Le(e,{type:r,column:o,resizing:i});case"end":return Le(e,{type:r,column:o,resizing:i,width:n});case"resize":return Le(e,{type:r,column:o,width:n});default:throw Error(`useTableModel.resizeColumn, invalid resizePhase ${t}`)}}function ba(e,{tableSchema:o}){let{columns:t}=e;if(t.some(ca)){let n=t.map(r=>{var s;let i=Wn(r,o);return{...r,align:(s=r.align)!=null?s:Kn(i),serverDataType:i}});return{...e,columns:n}}else return e}function ha(e,o){let{columns:t}=e,{column:n,pin:r}=o,i=t.find(s=>s.name===n.name);return i?(t=he(t,{...i,pin:r}),t=Un(t),{...e,columns:t}):e}function Le(e,o){let{columns:t,tableConfig:n}=e,{align:r,column:i,hidden:s,label:l,resizing:a,width:c}=o,p=t.find(m=>m.name===i.name);if(p&&((r==="left"||r==="right")&&(t=he(t,{...p,align:r})),typeof l=="string"&&(t=he(t,{...p,label:l})),typeof a=="boolean"&&(t=he(t,{...p,resizing:a})),typeof s=="boolean"&&(t=he(t,{...p,hidden:s})),typeof c=="number")){t=he(t,{...p,width:c});let m=n.columns.find(d=>d.name===i.name);m&&(n={...n,columns:he(n.columns,{...m,width:c})})}return{...e,columns:t,tableConfig:n}}function qn(e,{confirmed:o,filter:t,groupBy:n,sort:r}){let i=n!==void 0,s=typeof(t==null?void 0:t.filter)=="string",l=r&&r.sortDefs.length>0,a=e;return i&&(a={...e,columns:Ul(a.columns,n,o)}),l&&(a={...e,columns:Wl(a.columns,r)}),s?a={...e,columns:Gl(a.columns,t)}:a.columns.some(jl)&&(a={...e,columns:ra(a.columns)}),a}import{getRowElementAtIndex as xa}from"@vuu-ui/vuu-utils";import{useCallback as se,useEffect as ya,useImperativeHandle as wa,useMemo as Ta,useRef as Oe}from"react";var jn=e=>{let{scrollLeft:o,scrollTop:t}=e,{clientHeight:n,clientWidth:r,scrollHeight:i,scrollWidth:s}=e,l=o/(s-r),a=t/(i-n);return[l,a]},Ea={scrollToIndex:()=>{},scrollToKey:()=>{}},Ra=[void 0,void 0],Sa=(e,o,t=e.closest(".vuuTable-contentContainer"))=>{if(t){let n=t==null?void 0:t.getBoundingClientRect(),r=n.top+o,i=e.getBoundingClientRect();if(i)return i.bottom>n.bottom?["down",i.bottom-n.bottom]:i.top<r?["up",i.top-r]:Ra;throw Error("Whats going on, row not found")}else throw Error("Whats going on, scrollbar container not found")},er=({onAttach:e,onDetach:o})=>{let t=Oe(null);return se(r=>{if(r)t.current=r,e==null||e(r);else if(t.current){let{current:i}=t;t.current=r,o==null||o(i)}},[e,o])},or=({getRowAtPosition:e,onHorizontalScroll:o,onVerticalScroll:t,scrollingApiRef:n,setRange:r,viewportMeasurements:i})=>{let s=Oe(0),l=Oe(!1),a=Oe({scrollTop:0,scrollLeft:0}),c=Oe(null),p=Oe(null),{appliedPageSize:m,isVirtualScroll:d,maxScrollContainerScrollHorizontal:u,maxScrollContainerScrollVertical:f,rowCount:C,totalHeaderHeight:g}=i,v=se((R,M)=>{t==null||t(R,M);let E=e(R);E!==s.current&&(s.current=E,r({from:E,to:E+C+1}))},[e,t,r,C]),h=se(()=>{let{current:R}=p,{current:M}=c,{current:E}=l;if(E)l.current=!1;else if(R&&M){let[U,G]=jn(M),P=Math.round(U*u),x=G*f;R.scrollTo({left:P,top:x,behavior:"auto"})}},[u,f]),T=se(()=>{let{current:R}=p,{current:M}=c,{current:E}=a;if(R&&M){let{scrollLeft:U,scrollTop:G}=R,[P,x]=jn(R);l.current=!0,M.scrollLeft=Math.round(P*u),M.scrollTop=x*f,E.scrollTop!==G&&(E.scrollTop=G,v(G,x)),E.scrollLeft!==U&&(E.scrollLeft=U,o==null||o(U))}},[v,u,f,o]),F=se(R=>{c.current=R,R.addEventListener("scroll",h,{passive:!0})},[h]),O=se(R=>{c.current=null,R.removeEventListener("scroll",h)},[h]),N=se(R=>{p.current=R,R.addEventListener("scroll",T,{passive:!0})},[T]),k=se(R=>{p.current=null,R.removeEventListener("scroll",T)},[T]),D=er({onAttach:N,onDetach:k}),$=er({onAttach:F,onDetach:O}),B=se(R=>{let{current:M}=p;if(M){let{scrollLeft:E,scrollTop:U}=M;if(l.current=!1,R.type==="scroll-row"){let G=xa(M,R.rowIndex);if(G!==null){let[P,x]=Sa(G,g);if(P&&x)if(d)console.log(`virtual scroll row required ${P} ${x}
2
- first Row ${s.current}`);else{let w=E,H=U;P==="up"||P==="down"?H=Math.min(Math.max(0,U+x),f):w=Math.min(Math.max(0,E+x),u),M.scrollTo({top:H,left:w,behavior:"smooth"})}}}else if(R.type==="scroll-page"){let{direction:G}=R;if(d)console.log("need a virtual page scroll");else{let P=G==="down"?m:-m,x=Math.min(Math.max(0,U+P),f);M.scrollTo({top:x,left:E,behavior:"auto"})}}else if(R.type==="scroll-end"){let{direction:G}=R,P=G==="end"?f:0;M.scrollTo({top:P,left:M.scrollLeft,behavior:"auto"})}}},[m,d,u,f,r,g,C]),A=Ta(()=>({scrollToIndex:R=>{if(c.current){let M=(R-30)*20;c.current.scrollTop=M}},scrollToKey:R=>{console.log(`scrollToKey ${R}`)}}),[]);return wa(n,()=>c.current?A:Ea,[A]),ya(()=>{let{current:R}=s,M={from:R,to:R+C+1};r(M)},[r,C]),{scrollbarContainerRef:$,contentContainerRef:D,requestScroll:B}};import{useCallback as Da,useMemo as wo,useRef as tr}from"react";import{actualRowPositioning as Pa,virtualRowPositioning as ka}from"@vuu-ui/vuu-utils";var Ha=1e5,Ma={appliedPageSize:0,contentHeight:0,contentWidth:0,getRowAtPosition:()=>-1,getRowOffset:()=>-1,horizontalScrollbarHeight:0,isVirtualScroll:!1,maxScrollContainerScrollHorizontal:0,maxScrollContainerScrollVertical:0,pinnedWidthLeft:0,pinnedWidthRight:0,rowCount:0,setPctScrollTop:()=>{},totalHeaderHeight:0,verticalScrollbarWidth:0,viewportBodyHeight:0},La=e=>{let o=0,t=0,n=0;for(let r of e){let{hidden:i,pin:s,width:l}=r,a=i?0:l;s==="left"?o+=a:s==="right"?t+=a:n+=a}return{pinnedWidthLeft:o+4,pinnedWidthRight:t+4,unpinnedWidth:n}},nr=({columns:e,headerHeight:o,headings:t,rowCount:n,rowHeight:r,size:i})=>{let s=tr(0),l=r*Math.min(n,Ha),a=n*r,c=a-l,{pinnedWidthLeft:p,pinnedWidthRight:m,unpinnedWidth:d}=wo(()=>La(e),[e]),u=tr(o);wo(()=>{u.current=o*(1+t.length)},[o,t.length]);let[f,C,g]=wo(()=>c?ka(r,c,s):Pa(r),[c,r]),v=Da(h=>{s.current=h},[]);return wo(()=>{var h;if(i){let{current:T}=u,F=15,O=p+d+m,N=O>i.width?F:0,k=l-(((h=i==null?void 0:i.height)!=null?h:0)-N)+T,D=O-i.width+p,$=(i.height-o)/r,B=Number.isInteger($)?$:Math.ceil($),A=i.height-T,R=l>A?F:0;return{appliedPageSize:B*r*(l/a),contentHeight:l,contentWidth:O,getRowAtPosition:C,getRowOffset:f,isVirtualScroll:g,horizontalScrollbarHeight:N,maxScrollContainerScrollHorizontal:D,maxScrollContainerScrollVertical:k,pinnedWidthLeft:p,pinnedWidthRight:m,rowCount:B,setPctScrollTop:v,totalHeaderHeight:T,verticalScrollbarWidth:R,viewportBodyHeight:A}}else return Ma},[C,f,o,g,p,d,m,l,r,v,i,a])};import{useLayoutProviderDispatch as Oa}from"@vuu-ui/vuu-layout";import{getCalculatedColumnType as Fa}from"@vuu-ui/vuu-utils";import{useCallback as xe,useRef as Na,useState as Ia}from"react";var rr=({availableColumns:e,onAvailableColumnsChange:o,onConfigChange:t,onCreateCalculatedColumn:n,onDataSourceConfigChange:r,tableConfig:i})=>{let s=Oa(),l=Na(),[a,c]=Ia(e),p=xe((g,v,h)=>{s({type:"set-props",path:"#context-panel",props:{expanded:!0,content:{type:g,props:h},title:v}})},[s]),m=xe(()=>{requestAnimationFrame(()=>{var g;(g=l.current)==null||g.call(l)})},[]),d=xe(g=>{let v=a.concat({name:g.name,serverDataType:Fa(g)});c(v),o==null||o(v),requestAnimationFrame(()=>{var h;(h=l.current)==null||h.call(l)}),n(g)},[a,o,n]),u=xe(g=>{p("ColumnSettings","Column Settings",{column:g.column,onCancelCreateColumn:m,onConfigChange:t,onCreateCalculatedColumn:d,tableConfig:i,vuuTable:g.vuuTable})},[m,d,t,p,i]),f=xe(()=>{u({column:{name:"::",serverDataType:"string"},type:"columnSettings",vuuTable:{module:"SIMUL",table:"instruments"}})},[u]),C=xe(g=>{let v=i.columns.find(h=>h.name===g);v&&u({type:"columnSettings",column:v,vuuTable:{module:"SIMUL",table:"instruments"}})},[u,i.columns]);return l.current=xe(()=>{p("TableSettings","DataGrid Settings",{availableColumns:a!=null?a:i.columns.map(({name:g,serverDataType:v})=>({name:g,serverDataType:v})),onAddCalculatedColumn:f,onConfigChange:t,onDataSourceConfigChange:r,onNavigateToColumn:C,tableConfig:i})},[a,f,C,t,r,p,i]),{showColumnSettingsPanel:u,showTableSettingsPanel:l.current}};var To=e=>e,{KEY:Wa,IS_EXPANDED:ur,IS_LEAF:cr}=Ga,Ka={draggable:void 0,onMouseDown:void 0},Xa=()=>Ka,Za=(e,o)=>({...e,columns:e.columns.concat(o)}),pr=({allowDragDrop:e=!1,availableColumns:o,config:t,containerRef:n,dataSource:r,disableFocus:i,headerHeight:s=25,highlightedIndex:l,id:a,navigationStyle:c="cell",onAvailableColumnsChange:p,onConfigChange:m,onDragStart:d,onDrop:u,onFeatureInvocation:f,onHighlight:C,onRowClick:g,onSelect:v,onSelectionChange:h,renderBufferSize:T=0,rowHeight:F=20,scrollingApiRef:O,selectionModel:N,size:k})=>{let[D,$]=ar(r.size);if(r===void 0)throw Error("no data source provided to Vuu Table");let B=e?Aa:Xa,A=dt(()=>Tn(r),[r]),R=V(b=>{$(b)},[]),{columns:M,dispatchColumnAction:E,headings:U,tableAttributes:G,tableConfig:P}=_n(t,r);lr(()=>{E({type:"init",dataSource:r,tableConfig:P})},[P,r,E]);let x=V(b=>{E({type:"init",tableConfig:b,dataSource:r}),m==null||m(To(b))},[r,E,m]),[w,H]=ar(),[I,W]=dt(()=>{let b=(L,z)=>{let X=sr(M,L,{width:z});H(X)};return[w!=null?w:M,b]},[M,w]),zo=dt(()=>Va(r.columns),[r.columns]),{getRowAtPosition:$o,getRowOffset:Qo,setPctScrollTop:uo,...Ce}=nr({columns:I,headerHeight:s,headings:U,rowCount:D,rowHeight:F,size:k}),co=Nn({from:0,to:Ce.rowCount===0?0:Ce.rowCount+1}),De=V(({tableSchema:b})=>{b?E({type:"setTableSchema",tableSchema:b}):console.log("subscription message with no schema")},[E]),{data:po,dataRef:j,getSelectedRows:Go,range:Uo,setRange:mo}=Fn({dataSource:r,onFeatureInvocation:f,renderBufferSize:T,onSizeChange:R,onSubscribed:De,range:co}),ve=V(b=>{E({type:"init",tableConfig:b,dataSource:r}),m==null||m(To(b))},[r,E,m]),yi=V(b=>{r.config={...r.config,...b}},[r]);Ua(()=>{r.on("config",(b,L)=>{E({type:"tableConfig",...b,confirmed:L})})},[r,E]);let wi=V(b=>{r.columns=r.columns.concat(b.name),x(Za(P,b))},[r,P,x]),_t=V(b=>{let{columns:L}=b,z=L.map(Y=>Y.name),X={...P,columns:P.columns.map(Y=>z.includes(Y.name)?{...Y,hidden:!0}:Y)};x(X)},[P,x]),Yt=V(b=>{x({...P,columns:sr(P.columns,{...b.column,pin:b.pin})})},[P,x]),{showColumnSettingsPanel:Jt,showTableSettingsPanel:qt}=rr({availableColumns:o!=null?o:P.columns.map(({name:b,serverDataType:L="string"})=>({name:b,serverDataType:L})),onAvailableColumnsChange:p,onConfigChange:ve,onCreateCalculatedColumn:wi,onDataSourceConfigChange:yi,tableConfig:P}),Ti=V(b=>{if(Xn(b))Jt(b);else if(Zn(b))qt();else switch(b.type){case"hideColumns":return _t(b);case"pinColumn":return Yt(b);default:E(b)}},[E,_t,Yt,Jt,qt]),Ei=Dn({dataSource:r,onPersistentColumnOperation:Ti}),Ri=V((b,L=!1,z)=>{r&&(r.sort=Ba(r.sort,b,L,z))},[r]),Si=V((b,L,z)=>{let X=I.find(Y=>Y.name===L);if(X)b==="resize"?ir(z)&&W(L,z):b==="end"?ir(z)&&(E({type:"resizeColumn",phase:b,column:X,width:z}),H(void 0),m==null||m(To(vo(P,{type:"col-size",column:X,width:z})))):(H(void 0),E({type:"resizeColumn",phase:b,column:X,width:z}));else throw Error(`useDataTable.handleColumnResize, column ${L} not found`)},[I,P,E,m,W]),Di=V((b,L)=>{var Y,ln;let z=Qa(L,b),X=b[Wa];if(b[ur]){if(r.closeTreeNode(X,!0),z){let Ye=I.indexOf(L),Je=(Y=r.getRowsAtDepth)==null?void 0:Y.call(r,Ye+1);Je&&!Je.some(Pe=>Pe[ur]||Pe[cr])&&E({type:"hideColumns",columns:I.slice(Ye+2)})}}else if(r.openTreeNode(X),z){let Ye=(ln=r.getChildRows)==null?void 0:ln.call(r,X),Je=I.indexOf(L)+1,Pe=[I[Je]];Ye&&Ye.some(Wo=>Wo[cr])&&Pe.push(I[Je+1]),Pe.some(Wo=>Wo.hidden)&&E({type:"showColumns",columns:Pe})}},[I,r,E]),Pi=V((b,L)=>{uo(L)},[uo]),{requestScroll:ki,...Hi}=or({getRowAtPosition:$o,rowHeight:F,scrollingApiRef:O,setRange:mo,onVerticalScroll:Pi,viewportMeasurements:Ce}),{highlightedIndexRef:jt,navigate:Mi,onFocus:en,onKeyDown:on,...Li}=zn({columnCount:I.filter(b=>b.hidden!==!0).length,containerRef:n,disableFocus:i,highlightedIndex:l,navigationStyle:c,requestScroll:ki,rowCount:r==null?void 0:r.size,onHighlight:C,viewportRange:Uo,viewportRowCount:Ce.rowCount}),{onBlur:Oi,onDoubleClick:Fi,onKeyDown:tn,onFocus:nn}=Mn({navigate:Mi}),Ni=V(b=>{en(),b.defaultPrevented||nn(b)},[nn,en]),Ii=Gn({columns:I,data:po,dataSource:r,getSelectedRows:Go}),Ai=V(b=>{r.groupBy=b.map(L=>L.name)},[r]),Bi=V(b=>{$a(b)?r.groupBy=[]:r&&r.groupBy.includes(b.name)&&(r.groupBy=r.groupBy.filter(L=>L!==b.name))},[r]),Vi=V(b=>{r.select(b),h==null||h(b)},[r,h]),{onKeyDown:rn,onRowClick:sn}=Qn({highlightedIndexRef:jt,onSelect:v,onSelectionChange:Vi,selectionModel:N}),zi=V(b=>{on(b),b.defaultPrevented||tn(b),b.defaultPrevented||rn(b)},[on,tn,rn]),$i=V((b,L,z)=>{sn(b,L,z),g==null||g(b)},[g,sn]);lr(()=>{E({type:"init",tableConfig:t,dataSource:r})},[t,r,E]);let Qi=V(b=>{console.log("useTable onMoveColumn",{columns:b});let L={...P,columns:b};E({type:"init",tableConfig:L,dataSource:r}),m==null||m(To(L))},[r,E,m,P]),Gi=V(b=>{u==null||u(b)},[u]),Ui=V(async(b,L,z)=>r.applyEdit(b,L,z),[r]),Wi=V(b=>{let{initialDragElement:L}=b,z=za(L),X=j.current.find(Y=>Y[0]===z);X&&b.setPayload(X),d==null||d(b)},[j,d]),{onMouseDown:Ki,draggable:Xi}=B({allowDragDrop:e,containerRef:n,draggableClassName:"vuuTable",id:a,onDragStart:Wi,onDrop:Gi,orientation:"vertical",itemQuery:".vuuTableRow"});return{...Li,"aria-rowcount":r.size,draggableRow:Xi,onBlur:Oi,onDoubleClick:Fi,onFocus:Ni,onKeyDown:zi,onMouseDown:Ki,columnMap:zo,columns:I,data:po,getRowOffset:Qo,handleContextMenuAction:Ei,headings:U,highlightedIndex:jt.current,menuBuilder:A,onContextMenu:Ii,onDataEdited:Ui,onMoveColumn:Qi,onMoveGroupColumn:Ai,onRemoveGroupColumn:Bi,onRowClick:$i,onSortColumn:Ri,onResizeColumn:Si,onToggleGroup:Di,scrollProps:Hi,tableAttributes:G,tableConfig:P,viewportMeasurements:Ce}};import{isGroupColumn as qa,isNotHidden as ja}from"@vuu-ui/vuu-utils";import eu from"clsx";import{useDragDrop as _a}from"@vuu-ui/vuu-ui-controls";import{moveColumnTo as gt,visibleColumnAtIndex as Ya}from"@vuu-ui/vuu-utils";import{useCallback as mr,useRef as Ja}from"react";var dr=({columns:e,onMoveColumn:o,onSortColumn:t,tableConfig:n})=>{let r=Ja(null),i=mr((p,m)=>{let d=e[p],u=gt(e,d,m),f=({name:h})=>T=>T.name===h,C=u.findIndex(f(d)),g=u[C+1],v=g?n.columns.findIndex(f(g)):-1;m>p&&v!==-1?o(gt(n.columns,d,v-1)):o(gt(n.columns,d,v))},[e,o,n.columns]),s=mr(p=>{var g;let d=p.target.closest(".vuuTableHeaderCell"),u=parseInt((g=d==null?void 0:d.dataset.index)!=null?g:"-1"),f=Ya(e,u),C=p.shiftKey;f&&t(f,C)},[e,t]),{onMouseDown:l,draggable:a,...c}=_a({allowDragDrop:!0,containerRef:r,draggableClassName:"vuuTable",onDrop:i,orientation:"horizontal",itemQuery:".vuuTableHeaderCell"});return{containerRef:r,draggableColumn:a,draggedColumnIndex:c.draggedItemIndex,onClick:s,onMouseDown:l}};import{jsx as Eo,jsxs as gr}from"react/jsx-runtime";var fr=({classBase:e="vuuTable",columns:o,headings:t,onMoveColumn:n,onMoveGroupColumn:r,onRemoveGroupColumn:i,onResizeColumn:s,onSortColumn:l,tableConfig:a,tableId:c})=>{let{containerRef:p,draggableColumn:m,draggedColumnIndex:d,onClick:u,onMouseDown:f}=dr({columns:o,onMoveColumn:n,onSortColumn:l,tableConfig:a});return gr("div",{className:`${e}-col-headings`,ref:p,children:[t.map((C,g)=>Eo("div",{className:"vuuTable-heading",children:C.map(({label:v,width:h},T)=>Eo("div",{className:"vuuTable-headingCell",style:{width:h},children:v},T))},g)),gr("div",{className:`${e}-col-headers`,role:"row",children:[o.filter(ja).map((C,g)=>qa(C)?Eo(Jo,{column:C,"data-index":g,onMoveColumn:r,onRemoveColumn:i,onResize:s},C.name):Eo(Cn,{className:eu({"vuuDraggable-dragAway":g===d}),column:C,"data-index":g,id:`${c}-col-${g}`,onClick:u,onMouseDown:f,onResize:s},C.name)),m]})]})};import{jsx as de,jsxs as Cr}from"react/jsx-runtime";var le="vuuTable",{IDX:uu,RENDER_IDX:cu}=nu,pu=({Row:e=ot,allowDragDrop:o,availableColumns:t,config:n,containerRef:r,dataSource:i,disableFocus:s=!1,highlightedIndex:l,id:a,navigationStyle:c="cell",onAvailableColumnsChange:p,onConfigChange:m,onDragStart:d,onDrop:u,onFeatureInvocation:f,onHighlight:C,onRowClick:g,onSelect:v,onSelectionChange:h,renderBufferSize:T=5,rowHeight:F=20,scrollingApiRef:O,selectionModel:N="extended",showColumnHeaders:k=!0,headerHeight:D=k?25:0,size:$})=>{let B=ru(a),{columnMap:A,columns:R,data:M,draggableRow:E,getRowOffset:U,handleContextMenuAction:G,headings:P,highlightedIndex:x,onDataEdited:w,onMoveColumn:H,onMoveGroupColumn:I,onRemoveGroupColumn:W,onResizeColumn:zo,onRowClick:$o,onSortColumn:Qo,onToggleGroup:uo,menuBuilder:Ce,scrollProps:co,tableAttributes:De,tableConfig:po,viewportMeasurements:j,...Go}=pr({allowDragDrop:o,availableColumns:t,config:n,containerRef:r,dataSource:i,disableFocus:s,headerHeight:D,highlightedIndex:l,id:B,navigationStyle:c,onAvailableColumnsChange:p,onConfigChange:m,onDragStart:d,onDrop:u,onFeatureInvocation:f,onHighlight:C,onRowClick:g,onSelect:v,onSelectionChange:h,renderBufferSize:T,rowHeight:F,scrollingApiRef:O,selectionModel:N,size:$}),Uo=vr(`${le}-contentContainer`,{[`${le}-colLines`]:De.columnSeparators,[`${le}-rowLines`]:De.rowSeparators,[`${le}-zebra`]:De.zebraStripes}),mo={"--content-height":`${j.contentHeight}px`,"--content-width":`${j.contentWidth}px`,"--horizontal-scrollbar-height":`${j.horizontalScrollbarHeight}px`,"--pinned-width-left":`${j.pinnedWidthLeft}px`,"--pinned-width-right":`${j.pinnedWidthRight}px`,"--header-height":`${D}px`,"--row-height":`${F}px`,"--total-header-height":`${j.totalHeaderHeight}px`,"--vertical-scrollbar-width":`${j.verticalScrollbarWidth}px`,"--viewport-body-height":`${j.viewportBodyHeight}px`};return Cr(tu,{menuActionHandler:G,menuBuilder:Ce,children:[de("div",{className:`${le}-scrollbarContainer`,ref:co.scrollbarContainerRef,style:mo,children:de("div",{className:`${le}-scrollbarContent`})}),de("div",{className:Uo,ref:co.contentContainerRef,style:mo,children:Cr("div",{...Go,className:`${le}-table`,role:"table",tabIndex:s?void 0:-1,children:[k?de(fr,{columns:R,headings:P,onMoveColumn:H,onMoveGroupColumn:I,onRemoveGroupColumn:W,onResizeColumn:zo,onSortColumn:Qo,tableConfig:po,tableId:B}):null,de("div",{className:`${le}-body`,children:M.map(ve=>de(e,{"aria-rowindex":ve[0]+1,columnMap:A,columns:R,highlighted:x===ve[uu],onClick:$o,onDataEdited:w,row:ve,offset:U(ve),onToggleGroup:uo,zebraStripes:De.zebraStripes},ve[cu]))})]})}),E]})},Xv=su(function({Row:o,allowDragDrop:t,availableColumns:n,className:r,config:i,dataSource:s,disableFocus:l,highlightedIndex:a,id:c,navigationStyle:p,onAvailableColumnsChange:m,onConfigChange:d,onDragStart:u,onDrop:f,onFeatureInvocation:C,onHighlight:g,onRowClick:v,onSelect:h,onSelectionChange:T,renderBufferSize:F,rowHeight:O,scrollingApiRef:N,selectionModel:k,showColumnHeaders:D,headerHeight:$,style:B,...A},R){let M=lu(null),[E,U]=au();if(i===void 0)throw Error("vuu Table requires config prop. Minimum config is list of Column Descriptors");if(s===void 0)throw Error("vuu Table requires dataSource prop");return de(ou,{...A,className:vr(le,r),id:c,onResize:U,ref:iu(M,R),children:E?de(pu,{Row:o,allowDragDrop:t,availableColumns:n,config:i,containerRef:M,dataSource:s,disableFocus:l,headerHeight:$,highlightedIndex:a,id:c,navigationStyle:p,onAvailableColumnsChange:m,onConfigChange:d,onDragStart:u,onDrop:f,onFeatureInvocation:C,onHighlight:g,onRowClick:v,onSelect:h,onSelectionChange:T,renderBufferSize:F,rowHeight:O,scrollingApiRef:N,selectionModel:k,showColumnHeaders:D,size:E}):null})});import{memo as mu,useCallback as du}from"react";import{CheckboxIcon as gu,WarnCommit as fu}from"@vuu-ui/vuu-ui-controls";import{Checkbox as Cu}from"@salt-ds/core";var oe=(e,o)=>e.column===o.column&&e.column.valueFormatter(e.row[e.columnMap[e.column.name]])===o.column.valueFormatter(o.row[o.columnMap[o.column.name]]);import{dispatchCustomEvent as vu,registerComponent as bu}from"@vuu-ui/vuu-utils";import{jsx as br}from"react/jsx-runtime";var hr=mu(({column:e,columnMap:o,onCommit:t=fu,row:n})=>{let r=o[e.name],i=n[r],s=du(l=>async a=>{let c=await t(l);return c===!0&&vu(a.target,"vuu-commit"),c},[t]);return e.editable?br(Cu,{checked:i,onClick:s(!i)}):br(gu,{checked:i,disabled:!0})},oe);hr.displayName="CheckboxCell";bu("checkbox-cell",hr,"cell-renderer",{serverDataType:"boolean"});import{registerComponent as hu}from"@vuu-ui/vuu-utils";import{Input as xu}from"@salt-ds/core";import{useEditableText as yu}from"@vuu-ui/vuu-ui-controls";import wu from"clsx";import{jsx as ft}from"react/jsx-runtime";var Ro="vuuTableInputCell",Tu=()=>(console.warn("onCommit handler has not been provided to InputCell cell renderer"),Promise.resolve(!0)),Eu=({column:e,columnMap:o,onCommit:t=Tu,row:n})=>{let r=o[e.name],{align:i="left",clientSideEditValidationCheck:s}=e,{warningMessage:l,...a}=yu({initialValue:n[r],onCommit:t,clientSideEditValidationCheck:s}),c=l&&i==="left"?ft("span",{className:`${Ro}-icon`,"data-icon":"error"}):void 0,p=l&&i==="right"?ft("span",{className:`${Ro}-icon`,"data-icon":"error"}):void 0;return ft(xu,{...a,className:wu(Ro,{[`${Ro}-error`]:l!==void 0}),endAdornment:c,startAdornment:p})};hu("input-cell",Eu,"cell-renderer",{});import{WarnCommit as Ru}from"@vuu-ui/vuu-ui-controls";import{dispatchCustomEvent as Su,isTypeDescriptor as Du,isValueListRenderer as Pu,registerComponent as ku}from"@vuu-ui/vuu-utils";import Hu from"clsx";import{memo as Mu,useCallback as Lu}from"react";import{CycleStateButton as Ou}from"@vuu-ui/vuu-ui-controls";import{jsx as Iu}from"react/jsx-runtime";var xr="vuuTableToggleCell",Fu=({name:e,type:o})=>{if(Du(o)&&Pu(o.renderer))return o.renderer.values;throw Error(`useLookupValues column ${e} has not been configured with a values list`)},Nu=Mu(function({column:o,columnMap:t,onCommit:n=Ru,row:r}){let i=Fu(o),s=t[o.name],l=r[s],a=Lu((c,p)=>n(p).then(m=>(m===!0&&Su(c.target,"vuu-commit"),m)),[n]);return Iu(Ou,{className:Hu(xr,`${xr}-${o.name}`),onCommit:a,value:l,values:i,variant:"cta",children:l})},oe);ku("toggle-cell",Nu,"cell-renderer",{});import{useStateRef as Bb}from"@vuu-ui/vuu-ui-controls";import{dispatchMouseEvent as zb}from"@vuu-ui/vuu-utils";import{useCallback as Gb,useRef as Ub}from"react";import{DOWN1 as Qu,DOWN2 as Gu,isTypeDescriptor as Uu,metadataKeys as Wu,registerComponent as Ku,UP1 as Xu,UP2 as Zu}from"@vuu-ui/vuu-utils";import _u from"clsx";import{memo as Yu}from"react";import{getMovingValueDirection as Au,isTypeDescriptor as Bu,isValidNumber as yr}from"@vuu-ui/vuu-utils";import{useEffect as Vu,useRef as zu}from"react";var $u=[void 0,void 0,void 0,void 0];function wr(e,o,t){var m;let n=zu(),[r,i,s,l]=n.current||$u,{type:a}=t,c=Bu(a)?(m=a.formatting)==null?void 0:m.decimals:void 0,p=e===r&&yr(o)&&yr(i)&&t===s?Au(o,l,i,c):"";return Vu(()=>{n.current=[e,o,t,p]}),p}import{jsx as tc,jsxs as nc}from"react/jsx-runtime";var Ju="\u2B06",qu="\u2B07",{KEY:ju}=Wu,qe="vuuBackgroundCell",Fe={ArrowOnly:"arrow",BackgroundOnly:"bg-only",ArrowBackground:"arrow-bg"},ec=e=>Uu(e)&&e.renderer&&"flashStyle"in e.renderer?e.renderer.flashStyle:Fe.BackgroundOnly,oc=Yu(function({column:o,columnMap:t,row:n}){let{name:r,type:i,valueFormatter:s}=o,l=t[r],a=n[l],c=ec(i),p=wr(n[ju],a,o),m=c===Fe.ArrowOnly||c===Fe.ArrowBackground?p===Xu||p===Zu?Ju:p===Qu||p===Gu?qu:null:null,d=p?" "+p:"",u=_u(qe,d,{[`${qe}-backgroundOnly`]:c===Fe.BackgroundOnly,[`${qe}-arrowOnly`]:c===Fe.ArrowOnly,[`${qe}-arrowBackground`]:c===Fe.ArrowBackground});return nc("div",{className:u,tabIndex:-1,children:[tc("div",{className:`${qe}-arrow`,children:m}),s(n[l])]})},oe);Ku("vuu.price-move-background",oc,"cell-renderer",{description:"Change background color of cell when value changes",configEditor:"BackgroundCellConfigurationEditor",label:"Background Flash",serverDataType:["long","int","double"]});import{registerConfigurationEditor as rc}from"@vuu-ui/vuu-utils";import{FormField as ic,FormFieldLabel as sc}from"@salt-ds/core";import{Dropdown as lc}from"@vuu-ui/vuu-ui-controls";import{useCallback as ac,useState as uc}from"react";import{jsx as Tr,jsxs as dc}from"react/jsx-runtime";var cc="vuuBackgroundCellConfiguration",Ct=[{label:"Background Only",value:"bg-only"},{label:"Background and Arrow",value:"arrow-bg"},{label:"Arrow Only",value:"arrow"}],[Er]=Ct,pc=e=>{let{flashStyle:o}=e.type.renderer;return Ct.find(t=>t.value===o)||Er},mc=({column:e,onChangeRendering:o})=>{let[t,n]=uc(pc(e)),r=ac((i,s)=>{var a;n(s);let l=e.type.renderer;o({...l,flashStyle:(a=s==null?void 0:s.value)!=null?a:Er.value})},[e.type,o]);return dc(ic,{children:[Tr(sc,{children:"Flash Style"}),Tr(lc,{className:`${cc}-flashStyle`,onSelectionChange:r,selected:t,source:Ct,width:"100%"})]})};rc("BackgroundCellConfigurationEditor",mc);import{useLookupValues as gc}from"@vuu-ui/vuu-data-react";import{Dropdown as fc,WarnCommit as Cc}from"@vuu-ui/vuu-ui-controls";import{dispatchCustomEvent as vc,registerComponent as bc}from"@vuu-ui/vuu-utils";import{memo as hc,useCallback as xc,useState as yc}from"react";import{jsx as Rc}from"react/jsx-runtime";var wc="vuuTableDropdownCell",Tc=["Enter"," "],Ec=hc(function({column:o,columnMap:t,onCommit:n=Cc,row:r}){let i=t[o.name],{initialValue:s,values:l}=gc(o,r[i]),[a,c]=yc(null),p=xc((m,d)=>{d&&(c(d),n(d.value).then(u=>{u===!0&&m&&vc(m.target,"vuu-commit")}))},[n]);return Rc(fc,{className:wc,onSelectionChange:p,openKeys:Tc,selected:a!=null?a:s,source:l,width:o.width-17})},oe);bc("dropdown-cell",Ec,"cell-renderer",{});import{useLookupValues as Sc}from"@vuu-ui/vuu-data-react";import{registerComponent as Dc}from"@vuu-ui/vuu-utils";import{memo as Pc}from"react";import{jsx as Hc}from"react/jsx-runtime";var kc=Pc(function({column:o,columnMap:t,row:n}){let r=t[o.name],{initialValue:i}=Sc(o,n[r]);return Hc("span",{children:i==null?void 0:i.label})},oe);Dc("lookup-cell",kc,"cell-renderer",{});import{isColumnTypeRenderer as Mc,isTypeDescriptor as Lc,isValidNumber as Rr,registerComponent as Oc}from"@vuu-ui/vuu-utils";import Fc from"clsx";import{jsx as vt,jsxs as Sr}from"react/jsx-runtime";var je="vuuProgressCell",Nc=({column:e,columnMap:o,row:t})=>{let{type:n}=e,r=t[e.key],i=!1,s=0;if(Lc(n)&&Mc(n.renderer)){let{associatedField:a}=n.renderer;if(a){let c=t[o[a]];if(typeof Rr(r)&&Rr(c))s=Math.min(Math.round(r/c*100),100),s=Math.min(Math.round(r/c*100),100),i=isFinite(s);else{let p=parseFloat(r);if(Number.isFinite(p)){let m=parseFloat(c);Number.isFinite(m)&&(s=Math.min(Math.round(p/m*100),100),i=isFinite(s))}}}else throw Error("ProgressCell associatedField is required to render")}let l=Fc(je,{});return Sr("div",{className:l,tabIndex:-1,children:[i?Sr("span",{className:`${je}-track`,children:[vt("span",{className:`${je}-bg`}),vt("span",{className:`${je}-bar`,style:{"--progress-bar-pct":`-${100-s}%`}})]}):null,vt("span",{className:`${je}-text`,children:`${s} %`})]})};Oc("vuu.progress",Nc,"cell-renderer",{description:"Progress formatter",label:"Progress formatter",serverDataType:["long","int","double"]});import{List as Ic,ListItem as Ac}from"@vuu-ui/vuu-ui-controls";import{Checkbox as Bc,Switch as Vc}from"@salt-ds/core";import zc from"clsx";import{useCallback as Dr}from"react";import{getColumnLabel as $c}from"@vuu-ui/vuu-utils";import{jsx as ne,jsxs as bt}from"react/jsx-runtime";var te="vuuColumnList",Pr="vuuColumnListItem",Qc=({className:e,item:o,...t})=>bt(Ac,{...t,className:zc(e,Pr),"data-name":o==null?void 0:o.name,children:[ne("span",{className:`${te}-icon`,"data-icon":"draggable"}),o!=null&&o.isCalculated?ne("span",{className:`${te}-icon`,"data-icon":"function"}):ne(Vc,{className:`${te}-switch`,checked:o==null?void 0:o.subscribed}),ne("span",{className:`${te}-text`,children:$c(o)}),ne(Bc,{className:`${te}-checkBox`,checked:(o==null?void 0:o.hidden)!==!0,disabled:(o==null?void 0:o.subscribed)!==!0})]}),kr=({columnItems:e,onChange:o,onMoveListItem:t,onNavigateToColumn:n,...r})=>{let i=Dr(l=>{let a=l.target,c=a.closest(`.${Pr}`),{dataset:{name:p}}=c;if(p){let m=a.closest(`.${te}-switch`),d=a.closest(`.${te}-checkBox`);m?o(p,"subscribed",a.checked):d&&o(p,"hidden",a.checked===!1)}},[o]),s=Dr(l=>{let a=l.target;if(a.classList.contains("vuuColumnList-text")){let c=a.closest(".vuuListItem");c!=null&&c.dataset.name&&(n==null||n(c.dataset.name))}},[]);return bt("div",{...r,className:te,children:[ne("div",{className:`${te}-header`,children:ne("span",{children:"Column Selection"})}),bt("div",{className:`${te}-colHeadings`,children:[ne("span",{children:"Column subscription"}),ne("span",{children:"Visibility"})]}),ne(Ic,{ListItem:Qc,allowDragDrop:!0,height:"auto",onChange:i,onClick:s,onMoveListItem:t,selectionStrategy:"none",source:e,itemHeight:33})]})};import{VuuInput as vi}from"@vuu-ui/vuu-ui-controls";import{getCalculatedColumnName as Jm,getDefaultAlignment as qm,isCalculatedColumn as jm}from"@vuu-ui/vuu-utils";import{Button as Io,FormField as Ao,FormFieldLabel as Bo,ToggleButton as Xe,ToggleButtonGroup as bi}from"@salt-ds/core";import ed from"clsx";import{Dropdown as Xp}from"@vuu-ui/vuu-ui-controls";import{getCalculatedColumnExpression as Zp,getCalculatedColumnName as _p,getCalculatedColumnType as Yp}from"@vuu-ui/vuu-utils";import{FormField as It,FormFieldLabel as At,Input as Jp}from"@salt-ds/core";import{useCallback as qp,useRef as jr}from"react";import{memo as hp}from"react";import{autocompletion as ap,defaultKeymap as up,EditorState as Gr,EditorView as Ur,ensureSyntaxTree as cp,keymap as Wr,minimalSetup as pp,startCompletion as Kr}from"@vuu-ui/vuu-codemirror";import{createEl as Xr}from"@vuu-ui/vuu-utils";import{useCallback as mp,useEffect as dp,useMemo as gp,useRef as Mt}from"react";import{LanguageSupport as Uc,LRLanguage as Wc,styleTags as Kc,tags as eo}from"@vuu-ui/vuu-codemirror";import{LRParser as Gc}from"@lezer/lr";var So=Gc.deserialize({version:14,states:"&xOVQPOOO!fQPO'#C^OVQPO'#CcQ!pQPOOO#bQPO'#CkO#gQPO'#CrOOQO'#Cy'#CyO#lQPO,58}OVQPO,59QOVQPO,59QOOQO'#Cn'#CnOVQPO,59XOVQPO,59VOVQPO'#CtOOQO,59^,59^OOQO1G.i1G.iOOQO1G.l1G.lO$bQPO1G.lO%ZQPO1G.sO!pQPO'#CmO%qQQO1G.qO%|QQO'#C{OOQO'#C{'#C{O&wQPO,59`OVQPO,59ZOVQPO,59[OVQPO7+$]OVQPO'#CuO'RQPO1G.zOOQO1G.z1G.zO'ZQQO'#C^O'eQQO1G.sO'{QQO1G.uOOQO1G.v1G.vO(WQPO<<GwO(_QPO,59aOOQO-E6s-E6sOOQO7+$f7+$fOVQPOAN=cO(iQQO1G.lO(yQPOG22}OOQOLD(iLD(iO)QQPO,59QO)QQPO,59QO)QQPO,59X",stateData:")n~OlOS~ORUOSUOTUOUUOWQO`SOnPO~OWgXZQX[QX]QX^QXpQXqQXrQXsQXtQXuQXeQX~OjQXXQX~PnOZWO[WO]XO^XOpYOqYOrYOsYOtYOuYO~OW[O~OW]O~OX_O~P!pO]Yi^YipYiqYirYisYitYiuYieYi~OZWO[WOjYiXYi~P#sOpaiqairaisaitaiuaieai~OZWO[WO]XO^XOjaiXai~P$rOejOvhOwiO~OZmX[mX]mX^mXeoXpmXqmXrmXsmXtmXumXvoXwoX~OXmOekO~P!pOXuOekO~OvQXwQX~PnOZzO[zO]{O^{Ovaiwai~P$rOwiOecivci~OevO~P!pOXiaeia~P!pOZzO[zOvYiwYi~P#sOXyO~P!pORUOSUOTUOUUOWQO`SOnnO~O`UTn~",goto:"$epPPqPPPPqPPqPPPPqP!S!g!r!rPq!w#Y#]PPP#cP$[oUOQWXZ[]hijkvz{|hUOQWXZ]jkvz{|Ve[hi[ZRVgrsxR|cVf[hioTOQWXZ[]hijkvz{|R^TQlgRtlQROQVQS`WzQaXQbZUc[hiQg]Qo|QrjQskQw{RxvQd[QphRqi",nodeNames:"\u26A0 ColumnDefinitionExpression Column Number String True False ParenthesizedExpression OpenBrace CloseBrace ArithmeticExpression Divide Times Plus Minus ConditionalExpression If RelationalExpression RelationalOperator AndCondition OrCondition Comma CallExpression Function ArgList",maxTerm:39,skippedNodes:[0],repeatNodeCount:1,tokenData:".^~RnXY#PYZ#P]^#Ppq#Pqr#brs#mxy$eyz$jz{$o{|$t|}$y}!O%O!O!P%T!P!Q%c!Q![%h!^!_%s!_!`&Q!`!a&V!c!}&d#R#S&d#T#U&u#U#Y&d#Y#Z(Y#Z#]&d#]#^*j#^#c&d#c#d+f#d#h&d#h#i,b#i#o&d~#USl~XY#PYZ#P]^#Ppq#P~#eP!_!`#h~#mOu~~#pWOX#mZ]#m^r#mrs$Ys#O#m#P;'S#m;'S;=`$_<%lO#m~$_OS~~$bP;=`<%l#m~$jOW~~$oOX~~$tO[~~$yO]~~%OOe~~%TO^~~%WP!Q![%Z~%`PR~!Q![%Z~%hOZ~~%mQR~!O!P%Z!Q![%h~%xPr~!_!`%{~&QOt~~&VOp~~&[Pq~!_!`&_~&dOs~P&iSnP!Q![&d!c!}&d#R#S&d#T#o&dR&zUnP!Q![&d!c!}&d#R#S&d#T#b&d#b#c'^#c#o&dR'cUnP!Q![&d!c!}&d#R#S&d#T#W&d#W#X'u#X#o&dR'|SvQnP!Q![&d!c!}&d#R#S&d#T#o&d~(_TnP!Q![&d!c!}&d#R#S&d#T#U(n#U#o&d~(sUnP!Q![&d!c!}&d#R#S&d#T#`&d#`#a)V#a#o&d~)[UnP!Q![&d!c!}&d#R#S&d#T#g&d#g#h)n#h#o&d~)sUnP!Q![&d!c!}&d#R#S&d#T#X&d#X#Y*V#Y#o&d~*^SU~nP!Q![&d!c!}&d#R#S&d#T#o&d~*oUnP!Q![&d!c!}&d#R#S&d#T#Y&d#Y#Z+R#Z#o&d~+YS`~nP!Q![&d!c!}&d#R#S&d#T#o&dR+kUnP!Q![&d!c!}&d#R#S&d#T#f&d#f#g+}#g#o&dR,USwQnP!Q![&d!c!}&d#R#S&d#T#o&d~,gUnP!Q![&d!c!}&d#R#S&d#T#f&d#f#g,y#g#o&d~-OUnP!Q![&d!c!}&d#R#S&d#T#i&d#i#j-b#j#o&d~-gUnP!Q![&d!c!}&d#R#S&d#T#X&d#X#Y-y#Y#o&d~.QST~nP!Q![&d!c!}&d#R#S&d#T#o&d",tokenizers:[0,1],topRules:{ColumnDefinitionExpression:[0,1]},tokenPrec:393});var Xc=Wc.define({name:"VuuColumnExpression",parser:So.configure({props:[Kc({Column:eo.attributeValue,Function:eo.variableName,String:eo.string,Or:eo.emphasis,Operator:eo.operator})]})}),Hr=()=>new Uc(Xc);var ht=class{constructor(o){switch(this.value=o,typeof o){case"boolean":this.type="booleanLiteralExpression";break;case"number":this.type="numericLiteralExpression";break;default:this.type="stringLiteralExpression"}}toJSON(){return{type:this.type,value:this.value}}},xt=class{constructor(o){this.type="colExpression";this.column=o}toJSON(){return{type:this.type,column:this.column}}},to,we,yt=class{constructor(o="unknown"){ee(this,to,[{type:"unknown"},{type:"unknown"}]);ee(this,we,void 0);this.type="arithmeticExpression";pe(this,we,o)}get op(){return y(this,we)}set op(o){pe(this,we,o)}get expressions(){return y(this,to)}toJSON(){return{type:this.type,op:y(this,we),expressions:y(this,to)}}};to=new WeakMap,we=new WeakMap;var Be,wt=class{constructor(o){ee(this,Be,[]);this.type="callExpression";this.functionName=o}get expressions(){return y(this,Be)}get arguments(){return y(this,Be)}toJSON(){return{type:this.type,functionName:this.functionName,arguments:y(this,Be).map(o=>{var t;return(t=o.toJSON)==null?void 0:t.call(o)})}}};Be=new WeakMap;var no,Ve,Ie=class{constructor(){ee(this,no,[{type:"unknown"},{type:"unknown"}]);ee(this,Ve,"unknown");this.type="relationalExpression"}get op(){return y(this,Ve)}set op(o){pe(this,Ve,o)}get expressions(){return y(this,no)}toJSON(){return{type:this.type,op:y(this,Ve),expressions:y(this,no)}}};no=new WeakMap,Ve=new WeakMap;var ro,ze,Ae=class{constructor(o){ee(this,ro,[{type:"unknown"},{type:"unknown"}]);ee(this,ze,void 0);this.type="booleanCondition";pe(this,ze,o)}get op(){return y(this,ze)}get expressions(){return y(this,ro)}toJSON(){return{type:this.type,op:y(this,ze),expressions:y(this,ro).map(o=>{var t;return(t=o.toJSON)==null?void 0:t.call(o)})}}};ro=new WeakMap,ze=new WeakMap;var re,oo=class{constructor(o){ee(this,re,void 0);this.type="conditionalExpression";pe(this,re,[o?new Ae(o):new Ie,{type:"unknown"},{type:"unknown"}])}get expressions(){return y(this,re)}get condition(){return y(this,re)[0]}get truthyExpression(){return y(this,re)[1]}set truthyExpression(o){y(this,re)[1]=o}get falsyExpression(){return y(this,re)[2]}set falsyExpression(o){y(this,re)[2]=o}toJSON(){var o,t,n,r,i;return{type:this.type,condition:(t=(o=this.condition).toJSON)==null?void 0:t.call(o),truthyExpression:this.truthyExpression,falsyExpression:(i=(r=(n=this.falsyExpression)==null?void 0:n.toJSON)==null?void 0:r.call(n))!=null?i:this.falsyExpression}}};re=new WeakMap;var ye=e=>e.type==="unknown",Do=e=>e.type==="arithmeticExpression",Zc=e=>e.type==="callExpression",Ne=e=>e.type==="conditionalExpression",_c=e=>e.type==="relationalExpression"||e.type==="booleanCondition";var Yc=e=>e.type==="booleanCondition",Et=e=>(e==null?void 0:e.type)==="relationalExpression";var J=e=>{if(ye(e))return e;if(Et(e)){let[o,t]=e.expressions;if(K(o))return J(o);if(e.op==="unknown")return e;if(K(t))return J(t)}else if(_c(e)){let{expressions:o=[]}=e;for(let t of o)if(K(t))return J(t)}else if(Ne(e)){let{condition:o,truthyExpression:t,falsyExpression:n}=e;if(K(o))return J(o);if(K(t))return J(t);if(K(n))return J(n)}else if(Do(e)){let{expressions:o=[]}=e;for(let t of o)if(K(t))return J(t)}},Po=(e,o,t)=>{let{expressions:n=[]}=e;if(n.includes(o)){let r=n.indexOf(o);return n.splice(r,1,t),!0}else for(let r of n)if(Po(r,o,t))return!0;return!1},K=e=>ye(e)?!0:Ne(e)?K(e.condition)||K(e.truthyExpression)||K(e.falsyExpression):Et(e)||Yc(e)?e.op===void 0||e.expressions.some(o=>K(o)):!1,Mr=(e,o)=>{let t=J(e);t?t.expressions?t.expressions.push(o):console.warn("don't know how to treat targetExpression"):console.error("no target expression found")},S,Te,Tt=class{constructor(){ee(this,S,void 0);ee(this,Te,[])}setCondition(o){if(y(this,S)===void 0)this.addExpression(new oo(o));else if(Ne(y(this,S))){if(K(y(this,S).condition)){let t=o?new Ae(o):new Ie;this.addExpression(t)}else if(ye(y(this,S).truthyExpression))y(this,S).truthyExpression=new oo(o);else if(K(y(this,S).truthyExpression)){let t=o?new Ae(o):new Ie;this.addExpression(t)}else if(ye(y(this,S).falsyExpression))y(this,S).falsyExpression=new oo(o);else if(K(y(this,S).falsyExpression)){let t=o?new Ae(o):new Ie;this.addExpression(t)}}else console.error("setCondition called unexpectedly")}addExpression(o){if(y(this,Te).length>0){let t=y(this,Te).at(-1);t==null||t.arguments.push(o)}else if(y(this,S)===void 0)pe(this,S,o);else if(Do(y(this,S))){let t=J(y(this,S));t&&ye(t)&&Po(y(this,S),t,o)}else if(Ne(y(this,S))&&K(y(this,S))){let t=J(y(this,S));t&&ye(t)?Po(y(this,S),t,o):t&&Mr(t,o)}}setFunction(o){let t=new wt(o);this.addExpression(t),y(this,Te).push(t)}setColumn(o){this.addExpression(new xt(o))}setArithmeticOp(o){let t=o,n=y(this,S);Do(n)&&(n.op=t)}setRelationalOperator(o){let t=o;if(y(this,S)&&Ne(y(this,S))){let n=J(y(this,S));Et(n)?n.op=t:console.error(`no target expression found (op = ${o})`)}}setValue(o){let t=new ht(o);if(y(this,S)===void 0)pe(this,S,t);else if(Do(y(this,S)))this.addExpression(t);else if(Zc(y(this,S)))y(this,S).arguments.push(t);else if(Ne(y(this,S)))if(K(y(this,S))){let n=J(y(this,S));n&&ye(n)?Po(y(this,S),n,t):n&&Mr(n,t)}else console.log("what do we do with value, in a complete expression")}closeBrace(){y(this,Te).pop()}get expression(){return y(this,S)}toJSON(){var o;return(o=y(this,S))==null?void 0:o.toJSON()}};S=new WeakMap,Te=new WeakMap;var Lr=(e,o)=>{let t=new Tt,n=e.cursor();do{let{name:r,from:i,to:s}=n;switch(r){case"AndCondition":t.setCondition("and");break;case"OrCondition":t.setCondition("or");break;case"RelationalExpression":t.setCondition();break;case"ArithmeticExpression":t.addExpression(new yt);break;case"Column":{let l=o.substring(i,s);t.setColumn(l)}break;case"Function":{let l=o.substring(i,s);t.setFunction(l)}break;case"Times":case"Divide":case"Plus":case"Minus":{let l=o.substring(i,s);t.setArithmeticOp(l)}break;case"RelationalOperator":{let l=o.substring(i,s);t.setRelationalOperator(l)}break;case"False":case"True":{let l=o.substring(i,s);t.setValue(l==="true")}break;case"String":t.setValue(o.substring(i+1,s-1));break;case"Number":t.setValue(parseFloat(o.substring(i,s)));break;case"CloseBrace":t.closeBrace();break;default:}}while(n.next());return t.toJSON()};var Jc=So.configure({strict:!0}),Or=["Number","String"],Rt=[...Or,"AndCondition","ArithmeticExpression","BooleanOperator","RelationalOperatorOperator","CallExpression","CloseBrace","Column","Comma","ConditionalExpression","Divide","Equal","If","Minus","OpenBrace","OrCondition","ParenthesizedExpression","Plus","RelationalExpression","RelationalOperator","Times"],Fr=e=>{try{return Jc.parse(e),!0}catch{return!1}},St=e=>{let{lastChild:o}=e;for(;o&&!Rt.includes(o.name);)o=o.prevSibling,console.log(o==null?void 0:o.name);return o},Nr=e=>{if((e==null?void 0:e.name)==="RelationalExpression"){let{firstChild:o}=e,t=St(e);if((o==null?void 0:o.name)==="Column"&&typeof(t==null?void 0:t.name)=="string"&&Or.includes(t.name))return!0}return!1};import{HighlightStyle as qc,syntaxHighlighting as jc,tags as Dt}from"@vuu-ui/vuu-codemirror";var ep=qc.define([{tag:Dt.attributeValue,color:"var(--vuuFilterEditor-variableColor);font-weight: bold"},{tag:Dt.variableName,color:"var(--vuuFilterEditor-variableColor)"},{tag:Dt.comment,color:"green",fontStyle:"italic"}]),Ir=jc(ep);import{EditorView as op}from"@vuu-ui/vuu-codemirror";var Ar=op.theme({"&":{border:"solid 1px var(--salt-container-primary-borderColor)",color:"var(--vuuFilterEditor-color)",backgroundColor:"var(--vuuFilterEditor-background)"},".cm-content":{caretColor:"var(--vuuFilterEditor-cursorColor)"},"&.cm-focused .cm-cursor":{borderLeftColor:"var(--vuuFilterEditor-cursorColor)"},"&.cm-focused .cm-selectionBackground, ::selection":{backgroundColor:"var(--vuuFilterEditor-selectionBackground)"},".cm-selectionBackground, ::selection":{backgroundColor:"var(--vuuFilterEditor-selectionBackground)"},".cm-scroller":{fontFamily:"var(--vuuFilterEditor-fontFamily)"},".cm-completionLabel":{color:"var(--vuu-color-gray-50)"},".cm-completionMatchedText":{color:"var(--vuu-color-gray-80)",fontWeight:700,textDecoration:"none"},".cm-tooltip":{background:"var(--vuuFilterEditor-tooltipBackground)",border:"var(--vuuFilterEditor-tooltipBorder)",borderRadius:"4px",boxShadow:"var(--vuuFilterEditor-tooltipElevation)","&.cm-tooltip-autocomplete > ul":{fontFamily:"var(--vuuFilterEditor-fontFamily)",fontSize:"var(--vuuFilterEditor-fontSize)",maxHeight:"240px"},"&.cm-tooltip-autocomplete > ul > li":{height:"var(--vuuFilterEditor-suggestion-height)",padding:"0 3px",lineHeight:"var(--vuuFilterEditor-suggestion-height)"},"&.cm-tooltip-autocomplete li[aria-selected]":{background:"var(--vuuFilterEditor-suggestion-selectedBackground)",color:"var(--vuuFilterEditor-suggestion-selectedColor)"},"&.cm-tooltip-autocomplete li .cm-completionDetail":{color:"var(--vuuFilterEditor-suggestion-detailColor)"}}},{dark:!1});import{booleanJoinSuggestions as tp,getNamedParentNode as Br,getPreviousNode as np,getValue as ae,syntaxTree as rp}from"@vuu-ui/vuu-codemirror";import{useCallback as Vr}from"react";var ip=(e,o)=>o?e.map(t=>{var n;return{...t,apply:typeof t.apply=="function"?t.apply:`${o}${(n=t.apply)!=null?n:t.label}`}}):e,sp=e=>e===void 0?!1:["Times","Divide","Plus","Minus"].includes(e.name),io=e=>({apply:()=>{e==null||e()},label:"Done",boost:10}),$e=(e,o)=>{var r;let{lastChild:t}=e,{pos:n}=o;for(;t;)if(t.from<n&&Rt.includes(t.name)){if(t.name==="ParenthesizedExpression"){let s=(r=t.firstChild)==null?void 0:r.nextSibling;s&&(t=s)}return t}else t=t.prevSibling},zr=(e,o)=>{var t;if(e.name==="ArgList"){let n=e.prevSibling;if(n)return ae(n,o)}else if(e.name==="OpenBrace"){let n=(t=e.parent)==null?void 0:t.prevSibling;if((n==null?void 0:n.name)==="Function")return ae(n,o)}},$r=(e,o)=>{if(e.name==="RelationalExpression"){let t=St(e);if((t==null?void 0:t.name)==="RelationalOperator")return ae(t,o)}else{let t=e.prevSibling;if((t==null?void 0:t.name)==="RelationalOperator")return ae(t,o)}},Ht=(e,o)=>{var t;if(e.name==="RelationalExpression"){if(((t=e.firstChild)==null?void 0:t.name)==="Column")return ae(e.firstChild,o)}else{let n=e.prevSibling;if((n==null?void 0:n.name)==="Column")return ae(n,o);if((n==null?void 0:n.name)==="RelationalOperator")return Ht(n,o)}},Pt=async(e,o,t,n={})=>{let r=await o.getSuggestions(t,n),{startsWith:i=""}=n;return{from:e.pos-i.length,options:r}},kt=(e,o,t,n,r)=>{let i=$e(e,o);switch(i==null?void 0:i.name){case"If":return Pt(o,t,"expression",{prefix:"( "});case"OpenBrace":return Pt(o,t,"expression");case"Condition":return Pt(o,t,"expression",{prefix:", "});case"CloseBrace":if(n){let s=[io(r)];return{from:o.pos,options:s}}}},lp=(e,o)=>{let t=[io(o)];return{from:e.pos,options:t}},Qr=(e,o)=>{let t=Vr(async(n,r,i={})=>{let s=await e.getSuggestions(r,i),{startsWith:l=""}=i;return{from:n.pos-l.length,options:s}},[e]);return Vr(async n=>{var m,d;let{state:r,pos:i}=n,s=(m=n.matchBefore(/\w*/))!=null?m:{from:0,to:0,text:void 0},a=rp(r).resolveInner(i,-1),c=r.doc.toString(),p=Fr(c);switch(a.name){case"If":return t(n,"expression",{prefix:"( "});case"Condition":{let u=$e(a,n);if((u==null?void 0:u.name)==="Column"){let f=np(u);if((f==null?void 0:f.name)!=="RelationalOperator")return t(n,"condition-operator",{columnName:ae(u,r)})}else if((u==null?void 0:u.name)==="RelationalOperator")return t(n,"expression")}break;case"ConditionalExpression":return kt(a,n,e);case"RelationalExpression":{if(Nr(a))return{from:n.pos,options:tp.concat({label:", <truthy expression>, <falsy expression>",apply:", "})};{let u=$r(a,r),f=Ht(a,r);if(u)return t(n,"expression");{let C=await e.getSuggestions("condition-operator",{columnName:f});return{from:n.pos,options:C}}}}break;case"RelationalOperator":return t(n,"expression");case"String":{let u=$r(a,r),f=Ht(a,r),{from:C,to:g}=a;if(g-C===2&&n.pos===C+1){if(f&&u)return t(n,"columnValue",{columnName:f,operator:u,startsWith:s.text})}else if(g-C>2&&n.pos===g)return t(n,"expression",{prefix:", "})}break;case"ArithmeticExpression":{let u=$e(a,n);if((u==null?void 0:u.name)==="Column")return t(n,"expression");if(sp(u)){let f=u.name;return t(n,"column",{operator:f})}}break;case"OpenBrace":{let u=zr(a,r);return t(n,"expression",{functionName:u})}break;case"ArgList":{let u=zr(a,r),f=$e(a,n),C=(f==null?void 0:f.name)==="OpenBrace"||(f==null?void 0:f.name)==="Comma"?void 0:",",g=await e.getSuggestions("expression",{functionName:u});return g=C?ip(g,", "):g,(f==null?void 0:f.name)!=="OpenBrace"&&(f==null?void 0:f.name)!=="Comma"&&(g=[{apply:") ",boost:10,label:"Done - no more arguments"}].concat(g)),{from:n.pos,options:g}}case"Equal":if(c.trim()==="=")return t(n,"expression");break;case"ParenthesizedExpression":case"ColumnDefinitionExpression":if(n.pos===0)return t(n,"expression");{let u=$e(a,n);if((u==null?void 0:u.name)==="Column"){if(p){let f=[io(o.current)],C=ae(u,r),g=await e.getSuggestions("operator",{columnName:C});return{from:n.pos,options:f.concat(g)}}}else if((u==null?void 0:u.name)==="CallExpression"){if(p)return{from:n.pos,options:[io(o.current)]}}else if((u==null?void 0:u.name)==="ArithmeticExpression"){if(p){let f=[io(o.current)],C=$e(u,n);if((C==null?void 0:C.name)==="Column"){let g=ae(C,r),v=await e.getSuggestions("operator",{columnName:g});f=f.concat(v)}return{from:n.pos,options:f}}}else if((u==null?void 0:u.name)==="ConditionalExpression")return kt(u,n,e,p,o.current);break}case"Column":if(await e.isPartialMatch("expression",void 0,s.text))return t(n,"expression",{startsWith:s.text});break;case"Comma":{let u=Br(a);if((u==null?void 0:u.name)==="ConditionalExpression")return t(n,"expression")}break;case"CloseBrace":{let u=Br(a);if((u==null?void 0:u.name)==="ConditionalExpression")return kt(u,n,e,p,o.current);if((u==null?void 0:u.name)==="ArgList"&&p)return lp(n,o.current)}break;default:((d=a==null?void 0:a.prevSibling)==null?void 0:d.name)==="FilterClause"&&console.log("looks like we ight be a or|and operator")}},[t,o,e])};var ko=e=>{if(e.current==null)throw Error("EditorView not defined");return e.current},fp=()=>"vuuSuggestion",Cp=()=>console.log("noooop"),vp=e=>"expressionType"in e,bp=e=>{if(vp(e)){let o=Xr("div","expression-type-container"),t=Xr("span","expression-type",e.expressionType);return o.appendChild(t),o}else return null},Zr=({onChange:e,onSubmitExpression:o,source:t,suggestionProvider:n})=>{let r=Mt(null),i=Mt(Cp),s=Mt(),l=Qr(n,i),[a,c,p]=gp(()=>{let d=()=>{let v=ko(s),h=v.state.doc.toString(),T=cp(v.state,v.state.doc.length,5e3);if(T){let F=Lr(T,h);return[h,F]}else return["",void 0]},u=()=>{ko(s).setState(g())},f=()=>{let[v,h]=d();o==null||o(v,h)},C=v=>Wr.of([{key:v,run(){return Kr(ko(s)),!0}}]),g=()=>Gr.create({doc:t,extensions:[pp,ap({addToOptions:[{render:bp,position:70}],override:[l],optionClass:fp}),Hr(),Wr.of(up),C("ArrowDown"),Ur.updateListener.of(v=>{let h=ko(s);if(v.docChanged){Kr(h);let T=h.state.doc.toString();e==null||e(T)}}),Gr.transactionFilter.of(v=>v.newDoc.lines>1?[]:v),Ar,Ir]});return i.current=()=>{f()},[g,u,f]},[l,e,o,t]);dp(()=>{if(!r.current)throw Error("editor not in dom");return s.current=new Ur({state:a(),parent:r.current}),()=>{var d;(d=s.current)==null||d.destroy()}},[l,a]);let m=mp(()=>{p()},[p]);return{editorRef:r,clearInput:c,onBlur:m}};import{jsx as yp}from"react/jsx-runtime";var xp="vuuColumnExpressionInput",Lt=hp(({onChange:e,onSubmitExpression:o,source:t="",suggestionProvider:n})=>{let{editorRef:r,onBlur:i}=Zr({onChange:e,onSubmitExpression:o,source:t,suggestionProvider:n});return yp("div",{className:`${xp}`,onBlur:i,ref:r})},(e,o)=>e.source===o.source);Lt.displayName="ColumnExpressionInput";import{AnnotationType as wp,getRelationalOperators as Tp,numericOperators as Ep,stringOperators as Rp,toSuggestions as Sp}from"@vuu-ui/vuu-codemirror";import{getTypeaheadParams as Dp,useTypeaheadSuggestions as Pp}from"@vuu-ui/vuu-data-react";import{isNumericColumn as Ft,isTextColumn as kp}from"@vuu-ui/vuu-utils";import{useCallback as Ot,useRef as Hp}from"react";var Qe=[{accepts:["boolean"],description:"Applies boolean and operator across supplied parameters to returns a single boolean result",example:{expression:'and(ccy="EUR",quantity=0)',result:"true | false"},name:"and",params:{description:"( boolean, [ boolean* ] )"},type:"boolean"},{accepts:"string",description:"Returns multiple string values as a single joined string. Arguments may be string literal values, string columns or other string expressions. Non string arguments may also be included, these will be converted to strings.",example:{expression:'concatenate("example", "-test")',result:'"example-test"'},name:"concatenate",params:{description:"( string, string, [ string* ] )"},type:"string"},{accepts:["string","string"],description:"Tests a string value to determine whether it contains a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> contains one or more occurrences of <target subscring>",example:{expression:'contains("Royal Bank of Scotland", "bank")',result:"true"},name:"contains",params:{description:"( string )"},type:"boolean"},{accepts:["string","number"],description:"Returns the leftmost <number> characters from <string>. First argument may be a string literal, string column or other string expression.",example:{expression:'left("USD Benchmark Report", 3)',result:'"USD"'},name:"left",params:{count:2,description:"( string, number )"},type:"string"},{accepts:"string",description:"Returns the number of characters in <string>. Argument may be a string literal, string column or other string expression.",example:{expression:'len("example")',result:"7"},name:"len",params:{description:"(string)"},type:"number"},{accepts:"string",description:"Convert a string value to lowercase. Argument may be a string column or other string expression.",example:{expression:'lower("examPLE")',result:'"example"'},name:"lower",params:{description:"( string )"},type:"string"},{accepts:["boolean"],description:"Applies boolean or operator across supplied parameters to returns a single boolean result",example:{expression:'or(status="cancelled",quantity=0)',result:"true | false"},name:"or",params:{description:"( boolean, [ boolean* ] )"},type:"boolean"},{accepts:"string",description:"Convert a string value to uppercase. Argument may be a string column or other string expression.",example:{expression:'upper("example")',result:'"EXAMPLE"'},name:"upper",params:{description:"( string )"},type:"string"},{accepts:["string","number"],description:"Returns the rightmost <number> characters from <string>. First argument may be a string literal, string column or other string expression.",example:{expression:"blah",result:"blah"},name:"right",params:{description:"( string )"},type:"string"},{accepts:["string","string","string"],description:"Replace characters within a string. Accepts three arguments: source text, text to replace and replacement text. Returns a copy of <source text> with any occurrences of <text to replace> replaced by <replacement text>",example:{expression:"blah",result:"blah"},name:"replace",params:{description:"( string )"},type:"string"},{accepts:"number",description:"Converts a number to a string.",example:{expression:"blah",result:"blah"},name:"text",params:{description:"( string )"},type:"string"},{accepts:"string",description:"Tests a string value to determine whether it starts with a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> starts with <target subscring>.",example:{expression:"blah",result:"blah"},name:"starts",params:{description:"( string )"},type:"boolean"},{accepts:"string",description:"Tests a string value to determine whether it ends with a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> ends with <target subscring>.",example:{expression:"blah",result:"blah"},name:"ends",params:{description:"( string )"},type:"boolean"},{accepts:"number",description:"blah",example:{expression:"blah",result:"blah"},name:"min",params:{description:"( string )"},type:"number"},{accepts:"number",description:"blah",example:{expression:"blah",result:"blah"},name:"max",params:{description:"( string )"},type:"number"},{accepts:"number",description:"blah",example:{expression:"blah",result:"blah"},name:"sum",params:{description:"( string )"},type:"number"},{accepts:"number",description:"blah",example:{expression:"blah",result:"blah"},name:"round",params:{description:"( string )"},type:"number"},{accepts:"any",description:"blah",example:{expression:"blah",result:"blah"},name:"or",params:{description:"( string )"},type:"boolean"},{accepts:"any",description:"blah",example:{expression:"blah",result:"blah"},name:"and",params:{description:"( string )"},type:"boolean"},{accepts:"any",description:"Return one of two possible result values, depending on the evaluation of a filter expression. If <filterExpression> resolves to true, result is <expression1>, otherwise <expression2>. ",example:{expression:"blah",result:"blah"},name:"if",params:{description:"( filterExpression, expression1, expression 2)"},type:"variable"}];import{createEl as ue}from"@vuu-ui/vuu-utils";var _r=({name:e,description:o,example:t,params:n,type:r})=>{let i=ue("div","vuuFunctionDoc"),s=ue("div","function-heading"),l=ue("span","function-name",e),a=ue("span","param-list",n.description),c=ue("span","function-type",r);s.appendChild(l),s.appendChild(a),s.appendChild(c);let p=ue("p",void 0,o);if(i.appendChild(s),i.appendChild(p),t){let m=ue("div","example-container"),d=ue("div","example-expression",t.expression),u=ue("div","example-result",t.result);m.appendChild(d),i.appendChild(m),i.appendChild(u)}return i};var Mp=[],Ee=e=>e.map(o=>{var t;return{...o,apply:((t=o.apply)!=null?t:o.label)+" "}}),Lp=(e,{functionName:o,operator:t})=>{if(t)return e.filter(Ft);if(o){let n=Qe.find(r=>r.name===o);if(n)switch(n.accepts){case"string":return e.filter(kp);case"number":return e.filter(Ft);default:return e}}return e},Yr=(e,o)=>Lp(e,o).map(n=>{var i;let r=(i=n.label)!=null?i:n.name;return{apply:o.prefix?`${o.prefix}${n.name}`:n.name,label:r,boost:5,type:"column",expressionType:n.serverDataType}}),Op=[{apply:"* ",boost:2,label:"*",type:"operator"},{apply:"/ ",boost:2,label:"/",type:"operator"},{apply:"+ ",boost:2,label:"+",type:"operator"},{apply:"- ",boost:2,label:"-",type:"operator"}],Fp=e=>e===void 0||Ft(e)?Op:Mp,Np=e=>{switch(e.serverDataType){case"string":case"char":return Ee(Rp);case"int":case"long":case"double":return Ee(Ep)}},Nt=e=>({apply:`${e.name}( `,boost:2,expressionType:e.type,info:()=>_r(e),label:e.name,type:"function"}),Ip=e=>{if(e){if(typeof e.accepts=="string")return e.accepts;if(Array.isArray(e.accepts))return e.accepts.every(o=>o==="string")?"string":"any"}return"any"},Ap=Qe.map(Nt),Bp=({functionName:e})=>{if(e){let o=Qe.find(n=>n.name===e),t=Ip(o);if(o)switch(t){case"string":return Qe.filter(n=>n.type==="string"||n.type==="variable").map(Nt);case"number":return Qe.filter(n=>n.type==="number"||n.type==="variable").map(Nt);default:}}return Ap},Vp={},Jr=({columns:e,table:o})=>{let t=Ot(l=>l?e.find(a=>a.name===l):void 0,[e]),n=Hp(),r=Pp(),i=Ot(async(l,a=Vp)=>{let{columnName:c,functionName:p,operator:m,prefix:d}=a;switch(l){case"expression":{let u=await Ee(Yr(e,{functionName:p,prefix:d})).concat(Bp(a));return n.current=u}case"column":{let u=await Yr(e,a);return n.current=Ee(u)}case"operator":{let u=await Fp(t(c));return n.current=Ee(u)}case"relational-operator":{let u=await Tp(t(c));return n.current=Ee(u)}case"condition-operator":{let u=t(c);if(u){let f=await Np(u);if(f)return n.current=Ee(f)}}break;case"columnValue":if(c&&m){let u=Dp(o,c),f=await r(u);return n.current=Sp(f,{suffix:""}),n.current.forEach(C=>{C.apply=(g,v,h)=>{let T=new wp,F=h+v.label.length+1;g.dispatch({changes:{from:h,insert:v.label},selection:{anchor:F,head:F},annotations:T.of(v)})}}),n.current}break}return[]},[e,t,r,o]),s=Ot(async(l,a,c)=>{let{current:p}=n,m=!1,d=p||await i(l,{columnName:a});if(c&&d)for(let u of d){if(u.label===c)return!1;u.label.startsWith(c)&&(m=!0)}return m},[i]);return{getSuggestions:i,isPartialMatch:s}};import{getCalculatedColumnDetails as zp,setCalculatedColumnExpression as $p,setCalculatedColumnName as Qp,setCalculatedColumnType as Gp}from"@vuu-ui/vuu-utils";import{useCallback as Ho,useRef as Up,useState as Wp}from"react";var Kp=e=>{let[o,t,n]=zp(e);return n===""?{...e,name:`${o}:string:${t}`}:e},qr=({column:e,onChangeName:o})=>{let[t,n]=Wp(Kp(e)),r=Up(e),i=Ho(c=>{r.current=c,n(c)},[]),s=Ho(c=>{let{value:p}=c.target,m=Qp(t,p);i(m),o==null||o(m.name)},[t,o,i]),l=Ho(c=>{let p=c.trim(),{current:m}=r,d=$p(m,p);i(d),o==null||o(d.name)},[o,i]),a=Ho((c,p)=>{if(typeof p=="string"){let m=Gp(t,p);i(m),o==null||o(m.name)}},[t,o,i]);return{column:t,onChangeExpression:l,onChangeName:s,onChangeType:a}};import{jsx as ge,jsxs as Mo}from"react/jsx-runtime";var ei="vuuColumnExpressionPanel",oi=({column:e,onChangeName:o,tableConfig:t,vuuTable:n})=>{let r=jr(null),{column:i,onChangeExpression:s,onChangeName:l,onChangeType:a}=qr({column:e,onChangeName:o}),c=jr(Zp(i)),p=Jr({columns:t.columns,table:n}),m=qp(()=>{var d,u;r.current&&((u=(d=r.current)==null?void 0:d.querySelector("button"))==null||u.focus())},[]);return Mo("div",{className:ei,children:[ge("div",{className:"vuuColumnSettingsPanel-header",children:ge("span",{children:"Calculation"})}),Mo(It,{"data-field":"column-name",children:[ge(At,{children:"Column Name"}),ge(Jp,{className:"vuuInput",onChange:l,value:_p(i)})]}),Mo(It,{"data-field":"column-expression",children:[ge(At,{children:"Expression"}),ge(Lt,{onChange:s,onSubmitExpression:m,source:c.current,suggestionProvider:p})]}),Mo(It,{"data-field":"type",children:[ge(At,{children:"Column type"}),ge(Xp,{className:`${ei}-type`,onSelectionChange:a,ref:r,selected:Yp(i)||null,source:["double","long","string"],width:"100%"})]})]})};import{Dropdown as Em}from"@vuu-ui/vuu-ui-controls";import{getCellRendererOptions as Rm,getConfigurationEditor as Sm,isColumnTypeRenderer as ui,isTypeDescriptor as ci}from"@vuu-ui/vuu-utils";import{FormField as Dm,FormFieldLabel as Pm}from"@salt-ds/core";import pi from"clsx";import{useCallback as km,useMemo as Qt}from"react";import{FormField as Bt,FormFieldLabel as Vt,Input as jp,Switch as ti}from"@salt-ds/core";import{getTypeFormattingFromColumn as em}from"@vuu-ui/vuu-utils";import{useCallback as Lo,useState as om}from"react";import{jsx as Ge,jsxs as Oo}from"react/jsx-runtime";var tm="vuuFormattingSettings",Fo=({column:e,onChangeFormatting:o})=>{var a,c,p;let[t,n]=om(em(e)),r=Lo(m=>{(m.key==="Enter"||m.key==="Tab")&&o(t)},[t,o]),i=Lo(m=>{let{value:d}=m.target,u=d===""||isNaN(parseInt(d))?void 0:parseInt(d),f={...t,decimals:u};n(f)},[t]),s=Lo(m=>{let{checked:d}=m.target,u={...t,alignOnDecimals:d};n(u),o(u)},[t,o]),l=Lo(m=>{let{checked:d}=m.target,u={...t,zeroPad:d};n(u),o(u)},[t,o]);return Oo("div",{className:tm,children:[Oo(Bt,{"data-field":"decimals",children:[Ge(Vt,{children:"Number of decimals"}),Ge(jp,{className:"vuuInput",onChange:i,onKeyDown:r,value:(a=t.decimals)!=null?a:""})]}),Oo(Bt,{labelPlacement:"left",children:[Ge(Vt,{children:"Align on decimals"}),Ge(ti,{checked:(c=t.alignOnDecimals)!=null?c:!1,onChange:s,value:"align-decimals"})]}),Oo(Bt,{labelPlacement:"left",children:[Ge(Vt,{children:"Zero pad decimals"}),Ge(ti,{checked:(p=t.zeroPad)!=null?p:!1,onChange:l,value:"zero-pad"})]})]})};import{useCallback as fm}from"react";import{FormField as Cm,FormFieldLabel as vm,ToggleButton as bm,ToggleButtonGroup as hm}from"@salt-ds/core";import{isDateTimeColumn as xm,isTypeDescriptor as ym}from"@vuu-ui/vuu-utils";import{useCallback as zt,useMemo as nm,useState as rm}from"react";import{Dropdown as im}from"@vuu-ui/vuu-ui-controls";import{defaultPatternsByType as ni,fallbackDateTimePattern as sm,getTypeFormattingFromColumn as lm,supportedDateTimePatterns as am}from"@vuu-ui/vuu-utils";import{FormField as ri,FormFieldLabel as ii,ToggleButton as um,ToggleButtonGroup as cm}from"@salt-ds/core";import{Fragment as gm,jsx as so,jsxs as $t}from"react/jsx-runtime";var si=({column:e,onChangeFormatting:o})=>{var p,m;let t=lm(e),{pattern:n=sm}=t,r=nm(()=>dm(n),[n]),[i,s]=rm({time:(p=n.time)!=null?p:ni.time,date:(m=n.date)!=null?m:ni.date}),l=zt(d=>o({...t,pattern:d}),[o,t]),a=zt(d=>(u,f)=>{let C={...n!=null?n:{},[d]:f};s(g=>{var v,h;return{time:(v=C.time)!=null?v:g.time,date:(h=C.date)!=null?h:g.date}}),l(C)},[l,n]),c=zt(d=>{var f,C,g,v;let u=d.currentTarget.value;switch(u){case"time":return l({[u]:(f=n[u])!=null?f:i[u]});case"date":return l({[u]:(C=n[u])!=null?C:i[u]});case"both":return l({time:(g=n.time)!=null?g:i.time,date:(v=n.date)!=null?v:i.date})}},[l,n,i]);return $t(gm,{children:[$t(ri,{labelPlacement:"left",children:[so(ii,{children:"Display"}),so(cm,{className:"vuuToggleButtonGroup",onChange:c,value:r,children:mm.map(d=>so(um,{value:d,children:d.toUpperCase()},d))})]}),["date","time"].filter(d=>!!n[d]).map(d=>$t(ri,{labelPlacement:"left",children:[so(ii,{children:`${pm[d]} pattern`}),so(im,{onSelectionChange:a(d),selected:n[d],source:am[d],width:"100%"})]},d))]})},pm={date:"Date",time:"Time"},mm=["date","time","both"];function dm(e){return e.time?e.date?"both":"time":"date"}import{jsx as lo,jsxs as li}from"react/jsx-runtime";var wm="vuuLongColumnFormattingSettings",ai=e=>{let{column:o,onChangeType:t}=e,n=ym(o.type)?o.type.name:o.type,r=fm(i=>{let s=i.currentTarget.value;t(s)},[t]);return li("div",{className:wm,children:[li(Cm,{children:[lo(vm,{children:"Type inferred as"}),lo(hm,{className:"vuuToggleButtonGroup",onChange:r,value:n!=null?n:"number",children:Tm.map(i=>lo(bm,{value:i,children:i.toUpperCase()},i))})]}),xm(o)?lo(si,{...e,column:o}):lo(Fo,{...e})]})},Tm=["number","date/time"];import{jsx as Ue,jsxs as Ut}from"react/jsx-runtime";var Gt="vuuColumnFormattingPanel",Hm=e=>{var o;return(o=e.label)!=null?o:e.name},mi=({availableRenderers:e,className:o,column:t,onChangeFormatting:n,onChangeType:r,onChangeRendering:i,...s})=>{let l=Qt(()=>Mm({column:t,onChangeFormatting:n,onChangeType:r}),[t,n,r]),a=Qt(()=>{let{type:d}=t;if(ci(d)&&ui(d.renderer)){let u=Rm(d.renderer.name);return Sm(u==null?void 0:u.configEditor)}},[t]),c=Qt(()=>{let{type:d}=t,[u]=e,f=ci(d)&&ui(d.renderer)?d.renderer.name:void 0,C=e.find(g=>g.name===f);return C!=null?C:u},[e,t]),p=km((d,u)=>{let f={name:u.name};i==null||i(f)},[i]),{serverDataType:m="string"}=t;return Ut("div",{...s,className:"vuuColumnSettingsPanel-header",children:[Ue("div",{children:"Formatting"}),Ut(Dm,{children:[Ue(Pm,{children:`Renderer (data type ${t.serverDataType})`}),Ue(Em,{className:pi(`${Gt}-renderer`),itemToString:Hm,onSelectionChange:p,selected:c,source:e,width:"100%"})]}),Ut("div",{className:pi(Gt,o,`${Gt}-${m}`),children:[l,a?Ue(a,{column:t,onChangeRendering:i}):null]})]})};function Mm(e){let{column:o}=e;switch(o.serverDataType){case"double":case"int":return Ue(Fo,{...e});case"long":return Ue(ai,{...e});default:return null}}import Lm from"clsx";import{getCalculatedColumnDetails as Om,isCalculatedColumn as Fm}from"@vuu-ui/vuu-utils";import{jsx as Re,jsxs as Nm}from"react/jsx-runtime";var We="vuuColumnNameLabel",di=({column:e,onClick:o})=>{if(Fm(e.name)){let[t,n,r]=Om(e),i=t||"name",s="=expression",l=i==="name"?`${We}-placeholder`:void 0,a=r===""?`${We}-placeholder`:void 0;return Nm("div",{className:Lm(We,`${We}-calculated`),onClick:o,children:[Re("span",{className:l,children:i}),Re("span",{children:":"}),Re("span",{children:n||"string"}),Re("span",{children:":"}),Re("span",{className:a,children:s}),Re("span",{className:`${We}-edit`,"data-icon":"edit"})]})}else return Re("div",{className:We,children:e.name})};import{getRegisteredCellRenderers as No,isValidColumnAlignment as Im,isValidPinLocation as Am,setCalculatedColumnName as Bm,updateColumnRenderProps as Vm,updateColumnFormatting as zm,updateColumnType as $m}from"@vuu-ui/vuu-utils";import{useCallback as q,useEffect as Qm,useMemo as Gm,useRef as Um,useState as gi}from"react";var Wm=[{description:"Default formatter for columns with data type integer",label:"Default Renderer (int, long)",name:"default-int"},...No("int")],Km=[{description:"Default formatter for columns with data type double",label:"Default Renderer (double)",name:"default-double"},...No("double")],fi=[{description:"Default formatter for columns with data type string",label:"Default Renderer (string)",name:"default-string"},...No("string")],Xm=[...No("boolean")],Zm=e=>{switch(e.serverDataType){case"char":case"string":return fi;case"int":case"long":return Wm;case"double":return Km;case"boolean":return Xm;default:return fi}},_m=e=>{let o=e.closest(".saltFormField");if(o&&o.dataset.field){let{dataset:{field:t}}=o;return t}else throw Error("named form field not found")},Ym=(e,o)=>{if(o.name==="::")return o;{let t=e.find(n=>n.name===o.name);if(t)return t;throw Error(`columns does not contain column ${name}`)}},Ke=(e,o)=>({...e,columns:e.columns.map(t=>t.name===o.name?o:t)}),Ci=({column:e,onCancelCreateColumn:o,onConfigChange:t,onCreateCalculatedColumn:n,tableConfig:r})=>{let[i,s]=gi(Ym(r.columns,e)),l=Um(i),[a,c]=gi(i.name==="::"),p=q(()=>{l.current=i,c(!0)},[i]);Qm(()=>{s(e),c(e.name==="::")},[e]);let m=Gm(()=>Zm(i),[i]),d=q(()=>{t(Ke(r,i))},[i,t,r]),u=q(k=>{let D=k.target,$=_m(D),{value:B}=D;switch($){case"column-label":s(A=>({...A,label:B}));break;case"column-name":s(A=>Bm(A,B));break;case"column-width":s(A=>({...A,width:parseInt(B)}));break;case"column-alignment":if(Im(B)){let A={...i,align:B||void 0};s(A),t(Ke(r,A))}break;case"column-pin":if(Am(B)){let A={...i,pin:B||void 0};s(A),t(Ke(r,A));break}}},[i,t,r]),f=q(k=>{s(D=>({...D,name:k}))},[]),C=q(k=>{let D=zm(i,k);s(D),t(Ke(r,D))},[i,t,r]),g=q(k=>{let D=$m(i,k);s(D),t(Ke(r,D))},[i,t,r]),v=q(k=>{if(k){let D=Vm(i,k);s(D),t(Ke(r,D))}},[i,t,r]),h=q(({moveBy:k})=>{let{columns:D}=r,$=D.indexOf(i)+k,B=D[$];B&&s(B)},[i,r]),T=q(()=>{h({moveBy:1})},[h]),F=q(()=>{h({moveBy:-1})},[h]),O=q(()=>{n(i)},[i,n]),N=q(()=>{e.name==="::"?o():(l.current!==void 0&&l.current!==i&&s(l.current),c(!1))},[i,e.name,o]);return{availableRenderers:m,editCalculatedColumn:a,column:i,navigateNextColumn:T,navigatePrevColumn:F,onCancel:N,onChange:u,onChangeCalculatedColumnName:f,onChangeFormatting:C,onChangeRendering:v,onChangeType:g,onEditCalculatedColumn:p,onInputCommit:d,onSave:O}};import{jsx as Q,jsxs as ce}from"react/jsx-runtime";var fe="vuuColumnSettingsPanel",od=e=>{let{name:o,label:t}=e;return jm(o)?t!=null?t:Jm(e):t!=null?t:o},E1=({column:e,onCancelCreateColumn:o,onConfigChange:t,onCreateCalculatedColumn:n,tableConfig:r,vuuTable:i})=>{let s=e.name==="::",{availableRenderers:l,editCalculatedColumn:a,column:c,navigateNextColumn:p,navigatePrevColumn:m,onCancel:d,onChange:u,onChangeCalculatedColumnName:f,onChangeFormatting:C,onChangeRendering:g,onChangeType:v,onEditCalculatedColumn:h,onInputCommit:T,onSave:F}=Ci({column:e,onCancelCreateColumn:o,onConfigChange:t,onCreateCalculatedColumn:n,tableConfig:r}),{serverDataType:O,align:N=qm(O),pin:k,width:D}=c;return ce("div",{className:ed(fe,{[`${fe}-editing`]:a}),children:[Q("div",{className:`${fe}-header`,children:Q(di,{column:c,onClick:h})}),a?Q(oi,{column:c,onChangeName:f,tableConfig:r,vuuTable:i}):null,ce(Ao,{"data-field":"column-label",children:[Q(Bo,{children:"Column Label"}),Q(vi,{className:"vuuInput",onChange:u,onCommit:T,value:od(c)})]}),ce(Ao,{"data-field":"column-width",children:[Q(Bo,{children:"Column Width"}),Q(vi,{className:"vuuInput",onChange:u,value:D,onCommit:T})]}),ce(Ao,{"data-field":"column-alignment",children:[Q(Bo,{children:"Alignment"}),ce(bi,{className:"vuuToggleButtonGroup",onChange:u,value:N,children:[Q(Xe,{"data-icon":"align-left",className:"vuuIconToggleButton",value:"left"}),Q(Xe,{"data-icon":"align-right",className:"vuuIconToggleButton",value:"right"})]})]}),ce(Ao,{"data-field":"column-pin",children:[Q(Bo,{children:"Pin Column"}),ce(bi,{className:"vuuToggleButtonGroup",onChange:u,value:k!=null?k:"",children:[Q(Xe,{className:"vuuIconToggleButton","data-icon":"cross-circle",value:""}),Q(Xe,{className:"vuuIconToggleButton","data-icon":"pin-left",value:"left"}),Q(Xe,{className:"vuuIconToggleButton","data-icon":"pin-float",value:"floating"}),Q(Xe,{className:"vuuIconToggleButton","data-icon":"pin-right",value:"right"})]})]}),Q(mi,{availableRenderers:l,column:c,onChangeFormatting:C,onChangeRendering:g,onChangeType:v}),a?ce("div",{className:"vuuColumnSettingsPanel-buttonBar","data-align":"right",children:[Q(Io,{className:`${fe}-buttonCancel`,onClick:d,tabIndex:-1,children:"cancel"}),Q(Io,{className:`${fe}-buttonSave`,onClick:F,variant:"cta",children:"save"})]}):ce("div",{className:`${fe}-buttonBar`,"data-align":s?"right":void 0,children:[Q(Io,{className:`${fe}-buttonNavPrev`,variant:"secondary","data-icon":"arrow-left",onClick:m,children:"PREVIOUS"}),Q(Io,{className:`${fe}-buttonNavNext`,variant:"secondary","data-icon":"arrow-right",onClick:p,children:"NEXT"})]})]})};import td from"clsx";import{useEffect as nd,useState as hi}from"react";import{jsx as Ze,jsxs as rd}from"react/jsx-runtime";var ao="vuuDatasourceStats",Wt=new Intl.NumberFormat,N1=({className:e,dataSource:o})=>{let[t,n]=hi(o.range),[r,i]=hi(o.size);nd(()=>{i(o.size),o.on("resize",i),o.on("range",n)},[o]);let s=td(ao,e),l=Wt.format(t.from+1),a=Wt.format(Math.min(t.to,r)),c=Wt.format(r);return rd("div",{className:s,children:[Ze("span",{className:`${ao}-label`,children:"Row count"}),Ze("span",{className:`${ao}-range`,children:l}),Ze("span",{children:"-"}),Ze("span",{className:`${ao}-range`,children:a}),Ze("span",{children:"of"}),Ze("span",{className:`${ao}-size`,children:c})]})};import{Button as gd,FormField as Kt,FormFieldLabel as Xt,Input as fd,ToggleButton as _e,ToggleButtonGroup as Cd}from"@salt-ds/core";import{addColumnToSubscribedColumns as id,isCalculatedColumn as sd,moveItem as ld,subscribedOnly as ad,useLayoutEffectSkipFirst as ud}from"@vuu-ui/vuu-utils";import{useCallback as Vo,useMemo as cd,useState as pd}from"react";var md=(e,o)=>{let t=[];for(let{name:n}of e){let r=o.find(i=>i.name===n);r&&t.push(r)}return t},dd=(e,o)=>e.map(({name:t,serverDataType:n})=>{let r=o.find(i=>i.name===t);return{hidden:r==null?void 0:r.hidden,isCalculated:sd(t),label:r==null?void 0:r.label,name:t,serverDataType:n,subscribed:r!==void 0}}),xi=({availableColumns:e,onConfigChange:o,onDataSourceConfigChange:t,tableConfig:n})=>{let[{availableColumns:r,tableConfig:i},s]=pd({availableColumns:e,tableConfig:n}),l=cd(()=>dd(r,i.columns),[r,i.columns]),a=Vo((u,f)=>{s(C=>{let g=ld(C.availableColumns,u,f),v=md(g,i.columns);return{availableColumns:g,tableConfig:{...C.tableConfig,columns:v}}})},[i.columns]),c=Vo((u,f,C)=>{let g=l.find(v=>v.name===u);if(f==="subscribed")if(g!=null&&g.subscribed){let v=i.columns.filter(h=>h.name!==u).map(h=>h.name);s(h=>({...h,tableConfig:{...i,columns:i.columns.filter(ad(v))}})),t({columns:v})}else{let v={...i,columns:id(i.columns,r,u)};s(T=>({...T,tableConfig:v}));let h=v.columns.map(T=>T.name);t({columns:h})}else if(g!=null&&g.subscribed){let v=i.columns.find(h=>h.name===u);if(v){let h=vo(i,{type:"column-prop",property:f,column:v,value:C});s(T=>({...T,tableConfig:h}))}}},[r,l,t,i]),p=Vo(u=>{let{value:f}=u.target,C=f==="0"?void 0:f==="1"?"capitalize":"uppercase";s(g=>({...g,tableConfig:{...g.tableConfig,columnFormatHeader:C}}))},[]),m=Vo(u=>{let{ariaChecked:f,value:C}=u.target;s(g=>({...g,tableConfig:{...g.tableConfig,[C]:f!=="true"}}))},[]);ud(()=>{o==null||o(i)},[o,i]);let d=i.columnFormatHeader===void 0?0:i.columnFormatHeader==="capitalize"?1:2;return{columnItems:l,columnLabelsValue:d,onChangeColumnLabels:p,onChangeTableAttribute:m,onColumnChange:c,onMoveListItem:a,tableConfig:i}};import{jsx as _,jsxs as Se}from"react/jsx-runtime";var Zt="vuuTableSettingsPanel",q1=({availableColumns:e,onAddCalculatedColumn:o,onConfigChange:t,onDataSourceConfigChange:n,onNavigateToColumn:r,tableConfig:i})=>{var u,f,C;let{columnItems:s,columnLabelsValue:l,onChangeColumnLabels:a,onChangeTableAttribute:c,onColumnChange:p,onMoveListItem:m,tableConfig:d}=xi({availableColumns:e,onConfigChange:t,onDataSourceConfigChange:n,tableConfig:i});return Se("div",{className:Zt,children:[Se(Kt,{children:[_(Xt,{children:"Column Labels"}),Se(Cd,{className:"vuuToggleButtonGroup",onChange:a,value:l,children:[_(_e,{className:"vuuIconToggleButton","data-icon":"text-strikethrough",value:0}),_(_e,{className:"vuuIconToggleButton","data-icon":"text-Tt",value:1}),_(_e,{className:"vuuIconToggleButton","data-icon":"text-T",value:2})]})]}),Se(Kt,{children:[_(Xt,{children:"Grid separators"}),Se("div",{className:"saltToggleButtonGroup vuuToggleButtonGroup saltToggleButtonGroup-horizontal vuuGridSeparators",children:[_(_e,{className:"vuuIconToggleButton","data-icon":"row-striping",selected:(u=d.zebraStripes)!=null?u:!1,onChange:c,value:"zebraStripes"}),_(_e,{className:"vuuIconToggleButton","data-icon":"row-lines",selected:(f=d.rowSeparators)!=null?f:!1,onChange:c,value:"rowSeparators"}),_(_e,{className:"vuuIconToggleButton","data-icon":"col-lines",selected:(C=d.columnSeparators)!=null?C:!1,onChange:c,value:"columnSeparators"})]})]}),Se(Kt,{children:[_(Xt,{children:"Default Column Width"}),_(fd,{className:"vuuInput"})]}),_(kr,{columnItems:s,onChange:p,onMoveListItem:m,onNavigateToColumn:r}),Se("div",{className:`${Zt}-calculatedButtonbar`,children:[_(gd,{"data-icon":"plus",onClick:o}),_("span",{className:`${Zt}-calculatedLabel`,children:"Add calculated column"})]})]})};export{oc as BackgroundCell,mc as BackgroundCellConfigurationEditor,Fo as BaseNumericFormattingSettings,Yi as CaseValidator,Lt as ColumnExpressionInput,oi as ColumnExpressionPanel,mi as ColumnFormattingPanel,kr as ColumnList,Rt as ColumnNamedTerms,E1 as ColumnSettingsPanel,N1 as DataSourceStats,si as DateTimeFormattingSettings,Ec as DropdownCell,kc as LookupCell,es as PatternValidator,q1 as TableSettingsPanel,Hr as columnExpressionLanguageSupport,Fr as isCompleteExpression,Nr as isCompleteRelationalExpression,St as lastNamedChild,Zr as useColumnExpressionEditor,Jr as useColumnExpressionSuggestionProvider,xi as useTableSettings,Lr as walkTree};
1
+ var __accessCheck = (obj, member, msg) => {
2
+ if (!member.has(obj))
3
+ throw TypeError("Cannot " + msg);
4
+ };
5
+ var __privateGet = (obj, member, getter) => {
6
+ __accessCheck(obj, member, "read from private field");
7
+ return getter ? getter.call(obj) : member.get(obj);
8
+ };
9
+ var __privateAdd = (obj, member, value) => {
10
+ if (member.has(obj))
11
+ throw TypeError("Cannot add the same private member more than once");
12
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
13
+ };
14
+ var __privateSet = (obj, member, value, setter) => {
15
+ __accessCheck(obj, member, "write to private field");
16
+ setter ? setter.call(obj, value) : member.set(obj, value);
17
+ return value;
18
+ };
19
+
20
+ // src/cell-edit-validators/CaseValidator.ts
21
+ import { registerComponent } from "@vuu-ui/vuu-utils";
22
+ var isString = (value) => typeof value === "string";
23
+ var CaseValidator = (rule, value) => {
24
+ if (isString(value)) {
25
+ if (value === "") {
26
+ return true;
27
+ } else if (rule.value === "lower" && value.toLowerCase() !== value) {
28
+ return "value must be all lowercase";
29
+ } else if (rule.value === "upper" && value.toUpperCase() !== value) {
30
+ return "value must be all uppercase";
31
+ } else {
32
+ return true;
33
+ }
34
+ } else {
35
+ return "value must be a string";
36
+ }
37
+ };
38
+ registerComponent("vuu-case", CaseValidator, "data-edit-validator", {});
39
+
40
+ // src/cell-edit-validators/PatternValidator.ts
41
+ import { registerComponent as registerComponent2 } from "@vuu-ui/vuu-utils";
42
+ var isString2 = (value) => typeof value === "string";
43
+ var defaultMessage = "value does not match expected pattern";
44
+ var PatternValidator = (rule, value) => {
45
+ if (typeof rule.value !== "string") {
46
+ throw Error("Pattern validation rule must provide pattern");
47
+ }
48
+ if (isString2(value)) {
49
+ if (value === "") {
50
+ return true;
51
+ } else {
52
+ const { message = defaultMessage } = rule;
53
+ const pattern = new RegExp(rule.value);
54
+ return pattern.test(value) || message;
55
+ }
56
+ } else {
57
+ return "value must be a string";
58
+ }
59
+ };
60
+ registerComponent2("vuu-pattern", PatternValidator, "data-edit-validator", {});
61
+
62
+ // src/cell-renderers/background-cell/BackgroundCell.tsx
63
+ import {
64
+ dataAndColumnUnchanged,
65
+ DOWN1,
66
+ DOWN2,
67
+ isTypeDescriptor as isTypeDescriptor2,
68
+ metadataKeys,
69
+ registerComponent as registerComponent3,
70
+ UP1,
71
+ UP2
72
+ } from "@vuu-ui/vuu-utils";
73
+ import cx from "clsx";
74
+ import { memo } from "react";
75
+
76
+ // src/cell-renderers/background-cell/useDirection.ts
77
+ import {
78
+ getMovingValueDirection,
79
+ isTypeDescriptor,
80
+ isValidNumber
81
+ } from "@vuu-ui/vuu-utils";
82
+ import { useEffect, useRef } from "react";
83
+ var INITIAL_VALUE = [void 0, void 0, void 0, void 0];
84
+ function useDirection(key, value, column) {
85
+ var _a;
86
+ const ref = useRef();
87
+ const [prevKey, prevValue, prevColumn, prevDirection] = ref.current || INITIAL_VALUE;
88
+ const { type: dataType } = column;
89
+ const decimals = isTypeDescriptor(dataType) ? (_a = dataType.formatting) == null ? void 0 : _a.decimals : void 0;
90
+ const direction = key === prevKey && isValidNumber(value) && isValidNumber(prevValue) && column === prevColumn ? getMovingValueDirection(value, prevDirection, prevValue, decimals) : "";
91
+ useEffect(() => {
92
+ ref.current = [key, value, column, direction];
93
+ });
94
+ return direction;
95
+ }
96
+
97
+ // src/cell-renderers/background-cell/BackgroundCell.tsx
98
+ import { jsx, jsxs } from "react/jsx-runtime";
99
+ var CHAR_ARROW_UP = String.fromCharCode(11014);
100
+ var CHAR_ARROW_DOWN = String.fromCharCode(11015);
101
+ var { KEY } = metadataKeys;
102
+ var classBase = "vuuBackgroundCell";
103
+ var FlashStyle = {
104
+ ArrowOnly: "arrow",
105
+ BackgroundOnly: "bg-only",
106
+ ArrowBackground: "arrow-bg"
107
+ };
108
+ var getFlashStyle = (colType) => {
109
+ if (isTypeDescriptor2(colType) && colType.renderer) {
110
+ if ("flashStyle" in colType.renderer) {
111
+ return colType.renderer["flashStyle"];
112
+ }
113
+ }
114
+ return FlashStyle.BackgroundOnly;
115
+ };
116
+ var BackgroundCell = memo(
117
+ function BackgroundCell2({
118
+ column,
119
+ columnMap,
120
+ row
121
+ }) {
122
+ const { name: name2, type, valueFormatter } = column;
123
+ const dataIdx = columnMap[name2];
124
+ const value = row[dataIdx];
125
+ const flashStyle = getFlashStyle(type);
126
+ const direction = useDirection(row[KEY], value, column);
127
+ const arrow = flashStyle === FlashStyle.ArrowOnly || flashStyle === FlashStyle.ArrowBackground ? direction === UP1 || direction === UP2 ? CHAR_ARROW_UP : direction === DOWN1 || direction === DOWN2 ? CHAR_ARROW_DOWN : null : null;
128
+ const dirClass = direction ? ` ` + direction : "";
129
+ const className = cx(classBase, dirClass, {
130
+ [`${classBase}-backgroundOnly`]: flashStyle === FlashStyle.BackgroundOnly,
131
+ [`${classBase}-arrowOnly`]: flashStyle === FlashStyle.ArrowOnly,
132
+ [`${classBase}-arrowBackground`]: flashStyle === FlashStyle.ArrowBackground
133
+ });
134
+ return /* @__PURE__ */ jsxs("div", { className, tabIndex: -1, children: [
135
+ /* @__PURE__ */ jsx("div", { className: `${classBase}-arrow`, children: arrow }),
136
+ valueFormatter(row[dataIdx])
137
+ ] });
138
+ },
139
+ dataAndColumnUnchanged
140
+ );
141
+ registerComponent3(
142
+ "vuu.price-move-background",
143
+ BackgroundCell,
144
+ "cell-renderer",
145
+ {
146
+ description: "Change background color of cell when value changes",
147
+ configEditor: "BackgroundCellConfigurationEditor",
148
+ label: "Background Flash",
149
+ serverDataType: ["long", "int", "double"]
150
+ }
151
+ );
152
+
153
+ // src/cell-renderers/background-cell/BackgroundCellConfigurationEditor.tsx
154
+ import { Dropdown } from "@vuu-ui/vuu-ui-controls";
155
+ import {
156
+ registerConfigurationEditor
157
+ } from "@vuu-ui/vuu-utils";
158
+ import { FormField, FormFieldLabel } from "@salt-ds/core";
159
+ import { useCallback, useState } from "react";
160
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
161
+ var classBase2 = "vuuBackgroundCellConfiguration";
162
+ var flashOptions = [
163
+ { label: "Background Only", value: "bg-only" },
164
+ { label: "Background and Arrow", value: "arrow-bg" },
165
+ { label: "Arrow Only", value: "arrow" }
166
+ ];
167
+ var [defaultFlashOption] = flashOptions;
168
+ var valueFromColumn = (column) => {
169
+ const { flashStyle } = column.type.renderer;
170
+ return flashOptions.find((o) => o.value === flashStyle) || defaultFlashOption;
171
+ };
172
+ var BackgroundCellConfigurationEditor = ({
173
+ column,
174
+ onChangeRendering
175
+ }) => {
176
+ const [flashStyle, setFlashStyle] = useState(
177
+ valueFromColumn(column)
178
+ );
179
+ const handleSelectionChange = useCallback(
180
+ (_, flashOption) => {
181
+ var _a;
182
+ setFlashStyle(flashOption);
183
+ const renderProps = column.type.renderer;
184
+ onChangeRendering({
185
+ ...renderProps,
186
+ flashStyle: (_a = flashOption == null ? void 0 : flashOption.value) != null ? _a : defaultFlashOption.value
187
+ });
188
+ },
189
+ [column.type, onChangeRendering]
190
+ );
191
+ return /* @__PURE__ */ jsxs2(FormField, { children: [
192
+ /* @__PURE__ */ jsx2(FormFieldLabel, { children: "Flash Style" }),
193
+ /* @__PURE__ */ jsx2(
194
+ Dropdown,
195
+ {
196
+ className: `${classBase2}-flashStyle`,
197
+ onSelectionChange: handleSelectionChange,
198
+ selected: flashStyle,
199
+ source: flashOptions,
200
+ width: "100%"
201
+ }
202
+ )
203
+ ] });
204
+ };
205
+ registerConfigurationEditor(
206
+ "BackgroundCellConfigurationEditor",
207
+ BackgroundCellConfigurationEditor
208
+ );
209
+
210
+ // src/cell-renderers/dropdown-cell/DropdownCell.tsx
211
+ import { useLookupValues } from "@vuu-ui/vuu-data-react";
212
+ import {
213
+ Dropdown as Dropdown2,
214
+ WarnCommit
215
+ } from "@vuu-ui/vuu-ui-controls";
216
+ import {
217
+ dataAndColumnUnchanged as dataAndColumnUnchanged2,
218
+ dispatchCustomEvent,
219
+ registerComponent as registerComponent4
220
+ } from "@vuu-ui/vuu-utils";
221
+ import { memo as memo2, useCallback as useCallback2, useState as useState2 } from "react";
222
+ import { jsx as jsx3 } from "react/jsx-runtime";
223
+ var classBase3 = "vuuTableDropdownCell";
224
+ var openKeys = ["Enter", " "];
225
+ var DropdownCell = memo2(
226
+ function DropdownCell2({
227
+ column,
228
+ columnMap,
229
+ onCommit = WarnCommit,
230
+ row
231
+ }) {
232
+ const dataIdx = columnMap[column.name];
233
+ const { initialValue, values } = useLookupValues(column, row[dataIdx]);
234
+ const [value, setValue] = useState2(null);
235
+ const handleSelectionChange = useCallback2(
236
+ (evt, selectedOption) => {
237
+ if (selectedOption) {
238
+ setValue(selectedOption);
239
+ onCommit(selectedOption.value).then((response) => {
240
+ if (response === true && evt) {
241
+ dispatchCustomEvent(evt.target, "vuu-commit");
242
+ }
243
+ });
244
+ }
245
+ },
246
+ [onCommit]
247
+ );
248
+ return /* @__PURE__ */ jsx3(
249
+ Dropdown2,
250
+ {
251
+ className: classBase3,
252
+ onSelectionChange: handleSelectionChange,
253
+ openKeys,
254
+ selected: value != null ? value : initialValue,
255
+ source: values,
256
+ width: column.width - 17
257
+ }
258
+ );
259
+ },
260
+ dataAndColumnUnchanged2
261
+ );
262
+ registerComponent4("dropdown-cell", DropdownCell, "cell-renderer", {});
263
+
264
+ // src/cell-renderers/lookup-cell/LookupCell.tsx
265
+ import { useLookupValues as useLookupValues2 } from "@vuu-ui/vuu-data-react";
266
+ import { dataAndColumnUnchanged as dataAndColumnUnchanged3, registerComponent as registerComponent5 } from "@vuu-ui/vuu-utils";
267
+ import { memo as memo3 } from "react";
268
+ import { jsx as jsx4 } from "react/jsx-runtime";
269
+ var LookupCell = memo3(
270
+ function LookupCell2({
271
+ column,
272
+ columnMap,
273
+ row
274
+ }) {
275
+ const dataIdx = columnMap[column.name];
276
+ const { initialValue: value } = useLookupValues2(column, row[dataIdx]);
277
+ return /* @__PURE__ */ jsx4("span", { children: value == null ? void 0 : value.label });
278
+ },
279
+ dataAndColumnUnchanged3
280
+ );
281
+ registerComponent5("lookup-cell", LookupCell, "cell-renderer", {});
282
+
283
+ // src/cell-renderers/progress-cell/ProgressCell.tsx
284
+ import {
285
+ isColumnTypeRenderer,
286
+ isTypeDescriptor as isTypeDescriptor3,
287
+ isValidNumber as isValidNumber2,
288
+ registerComponent as registerComponent6
289
+ } from "@vuu-ui/vuu-utils";
290
+ import cx2 from "clsx";
291
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
292
+ var classBase4 = "vuuProgressCell";
293
+ var ProgressCell = ({ column, columnMap, row }) => {
294
+ const { name: name2, type } = column;
295
+ const value = row[columnMap[name2]];
296
+ let showProgress = false;
297
+ let percentage = 0;
298
+ if (isTypeDescriptor3(type) && isColumnTypeRenderer(type.renderer)) {
299
+ const { associatedField } = type.renderer;
300
+ if (associatedField) {
301
+ const associatedValue = row[columnMap[associatedField]];
302
+ if (typeof isValidNumber2(value) && isValidNumber2(associatedValue)) {
303
+ percentage = Math.min(Math.round(value / associatedValue * 100), 100);
304
+ percentage = Math.min(Math.round(value / associatedValue * 100), 100);
305
+ showProgress = isFinite(percentage);
306
+ } else {
307
+ const floatValue = parseFloat(value);
308
+ if (Number.isFinite(floatValue)) {
309
+ const floatOtherValue = parseFloat(associatedValue);
310
+ if (Number.isFinite(floatOtherValue)) {
311
+ percentage = Math.min(
312
+ Math.round(floatValue / floatOtherValue * 100),
313
+ 100
314
+ );
315
+ showProgress = isFinite(percentage);
316
+ }
317
+ }
318
+ }
319
+ } else {
320
+ throw Error("ProgressCell associatedField is required to render");
321
+ }
322
+ }
323
+ const className = cx2(classBase4, {});
324
+ return /* @__PURE__ */ jsxs3("div", { className, tabIndex: -1, children: [
325
+ showProgress ? /* @__PURE__ */ jsxs3("span", { className: `${classBase4}-track`, children: [
326
+ /* @__PURE__ */ jsx5("span", { className: `${classBase4}-bg` }),
327
+ /* @__PURE__ */ jsx5(
328
+ "span",
329
+ {
330
+ className: `${classBase4}-bar`,
331
+ style: { "--progress-bar-pct": `-${100 - percentage}%` }
332
+ }
333
+ )
334
+ ] }) : null,
335
+ /* @__PURE__ */ jsx5("span", { className: `${classBase4}-text`, children: `${percentage} %` })
336
+ ] });
337
+ };
338
+ registerComponent6("vuu.progress", ProgressCell, "cell-renderer", {
339
+ description: "Progress formatter",
340
+ label: "Progress formatter",
341
+ serverDataType: ["long", "int", "double"]
342
+ });
343
+
344
+ // src/column-list/ColumnList.tsx
345
+ import {
346
+ List,
347
+ ListItem
348
+ } from "@vuu-ui/vuu-ui-controls";
349
+ import { Checkbox, Switch } from "@salt-ds/core";
350
+ import cx3 from "clsx";
351
+ import {
352
+ useCallback as useCallback3
353
+ } from "react";
354
+ import { getColumnLabel } from "@vuu-ui/vuu-utils";
355
+ import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
356
+ var classBase5 = "vuuColumnList";
357
+ var classBaseListItem = "vuuColumnListItem";
358
+ var ColumnListItem = ({
359
+ className: classNameProp,
360
+ item,
361
+ ...listItemProps
362
+ }) => {
363
+ return /* @__PURE__ */ jsxs4(
364
+ ListItem,
365
+ {
366
+ ...listItemProps,
367
+ className: cx3(classNameProp, classBaseListItem),
368
+ "data-name": item == null ? void 0 : item.name,
369
+ children: [
370
+ /* @__PURE__ */ jsx6("span", { className: `${classBase5}-icon`, "data-icon": "draggable" }),
371
+ (item == null ? void 0 : item.isCalculated) ? /* @__PURE__ */ jsx6("span", { className: `${classBase5}-icon`, "data-icon": "function" }) : /* @__PURE__ */ jsx6(Switch, { className: `${classBase5}-switch`, checked: item == null ? void 0 : item.subscribed }),
372
+ /* @__PURE__ */ jsx6("span", { className: `${classBase5}-text`, children: getColumnLabel(item) }),
373
+ /* @__PURE__ */ jsx6(
374
+ Checkbox,
375
+ {
376
+ className: `${classBase5}-checkBox`,
377
+ checked: (item == null ? void 0 : item.hidden) !== true,
378
+ disabled: (item == null ? void 0 : item.subscribed) !== true
379
+ }
380
+ )
381
+ ]
382
+ }
383
+ );
384
+ };
385
+ var ColumnList = ({
386
+ columnItems,
387
+ onChange,
388
+ onMoveListItem,
389
+ onNavigateToColumn,
390
+ ...htmlAttributes
391
+ }) => {
392
+ const handleChange = useCallback3(
393
+ (evt) => {
394
+ const input = evt.target;
395
+ const listItem = input.closest(`.${classBaseListItem}`);
396
+ const {
397
+ dataset: { name: name2 }
398
+ } = listItem;
399
+ if (name2) {
400
+ const saltSwitch = input.closest(`.${classBase5}-switch`);
401
+ const saltCheckbox = input.closest(
402
+ `.${classBase5}-checkBox`
403
+ );
404
+ if (saltSwitch) {
405
+ onChange(name2, "subscribed", input.checked);
406
+ } else if (saltCheckbox) {
407
+ onChange(name2, "hidden", input.checked === false);
408
+ }
409
+ }
410
+ },
411
+ [onChange]
412
+ );
413
+ const handleClick = useCallback3((evt) => {
414
+ const targetEl = evt.target;
415
+ if (targetEl.classList.contains("vuuColumnList-text")) {
416
+ const listItemEl = targetEl.closest(".vuuListItem");
417
+ if (listItemEl == null ? void 0 : listItemEl.dataset.name) {
418
+ onNavigateToColumn == null ? void 0 : onNavigateToColumn(listItemEl.dataset.name);
419
+ }
420
+ }
421
+ }, []);
422
+ return /* @__PURE__ */ jsxs4("div", { ...htmlAttributes, className: classBase5, children: [
423
+ /* @__PURE__ */ jsx6("div", { className: `${classBase5}-header`, children: /* @__PURE__ */ jsx6("span", { children: "Column Selection" }) }),
424
+ /* @__PURE__ */ jsxs4("div", { className: `${classBase5}-colHeadings`, children: [
425
+ /* @__PURE__ */ jsx6("span", { children: "Column subscription" }),
426
+ /* @__PURE__ */ jsx6("span", { children: "Visibility" })
427
+ ] }),
428
+ /* @__PURE__ */ jsx6(
429
+ List,
430
+ {
431
+ ListItem: ColumnListItem,
432
+ allowDragDrop: true,
433
+ height: "auto",
434
+ onChange: handleChange,
435
+ onClick: handleClick,
436
+ onMoveListItem,
437
+ selectionStrategy: "none",
438
+ source: columnItems,
439
+ itemHeight: 33
440
+ }
441
+ )
442
+ ] });
443
+ };
444
+
445
+ // src/column-settings/ColumnSettingsPanel.tsx
446
+ import { VuuInput } from "@vuu-ui/vuu-ui-controls";
447
+ import {
448
+ getCalculatedColumnName as getCalculatedColumnName2,
449
+ getDefaultAlignment,
450
+ isCalculatedColumn as isCalculatedColumn2
451
+ } from "@vuu-ui/vuu-utils";
452
+ import {
453
+ Button,
454
+ FormField as FormField7,
455
+ FormFieldLabel as FormFieldLabel7,
456
+ ToggleButton as ToggleButton3,
457
+ ToggleButtonGroup as ToggleButtonGroup3
458
+ } from "@salt-ds/core";
459
+ import cx6 from "clsx";
460
+
461
+ // src/column-expression-panel/ColumnExpressionPanel.tsx
462
+ import { Dropdown as Dropdown3 } from "@vuu-ui/vuu-ui-controls";
463
+ import {
464
+ getCalculatedColumnExpression,
465
+ getCalculatedColumnName,
466
+ getCalculatedColumnType
467
+ } from "@vuu-ui/vuu-utils";
468
+ import { FormField as FormField2, FormFieldLabel as FormFieldLabel2, Input } from "@salt-ds/core";
469
+ import { useCallback as useCallback8, useRef as useRef5 } from "react";
470
+
471
+ // src/column-expression-input/ColumnExpressionInput.tsx
472
+ import { memo as memo4 } from "react";
473
+
474
+ // src/column-expression-input/useColumnExpressionEditor.ts
475
+ import {
476
+ autocompletion,
477
+ defaultKeymap,
478
+ EditorState as EditorState2,
479
+ EditorView as EditorView2,
480
+ ensureSyntaxTree,
481
+ keymap,
482
+ minimalSetup,
483
+ startCompletion
484
+ } from "@vuu-ui/vuu-codemirror";
485
+ import { createEl } from "@vuu-ui/vuu-utils";
486
+ import {
487
+ useCallback as useCallback5,
488
+ useEffect as useEffect2,
489
+ useMemo,
490
+ useRef as useRef2
491
+ } from "react";
492
+
493
+ // src/column-expression-input/column-language-parser/ColumnExpressionLanguage.ts
494
+ import {
495
+ LanguageSupport,
496
+ LRLanguage,
497
+ styleTags,
498
+ tags as tag
499
+ } from "@vuu-ui/vuu-codemirror";
500
+
501
+ // src/column-expression-input/column-language-parser/generated/column-parser.js
502
+ import { LRParser } from "@lezer/lr";
503
+ var parser = LRParser.deserialize({
504
+ version: 14,
505
+ states: "&xOVQPOOO!fQPO'#C^OVQPO'#CcQ!pQPOOO#bQPO'#CkO#gQPO'#CrOOQO'#Cy'#CyO#lQPO,58}OVQPO,59QOVQPO,59QOOQO'#Cn'#CnOVQPO,59XOVQPO,59VOVQPO'#CtOOQO,59^,59^OOQO1G.i1G.iOOQO1G.l1G.lO$bQPO1G.lO%ZQPO1G.sO!pQPO'#CmO%qQQO1G.qO%|QQO'#C{OOQO'#C{'#C{O&wQPO,59`OVQPO,59ZOVQPO,59[OVQPO7+$]OVQPO'#CuO'RQPO1G.zOOQO1G.z1G.zO'ZQQO'#C^O'eQQO1G.sO'{QQO1G.uOOQO1G.v1G.vO(WQPO<<GwO(_QPO,59aOOQO-E6s-E6sOOQO7+$f7+$fOVQPOAN=cO(iQQO1G.lO(yQPOG22}OOQOLD(iLD(iO)QQPO,59QO)QQPO,59QO)QQPO,59X",
506
+ stateData: ")n~OlOS~ORUOSUOTUOUUOWQO`SOnPO~OWgXZQX[QX]QX^QXpQXqQXrQXsQXtQXuQXeQX~OjQXXQX~PnOZWO[WO]XO^XOpYOqYOrYOsYOtYOuYO~OW[O~OW]O~OX_O~P!pO]Yi^YipYiqYirYisYitYiuYieYi~OZWO[WOjYiXYi~P#sOpaiqairaisaitaiuaieai~OZWO[WO]XO^XOjaiXai~P$rOejOvhOwiO~OZmX[mX]mX^mXeoXpmXqmXrmXsmXtmXumXvoXwoX~OXmOekO~P!pOXuOekO~OvQXwQX~PnOZzO[zO]{O^{Ovaiwai~P$rOwiOecivci~OevO~P!pOXiaeia~P!pOZzO[zOvYiwYi~P#sOXyO~P!pORUOSUOTUOUUOWQO`SOnnO~O`UTn~",
507
+ goto: "$epPPqPPPPqPPqPPPPqP!S!g!r!rPq!w#Y#]PPP#cP$[oUOQWXZ[]hijkvz{|hUOQWXZ]jkvz{|Ve[hi[ZRVgrsxR|cVf[hioTOQWXZ[]hijkvz{|R^TQlgRtlQROQVQS`WzQaXQbZUc[hiQg]Qo|QrjQskQw{RxvQd[QphRqi",
508
+ nodeNames: "\u26A0 ColumnDefinitionExpression Column Number String True False ParenthesizedExpression OpenBrace CloseBrace ArithmeticExpression Divide Times Plus Minus ConditionalExpression If RelationalExpression RelationalOperator AndCondition OrCondition Comma CallExpression Function ArgList",
509
+ maxTerm: 39,
510
+ skippedNodes: [0],
511
+ repeatNodeCount: 1,
512
+ tokenData: ".^~RnXY#PYZ#P]^#Ppq#Pqr#brs#mxy$eyz$jz{$o{|$t|}$y}!O%O!O!P%T!P!Q%c!Q![%h!^!_%s!_!`&Q!`!a&V!c!}&d#R#S&d#T#U&u#U#Y&d#Y#Z(Y#Z#]&d#]#^*j#^#c&d#c#d+f#d#h&d#h#i,b#i#o&d~#USl~XY#PYZ#P]^#Ppq#P~#eP!_!`#h~#mOu~~#pWOX#mZ]#m^r#mrs$Ys#O#m#P;'S#m;'S;=`$_<%lO#m~$_OS~~$bP;=`<%l#m~$jOW~~$oOX~~$tO[~~$yO]~~%OOe~~%TO^~~%WP!Q![%Z~%`PR~!Q![%Z~%hOZ~~%mQR~!O!P%Z!Q![%h~%xPr~!_!`%{~&QOt~~&VOp~~&[Pq~!_!`&_~&dOs~P&iSnP!Q![&d!c!}&d#R#S&d#T#o&dR&zUnP!Q![&d!c!}&d#R#S&d#T#b&d#b#c'^#c#o&dR'cUnP!Q![&d!c!}&d#R#S&d#T#W&d#W#X'u#X#o&dR'|SvQnP!Q![&d!c!}&d#R#S&d#T#o&d~(_TnP!Q![&d!c!}&d#R#S&d#T#U(n#U#o&d~(sUnP!Q![&d!c!}&d#R#S&d#T#`&d#`#a)V#a#o&d~)[UnP!Q![&d!c!}&d#R#S&d#T#g&d#g#h)n#h#o&d~)sUnP!Q![&d!c!}&d#R#S&d#T#X&d#X#Y*V#Y#o&d~*^SU~nP!Q![&d!c!}&d#R#S&d#T#o&d~*oUnP!Q![&d!c!}&d#R#S&d#T#Y&d#Y#Z+R#Z#o&d~+YS`~nP!Q![&d!c!}&d#R#S&d#T#o&dR+kUnP!Q![&d!c!}&d#R#S&d#T#f&d#f#g+}#g#o&dR,USwQnP!Q![&d!c!}&d#R#S&d#T#o&d~,gUnP!Q![&d!c!}&d#R#S&d#T#f&d#f#g,y#g#o&d~-OUnP!Q![&d!c!}&d#R#S&d#T#i&d#i#j-b#j#o&d~-gUnP!Q![&d!c!}&d#R#S&d#T#X&d#X#Y-y#Y#o&d~.QST~nP!Q![&d!c!}&d#R#S&d#T#o&d",
513
+ tokenizers: [0, 1],
514
+ topRules: { "ColumnDefinitionExpression": [0, 1] },
515
+ tokenPrec: 393
516
+ });
517
+
518
+ // src/column-expression-input/column-language-parser/ColumnExpressionLanguage.ts
519
+ var columnExpressionLanguage = LRLanguage.define({
520
+ name: "VuuColumnExpression",
521
+ parser: parser.configure({
522
+ props: [
523
+ styleTags({
524
+ Column: tag.attributeValue,
525
+ Function: tag.variableName,
526
+ String: tag.string,
527
+ Or: tag.emphasis,
528
+ Operator: tag.operator
529
+ })
530
+ ]
531
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
532
+ })
533
+ });
534
+ var columnExpressionLanguageSupport = () => {
535
+ return new LanguageSupport(
536
+ columnExpressionLanguage
537
+ /*, [exampleCompletion]*/
538
+ );
539
+ };
540
+
541
+ // src/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.ts
542
+ var LiteralExpressionImpl = class {
543
+ constructor(value) {
544
+ this.value = value;
545
+ switch (typeof value) {
546
+ case "boolean":
547
+ this.type = "booleanLiteralExpression";
548
+ break;
549
+ case "number":
550
+ this.type = "numericLiteralExpression";
551
+ break;
552
+ default:
553
+ this.type = "stringLiteralExpression";
554
+ }
555
+ }
556
+ toJSON() {
557
+ return {
558
+ type: this.type,
559
+ value: this.value
560
+ };
561
+ }
562
+ };
563
+ var ColumnExpressionImpl = class {
564
+ constructor(columnName) {
565
+ this.type = "colExpression";
566
+ this.column = columnName;
567
+ }
568
+ toJSON() {
569
+ return {
570
+ type: this.type,
571
+ column: this.column
572
+ };
573
+ }
574
+ };
575
+ var _expressions, _op;
576
+ var ArithmeticExpressionImpl = class {
577
+ constructor(op = "unknown") {
578
+ __privateAdd(this, _expressions, [
579
+ { type: "unknown" },
580
+ { type: "unknown" }
581
+ ]);
582
+ __privateAdd(this, _op, void 0);
583
+ this.type = "arithmeticExpression";
584
+ __privateSet(this, _op, op);
585
+ }
586
+ get op() {
587
+ return __privateGet(this, _op);
588
+ }
589
+ set op(op) {
590
+ __privateSet(this, _op, op);
591
+ }
592
+ get expressions() {
593
+ return __privateGet(this, _expressions);
594
+ }
595
+ toJSON() {
596
+ return {
597
+ type: this.type,
598
+ op: __privateGet(this, _op),
599
+ expressions: __privateGet(this, _expressions)
600
+ };
601
+ }
602
+ };
603
+ _expressions = new WeakMap();
604
+ _op = new WeakMap();
605
+ var _expressions2;
606
+ var CallExpressionImpl = class {
607
+ constructor(functionName) {
608
+ __privateAdd(this, _expressions2, []);
609
+ this.type = "callExpression";
610
+ this.functionName = functionName;
611
+ }
612
+ get expressions() {
613
+ return __privateGet(this, _expressions2);
614
+ }
615
+ get arguments() {
616
+ return __privateGet(this, _expressions2);
617
+ }
618
+ toJSON() {
619
+ return {
620
+ type: this.type,
621
+ functionName: this.functionName,
622
+ arguments: __privateGet(this, _expressions2).map((e) => {
623
+ var _a;
624
+ return (_a = e.toJSON) == null ? void 0 : _a.call(e);
625
+ })
626
+ };
627
+ }
628
+ };
629
+ _expressions2 = new WeakMap();
630
+ var _expressions3, _op2;
631
+ var RelationalExpressionImpl = class {
632
+ constructor() {
633
+ __privateAdd(this, _expressions3, [
634
+ { type: "unknown" },
635
+ { type: "unknown" }
636
+ ]);
637
+ __privateAdd(this, _op2, "unknown");
638
+ this.type = "relationalExpression";
639
+ }
640
+ get op() {
641
+ return __privateGet(this, _op2);
642
+ }
643
+ set op(op) {
644
+ __privateSet(this, _op2, op);
645
+ }
646
+ get expressions() {
647
+ return __privateGet(this, _expressions3);
648
+ }
649
+ toJSON() {
650
+ return {
651
+ type: this.type,
652
+ op: __privateGet(this, _op2),
653
+ expressions: __privateGet(this, _expressions3)
654
+ };
655
+ }
656
+ };
657
+ _expressions3 = new WeakMap();
658
+ _op2 = new WeakMap();
659
+ var _expressions4, _op3;
660
+ var BooleanConditionImp = class {
661
+ constructor(booleanOperator) {
662
+ __privateAdd(this, _expressions4, [
663
+ { type: "unknown" },
664
+ { type: "unknown" }
665
+ ]);
666
+ __privateAdd(this, _op3, void 0);
667
+ this.type = "booleanCondition";
668
+ __privateSet(this, _op3, booleanOperator);
669
+ }
670
+ get op() {
671
+ return __privateGet(this, _op3);
672
+ }
673
+ get expressions() {
674
+ return __privateGet(this, _expressions4);
675
+ }
676
+ toJSON() {
677
+ return {
678
+ type: this.type,
679
+ op: __privateGet(this, _op3),
680
+ expressions: __privateGet(this, _expressions4).map((e) => {
681
+ var _a;
682
+ return (_a = e.toJSON) == null ? void 0 : _a.call(e);
683
+ })
684
+ };
685
+ }
686
+ };
687
+ _expressions4 = new WeakMap();
688
+ _op3 = new WeakMap();
689
+ var _expressions5;
690
+ var ConditionalExpressionImpl = class {
691
+ constructor(booleanOperator) {
692
+ __privateAdd(this, _expressions5, void 0);
693
+ this.type = "conditionalExpression";
694
+ __privateSet(this, _expressions5, [
695
+ booleanOperator ? new BooleanConditionImp(booleanOperator) : new RelationalExpressionImpl(),
696
+ { type: "unknown" },
697
+ { type: "unknown" }
698
+ ]);
699
+ }
700
+ get expressions() {
701
+ return __privateGet(this, _expressions5);
702
+ }
703
+ get condition() {
704
+ return __privateGet(this, _expressions5)[0];
705
+ }
706
+ get truthyExpression() {
707
+ return __privateGet(this, _expressions5)[1];
708
+ }
709
+ set truthyExpression(expression) {
710
+ __privateGet(this, _expressions5)[1] = expression;
711
+ }
712
+ get falsyExpression() {
713
+ return __privateGet(this, _expressions5)[2];
714
+ }
715
+ set falsyExpression(expression) {
716
+ __privateGet(this, _expressions5)[2] = expression;
717
+ }
718
+ toJSON() {
719
+ var _a, _b, _c, _d, _e;
720
+ return {
721
+ type: this.type,
722
+ condition: (_b = (_a = this.condition).toJSON) == null ? void 0 : _b.call(_a),
723
+ truthyExpression: this.truthyExpression,
724
+ falsyExpression: (_e = (_d = (_c = this.falsyExpression) == null ? void 0 : _c.toJSON) == null ? void 0 : _d.call(_c)) != null ? _e : this.falsyExpression
725
+ };
726
+ }
727
+ };
728
+ _expressions5 = new WeakMap();
729
+ var isUnknown = (e) => e.type === "unknown";
730
+ var isArithmeticExpression = (expression) => expression.type === "arithmeticExpression";
731
+ var isCallExpression = (expression) => expression.type === "callExpression";
732
+ var isConditionalExpression = (expression) => expression.type === "conditionalExpression";
733
+ var isCondition = (expression) => expression.type === "relationalExpression" || expression.type === "booleanCondition";
734
+ var isBooleanCondition = (expression) => expression.type === "booleanCondition";
735
+ var isRelationalExpression = (expression) => (expression == null ? void 0 : expression.type) === "relationalExpression";
736
+ var firstIncompleteExpression = (expression) => {
737
+ if (isUnknown(expression)) {
738
+ return expression;
739
+ } else if (isRelationalExpression(expression)) {
740
+ const [operand1, operand2] = expression.expressions;
741
+ if (expressionIsIncomplete(operand1)) {
742
+ return firstIncompleteExpression(operand1);
743
+ } else if (expression.op === "unknown") {
744
+ return expression;
745
+ } else if (expressionIsIncomplete(operand2)) {
746
+ return firstIncompleteExpression(operand2);
747
+ }
748
+ } else if (isCondition(expression)) {
749
+ const { expressions = [] } = expression;
750
+ for (const e of expressions) {
751
+ if (expressionIsIncomplete(e)) {
752
+ return firstIncompleteExpression(e);
753
+ }
754
+ }
755
+ } else if (isConditionalExpression(expression)) {
756
+ const { condition, truthyExpression, falsyExpression } = expression;
757
+ if (expressionIsIncomplete(condition)) {
758
+ return firstIncompleteExpression(condition);
759
+ } else if (expressionIsIncomplete(truthyExpression)) {
760
+ return firstIncompleteExpression(truthyExpression);
761
+ } else if (expressionIsIncomplete(falsyExpression)) {
762
+ return firstIncompleteExpression(falsyExpression);
763
+ }
764
+ } else if (isArithmeticExpression(expression)) {
765
+ const { expressions = [] } = expression;
766
+ for (const e of expressions) {
767
+ if (expressionIsIncomplete(e)) {
768
+ return firstIncompleteExpression(e);
769
+ }
770
+ }
771
+ }
772
+ };
773
+ var replaceUnknownExpression = (incompleteExpression, unknownExpression, expression) => {
774
+ const { expressions = [] } = incompleteExpression;
775
+ if (expressions.includes(unknownExpression)) {
776
+ const pos = expressions.indexOf(unknownExpression);
777
+ expressions.splice(pos, 1, expression);
778
+ return true;
779
+ } else {
780
+ for (const e of expressions) {
781
+ if (replaceUnknownExpression(e, unknownExpression, expression)) {
782
+ return true;
783
+ }
784
+ }
785
+ }
786
+ return false;
787
+ };
788
+ var expressionIsIncomplete = (expression) => {
789
+ if (isUnknown(expression)) {
790
+ return true;
791
+ } else if (isConditionalExpression(expression)) {
792
+ return expressionIsIncomplete(expression.condition) || expressionIsIncomplete(expression.truthyExpression) || expressionIsIncomplete(expression.falsyExpression);
793
+ } else if (isRelationalExpression(expression) || isBooleanCondition(expression)) {
794
+ return expression.op === void 0 || expression.expressions.some((e) => expressionIsIncomplete(e));
795
+ }
796
+ return false;
797
+ };
798
+ var addExpression = (expression, subExpression) => {
799
+ const targetExpression = firstIncompleteExpression(expression);
800
+ if (targetExpression) {
801
+ if (targetExpression.expressions) {
802
+ targetExpression.expressions.push(subExpression);
803
+ } else {
804
+ console.warn("don't know how to treat targetExpression");
805
+ }
806
+ } else {
807
+ console.error("no target expression found");
808
+ }
809
+ };
810
+ var _expression, _callStack;
811
+ var ColumnExpression = class {
812
+ constructor() {
813
+ __privateAdd(this, _expression, void 0);
814
+ __privateAdd(this, _callStack, []);
815
+ }
816
+ setCondition(booleanOperator) {
817
+ if (__privateGet(this, _expression) === void 0) {
818
+ this.addExpression(new ConditionalExpressionImpl(booleanOperator));
819
+ } else if (isConditionalExpression(__privateGet(this, _expression))) {
820
+ if (expressionIsIncomplete(__privateGet(this, _expression).condition)) {
821
+ const condition = booleanOperator ? new BooleanConditionImp(booleanOperator) : new RelationalExpressionImpl();
822
+ this.addExpression(condition);
823
+ } else if (isUnknown(__privateGet(this, _expression).truthyExpression)) {
824
+ __privateGet(this, _expression).truthyExpression = new ConditionalExpressionImpl(
825
+ booleanOperator
826
+ );
827
+ } else if (expressionIsIncomplete(__privateGet(this, _expression).truthyExpression)) {
828
+ const condition = booleanOperator ? new BooleanConditionImp(booleanOperator) : new RelationalExpressionImpl();
829
+ this.addExpression(condition);
830
+ } else if (isUnknown(__privateGet(this, _expression).falsyExpression)) {
831
+ __privateGet(this, _expression).falsyExpression = new ConditionalExpressionImpl(
832
+ booleanOperator
833
+ );
834
+ } else if (expressionIsIncomplete(__privateGet(this, _expression).falsyExpression)) {
835
+ const condition = booleanOperator ? new BooleanConditionImp(booleanOperator) : new RelationalExpressionImpl();
836
+ this.addExpression(condition);
837
+ }
838
+ } else {
839
+ console.error("setCondition called unexpectedly");
840
+ }
841
+ }
842
+ addExpression(expression) {
843
+ if (__privateGet(this, _callStack).length > 0) {
844
+ const currentCallExpression = __privateGet(this, _callStack).at(-1);
845
+ currentCallExpression == null ? void 0 : currentCallExpression.arguments.push(expression);
846
+ } else if (__privateGet(this, _expression) === void 0) {
847
+ __privateSet(this, _expression, expression);
848
+ } else if (isArithmeticExpression(__privateGet(this, _expression))) {
849
+ const targetExpression = firstIncompleteExpression(__privateGet(this, _expression));
850
+ if (targetExpression && isUnknown(targetExpression)) {
851
+ replaceUnknownExpression(
852
+ __privateGet(this, _expression),
853
+ targetExpression,
854
+ expression
855
+ );
856
+ }
857
+ } else if (isConditionalExpression(__privateGet(this, _expression))) {
858
+ if (expressionIsIncomplete(__privateGet(this, _expression))) {
859
+ const targetExpression = firstIncompleteExpression(__privateGet(this, _expression));
860
+ if (targetExpression && isUnknown(targetExpression)) {
861
+ replaceUnknownExpression(
862
+ __privateGet(this, _expression),
863
+ targetExpression,
864
+ expression
865
+ );
866
+ } else if (targetExpression) {
867
+ addExpression(targetExpression, expression);
868
+ }
869
+ }
870
+ }
871
+ }
872
+ setFunction(functionName) {
873
+ const callExpression = new CallExpressionImpl(functionName);
874
+ this.addExpression(callExpression);
875
+ __privateGet(this, _callStack).push(callExpression);
876
+ }
877
+ setColumn(columnName) {
878
+ this.addExpression(new ColumnExpressionImpl(columnName));
879
+ }
880
+ setArithmeticOp(value) {
881
+ const op = value;
882
+ const expression = __privateGet(this, _expression);
883
+ if (isArithmeticExpression(expression)) {
884
+ expression.op = op;
885
+ }
886
+ }
887
+ setRelationalOperator(value) {
888
+ const op = value;
889
+ if (__privateGet(this, _expression) && isConditionalExpression(__privateGet(this, _expression))) {
890
+ const targetExpression = firstIncompleteExpression(__privateGet(this, _expression));
891
+ if (isRelationalExpression(targetExpression)) {
892
+ targetExpression.op = op;
893
+ } else {
894
+ console.error(`no target expression found (op = ${value})`);
895
+ }
896
+ }
897
+ }
898
+ setValue(value) {
899
+ const literalExpression = new LiteralExpressionImpl(value);
900
+ if (__privateGet(this, _expression) === void 0) {
901
+ __privateSet(this, _expression, literalExpression);
902
+ } else if (isArithmeticExpression(__privateGet(this, _expression))) {
903
+ this.addExpression(literalExpression);
904
+ } else if (isCallExpression(__privateGet(this, _expression))) {
905
+ __privateGet(this, _expression).arguments.push(literalExpression);
906
+ } else if (isConditionalExpression(__privateGet(this, _expression))) {
907
+ if (expressionIsIncomplete(__privateGet(this, _expression))) {
908
+ const targetExpression = firstIncompleteExpression(__privateGet(this, _expression));
909
+ if (targetExpression && isUnknown(targetExpression)) {
910
+ replaceUnknownExpression(
911
+ __privateGet(this, _expression),
912
+ targetExpression,
913
+ literalExpression
914
+ );
915
+ } else if (targetExpression) {
916
+ addExpression(targetExpression, literalExpression);
917
+ }
918
+ } else {
919
+ console.log("what do we do with value, in a complete expression");
920
+ }
921
+ }
922
+ }
923
+ closeBrace() {
924
+ __privateGet(this, _callStack).pop();
925
+ }
926
+ get expression() {
927
+ return __privateGet(this, _expression);
928
+ }
929
+ toJSON() {
930
+ var _a;
931
+ return (_a = __privateGet(this, _expression)) == null ? void 0 : _a.toJSON();
932
+ }
933
+ };
934
+ _expression = new WeakMap();
935
+ _callStack = new WeakMap();
936
+ var walkTree = (tree, source) => {
937
+ const columnExpression = new ColumnExpression();
938
+ const cursor = tree.cursor();
939
+ do {
940
+ const { name: name2, from, to } = cursor;
941
+ switch (name2) {
942
+ case "AndCondition":
943
+ columnExpression.setCondition("and");
944
+ break;
945
+ case "OrCondition":
946
+ columnExpression.setCondition("or");
947
+ break;
948
+ case "RelationalExpression":
949
+ columnExpression.setCondition();
950
+ break;
951
+ case "ArithmeticExpression":
952
+ columnExpression.addExpression(new ArithmeticExpressionImpl());
953
+ break;
954
+ case "Column":
955
+ {
956
+ const columnName = source.substring(from, to);
957
+ columnExpression.setColumn(columnName);
958
+ }
959
+ break;
960
+ case "Function":
961
+ {
962
+ const functionName = source.substring(from, to);
963
+ columnExpression.setFunction(functionName);
964
+ }
965
+ break;
966
+ case "Times":
967
+ case "Divide":
968
+ case "Plus":
969
+ case "Minus":
970
+ {
971
+ const op = source.substring(from, to);
972
+ columnExpression.setArithmeticOp(op);
973
+ }
974
+ break;
975
+ case "RelationalOperator":
976
+ {
977
+ const op = source.substring(from, to);
978
+ columnExpression.setRelationalOperator(op);
979
+ }
980
+ break;
981
+ case "False":
982
+ case "True":
983
+ {
984
+ const value = source.substring(from, to);
985
+ columnExpression.setValue(value === "true" ? true : false);
986
+ }
987
+ break;
988
+ case "String":
989
+ columnExpression.setValue(source.substring(from + 1, to - 1));
990
+ break;
991
+ case "Number":
992
+ columnExpression.setValue(parseFloat(source.substring(from, to)));
993
+ break;
994
+ case "CloseBrace":
995
+ columnExpression.closeBrace();
996
+ break;
997
+ default:
998
+ }
999
+ } while (cursor.next());
1000
+ return columnExpression.toJSON();
1001
+ };
1002
+
1003
+ // src/column-expression-input/column-language-parser/column-expression-parse-utils.ts
1004
+ var strictParser = parser.configure({ strict: true });
1005
+ var RelationalOperands = ["Number", "String"];
1006
+ var ColumnNamedTerms = [
1007
+ ...RelationalOperands,
1008
+ "AndCondition",
1009
+ "ArithmeticExpression",
1010
+ "BooleanOperator",
1011
+ "RelationalOperatorOperator",
1012
+ "CallExpression",
1013
+ "CloseBrace",
1014
+ "Column",
1015
+ "Comma",
1016
+ "ConditionalExpression",
1017
+ "Divide",
1018
+ "Equal",
1019
+ "If",
1020
+ "Minus",
1021
+ "OpenBrace",
1022
+ "OrCondition",
1023
+ "ParenthesizedExpression",
1024
+ "Plus",
1025
+ "RelationalExpression",
1026
+ "RelationalOperator",
1027
+ "Times"
1028
+ ];
1029
+ var isCompleteExpression = (src) => {
1030
+ try {
1031
+ strictParser.parse(src);
1032
+ return true;
1033
+ } catch (err) {
1034
+ return false;
1035
+ }
1036
+ };
1037
+ var lastNamedChild = (node) => {
1038
+ let { lastChild } = node;
1039
+ while (lastChild && !ColumnNamedTerms.includes(lastChild.name)) {
1040
+ lastChild = lastChild.prevSibling;
1041
+ console.log(lastChild == null ? void 0 : lastChild.name);
1042
+ }
1043
+ return lastChild;
1044
+ };
1045
+ var isCompleteRelationalExpression = (node) => {
1046
+ if ((node == null ? void 0 : node.name) === "RelationalExpression") {
1047
+ const { firstChild } = node;
1048
+ const lastChild = lastNamedChild(node);
1049
+ if ((firstChild == null ? void 0 : firstChild.name) === "Column" && typeof (lastChild == null ? void 0 : lastChild.name) === "string" && RelationalOperands.includes(lastChild.name)) {
1050
+ return true;
1051
+ }
1052
+ }
1053
+ return false;
1054
+ };
1055
+
1056
+ // src/column-expression-input/highlighting.ts
1057
+ import {
1058
+ HighlightStyle,
1059
+ syntaxHighlighting,
1060
+ tags
1061
+ } from "@vuu-ui/vuu-codemirror";
1062
+ var myHighlightStyle = HighlightStyle.define([
1063
+ {
1064
+ tag: tags.attributeValue,
1065
+ color: "var(--vuuFilterEditor-variableColor);font-weight: bold"
1066
+ },
1067
+ { tag: tags.variableName, color: "var(--vuuFilterEditor-variableColor)" },
1068
+ { tag: tags.comment, color: "green", fontStyle: "italic" }
1069
+ ]);
1070
+ var vuuHighlighting = syntaxHighlighting(myHighlightStyle);
1071
+
1072
+ // src/column-expression-input/theme.ts
1073
+ import { EditorView } from "@vuu-ui/vuu-codemirror";
1074
+ var vuuTheme = EditorView.theme(
1075
+ {
1076
+ "&": {
1077
+ border: "solid 1px var(--salt-container-primary-borderColor)",
1078
+ color: "var(--vuuFilterEditor-color)",
1079
+ backgroundColor: "var(--vuuFilterEditor-background)"
1080
+ },
1081
+ ".cm-content": {
1082
+ caretColor: "var(--vuuFilterEditor-cursorColor)"
1083
+ },
1084
+ "&.cm-focused .cm-cursor": {
1085
+ borderLeftColor: "var(--vuuFilterEditor-cursorColor)"
1086
+ },
1087
+ "&.cm-focused .cm-selectionBackground, ::selection": {
1088
+ backgroundColor: "var(--vuuFilterEditor-selectionBackground)"
1089
+ },
1090
+ ".cm-selectionBackground, ::selection": {
1091
+ backgroundColor: "var(--vuuFilterEditor-selectionBackground)"
1092
+ },
1093
+ ".cm-scroller": {
1094
+ fontFamily: "var(--vuuFilterEditor-fontFamily)"
1095
+ },
1096
+ ".cm-completionLabel": {
1097
+ color: "var(--vuu-color-gray-50)"
1098
+ },
1099
+ ".cm-completionMatchedText": {
1100
+ color: "var(--vuu-color-gray-80)",
1101
+ fontWeight: 700,
1102
+ textDecoration: "none"
1103
+ },
1104
+ ".cm-tooltip": {
1105
+ background: "var(--vuuFilterEditor-tooltipBackground)",
1106
+ border: "var(--vuuFilterEditor-tooltipBorder)",
1107
+ borderRadius: "4px",
1108
+ boxShadow: "var(--vuuFilterEditor-tooltipElevation)",
1109
+ "&.cm-tooltip-autocomplete > ul": {
1110
+ fontFamily: "var(--vuuFilterEditor-fontFamily)",
1111
+ fontSize: "var(--vuuFilterEditor-fontSize)",
1112
+ maxHeight: "240px"
1113
+ },
1114
+ "&.cm-tooltip-autocomplete > ul > li": {
1115
+ height: "var(--vuuFilterEditor-suggestion-height)",
1116
+ padding: "0 3px",
1117
+ lineHeight: "var(--vuuFilterEditor-suggestion-height)"
1118
+ },
1119
+ "&.cm-tooltip-autocomplete li[aria-selected]": {
1120
+ background: "var(--vuuFilterEditor-suggestion-selectedBackground)",
1121
+ color: "var(--vuuFilterEditor-suggestion-selectedColor)"
1122
+ },
1123
+ "&.cm-tooltip-autocomplete li .cm-completionDetail": {
1124
+ color: "var(--vuuFilterEditor-suggestion-detailColor)"
1125
+ }
1126
+ }
1127
+ },
1128
+ { dark: false }
1129
+ );
1130
+
1131
+ // src/column-expression-input/useColumnAutoComplete.ts
1132
+ import {
1133
+ booleanJoinSuggestions,
1134
+ getNamedParentNode,
1135
+ getPreviousNode,
1136
+ getValue,
1137
+ syntaxTree
1138
+ } from "@vuu-ui/vuu-codemirror";
1139
+ import { useCallback as useCallback4 } from "react";
1140
+ var applyPrefix = (completions, prefix) => prefix ? completions.map((completion) => {
1141
+ var _a;
1142
+ return {
1143
+ ...completion,
1144
+ apply: typeof completion.apply === "function" ? completion.apply : `${prefix}${(_a = completion.apply) != null ? _a : completion.label}`
1145
+ };
1146
+ }) : completions;
1147
+ var isOperator = (node) => node === void 0 ? false : ["Times", "Divide", "Plus", "Minus"].includes(node.name);
1148
+ var completionDone = (onSubmit) => ({
1149
+ apply: () => {
1150
+ onSubmit == null ? void 0 : onSubmit();
1151
+ },
1152
+ label: "Done",
1153
+ boost: 10
1154
+ });
1155
+ var getLastChild = (node, context) => {
1156
+ var _a;
1157
+ let { lastChild: childNode } = node;
1158
+ const { pos } = context;
1159
+ while (childNode) {
1160
+ const isBeforeCursor = childNode.from < pos;
1161
+ if (isBeforeCursor && ColumnNamedTerms.includes(childNode.name)) {
1162
+ if (childNode.name === "ParenthesizedExpression") {
1163
+ const expression = (_a = childNode.firstChild) == null ? void 0 : _a.nextSibling;
1164
+ if (expression) {
1165
+ childNode = expression;
1166
+ }
1167
+ }
1168
+ return childNode;
1169
+ } else {
1170
+ childNode = childNode.prevSibling;
1171
+ }
1172
+ }
1173
+ };
1174
+ var getFunctionName = (node, state) => {
1175
+ var _a;
1176
+ if (node.name === "ArgList") {
1177
+ const functionNode = node.prevSibling;
1178
+ if (functionNode) {
1179
+ return getValue(functionNode, state);
1180
+ }
1181
+ } else if (node.name === "OpenBrace") {
1182
+ const maybeFunction = (_a = node.parent) == null ? void 0 : _a.prevSibling;
1183
+ if ((maybeFunction == null ? void 0 : maybeFunction.name) === "Function") {
1184
+ return getValue(maybeFunction, state);
1185
+ }
1186
+ }
1187
+ };
1188
+ var getRelationalOperator = (node, state) => {
1189
+ if (node.name === "RelationalExpression") {
1190
+ const lastNode = lastNamedChild(node);
1191
+ if ((lastNode == null ? void 0 : lastNode.name) === "RelationalOperator") {
1192
+ return getValue(lastNode, state);
1193
+ }
1194
+ } else {
1195
+ const prevNode = node.prevSibling;
1196
+ if ((prevNode == null ? void 0 : prevNode.name) === "RelationalOperator") {
1197
+ return getValue(prevNode, state);
1198
+ }
1199
+ }
1200
+ };
1201
+ var getColumnName = (node, state) => {
1202
+ var _a;
1203
+ if (node.name === "RelationalExpression") {
1204
+ if (((_a = node.firstChild) == null ? void 0 : _a.name) === "Column") {
1205
+ return getValue(node.firstChild, state);
1206
+ }
1207
+ } else {
1208
+ const prevNode = node.prevSibling;
1209
+ if ((prevNode == null ? void 0 : prevNode.name) === "Column") {
1210
+ return getValue(prevNode, state);
1211
+ } else if ((prevNode == null ? void 0 : prevNode.name) === "RelationalOperator") {
1212
+ return getColumnName(prevNode, state);
1213
+ }
1214
+ }
1215
+ };
1216
+ var makeSuggestions = async (context, suggestionProvider, suggestionType, optionalArgs = {}) => {
1217
+ const options = await suggestionProvider.getSuggestions(
1218
+ suggestionType,
1219
+ optionalArgs
1220
+ );
1221
+ const { startsWith = "" } = optionalArgs;
1222
+ return { from: context.pos - startsWith.length, options };
1223
+ };
1224
+ var handleConditionalExpression = (node, context, suggestionProvider, maybeComplete, onSubmit) => {
1225
+ const lastChild = getLastChild(node, context);
1226
+ switch (lastChild == null ? void 0 : lastChild.name) {
1227
+ case "If":
1228
+ return makeSuggestions(context, suggestionProvider, "expression", {
1229
+ prefix: "( "
1230
+ });
1231
+ case "OpenBrace":
1232
+ return makeSuggestions(context, suggestionProvider, "expression");
1233
+ case "Condition":
1234
+ return makeSuggestions(context, suggestionProvider, "expression", {
1235
+ prefix: ", "
1236
+ });
1237
+ case "CloseBrace":
1238
+ if (maybeComplete) {
1239
+ const options = [completionDone(onSubmit)];
1240
+ return { from: context.pos, options };
1241
+ }
1242
+ }
1243
+ };
1244
+ var promptToSave = (context, onSubmit) => {
1245
+ const options = [completionDone(onSubmit)];
1246
+ return { from: context.pos, options };
1247
+ };
1248
+ var useColumnAutoComplete = (suggestionProvider, onSubmit) => {
1249
+ const makeSuggestions2 = useCallback4(
1250
+ async (context, suggestionType, optionalArgs = {}) => {
1251
+ const options = await suggestionProvider.getSuggestions(
1252
+ suggestionType,
1253
+ optionalArgs
1254
+ );
1255
+ const { startsWith = "" } = optionalArgs;
1256
+ return { from: context.pos - startsWith.length, options };
1257
+ },
1258
+ [suggestionProvider]
1259
+ );
1260
+ return useCallback4(
1261
+ async (context) => {
1262
+ var _a, _b;
1263
+ const { state, pos } = context;
1264
+ const word = (_a = context.matchBefore(/\w*/)) != null ? _a : {
1265
+ from: 0,
1266
+ to: 0,
1267
+ text: void 0
1268
+ };
1269
+ const tree = syntaxTree(state);
1270
+ const nodeBefore = tree.resolveInner(pos, -1);
1271
+ const text = state.doc.toString();
1272
+ const maybeComplete = isCompleteExpression(text);
1273
+ switch (nodeBefore.name) {
1274
+ case "If": {
1275
+ return makeSuggestions2(context, "expression", { prefix: "( " });
1276
+ }
1277
+ case "Condition":
1278
+ {
1279
+ const lastChild = getLastChild(nodeBefore, context);
1280
+ if ((lastChild == null ? void 0 : lastChild.name) === "Column") {
1281
+ const prevChild = getPreviousNode(lastChild);
1282
+ if ((prevChild == null ? void 0 : prevChild.name) !== "RelationalOperator") {
1283
+ return makeSuggestions2(context, "condition-operator", {
1284
+ columnName: getValue(lastChild, state)
1285
+ });
1286
+ }
1287
+ } else if ((lastChild == null ? void 0 : lastChild.name) === "RelationalOperator") {
1288
+ return makeSuggestions2(context, "expression");
1289
+ }
1290
+ }
1291
+ break;
1292
+ case "ConditionalExpression":
1293
+ return handleConditionalExpression(
1294
+ nodeBefore,
1295
+ context,
1296
+ suggestionProvider
1297
+ );
1298
+ case "RelationalExpression":
1299
+ {
1300
+ if (isCompleteRelationalExpression(nodeBefore)) {
1301
+ return {
1302
+ from: context.pos,
1303
+ options: booleanJoinSuggestions.concat({
1304
+ label: ", <truthy expression>, <falsy expression>",
1305
+ apply: ", "
1306
+ })
1307
+ };
1308
+ } else {
1309
+ const operator = getRelationalOperator(nodeBefore, state);
1310
+ const columnName = getColumnName(nodeBefore, state);
1311
+ if (!operator) {
1312
+ const options = await suggestionProvider.getSuggestions(
1313
+ "condition-operator",
1314
+ {
1315
+ columnName
1316
+ }
1317
+ );
1318
+ return { from: context.pos, options };
1319
+ } else {
1320
+ return makeSuggestions2(context, "expression");
1321
+ }
1322
+ }
1323
+ }
1324
+ break;
1325
+ case "RelationalOperator":
1326
+ return makeSuggestions2(context, "expression");
1327
+ case "String":
1328
+ {
1329
+ const operator = getRelationalOperator(
1330
+ nodeBefore,
1331
+ state
1332
+ );
1333
+ const columnName = getColumnName(nodeBefore, state);
1334
+ const { from, to } = nodeBefore;
1335
+ if (to - from === 2 && context.pos === from + 1) {
1336
+ if (columnName && operator) {
1337
+ return makeSuggestions2(context, "columnValue", {
1338
+ columnName,
1339
+ operator,
1340
+ startsWith: word.text
1341
+ });
1342
+ }
1343
+ } else if (to - from > 2 && context.pos === to) {
1344
+ return makeSuggestions2(context, "expression", {
1345
+ prefix: ", "
1346
+ });
1347
+ }
1348
+ }
1349
+ break;
1350
+ case "ArithmeticExpression":
1351
+ {
1352
+ const lastChild = getLastChild(nodeBefore, context);
1353
+ if ((lastChild == null ? void 0 : lastChild.name) === "Column") {
1354
+ return makeSuggestions2(context, "expression");
1355
+ } else if (isOperator(lastChild)) {
1356
+ const operator = lastChild.name;
1357
+ return makeSuggestions2(context, "column", { operator });
1358
+ }
1359
+ }
1360
+ break;
1361
+ case "OpenBrace":
1362
+ {
1363
+ const functionName = getFunctionName(nodeBefore, state);
1364
+ return makeSuggestions2(context, "expression", { functionName });
1365
+ }
1366
+ break;
1367
+ case "ArgList": {
1368
+ const functionName = getFunctionName(nodeBefore, state);
1369
+ const lastArgument = getLastChild(nodeBefore, context);
1370
+ const prefix = (lastArgument == null ? void 0 : lastArgument.name) === "OpenBrace" || (lastArgument == null ? void 0 : lastArgument.name) === "Comma" ? void 0 : ",";
1371
+ let options = await suggestionProvider.getSuggestions("expression", {
1372
+ functionName
1373
+ });
1374
+ options = prefix ? applyPrefix(options, ", ") : options;
1375
+ if ((lastArgument == null ? void 0 : lastArgument.name) !== "OpenBrace" && (lastArgument == null ? void 0 : lastArgument.name) !== "Comma") {
1376
+ options = [
1377
+ {
1378
+ apply: ") ",
1379
+ boost: 10,
1380
+ label: "Done - no more arguments"
1381
+ }
1382
+ ].concat(options);
1383
+ }
1384
+ return { from: context.pos, options };
1385
+ }
1386
+ case "Equal":
1387
+ if (text.trim() === "=") {
1388
+ return makeSuggestions2(context, "expression");
1389
+ }
1390
+ break;
1391
+ case "ParenthesizedExpression":
1392
+ case "ColumnDefinitionExpression":
1393
+ if (context.pos === 0) {
1394
+ return makeSuggestions2(context, "expression");
1395
+ } else {
1396
+ const lastChild = getLastChild(nodeBefore, context);
1397
+ if ((lastChild == null ? void 0 : lastChild.name) === "Column") {
1398
+ if (maybeComplete) {
1399
+ const options = [
1400
+ completionDone(onSubmit.current)
1401
+ ];
1402
+ const columnName = getValue(lastChild, state);
1403
+ const columnOptions = await suggestionProvider.getSuggestions("operator", {
1404
+ columnName
1405
+ });
1406
+ return {
1407
+ from: context.pos,
1408
+ options: options.concat(columnOptions)
1409
+ };
1410
+ }
1411
+ } else if ((lastChild == null ? void 0 : lastChild.name) === "CallExpression") {
1412
+ if (maybeComplete) {
1413
+ return {
1414
+ from: context.pos,
1415
+ options: [completionDone(onSubmit.current)]
1416
+ };
1417
+ }
1418
+ } else if ((lastChild == null ? void 0 : lastChild.name) === "ArithmeticExpression") {
1419
+ if (maybeComplete) {
1420
+ let options = [completionDone(onSubmit.current)];
1421
+ const lastExpressionChild = getLastChild(lastChild, context);
1422
+ if ((lastExpressionChild == null ? void 0 : lastExpressionChild.name) === "Column") {
1423
+ const columnName = getValue(lastExpressionChild, state);
1424
+ const suggestions = await suggestionProvider.getSuggestions(
1425
+ "operator",
1426
+ { columnName }
1427
+ );
1428
+ options = options.concat(suggestions);
1429
+ }
1430
+ return {
1431
+ from: context.pos,
1432
+ options
1433
+ };
1434
+ }
1435
+ } else if ((lastChild == null ? void 0 : lastChild.name) === "ConditionalExpression") {
1436
+ return handleConditionalExpression(
1437
+ lastChild,
1438
+ context,
1439
+ suggestionProvider,
1440
+ maybeComplete,
1441
+ onSubmit.current
1442
+ );
1443
+ }
1444
+ break;
1445
+ }
1446
+ case "Column":
1447
+ {
1448
+ const isPartialMatch = await suggestionProvider.isPartialMatch(
1449
+ "expression",
1450
+ void 0,
1451
+ word.text
1452
+ );
1453
+ if (isPartialMatch) {
1454
+ return makeSuggestions2(context, "expression", {
1455
+ startsWith: word.text
1456
+ });
1457
+ }
1458
+ }
1459
+ break;
1460
+ case "Comma":
1461
+ {
1462
+ const parentNode = getNamedParentNode(nodeBefore);
1463
+ if ((parentNode == null ? void 0 : parentNode.name) === "ConditionalExpression") {
1464
+ return makeSuggestions2(context, "expression");
1465
+ }
1466
+ }
1467
+ break;
1468
+ case "CloseBrace":
1469
+ {
1470
+ const parentNode = getNamedParentNode(nodeBefore);
1471
+ if ((parentNode == null ? void 0 : parentNode.name) === "ConditionalExpression") {
1472
+ return handleConditionalExpression(
1473
+ parentNode,
1474
+ context,
1475
+ suggestionProvider,
1476
+ maybeComplete,
1477
+ onSubmit.current
1478
+ );
1479
+ } else if ((parentNode == null ? void 0 : parentNode.name) === "ArgList") {
1480
+ if (maybeComplete) {
1481
+ return promptToSave(context, onSubmit.current);
1482
+ }
1483
+ }
1484
+ }
1485
+ break;
1486
+ default: {
1487
+ if (((_b = nodeBefore == null ? void 0 : nodeBefore.prevSibling) == null ? void 0 : _b.name) === "FilterClause") {
1488
+ console.log("looks like we ight be a or|and operator");
1489
+ }
1490
+ }
1491
+ }
1492
+ },
1493
+ [makeSuggestions2, onSubmit, suggestionProvider]
1494
+ );
1495
+ };
1496
+
1497
+ // src/column-expression-input/useColumnExpressionEditor.ts
1498
+ var getView = (ref) => {
1499
+ if (ref.current == void 0) {
1500
+ throw Error("EditorView not defined");
1501
+ }
1502
+ return ref.current;
1503
+ };
1504
+ var getOptionClass = () => {
1505
+ return "vuuSuggestion";
1506
+ };
1507
+ var noop = () => console.log("noooop");
1508
+ var hasExpressionType = (completion) => "expressionType" in completion;
1509
+ var injectOptionContent = (completion) => {
1510
+ if (hasExpressionType(completion)) {
1511
+ const div = createEl("div", "expression-type-container");
1512
+ const span = createEl("span", "expression-type", completion.expressionType);
1513
+ div.appendChild(span);
1514
+ return div;
1515
+ } else {
1516
+ return null;
1517
+ }
1518
+ };
1519
+ var useColumnExpressionEditor = ({
1520
+ onChange,
1521
+ onSubmitExpression,
1522
+ source,
1523
+ suggestionProvider
1524
+ }) => {
1525
+ const editorRef = useRef2(null);
1526
+ const onSubmitRef = useRef2(noop);
1527
+ const viewRef = useRef2();
1528
+ const completionFn = useColumnAutoComplete(suggestionProvider, onSubmitRef);
1529
+ const [createState, clearInput, submit] = useMemo(() => {
1530
+ const parseExpression = () => {
1531
+ const view = getView(viewRef);
1532
+ const source2 = view.state.doc.toString();
1533
+ const tree = ensureSyntaxTree(view.state, view.state.doc.length, 5e3);
1534
+ if (tree) {
1535
+ const expression = walkTree(tree, source2);
1536
+ return [source2, expression];
1537
+ } else {
1538
+ return ["", void 0];
1539
+ }
1540
+ };
1541
+ const clearInput2 = () => {
1542
+ getView(viewRef).setState(createState2());
1543
+ };
1544
+ const submitExpression = () => {
1545
+ const [source2, expression] = parseExpression();
1546
+ onSubmitExpression == null ? void 0 : onSubmitExpression(source2, expression);
1547
+ };
1548
+ const showSuggestions = (key) => {
1549
+ return keymap.of([
1550
+ {
1551
+ key,
1552
+ run() {
1553
+ startCompletion(getView(viewRef));
1554
+ return true;
1555
+ }
1556
+ }
1557
+ ]);
1558
+ };
1559
+ const createState2 = () => EditorState2.create({
1560
+ doc: source,
1561
+ extensions: [
1562
+ minimalSetup,
1563
+ autocompletion({
1564
+ addToOptions: [
1565
+ {
1566
+ render: injectOptionContent,
1567
+ position: 70
1568
+ }
1569
+ ],
1570
+ override: [completionFn],
1571
+ optionClass: getOptionClass
1572
+ }),
1573
+ columnExpressionLanguageSupport(),
1574
+ keymap.of(defaultKeymap),
1575
+ showSuggestions("ArrowDown"),
1576
+ EditorView2.updateListener.of((v) => {
1577
+ const view = getView(viewRef);
1578
+ if (v.docChanged) {
1579
+ startCompletion(view);
1580
+ const source2 = view.state.doc.toString();
1581
+ onChange == null ? void 0 : onChange(source2);
1582
+ }
1583
+ }),
1584
+ // Enforces single line view
1585
+ EditorState2.transactionFilter.of(
1586
+ (tr) => tr.newDoc.lines > 1 ? [] : tr
1587
+ ),
1588
+ vuuTheme,
1589
+ vuuHighlighting
1590
+ ]
1591
+ });
1592
+ onSubmitRef.current = () => {
1593
+ submitExpression();
1594
+ };
1595
+ return [createState2, clearInput2, submitExpression];
1596
+ }, [completionFn, onChange, onSubmitExpression, source]);
1597
+ useEffect2(() => {
1598
+ if (!editorRef.current) {
1599
+ throw Error("editor not in dom");
1600
+ }
1601
+ viewRef.current = new EditorView2({
1602
+ state: createState(),
1603
+ parent: editorRef.current
1604
+ });
1605
+ return () => {
1606
+ var _a;
1607
+ (_a = viewRef.current) == null ? void 0 : _a.destroy();
1608
+ };
1609
+ }, [completionFn, createState]);
1610
+ const handleBlur = useCallback5(() => {
1611
+ submit();
1612
+ }, [submit]);
1613
+ return { editorRef, clearInput, onBlur: handleBlur };
1614
+ };
1615
+
1616
+ // src/column-expression-input/ColumnExpressionInput.tsx
1617
+ import { jsx as jsx7 } from "react/jsx-runtime";
1618
+ var classBase6 = "vuuColumnExpressionInput";
1619
+ var ColumnExpressionInput = memo4(
1620
+ ({
1621
+ onChange,
1622
+ onSubmitExpression,
1623
+ source = "",
1624
+ suggestionProvider
1625
+ }) => {
1626
+ const { editorRef, onBlur } = useColumnExpressionEditor({
1627
+ onChange,
1628
+ onSubmitExpression,
1629
+ source,
1630
+ suggestionProvider
1631
+ });
1632
+ return /* @__PURE__ */ jsx7("div", { className: `${classBase6}`, onBlur, ref: editorRef });
1633
+ },
1634
+ (prevProps, newProps) => {
1635
+ return prevProps.source === newProps.source;
1636
+ }
1637
+ );
1638
+ ColumnExpressionInput.displayName = "ColumnExpressionInput";
1639
+
1640
+ // src/column-expression-input/useColumnExpressionSuggestionProvider.ts
1641
+ import {
1642
+ AnnotationType,
1643
+ getRelationalOperators,
1644
+ numericOperators,
1645
+ stringOperators,
1646
+ toSuggestions
1647
+ } from "@vuu-ui/vuu-codemirror";
1648
+ import {
1649
+ getTypeaheadParams,
1650
+ useTypeaheadSuggestions
1651
+ } from "@vuu-ui/vuu-data-react";
1652
+ import { isNumericColumn, isTextColumn } from "@vuu-ui/vuu-utils";
1653
+ import { useCallback as useCallback6, useRef as useRef3 } from "react";
1654
+
1655
+ // src/column-expression-input/column-function-descriptors.ts
1656
+ var columnFunctionDescriptors = [
1657
+ /**
1658
+ * and
1659
+ */
1660
+ {
1661
+ accepts: ["boolean"],
1662
+ description: "Applies boolean and operator across supplied parameters to returns a single boolean result",
1663
+ example: {
1664
+ expression: 'and(ccy="EUR",quantity=0)',
1665
+ result: "true | false"
1666
+ },
1667
+ name: "and",
1668
+ params: {
1669
+ description: "( boolean, [ boolean* ] )"
1670
+ },
1671
+ type: "boolean"
1672
+ },
1673
+ /**
1674
+ * concatenate()
1675
+ */
1676
+ {
1677
+ accepts: "string",
1678
+ description: "Returns multiple string values as a single joined string. Arguments may be string literal values, string columns or other string expressions. Non string arguments may also be included, these will be converted to strings.",
1679
+ example: {
1680
+ expression: 'concatenate("example", "-test")',
1681
+ result: '"example-test"'
1682
+ },
1683
+ name: "concatenate",
1684
+ params: {
1685
+ description: "( string, string, [ string* ] )"
1686
+ },
1687
+ type: "string"
1688
+ },
1689
+ /**
1690
+ * contains()
1691
+ */
1692
+ {
1693
+ accepts: ["string", "string"],
1694
+ description: "Tests a string value to determine whether it contains a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> contains one or more occurrences of <target subscring>",
1695
+ example: {
1696
+ expression: 'contains("Royal Bank of Scotland", "bank")',
1697
+ result: "true"
1698
+ },
1699
+ name: "contains",
1700
+ params: {
1701
+ description: "( string )"
1702
+ },
1703
+ type: "boolean"
1704
+ },
1705
+ /**
1706
+ * left()
1707
+ */
1708
+ {
1709
+ accepts: ["string", "number"],
1710
+ description: "Returns the leftmost <number> characters from <string>. First argument may be a string literal, string column or other string expression.",
1711
+ example: {
1712
+ expression: 'left("USD Benchmark Report", 3)',
1713
+ result: '"USD"'
1714
+ },
1715
+ name: "left",
1716
+ params: {
1717
+ count: 2,
1718
+ description: "( string, number )"
1719
+ },
1720
+ type: "string"
1721
+ },
1722
+ /**
1723
+ * len()
1724
+ */
1725
+ {
1726
+ accepts: "string",
1727
+ description: "Returns the number of characters in <string>. Argument may be a string literal, string column or other string expression.",
1728
+ example: {
1729
+ expression: 'len("example")',
1730
+ result: "7"
1731
+ },
1732
+ name: "len",
1733
+ params: {
1734
+ description: "(string)"
1735
+ },
1736
+ type: "number"
1737
+ },
1738
+ /**
1739
+ * lower()
1740
+ */
1741
+ {
1742
+ accepts: "string",
1743
+ description: "Convert a string value to lowercase. Argument may be a string column or other string expression.",
1744
+ example: {
1745
+ expression: 'lower("examPLE")',
1746
+ result: '"example"'
1747
+ },
1748
+ name: "lower",
1749
+ params: {
1750
+ description: "( string )"
1751
+ },
1752
+ type: "string"
1753
+ },
1754
+ /**
1755
+ * or
1756
+ */
1757
+ {
1758
+ accepts: ["boolean"],
1759
+ description: "Applies boolean or operator across supplied parameters to returns a single boolean result",
1760
+ example: {
1761
+ expression: 'or(status="cancelled",quantity=0)',
1762
+ result: "true | false"
1763
+ },
1764
+ name: "or",
1765
+ params: {
1766
+ description: "( boolean, [ boolean* ] )"
1767
+ },
1768
+ type: "boolean"
1769
+ },
1770
+ /**
1771
+ * upper()
1772
+ */
1773
+ {
1774
+ accepts: "string",
1775
+ description: "Convert a string value to uppercase. Argument may be a string column or other string expression.",
1776
+ example: {
1777
+ expression: 'upper("example")',
1778
+ result: '"EXAMPLE"'
1779
+ },
1780
+ name: "upper",
1781
+ params: {
1782
+ description: "( string )"
1783
+ },
1784
+ type: "string"
1785
+ },
1786
+ /**
1787
+ * right()
1788
+ */
1789
+ {
1790
+ accepts: ["string", "number"],
1791
+ description: "Returns the rightmost <number> characters from <string>. First argument may be a string literal, string column or other string expression.",
1792
+ example: {
1793
+ expression: "blah",
1794
+ result: "blah"
1795
+ },
1796
+ name: "right",
1797
+ params: {
1798
+ description: "( string )"
1799
+ },
1800
+ type: "string"
1801
+ },
1802
+ /**
1803
+ * replace()
1804
+ */
1805
+ {
1806
+ accepts: ["string", "string", "string"],
1807
+ description: "Replace characters within a string. Accepts three arguments: source text, text to replace and replacement text. Returns a copy of <source text> with any occurrences of <text to replace> replaced by <replacement text>",
1808
+ example: {
1809
+ expression: "blah",
1810
+ result: "blah"
1811
+ },
1812
+ name: "replace",
1813
+ params: {
1814
+ description: "( string )"
1815
+ },
1816
+ type: "string"
1817
+ },
1818
+ /**
1819
+ * text()
1820
+ */
1821
+ {
1822
+ accepts: "number",
1823
+ description: "Converts a number to a string.",
1824
+ example: {
1825
+ expression: "blah",
1826
+ result: "blah"
1827
+ },
1828
+ name: "text",
1829
+ params: {
1830
+ description: "( string )"
1831
+ },
1832
+ type: "string"
1833
+ },
1834
+ /**
1835
+ * starts()
1836
+ */
1837
+ {
1838
+ accepts: "string",
1839
+ description: "Tests a string value to determine whether it starts with a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> starts with <target subscring>.",
1840
+ example: {
1841
+ expression: "blah",
1842
+ result: "blah"
1843
+ },
1844
+ name: "starts",
1845
+ params: {
1846
+ description: "( string )"
1847
+ },
1848
+ type: "boolean"
1849
+ },
1850
+ /**
1851
+ * starts()
1852
+ */
1853
+ {
1854
+ accepts: "string",
1855
+ description: "Tests a string value to determine whether it ends with a given substring. Accepts two arguments: source text and target substring. Returns true if <source text> ends with <target subscring>.",
1856
+ example: {
1857
+ expression: "blah",
1858
+ result: "blah"
1859
+ },
1860
+ name: "ends",
1861
+ params: {
1862
+ description: "( string )"
1863
+ },
1864
+ type: "boolean"
1865
+ },
1866
+ {
1867
+ accepts: "number",
1868
+ description: "blah",
1869
+ example: {
1870
+ expression: "blah",
1871
+ result: "blah"
1872
+ },
1873
+ name: "min",
1874
+ params: {
1875
+ description: "( string )"
1876
+ },
1877
+ type: "number"
1878
+ },
1879
+ {
1880
+ accepts: "number",
1881
+ description: "blah",
1882
+ example: {
1883
+ expression: "blah",
1884
+ result: "blah"
1885
+ },
1886
+ name: "max",
1887
+ params: {
1888
+ description: "( string )"
1889
+ },
1890
+ type: "number"
1891
+ },
1892
+ {
1893
+ accepts: "number",
1894
+ description: "blah",
1895
+ example: {
1896
+ expression: "blah",
1897
+ result: "blah"
1898
+ },
1899
+ name: "sum",
1900
+ params: {
1901
+ description: "( string )"
1902
+ },
1903
+ type: "number"
1904
+ },
1905
+ {
1906
+ accepts: "number",
1907
+ description: "blah",
1908
+ example: {
1909
+ expression: "blah",
1910
+ result: "blah"
1911
+ },
1912
+ name: "round",
1913
+ params: {
1914
+ description: "( string )"
1915
+ },
1916
+ type: "number"
1917
+ },
1918
+ {
1919
+ accepts: "any",
1920
+ description: "blah",
1921
+ example: {
1922
+ expression: "blah",
1923
+ result: "blah"
1924
+ },
1925
+ name: "or",
1926
+ params: {
1927
+ description: "( string )"
1928
+ },
1929
+ type: "boolean"
1930
+ },
1931
+ {
1932
+ accepts: "any",
1933
+ description: "blah",
1934
+ example: {
1935
+ expression: "blah",
1936
+ result: "blah"
1937
+ },
1938
+ name: "and",
1939
+ params: {
1940
+ description: "( string )"
1941
+ },
1942
+ type: "boolean"
1943
+ },
1944
+ {
1945
+ accepts: "any",
1946
+ description: "Return one of two possible result values, depending on the evaluation of a filter expression. If <filterExpression> resolves to true, result is <expression1>, otherwise <expression2>. ",
1947
+ example: {
1948
+ expression: "blah",
1949
+ result: "blah"
1950
+ },
1951
+ name: "if",
1952
+ params: {
1953
+ description: "( filterExpression, expression1, expression 2)"
1954
+ },
1955
+ type: "variable"
1956
+ }
1957
+ ];
1958
+
1959
+ // src/column-expression-input/functionDocInfo.ts
1960
+ import { createEl as createEl2 } from "@vuu-ui/vuu-utils";
1961
+ var functionDocInfo = ({
1962
+ name: name2,
1963
+ description,
1964
+ example,
1965
+ params,
1966
+ type
1967
+ }) => {
1968
+ const rootElement = createEl2("div", "vuuFunctionDoc");
1969
+ const headingElement = createEl2("div", "function-heading");
1970
+ const nameElement = createEl2("span", "function-name", name2);
1971
+ const paramElement = createEl2("span", "param-list", params.description);
1972
+ const typeElement = createEl2("span", "function-type", type);
1973
+ headingElement.appendChild(nameElement);
1974
+ headingElement.appendChild(paramElement);
1975
+ headingElement.appendChild(typeElement);
1976
+ const child2 = createEl2("p", void 0, description);
1977
+ rootElement.appendChild(headingElement);
1978
+ rootElement.appendChild(child2);
1979
+ if (example) {
1980
+ const exampleElement = createEl2("div", "example-container");
1981
+ const expressionElement = createEl2(
1982
+ "div",
1983
+ "example-expression",
1984
+ example.expression
1985
+ );
1986
+ const resultElement = createEl2("div", "example-result", example.result);
1987
+ exampleElement.appendChild(expressionElement);
1988
+ rootElement.appendChild(exampleElement);
1989
+ rootElement.appendChild(resultElement);
1990
+ }
1991
+ return rootElement;
1992
+ };
1993
+
1994
+ // src/column-expression-input/useColumnExpressionSuggestionProvider.ts
1995
+ var NO_OPERATORS = [];
1996
+ var withApplySpace = (suggestions) => suggestions.map((suggestion) => {
1997
+ var _a;
1998
+ return {
1999
+ ...suggestion,
2000
+ apply: ((_a = suggestion.apply) != null ? _a : suggestion.label) + " "
2001
+ };
2002
+ });
2003
+ var getValidColumns = (columns, { functionName, operator }) => {
2004
+ if (operator) {
2005
+ return columns.filter(isNumericColumn);
2006
+ } else if (functionName) {
2007
+ const fn = columnFunctionDescriptors.find((f) => f.name === functionName);
2008
+ if (fn) {
2009
+ switch (fn.accepts) {
2010
+ case "string":
2011
+ return columns.filter(isTextColumn);
2012
+ case "number":
2013
+ return columns.filter(isNumericColumn);
2014
+ default:
2015
+ return columns;
2016
+ }
2017
+ }
2018
+ }
2019
+ return columns;
2020
+ };
2021
+ var getColumns = (columns, options) => {
2022
+ const validColumns = getValidColumns(columns, options);
2023
+ return validColumns.map((column) => {
2024
+ var _a;
2025
+ const label = (_a = column.label) != null ? _a : column.name;
2026
+ return {
2027
+ apply: options.prefix ? `${options.prefix}${column.name}` : column.name,
2028
+ label,
2029
+ boost: 5,
2030
+ type: "column",
2031
+ expressionType: column.serverDataType
2032
+ };
2033
+ });
2034
+ };
2035
+ var arithmeticOperators = [
2036
+ { apply: "* ", boost: 2, label: "*", type: "operator" },
2037
+ { apply: "/ ", boost: 2, label: "/", type: "operator" },
2038
+ { apply: "+ ", boost: 2, label: "+", type: "operator" },
2039
+ { apply: "- ", boost: 2, label: "-", type: "operator" }
2040
+ ];
2041
+ var getOperators = (column) => {
2042
+ if (column === void 0 || isNumericColumn(column)) {
2043
+ return arithmeticOperators;
2044
+ } else {
2045
+ return NO_OPERATORS;
2046
+ }
2047
+ };
2048
+ var getConditionOperators = (column) => {
2049
+ switch (column.serverDataType) {
2050
+ case "string":
2051
+ case "char":
2052
+ return withApplySpace(
2053
+ stringOperators
2054
+ /*, startsWith*/
2055
+ );
2056
+ case "int":
2057
+ case "long":
2058
+ case "double":
2059
+ return withApplySpace(numericOperators);
2060
+ }
2061
+ };
2062
+ var toFunctionCompletion = (functionDescriptor) => ({
2063
+ apply: `${functionDescriptor.name}( `,
2064
+ boost: 2,
2065
+ expressionType: functionDescriptor.type,
2066
+ info: () => functionDocInfo(functionDescriptor),
2067
+ label: functionDescriptor.name,
2068
+ type: "function"
2069
+ });
2070
+ var getAcceptedTypes = (fn) => {
2071
+ if (fn) {
2072
+ if (typeof fn.accepts === "string") {
2073
+ return fn.accepts;
2074
+ } else if (Array.isArray(fn.accepts)) {
2075
+ if (fn.accepts.every((s) => s === "string")) {
2076
+ return "string";
2077
+ } else {
2078
+ return "any";
2079
+ }
2080
+ }
2081
+ }
2082
+ return "any";
2083
+ };
2084
+ var functions = columnFunctionDescriptors.map(toFunctionCompletion);
2085
+ var getFunctions = ({ functionName }) => {
2086
+ if (functionName) {
2087
+ const fn = columnFunctionDescriptors.find((f) => f.name === functionName);
2088
+ const acceptedTypes = getAcceptedTypes(fn);
2089
+ if (fn) {
2090
+ switch (acceptedTypes) {
2091
+ case "string":
2092
+ return columnFunctionDescriptors.filter((f) => f.type === "string" || f.type === "variable").map(toFunctionCompletion);
2093
+ case "number":
2094
+ return columnFunctionDescriptors.filter((f) => f.type === "number" || f.type === "variable").map(toFunctionCompletion);
2095
+ default:
2096
+ }
2097
+ }
2098
+ }
2099
+ return functions;
2100
+ };
2101
+ var NONE = {};
2102
+ var useColumnExpressionSuggestionProvider = ({
2103
+ columns,
2104
+ table
2105
+ }) => {
2106
+ const findColumn = useCallback6(
2107
+ (name2) => name2 ? columns.find((col) => col.name === name2) : void 0,
2108
+ [columns]
2109
+ );
2110
+ const latestSuggestionsRef = useRef3();
2111
+ const getTypeaheadSuggestions = useTypeaheadSuggestions();
2112
+ const getSuggestions = useCallback6(
2113
+ async (suggestionType, options = NONE) => {
2114
+ const { columnName, functionName, operator, prefix } = options;
2115
+ switch (suggestionType) {
2116
+ case "expression": {
2117
+ const suggestions = await withApplySpace(
2118
+ getColumns(columns, { functionName, prefix })
2119
+ ).concat(getFunctions(options));
2120
+ return latestSuggestionsRef.current = suggestions;
2121
+ }
2122
+ case "column": {
2123
+ const suggestions = await getColumns(columns, options);
2124
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
2125
+ }
2126
+ case "operator": {
2127
+ const suggestions = await getOperators(findColumn(columnName));
2128
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
2129
+ }
2130
+ case "relational-operator": {
2131
+ const suggestions = await getRelationalOperators(
2132
+ findColumn(columnName)
2133
+ );
2134
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
2135
+ }
2136
+ case "condition-operator":
2137
+ {
2138
+ const column = findColumn(columnName);
2139
+ if (column) {
2140
+ const suggestions = await getConditionOperators(column);
2141
+ if (suggestions) {
2142
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
2143
+ }
2144
+ }
2145
+ }
2146
+ break;
2147
+ case "columnValue":
2148
+ if (columnName && operator) {
2149
+ const params = getTypeaheadParams(
2150
+ table,
2151
+ columnName
2152
+ /*, startsWith*/
2153
+ );
2154
+ const suggestions = await getTypeaheadSuggestions(params);
2155
+ latestSuggestionsRef.current = toSuggestions(suggestions, {
2156
+ suffix: ""
2157
+ });
2158
+ latestSuggestionsRef.current.forEach((suggestion) => {
2159
+ suggestion.apply = (view, completion, from) => {
2160
+ const annotation = new AnnotationType();
2161
+ const cursorPos = from + completion.label.length + 1;
2162
+ view.dispatch({
2163
+ changes: { from, insert: completion.label },
2164
+ selection: { anchor: cursorPos, head: cursorPos },
2165
+ annotations: annotation.of(completion)
2166
+ });
2167
+ };
2168
+ });
2169
+ return latestSuggestionsRef.current;
2170
+ }
2171
+ break;
2172
+ }
2173
+ return [];
2174
+ },
2175
+ [columns, findColumn, getTypeaheadSuggestions, table]
2176
+ );
2177
+ const isPartialMatch = useCallback6(
2178
+ async (valueType, columnName, pattern) => {
2179
+ const { current: latestSuggestions } = latestSuggestionsRef;
2180
+ let maybe = false;
2181
+ const suggestions = latestSuggestions || await getSuggestions(valueType, { columnName });
2182
+ if (pattern && suggestions) {
2183
+ for (const option of suggestions) {
2184
+ if (option.label === pattern) {
2185
+ return false;
2186
+ } else if (option.label.startsWith(pattern)) {
2187
+ maybe = true;
2188
+ }
2189
+ }
2190
+ }
2191
+ return maybe;
2192
+ },
2193
+ [getSuggestions]
2194
+ );
2195
+ return {
2196
+ getSuggestions,
2197
+ isPartialMatch
2198
+ };
2199
+ };
2200
+
2201
+ // src/column-expression-panel/useColumnExpression.ts
2202
+ import {
2203
+ getCalculatedColumnDetails,
2204
+ setCalculatedColumnExpression,
2205
+ setCalculatedColumnName,
2206
+ setCalculatedColumnType
2207
+ } from "@vuu-ui/vuu-utils";
2208
+ import { useCallback as useCallback7, useRef as useRef4, useState as useState3 } from "react";
2209
+ var applyDefaults = (column) => {
2210
+ const [name2, expression, type] = getCalculatedColumnDetails(column);
2211
+ if (type === "") {
2212
+ return {
2213
+ ...column,
2214
+ name: `${name2}:string:${expression}`
2215
+ };
2216
+ } else {
2217
+ return column;
2218
+ }
2219
+ };
2220
+ var useColumnExpression = ({
2221
+ column: columnProp,
2222
+ onChangeName: onChangeNameProp
2223
+ }) => {
2224
+ const [column, _setColumn] = useState3(
2225
+ applyDefaults(columnProp)
2226
+ );
2227
+ const columnRef = useRef4(columnProp);
2228
+ const setColumn = useCallback7((column2) => {
2229
+ columnRef.current = column2;
2230
+ _setColumn(column2);
2231
+ }, []);
2232
+ const onChangeName = useCallback7(
2233
+ (evt) => {
2234
+ const { value } = evt.target;
2235
+ const newColumn = setCalculatedColumnName(column, value);
2236
+ setColumn(newColumn);
2237
+ onChangeNameProp == null ? void 0 : onChangeNameProp(newColumn.name);
2238
+ },
2239
+ [column, onChangeNameProp, setColumn]
2240
+ );
2241
+ const onChangeExpression = useCallback7(
2242
+ (value) => {
2243
+ const expression = value.trim();
2244
+ const { current: column2 } = columnRef;
2245
+ const newColumn = setCalculatedColumnExpression(column2, expression);
2246
+ setColumn(newColumn);
2247
+ onChangeNameProp == null ? void 0 : onChangeNameProp(newColumn.name);
2248
+ },
2249
+ [onChangeNameProp, setColumn]
2250
+ );
2251
+ const onChangeType = useCallback7(
2252
+ (evt, value) => {
2253
+ if (typeof value === "string") {
2254
+ const newColumn = setCalculatedColumnType(column, value);
2255
+ setColumn(newColumn);
2256
+ onChangeNameProp == null ? void 0 : onChangeNameProp(newColumn.name);
2257
+ }
2258
+ },
2259
+ [column, onChangeNameProp, setColumn]
2260
+ );
2261
+ return {
2262
+ column,
2263
+ onChangeExpression,
2264
+ onChangeName,
2265
+ onChangeType
2266
+ };
2267
+ };
2268
+
2269
+ // src/column-expression-panel/ColumnExpressionPanel.tsx
2270
+ import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
2271
+ var classBase7 = "vuuColumnExpressionPanel";
2272
+ var ColumnExpressionPanel = ({
2273
+ column: columnProp,
2274
+ onChangeName: onChangeNameProp,
2275
+ tableConfig,
2276
+ vuuTable
2277
+ }) => {
2278
+ const typeRef = useRef5(null);
2279
+ const { column, onChangeExpression, onChangeName, onChangeType } = useColumnExpression({
2280
+ column: columnProp,
2281
+ onChangeName: onChangeNameProp
2282
+ });
2283
+ const initialExpressionRef = useRef5(
2284
+ getCalculatedColumnExpression(column)
2285
+ );
2286
+ const suggestionProvider = useColumnExpressionSuggestionProvider({
2287
+ columns: tableConfig.columns,
2288
+ table: vuuTable
2289
+ });
2290
+ const handleSubmitExpression = useCallback8(() => {
2291
+ var _a, _b;
2292
+ if (typeRef.current) {
2293
+ (_b = (_a = typeRef.current) == null ? void 0 : _a.querySelector("button")) == null ? void 0 : _b.focus();
2294
+ }
2295
+ }, []);
2296
+ return /* @__PURE__ */ jsxs5("div", { className: classBase7, children: [
2297
+ /* @__PURE__ */ jsx8("div", { className: "vuuColumnSettingsPanel-header", children: /* @__PURE__ */ jsx8("span", { children: "Calculation" }) }),
2298
+ /* @__PURE__ */ jsxs5(FormField2, { "data-field": "column-name", children: [
2299
+ /* @__PURE__ */ jsx8(FormFieldLabel2, { children: "Column Name" }),
2300
+ /* @__PURE__ */ jsx8(
2301
+ Input,
2302
+ {
2303
+ className: "vuuInput",
2304
+ onChange: onChangeName,
2305
+ value: getCalculatedColumnName(column)
2306
+ }
2307
+ )
2308
+ ] }),
2309
+ /* @__PURE__ */ jsxs5(FormField2, { "data-field": "column-expression", children: [
2310
+ /* @__PURE__ */ jsx8(FormFieldLabel2, { children: "Expression" }),
2311
+ /* @__PURE__ */ jsx8(
2312
+ ColumnExpressionInput,
2313
+ {
2314
+ onChange: onChangeExpression,
2315
+ onSubmitExpression: handleSubmitExpression,
2316
+ source: initialExpressionRef.current,
2317
+ suggestionProvider
2318
+ }
2319
+ )
2320
+ ] }),
2321
+ /* @__PURE__ */ jsxs5(FormField2, { "data-field": "type", children: [
2322
+ /* @__PURE__ */ jsx8(FormFieldLabel2, { children: "Column type" }),
2323
+ /* @__PURE__ */ jsx8(
2324
+ Dropdown3,
2325
+ {
2326
+ className: `${classBase7}-type`,
2327
+ onSelectionChange: onChangeType,
2328
+ ref: typeRef,
2329
+ selected: getCalculatedColumnType(column) || null,
2330
+ source: ["double", "long", "string"],
2331
+ width: "100%"
2332
+ }
2333
+ )
2334
+ ] })
2335
+ ] });
2336
+ };
2337
+
2338
+ // src/column-formatting-settings/ColumnFormattingPanel.tsx
2339
+ import { Dropdown as Dropdown5 } from "@vuu-ui/vuu-ui-controls";
2340
+ import {
2341
+ getCellRendererOptions,
2342
+ getConfigurationEditor,
2343
+ isColumnTypeRenderer as isColumnTypeRenderer2,
2344
+ isTypeDescriptor as isTypeDescriptor5
2345
+ } from "@vuu-ui/vuu-utils";
2346
+ import { FormField as FormField6, FormFieldLabel as FormFieldLabel6 } from "@salt-ds/core";
2347
+ import cx4 from "clsx";
2348
+ import { useCallback as useCallback12, useMemo as useMemo3 } from "react";
2349
+
2350
+ // src/column-formatting-settings/BaseNumericFormattingSettings.tsx
2351
+ import { FormField as FormField3, FormFieldLabel as FormFieldLabel3, Input as Input2, Switch as Switch2 } from "@salt-ds/core";
2352
+ import { getTypeFormattingFromColumn } from "@vuu-ui/vuu-utils";
2353
+ import {
2354
+ useCallback as useCallback9,
2355
+ useState as useState4
2356
+ } from "react";
2357
+ import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
2358
+ var classBase8 = "vuuFormattingSettings";
2359
+ var BaseNumericFormattingSettings = ({
2360
+ column,
2361
+ onChangeFormatting: onChange
2362
+ }) => {
2363
+ var _a, _b, _c;
2364
+ const [formattingSettings, setFormattingSettings] = useState4(getTypeFormattingFromColumn(column));
2365
+ const handleInputKeyDown = useCallback9(
2366
+ (evt) => {
2367
+ if (evt.key === "Enter" || evt.key === "Tab") {
2368
+ onChange(formattingSettings);
2369
+ }
2370
+ },
2371
+ [formattingSettings, onChange]
2372
+ );
2373
+ const handleChangeDecimals = useCallback9(
2374
+ (evt) => {
2375
+ const { value } = evt.target;
2376
+ const numericValue = value === "" ? void 0 : isNaN(parseInt(value)) ? void 0 : parseInt(value);
2377
+ const newFormattingSettings = {
2378
+ ...formattingSettings,
2379
+ decimals: numericValue
2380
+ };
2381
+ setFormattingSettings(newFormattingSettings);
2382
+ },
2383
+ [formattingSettings]
2384
+ );
2385
+ const handleChangeAlignDecimals = useCallback9(
2386
+ (evt) => {
2387
+ const { checked } = evt.target;
2388
+ const newFormattingSettings = {
2389
+ ...formattingSettings,
2390
+ alignOnDecimals: checked
2391
+ };
2392
+ setFormattingSettings(newFormattingSettings);
2393
+ onChange(newFormattingSettings);
2394
+ },
2395
+ [formattingSettings, onChange]
2396
+ );
2397
+ const handleChangeZeroPad = useCallback9(
2398
+ (evt) => {
2399
+ const { checked } = evt.target;
2400
+ const newFormattingSettings = {
2401
+ ...formattingSettings,
2402
+ zeroPad: checked
2403
+ };
2404
+ setFormattingSettings(newFormattingSettings);
2405
+ onChange(newFormattingSettings);
2406
+ },
2407
+ [formattingSettings, onChange]
2408
+ );
2409
+ return /* @__PURE__ */ jsxs6("div", { className: classBase8, children: [
2410
+ /* @__PURE__ */ jsxs6(FormField3, { "data-field": "decimals", children: [
2411
+ /* @__PURE__ */ jsx9(FormFieldLabel3, { children: "Number of decimals" }),
2412
+ /* @__PURE__ */ jsx9(
2413
+ Input2,
2414
+ {
2415
+ className: "vuuInput",
2416
+ onChange: handleChangeDecimals,
2417
+ onKeyDown: handleInputKeyDown,
2418
+ value: (_a = formattingSettings.decimals) != null ? _a : ""
2419
+ }
2420
+ )
2421
+ ] }),
2422
+ /* @__PURE__ */ jsxs6(FormField3, { labelPlacement: "left", children: [
2423
+ /* @__PURE__ */ jsx9(FormFieldLabel3, { children: "Align on decimals" }),
2424
+ /* @__PURE__ */ jsx9(
2425
+ Switch2,
2426
+ {
2427
+ checked: (_b = formattingSettings.alignOnDecimals) != null ? _b : false,
2428
+ onChange: handleChangeAlignDecimals,
2429
+ value: "align-decimals"
2430
+ }
2431
+ )
2432
+ ] }),
2433
+ /* @__PURE__ */ jsxs6(FormField3, { labelPlacement: "left", children: [
2434
+ /* @__PURE__ */ jsx9(FormFieldLabel3, { children: "Zero pad decimals" }),
2435
+ /* @__PURE__ */ jsx9(
2436
+ Switch2,
2437
+ {
2438
+ checked: (_c = formattingSettings.zeroPad) != null ? _c : false,
2439
+ onChange: handleChangeZeroPad,
2440
+ value: "zero-pad"
2441
+ }
2442
+ )
2443
+ ] })
2444
+ ] });
2445
+ };
2446
+
2447
+ // src/column-formatting-settings/LongTypeFormattingSettings.tsx
2448
+ import { useCallback as useCallback11 } from "react";
2449
+ import {
2450
+ FormField as FormField5,
2451
+ FormFieldLabel as FormFieldLabel5,
2452
+ ToggleButton as ToggleButton2,
2453
+ ToggleButtonGroup as ToggleButtonGroup2
2454
+ } from "@salt-ds/core";
2455
+ import { isDateTimeColumn, isTypeDescriptor as isTypeDescriptor4 } from "@vuu-ui/vuu-utils";
2456
+
2457
+ // src/column-formatting-settings/DateTimeFormattingSettings.tsx
2458
+ import { useCallback as useCallback10, useMemo as useMemo2, useState as useState5 } from "react";
2459
+ import { Dropdown as Dropdown4 } from "@vuu-ui/vuu-ui-controls";
2460
+ import {
2461
+ defaultPatternsByType,
2462
+ fallbackDateTimePattern,
2463
+ getTypeFormattingFromColumn as getTypeFormattingFromColumn2,
2464
+ supportedDateTimePatterns
2465
+ } from "@vuu-ui/vuu-utils";
2466
+ import {
2467
+ FormField as FormField4,
2468
+ FormFieldLabel as FormFieldLabel4,
2469
+ ToggleButton,
2470
+ ToggleButtonGroup
2471
+ } from "@salt-ds/core";
2472
+ import { Fragment, jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
2473
+ var DateTimeFormattingSettings = ({ column, onChangeFormatting: onChange }) => {
2474
+ var _a, _b;
2475
+ const formatting = getTypeFormattingFromColumn2(column);
2476
+ const { pattern = fallbackDateTimePattern } = formatting;
2477
+ const toggleValue = useMemo2(() => getToggleValue(pattern), [pattern]);
2478
+ const [fallbackState, setFallbackState] = useState5(
2479
+ {
2480
+ time: (_a = pattern.time) != null ? _a : defaultPatternsByType.time,
2481
+ date: (_b = pattern.date) != null ? _b : defaultPatternsByType.date
2482
+ }
2483
+ );
2484
+ const onPatternChange = useCallback10(
2485
+ (pattern2) => onChange({ ...formatting, pattern: pattern2 }),
2486
+ [onChange, formatting]
2487
+ );
2488
+ const onDropdownChange = useCallback10(
2489
+ (key) => (_, p) => {
2490
+ const updatedPattern = { ...pattern != null ? pattern : {}, [key]: p };
2491
+ setFallbackState((s) => {
2492
+ var _a2, _b2;
2493
+ return {
2494
+ time: (_a2 = updatedPattern.time) != null ? _a2 : s.time,
2495
+ date: (_b2 = updatedPattern.date) != null ? _b2 : s.date
2496
+ };
2497
+ });
2498
+ onPatternChange(updatedPattern);
2499
+ },
2500
+ [onPatternChange, pattern]
2501
+ );
2502
+ const onToggleChange = useCallback10(
2503
+ (evnt) => {
2504
+ var _a2, _b2, _c, _d;
2505
+ const value = evnt.currentTarget.value;
2506
+ switch (value) {
2507
+ case "time":
2508
+ return onPatternChange({
2509
+ [value]: (_a2 = pattern[value]) != null ? _a2 : fallbackState[value]
2510
+ });
2511
+ case "date":
2512
+ return onPatternChange({
2513
+ [value]: (_b2 = pattern[value]) != null ? _b2 : fallbackState[value]
2514
+ });
2515
+ case "both":
2516
+ return onPatternChange({
2517
+ time: (_c = pattern.time) != null ? _c : fallbackState.time,
2518
+ date: (_d = pattern.date) != null ? _d : fallbackState.date
2519
+ });
2520
+ }
2521
+ },
2522
+ [onPatternChange, pattern, fallbackState]
2523
+ );
2524
+ return /* @__PURE__ */ jsxs7(Fragment, { children: [
2525
+ /* @__PURE__ */ jsxs7(FormField4, { labelPlacement: "left", children: [
2526
+ /* @__PURE__ */ jsx10(FormFieldLabel4, { children: "Display" }),
2527
+ /* @__PURE__ */ jsx10(
2528
+ ToggleButtonGroup,
2529
+ {
2530
+ className: "vuuToggleButtonGroup",
2531
+ onChange: onToggleChange,
2532
+ value: toggleValue,
2533
+ children: toggleValues.map((v) => /* @__PURE__ */ jsx10(ToggleButton, { value: v, children: v.toUpperCase() }, v))
2534
+ }
2535
+ )
2536
+ ] }),
2537
+ ["date", "time"].filter((v) => !!pattern[v]).map((v) => /* @__PURE__ */ jsxs7(FormField4, { labelPlacement: "left", children: [
2538
+ /* @__PURE__ */ jsx10(FormFieldLabel4, { children: `${labelByType[v]} pattern` }),
2539
+ /* @__PURE__ */ jsx10(
2540
+ Dropdown4,
2541
+ {
2542
+ onSelectionChange: onDropdownChange(v),
2543
+ selected: pattern[v],
2544
+ source: supportedDateTimePatterns[v],
2545
+ width: "100%"
2546
+ }
2547
+ )
2548
+ ] }, v))
2549
+ ] });
2550
+ };
2551
+ var labelByType = { date: "Date", time: "Time" };
2552
+ var toggleValues = ["date", "time", "both"];
2553
+ function getToggleValue(pattern) {
2554
+ return !pattern.time ? "date" : !pattern.date ? "time" : "both";
2555
+ }
2556
+
2557
+ // src/column-formatting-settings/LongTypeFormattingSettings.tsx
2558
+ import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
2559
+ var classBase9 = "vuuLongColumnFormattingSettings";
2560
+ var LongTypeFormattingSettings = (props) => {
2561
+ const { column, onChangeType } = props;
2562
+ const type = isTypeDescriptor4(column.type) ? column.type.name : column.type;
2563
+ const handleToggleChange = useCallback11(
2564
+ (event) => {
2565
+ const value = event.currentTarget.value;
2566
+ onChangeType(value);
2567
+ },
2568
+ [onChangeType]
2569
+ );
2570
+ return /* @__PURE__ */ jsxs8("div", { className: classBase9, children: [
2571
+ /* @__PURE__ */ jsxs8(FormField5, { children: [
2572
+ /* @__PURE__ */ jsx11(FormFieldLabel5, { children: "Type inferred as" }),
2573
+ /* @__PURE__ */ jsx11(
2574
+ ToggleButtonGroup2,
2575
+ {
2576
+ className: "vuuToggleButtonGroup",
2577
+ onChange: handleToggleChange,
2578
+ value: type != null ? type : "number",
2579
+ children: toggleValues2.map((v) => /* @__PURE__ */ jsx11(ToggleButton2, { value: v, children: v.toUpperCase() }, v))
2580
+ }
2581
+ )
2582
+ ] }),
2583
+ isDateTimeColumn(column) ? /* @__PURE__ */ jsx11(DateTimeFormattingSettings, { ...props, column }) : /* @__PURE__ */ jsx11(BaseNumericFormattingSettings, { ...props })
2584
+ ] });
2585
+ };
2586
+ var toggleValues2 = ["number", "date/time"];
2587
+
2588
+ // src/column-formatting-settings/ColumnFormattingPanel.tsx
2589
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
2590
+ var classBase10 = "vuuColumnFormattingPanel";
2591
+ var itemToString = (item) => {
2592
+ var _a;
2593
+ return (_a = item.label) != null ? _a : item.name;
2594
+ };
2595
+ var ColumnFormattingPanel = ({
2596
+ availableRenderers,
2597
+ className,
2598
+ column,
2599
+ onChangeFormatting,
2600
+ onChangeType,
2601
+ onChangeRendering,
2602
+ ...htmlAttributes
2603
+ }) => {
2604
+ const formattingSettingsForType = useMemo3(
2605
+ () => formattingSettingsByColType({ column, onChangeFormatting, onChangeType }),
2606
+ [column, onChangeFormatting, onChangeType]
2607
+ );
2608
+ const ConfigEditor = useMemo3(() => {
2609
+ const { type } = column;
2610
+ if (isTypeDescriptor5(type) && isColumnTypeRenderer2(type.renderer)) {
2611
+ const cellRendererOptions = getCellRendererOptions(type.renderer.name);
2612
+ return getConfigurationEditor(cellRendererOptions == null ? void 0 : cellRendererOptions.configEditor);
2613
+ }
2614
+ return void 0;
2615
+ }, [column]);
2616
+ const selectedCellRenderer = useMemo3(() => {
2617
+ const { type } = column;
2618
+ const [defaultRenderer] = availableRenderers;
2619
+ const rendererName = isTypeDescriptor5(type) && isColumnTypeRenderer2(type.renderer) ? type.renderer.name : void 0;
2620
+ const configuredRenderer = availableRenderers.find(
2621
+ (renderer) => renderer.name === rendererName
2622
+ );
2623
+ return configuredRenderer != null ? configuredRenderer : defaultRenderer;
2624
+ }, [availableRenderers, column]);
2625
+ const handleChangeRenderer = useCallback12(
2626
+ (_, cellRendererDescriptor) => {
2627
+ const renderProps = {
2628
+ name: cellRendererDescriptor.name
2629
+ };
2630
+ onChangeRendering == null ? void 0 : onChangeRendering(renderProps);
2631
+ },
2632
+ [onChangeRendering]
2633
+ );
2634
+ const { serverDataType = "string" } = column;
2635
+ return /* @__PURE__ */ jsxs9("div", { ...htmlAttributes, className: `vuuColumnSettingsPanel-header`, children: [
2636
+ /* @__PURE__ */ jsx12("div", { children: "Formatting" }),
2637
+ /* @__PURE__ */ jsxs9(FormField6, { children: [
2638
+ /* @__PURE__ */ jsx12(FormFieldLabel6, { children: `Renderer (data type ${column.serverDataType})` }),
2639
+ /* @__PURE__ */ jsx12(
2640
+ Dropdown5,
2641
+ {
2642
+ className: cx4(`${classBase10}-renderer`),
2643
+ itemToString,
2644
+ onSelectionChange: handleChangeRenderer,
2645
+ selected: selectedCellRenderer,
2646
+ source: availableRenderers,
2647
+ width: "100%"
2648
+ }
2649
+ )
2650
+ ] }),
2651
+ /* @__PURE__ */ jsxs9(
2652
+ "div",
2653
+ {
2654
+ className: cx4(classBase10, className, `${classBase10}-${serverDataType}`),
2655
+ children: [
2656
+ formattingSettingsForType,
2657
+ ConfigEditor ? /* @__PURE__ */ jsx12(
2658
+ ConfigEditor,
2659
+ {
2660
+ column,
2661
+ onChangeRendering
2662
+ }
2663
+ ) : null
2664
+ ]
2665
+ }
2666
+ )
2667
+ ] });
2668
+ };
2669
+ function formattingSettingsByColType(props) {
2670
+ const { column } = props;
2671
+ switch (column.serverDataType) {
2672
+ case "double":
2673
+ case "int":
2674
+ return /* @__PURE__ */ jsx12(BaseNumericFormattingSettings, { ...props });
2675
+ case "long":
2676
+ return /* @__PURE__ */ jsx12(LongTypeFormattingSettings, { ...props });
2677
+ default:
2678
+ return null;
2679
+ }
2680
+ }
2681
+
2682
+ // src/column-settings/ColumnNameLabel.tsx
2683
+ import cx5 from "clsx";
2684
+ import {
2685
+ getCalculatedColumnDetails as getCalculatedColumnDetails2,
2686
+ isCalculatedColumn
2687
+ } from "@vuu-ui/vuu-utils";
2688
+ import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
2689
+ var classBase11 = "vuuColumnNameLabel";
2690
+ var ColumnNameLabel = ({ column, onClick }) => {
2691
+ if (isCalculatedColumn(column.name)) {
2692
+ const [name2, type, expression] = getCalculatedColumnDetails2(column);
2693
+ const displayName = name2 || "name";
2694
+ const displayExpression = "=expression";
2695
+ const nameClass = displayName === "name" ? `${classBase11}-placeholder` : void 0;
2696
+ const expressionClass = expression === "" ? `${classBase11}-placeholder` : void 0;
2697
+ return /* @__PURE__ */ jsxs10(
2698
+ "div",
2699
+ {
2700
+ className: cx5(classBase11, `${classBase11}-calculated`),
2701
+ onClick,
2702
+ children: [
2703
+ /* @__PURE__ */ jsx13("span", { className: nameClass, children: displayName }),
2704
+ /* @__PURE__ */ jsx13("span", { children: ":" }),
2705
+ /* @__PURE__ */ jsx13("span", { children: type || "string" }),
2706
+ /* @__PURE__ */ jsx13("span", { children: ":" }),
2707
+ /* @__PURE__ */ jsx13("span", { className: expressionClass, children: displayExpression }),
2708
+ /* @__PURE__ */ jsx13("span", { className: `${classBase11}-edit`, "data-icon": "edit" })
2709
+ ]
2710
+ }
2711
+ );
2712
+ } else {
2713
+ return /* @__PURE__ */ jsx13("div", { className: classBase11, children: column.name });
2714
+ }
2715
+ };
2716
+
2717
+ // src/column-settings/useColumnSettings.ts
2718
+ import {
2719
+ getRegisteredCellRenderers,
2720
+ isValidColumnAlignment,
2721
+ isValidPinLocation,
2722
+ setCalculatedColumnName as setCalculatedColumnName2,
2723
+ updateColumnRenderProps,
2724
+ updateColumnFormatting,
2725
+ updateColumnType
2726
+ } from "@vuu-ui/vuu-utils";
2727
+ import {
2728
+ useCallback as useCallback13,
2729
+ useEffect as useEffect3,
2730
+ useMemo as useMemo4,
2731
+ useRef as useRef6,
2732
+ useState as useState6
2733
+ } from "react";
2734
+ var integerCellRenderers = [
2735
+ {
2736
+ description: "Default formatter for columns with data type integer",
2737
+ label: "Default Renderer (int, long)",
2738
+ name: "default-int"
2739
+ },
2740
+ ...getRegisteredCellRenderers("int")
2741
+ ];
2742
+ var doubleCellRenderers = [
2743
+ {
2744
+ description: "Default formatter for columns with data type double",
2745
+ label: "Default Renderer (double)",
2746
+ name: "default-double"
2747
+ },
2748
+ ...getRegisteredCellRenderers("double")
2749
+ ];
2750
+ var stringCellRenderers = [
2751
+ {
2752
+ description: "Default formatter for columns with data type string",
2753
+ label: "Default Renderer (string)",
2754
+ name: "default-string"
2755
+ },
2756
+ ...getRegisteredCellRenderers("string")
2757
+ ];
2758
+ var booleanCellRenderers = [
2759
+ ...getRegisteredCellRenderers("boolean")
2760
+ ];
2761
+ var getAvailableCellRenderers = (column) => {
2762
+ switch (column.serverDataType) {
2763
+ case "char":
2764
+ case "string":
2765
+ return stringCellRenderers;
2766
+ case "int":
2767
+ case "long":
2768
+ return integerCellRenderers;
2769
+ case "double":
2770
+ return doubleCellRenderers;
2771
+ case "boolean":
2772
+ return booleanCellRenderers;
2773
+ default:
2774
+ return stringCellRenderers;
2775
+ }
2776
+ };
2777
+ var getFieldName = (input) => {
2778
+ const saltFormField = input.closest(".saltFormField");
2779
+ if (saltFormField && saltFormField.dataset.field) {
2780
+ const {
2781
+ dataset: { field }
2782
+ } = saltFormField;
2783
+ return field;
2784
+ } else {
2785
+ throw Error("named form field not found");
2786
+ }
2787
+ };
2788
+ var getColumn = (columns, column) => {
2789
+ if (column.name === "::") {
2790
+ return column;
2791
+ } else {
2792
+ const col = columns.find((col2) => col2.name === column.name);
2793
+ if (col) {
2794
+ return col;
2795
+ }
2796
+ throw Error(`columns does not contain column ${name}`);
2797
+ }
2798
+ };
2799
+ var replaceColumn = (tableConfig, column) => ({
2800
+ ...tableConfig,
2801
+ columns: tableConfig.columns.map(
2802
+ (col) => col.name === column.name ? column : col
2803
+ )
2804
+ });
2805
+ var useColumnSettings = ({
2806
+ column: columnProp,
2807
+ onCancelCreateColumn,
2808
+ onConfigChange,
2809
+ onCreateCalculatedColumn,
2810
+ tableConfig
2811
+ }) => {
2812
+ const [column, setColumn] = useState6(
2813
+ getColumn(tableConfig.columns, columnProp)
2814
+ );
2815
+ const columnRef = useRef6(column);
2816
+ const [inEditMode, setEditMode] = useState6(column.name === "::");
2817
+ const handleEditCalculatedcolumn = useCallback13(() => {
2818
+ columnRef.current = column;
2819
+ setEditMode(true);
2820
+ }, [column]);
2821
+ useEffect3(() => {
2822
+ setColumn(columnProp);
2823
+ setEditMode(columnProp.name === "::");
2824
+ }, [columnProp]);
2825
+ const availableRenderers = useMemo4(() => {
2826
+ return getAvailableCellRenderers(column);
2827
+ }, [column]);
2828
+ const handleInputCommit = useCallback13(() => {
2829
+ onConfigChange(replaceColumn(tableConfig, column));
2830
+ }, [column, onConfigChange, tableConfig]);
2831
+ const handleChange = useCallback13(
2832
+ (evt) => {
2833
+ const input = evt.target;
2834
+ const fieldName = getFieldName(input);
2835
+ const { value } = input;
2836
+ switch (fieldName) {
2837
+ case "column-label":
2838
+ setColumn((state) => ({ ...state, label: value }));
2839
+ break;
2840
+ case "column-name":
2841
+ setColumn((state) => setCalculatedColumnName2(state, value));
2842
+ break;
2843
+ case "column-width":
2844
+ setColumn((state) => ({ ...state, width: parseInt(value) }));
2845
+ break;
2846
+ case "column-alignment":
2847
+ if (isValidColumnAlignment(value)) {
2848
+ const newColumn = {
2849
+ ...column,
2850
+ align: value || void 0
2851
+ };
2852
+ setColumn(newColumn);
2853
+ onConfigChange(replaceColumn(tableConfig, newColumn));
2854
+ }
2855
+ break;
2856
+ case "column-pin":
2857
+ if (isValidPinLocation(value)) {
2858
+ const newColumn = {
2859
+ ...column,
2860
+ pin: value || void 0
2861
+ };
2862
+ setColumn(newColumn);
2863
+ onConfigChange(replaceColumn(tableConfig, newColumn));
2864
+ break;
2865
+ }
2866
+ }
2867
+ },
2868
+ [column, onConfigChange, tableConfig]
2869
+ );
2870
+ const handleChangeCalculatedColumnName = useCallback13((name2) => {
2871
+ setColumn((state) => ({ ...state, name: name2 }));
2872
+ }, []);
2873
+ const handleChangeFormatting = useCallback13(
2874
+ (formatting) => {
2875
+ const newColumn = updateColumnFormatting(column, formatting);
2876
+ setColumn(newColumn);
2877
+ onConfigChange(replaceColumn(tableConfig, newColumn));
2878
+ },
2879
+ [column, onConfigChange, tableConfig]
2880
+ );
2881
+ const handleChangeType = useCallback13(
2882
+ (type) => {
2883
+ const updatedColumn = updateColumnType(column, type);
2884
+ setColumn(updatedColumn);
2885
+ onConfigChange(replaceColumn(tableConfig, updatedColumn));
2886
+ },
2887
+ [column, onConfigChange, tableConfig]
2888
+ );
2889
+ const handleChangeRendering = useCallback13(
2890
+ (renderProps) => {
2891
+ if (renderProps) {
2892
+ const newColumn = updateColumnRenderProps(
2893
+ column,
2894
+ renderProps
2895
+ );
2896
+ setColumn(newColumn);
2897
+ onConfigChange(replaceColumn(tableConfig, newColumn));
2898
+ }
2899
+ },
2900
+ [column, onConfigChange, tableConfig]
2901
+ );
2902
+ const navigateColumn = useCallback13(
2903
+ ({ moveBy }) => {
2904
+ const { columns } = tableConfig;
2905
+ const index = columns.indexOf(column) + moveBy;
2906
+ const newColumn = columns[index];
2907
+ if (newColumn) {
2908
+ setColumn(newColumn);
2909
+ }
2910
+ },
2911
+ [column, tableConfig]
2912
+ );
2913
+ const navigateNextColumn = useCallback13(() => {
2914
+ navigateColumn({ moveBy: 1 });
2915
+ }, [navigateColumn]);
2916
+ const navigatePrevColumn = useCallback13(() => {
2917
+ navigateColumn({ moveBy: -1 });
2918
+ }, [navigateColumn]);
2919
+ const handleSaveCalculatedColumn = useCallback13(() => {
2920
+ onCreateCalculatedColumn(column);
2921
+ }, [column, onCreateCalculatedColumn]);
2922
+ const handleCancelEdit = useCallback13(() => {
2923
+ if (columnProp.name === "::") {
2924
+ onCancelCreateColumn();
2925
+ } else {
2926
+ if (columnRef.current !== void 0 && columnRef.current !== column) {
2927
+ setColumn(columnRef.current);
2928
+ }
2929
+ setEditMode(false);
2930
+ }
2931
+ }, [column, columnProp.name, onCancelCreateColumn]);
2932
+ return {
2933
+ availableRenderers,
2934
+ editCalculatedColumn: inEditMode,
2935
+ column,
2936
+ navigateNextColumn,
2937
+ navigatePrevColumn,
2938
+ onCancel: handleCancelEdit,
2939
+ onChange: handleChange,
2940
+ onChangeCalculatedColumnName: handleChangeCalculatedColumnName,
2941
+ onChangeFormatting: handleChangeFormatting,
2942
+ onChangeRendering: handleChangeRendering,
2943
+ onChangeType: handleChangeType,
2944
+ onEditCalculatedColumn: handleEditCalculatedcolumn,
2945
+ onInputCommit: handleInputCommit,
2946
+ onSave: handleSaveCalculatedColumn
2947
+ };
2948
+ };
2949
+
2950
+ // src/column-settings/ColumnSettingsPanel.tsx
2951
+ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
2952
+ var classBase12 = "vuuColumnSettingsPanel";
2953
+ var getColumnLabel2 = (column) => {
2954
+ const { name: name2, label } = column;
2955
+ if (isCalculatedColumn2(name2)) {
2956
+ return label != null ? label : getCalculatedColumnName2(column);
2957
+ } else {
2958
+ return label != null ? label : name2;
2959
+ }
2960
+ };
2961
+ var ColumnSettingsPanel = ({
2962
+ column: columnProp,
2963
+ onCancelCreateColumn,
2964
+ onConfigChange,
2965
+ onCreateCalculatedColumn,
2966
+ tableConfig,
2967
+ vuuTable
2968
+ }) => {
2969
+ const isNewCalculatedColumn = columnProp.name === "::";
2970
+ const {
2971
+ availableRenderers,
2972
+ editCalculatedColumn,
2973
+ column,
2974
+ navigateNextColumn,
2975
+ navigatePrevColumn,
2976
+ onCancel,
2977
+ onChange,
2978
+ onChangeCalculatedColumnName,
2979
+ onChangeFormatting,
2980
+ onChangeRendering,
2981
+ onChangeType,
2982
+ onEditCalculatedColumn,
2983
+ onInputCommit,
2984
+ onSave
2985
+ } = useColumnSettings({
2986
+ column: columnProp,
2987
+ onCancelCreateColumn,
2988
+ onConfigChange,
2989
+ onCreateCalculatedColumn,
2990
+ tableConfig
2991
+ });
2992
+ const {
2993
+ serverDataType,
2994
+ align = getDefaultAlignment(serverDataType),
2995
+ pin,
2996
+ width
2997
+ } = column;
2998
+ return /* @__PURE__ */ jsxs11(
2999
+ "div",
3000
+ {
3001
+ className: cx6(classBase12, {
3002
+ [`${classBase12}-editing`]: editCalculatedColumn
3003
+ }),
3004
+ children: [
3005
+ /* @__PURE__ */ jsx14("div", { className: `${classBase12}-header`, children: /* @__PURE__ */ jsx14(ColumnNameLabel, { column, onClick: onEditCalculatedColumn }) }),
3006
+ editCalculatedColumn ? /* @__PURE__ */ jsx14(
3007
+ ColumnExpressionPanel,
3008
+ {
3009
+ column,
3010
+ onChangeName: onChangeCalculatedColumnName,
3011
+ tableConfig,
3012
+ vuuTable
3013
+ }
3014
+ ) : null,
3015
+ /* @__PURE__ */ jsxs11(FormField7, { "data-field": "column-label", children: [
3016
+ /* @__PURE__ */ jsx14(FormFieldLabel7, { children: "Column Label" }),
3017
+ /* @__PURE__ */ jsx14(
3018
+ VuuInput,
3019
+ {
3020
+ className: "vuuInput",
3021
+ onChange,
3022
+ onCommit: onInputCommit,
3023
+ value: getColumnLabel2(column)
3024
+ }
3025
+ )
3026
+ ] }),
3027
+ /* @__PURE__ */ jsxs11(FormField7, { "data-field": "column-width", children: [
3028
+ /* @__PURE__ */ jsx14(FormFieldLabel7, { children: "Column Width" }),
3029
+ /* @__PURE__ */ jsx14(
3030
+ VuuInput,
3031
+ {
3032
+ className: "vuuInput",
3033
+ onChange,
3034
+ value: width,
3035
+ onCommit: onInputCommit
3036
+ }
3037
+ )
3038
+ ] }),
3039
+ /* @__PURE__ */ jsxs11(FormField7, { "data-field": "column-alignment", children: [
3040
+ /* @__PURE__ */ jsx14(FormFieldLabel7, { children: "Alignment" }),
3041
+ /* @__PURE__ */ jsxs11(
3042
+ ToggleButtonGroup3,
3043
+ {
3044
+ className: "vuuToggleButtonGroup",
3045
+ onChange,
3046
+ value: align,
3047
+ children: [
3048
+ /* @__PURE__ */ jsx14(
3049
+ ToggleButton3,
3050
+ {
3051
+ "data-icon": "align-left",
3052
+ className: "vuuIconToggleButton",
3053
+ value: "left"
3054
+ }
3055
+ ),
3056
+ /* @__PURE__ */ jsx14(
3057
+ ToggleButton3,
3058
+ {
3059
+ "data-icon": "align-right",
3060
+ className: "vuuIconToggleButton",
3061
+ value: "right"
3062
+ }
3063
+ )
3064
+ ]
3065
+ }
3066
+ )
3067
+ ] }),
3068
+ /* @__PURE__ */ jsxs11(FormField7, { "data-field": "column-pin", children: [
3069
+ /* @__PURE__ */ jsx14(FormFieldLabel7, { children: "Pin Column" }),
3070
+ /* @__PURE__ */ jsxs11(
3071
+ ToggleButtonGroup3,
3072
+ {
3073
+ className: "vuuToggleButtonGroup",
3074
+ onChange,
3075
+ value: pin != null ? pin : "",
3076
+ children: [
3077
+ /* @__PURE__ */ jsx14(
3078
+ ToggleButton3,
3079
+ {
3080
+ className: "vuuIconToggleButton",
3081
+ "data-icon": "cross-circle",
3082
+ value: ""
3083
+ }
3084
+ ),
3085
+ /* @__PURE__ */ jsx14(
3086
+ ToggleButton3,
3087
+ {
3088
+ className: "vuuIconToggleButton",
3089
+ "data-icon": "pin-left",
3090
+ value: "left"
3091
+ }
3092
+ ),
3093
+ /* @__PURE__ */ jsx14(
3094
+ ToggleButton3,
3095
+ {
3096
+ className: "vuuIconToggleButton",
3097
+ "data-icon": "pin-float",
3098
+ value: "floating"
3099
+ }
3100
+ ),
3101
+ /* @__PURE__ */ jsx14(
3102
+ ToggleButton3,
3103
+ {
3104
+ className: "vuuIconToggleButton",
3105
+ "data-icon": "pin-right",
3106
+ value: "right"
3107
+ }
3108
+ )
3109
+ ]
3110
+ }
3111
+ )
3112
+ ] }),
3113
+ /* @__PURE__ */ jsx14(
3114
+ ColumnFormattingPanel,
3115
+ {
3116
+ availableRenderers,
3117
+ column,
3118
+ onChangeFormatting,
3119
+ onChangeRendering,
3120
+ onChangeType
3121
+ }
3122
+ ),
3123
+ editCalculatedColumn ? /* @__PURE__ */ jsxs11("div", { className: "vuuColumnSettingsPanel-buttonBar", "data-align": "right", children: [
3124
+ /* @__PURE__ */ jsx14(
3125
+ Button,
3126
+ {
3127
+ className: `${classBase12}-buttonCancel`,
3128
+ onClick: onCancel,
3129
+ tabIndex: -1,
3130
+ children: "cancel"
3131
+ }
3132
+ ),
3133
+ /* @__PURE__ */ jsx14(
3134
+ Button,
3135
+ {
3136
+ className: `${classBase12}-buttonSave`,
3137
+ onClick: onSave,
3138
+ variant: "cta",
3139
+ children: "save"
3140
+ }
3141
+ )
3142
+ ] }) : /* @__PURE__ */ jsxs11(
3143
+ "div",
3144
+ {
3145
+ className: `${classBase12}-buttonBar`,
3146
+ "data-align": isNewCalculatedColumn ? "right" : void 0,
3147
+ children: [
3148
+ /* @__PURE__ */ jsx14(
3149
+ Button,
3150
+ {
3151
+ className: `${classBase12}-buttonNavPrev`,
3152
+ variant: "secondary",
3153
+ "data-icon": "arrow-left",
3154
+ onClick: navigatePrevColumn,
3155
+ children: "PREVIOUS"
3156
+ }
3157
+ ),
3158
+ /* @__PURE__ */ jsx14(
3159
+ Button,
3160
+ {
3161
+ className: `${classBase12}-buttonNavNext`,
3162
+ variant: "secondary",
3163
+ "data-icon": "arrow-right",
3164
+ onClick: navigateNextColumn,
3165
+ children: "NEXT"
3166
+ }
3167
+ )
3168
+ ]
3169
+ }
3170
+ )
3171
+ ]
3172
+ }
3173
+ );
3174
+ };
3175
+
3176
+ // src/datasource-stats/DatasourceStats.tsx
3177
+ import cx7 from "clsx";
3178
+ import { useEffect as useEffect4, useState as useState7 } from "react";
3179
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
3180
+ var classBase13 = "vuuDatasourceStats";
3181
+ var numberFormatter = new Intl.NumberFormat();
3182
+ var DataSourceStats = ({
3183
+ className: classNameProp,
3184
+ dataSource
3185
+ }) => {
3186
+ const [range, setRange] = useState7(dataSource.range);
3187
+ const [size, setSize] = useState7(dataSource.size);
3188
+ useEffect4(() => {
3189
+ setSize(dataSource.size);
3190
+ dataSource.on("resize", setSize);
3191
+ dataSource.on("range", setRange);
3192
+ }, [dataSource]);
3193
+ const className = cx7(classBase13, classNameProp);
3194
+ const from = numberFormatter.format(range.from + 1);
3195
+ const to = numberFormatter.format(Math.min(range.to, size));
3196
+ const value = numberFormatter.format(size);
3197
+ return /* @__PURE__ */ jsxs12("div", { className, children: [
3198
+ /* @__PURE__ */ jsx15("span", { className: `${classBase13}-label`, children: "Row count" }),
3199
+ /* @__PURE__ */ jsx15("span", { className: `${classBase13}-range`, children: from }),
3200
+ /* @__PURE__ */ jsx15("span", { children: "-" }),
3201
+ /* @__PURE__ */ jsx15("span", { className: `${classBase13}-range`, children: to }),
3202
+ /* @__PURE__ */ jsx15("span", { children: "of" }),
3203
+ /* @__PURE__ */ jsx15("span", { className: `${classBase13}-size`, children: value })
3204
+ ] });
3205
+ };
3206
+
3207
+ // src/table-settings/TableSettingsPanel.tsx
3208
+ import {
3209
+ Button as Button2,
3210
+ FormField as FormField8,
3211
+ FormFieldLabel as FormFieldLabel8,
3212
+ Input as Input3,
3213
+ ToggleButton as ToggleButton4,
3214
+ ToggleButtonGroup as ToggleButtonGroup4
3215
+ } from "@salt-ds/core";
3216
+
3217
+ // src/table-settings/useTableSettings.ts
3218
+ import { updateTableConfig } from "@vuu-ui/vuu-table";
3219
+ import {
3220
+ addColumnToSubscribedColumns,
3221
+ isCalculatedColumn as isCalculatedColumn3,
3222
+ moveItem,
3223
+ subscribedOnly,
3224
+ useLayoutEffectSkipFirst
3225
+ } from "@vuu-ui/vuu-utils";
3226
+ import {
3227
+ useCallback as useCallback14,
3228
+ useMemo as useMemo5,
3229
+ useState as useState8
3230
+ } from "react";
3231
+ var sortOrderFromAvailableColumns = (availableColumns, columns) => {
3232
+ const sortedColumns = [];
3233
+ for (const { name: name2 } of availableColumns) {
3234
+ const column = columns.find((col) => col.name === name2);
3235
+ if (column) {
3236
+ sortedColumns.push(column);
3237
+ }
3238
+ }
3239
+ return sortedColumns;
3240
+ };
3241
+ var buildColumnItems = (availableColumns, configuredColumns) => {
3242
+ return availableColumns.map(({ name: name2, serverDataType }) => {
3243
+ const configuredColumn = configuredColumns.find((col) => col.name === name2);
3244
+ return {
3245
+ hidden: configuredColumn == null ? void 0 : configuredColumn.hidden,
3246
+ isCalculated: isCalculatedColumn3(name2),
3247
+ label: configuredColumn == null ? void 0 : configuredColumn.label,
3248
+ name: name2,
3249
+ serverDataType,
3250
+ subscribed: configuredColumn !== void 0
3251
+ };
3252
+ });
3253
+ };
3254
+ var useTableSettings = ({
3255
+ availableColumns: availableColumnsProp,
3256
+ onConfigChange,
3257
+ onDataSourceConfigChange,
3258
+ tableConfig: tableConfigProp
3259
+ }) => {
3260
+ const [{ availableColumns, tableConfig }, setColumnState] = useState8({
3261
+ availableColumns: availableColumnsProp,
3262
+ tableConfig: tableConfigProp
3263
+ });
3264
+ const columnItems = useMemo5(
3265
+ () => buildColumnItems(availableColumns, tableConfig.columns),
3266
+ [availableColumns, tableConfig.columns]
3267
+ );
3268
+ const handleMoveListItem = useCallback14(
3269
+ (fromIndex, toIndex) => {
3270
+ setColumnState((state) => {
3271
+ const newAvailableColumns = moveItem(
3272
+ state.availableColumns,
3273
+ fromIndex,
3274
+ toIndex
3275
+ );
3276
+ const newColumns = sortOrderFromAvailableColumns(
3277
+ newAvailableColumns,
3278
+ tableConfig.columns
3279
+ );
3280
+ return {
3281
+ availableColumns: newAvailableColumns,
3282
+ tableConfig: {
3283
+ ...state.tableConfig,
3284
+ columns: newColumns
3285
+ }
3286
+ };
3287
+ });
3288
+ },
3289
+ [tableConfig.columns]
3290
+ );
3291
+ const handleColumnChange = useCallback14(
3292
+ (name2, property, value) => {
3293
+ const columnItem = columnItems.find((col) => col.name === name2);
3294
+ if (property === "subscribed") {
3295
+ if (columnItem == null ? void 0 : columnItem.subscribed) {
3296
+ const subscribedColumns = tableConfig.columns.filter((col) => col.name !== name2).map((col) => col.name);
3297
+ setColumnState((state) => ({
3298
+ ...state,
3299
+ tableConfig: {
3300
+ ...tableConfig,
3301
+ columns: tableConfig.columns.filter(
3302
+ subscribedOnly(subscribedColumns)
3303
+ )
3304
+ }
3305
+ }));
3306
+ onDataSourceConfigChange({
3307
+ columns: subscribedColumns
3308
+ });
3309
+ } else {
3310
+ const newConfig = {
3311
+ ...tableConfig,
3312
+ columns: addColumnToSubscribedColumns(
3313
+ tableConfig.columns,
3314
+ availableColumns,
3315
+ name2
3316
+ )
3317
+ };
3318
+ setColumnState((state) => ({
3319
+ ...state,
3320
+ tableConfig: newConfig
3321
+ }));
3322
+ const subscribedColumns = newConfig.columns.map((col) => col.name);
3323
+ onDataSourceConfigChange({
3324
+ columns: subscribedColumns
3325
+ });
3326
+ }
3327
+ } else if (columnItem == null ? void 0 : columnItem.subscribed) {
3328
+ const column = tableConfig.columns.find((col) => col.name === name2);
3329
+ if (column) {
3330
+ const newConfig = updateTableConfig(tableConfig, {
3331
+ type: "column-prop",
3332
+ property,
3333
+ column,
3334
+ value
3335
+ });
3336
+ setColumnState((state) => ({
3337
+ ...state,
3338
+ tableConfig: newConfig
3339
+ }));
3340
+ }
3341
+ }
3342
+ },
3343
+ [availableColumns, columnItems, onDataSourceConfigChange, tableConfig]
3344
+ );
3345
+ const handleChangeColumnLabels = useCallback14((evt) => {
3346
+ const { value } = evt.target;
3347
+ const columnFormatHeader = value === "0" ? void 0 : value === "1" ? "capitalize" : "uppercase";
3348
+ setColumnState((state) => ({
3349
+ ...state,
3350
+ tableConfig: {
3351
+ ...state.tableConfig,
3352
+ columnFormatHeader
3353
+ }
3354
+ }));
3355
+ }, []);
3356
+ const handleChangeTableAttribute = useCallback14(
3357
+ (evt) => {
3358
+ const { ariaChecked, value } = evt.target;
3359
+ setColumnState((state) => ({
3360
+ ...state,
3361
+ tableConfig: {
3362
+ ...state.tableConfig,
3363
+ [value]: ariaChecked !== "true"
3364
+ }
3365
+ }));
3366
+ },
3367
+ []
3368
+ );
3369
+ useLayoutEffectSkipFirst(() => {
3370
+ onConfigChange == null ? void 0 : onConfigChange(tableConfig);
3371
+ }, [onConfigChange, tableConfig]);
3372
+ const columnLabelsValue = tableConfig.columnFormatHeader === void 0 ? 0 : tableConfig.columnFormatHeader === "capitalize" ? 1 : 2;
3373
+ return {
3374
+ columnItems,
3375
+ columnLabelsValue,
3376
+ onChangeColumnLabels: handleChangeColumnLabels,
3377
+ onChangeTableAttribute: handleChangeTableAttribute,
3378
+ onColumnChange: handleColumnChange,
3379
+ onMoveListItem: handleMoveListItem,
3380
+ tableConfig
3381
+ };
3382
+ };
3383
+
3384
+ // src/table-settings/TableSettingsPanel.tsx
3385
+ import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
3386
+ var classBase14 = "vuuTableSettingsPanel";
3387
+ var TableSettingsPanel = ({
3388
+ availableColumns,
3389
+ onAddCalculatedColumn,
3390
+ onConfigChange,
3391
+ onDataSourceConfigChange,
3392
+ onNavigateToColumn,
3393
+ tableConfig: tableConfigProp
3394
+ }) => {
3395
+ var _a, _b, _c;
3396
+ const {
3397
+ columnItems,
3398
+ columnLabelsValue,
3399
+ onChangeColumnLabels,
3400
+ onChangeTableAttribute,
3401
+ onColumnChange,
3402
+ onMoveListItem,
3403
+ tableConfig
3404
+ } = useTableSettings({
3405
+ availableColumns,
3406
+ onConfigChange,
3407
+ onDataSourceConfigChange,
3408
+ tableConfig: tableConfigProp
3409
+ });
3410
+ return /* @__PURE__ */ jsxs13("div", { className: classBase14, children: [
3411
+ /* @__PURE__ */ jsxs13(FormField8, { children: [
3412
+ /* @__PURE__ */ jsx16(FormFieldLabel8, { children: "Column Labels" }),
3413
+ /* @__PURE__ */ jsxs13(
3414
+ ToggleButtonGroup4,
3415
+ {
3416
+ className: "vuuToggleButtonGroup",
3417
+ onChange: onChangeColumnLabels,
3418
+ value: columnLabelsValue,
3419
+ children: [
3420
+ /* @__PURE__ */ jsx16(
3421
+ ToggleButton4,
3422
+ {
3423
+ className: "vuuIconToggleButton",
3424
+ "data-icon": "text-strikethrough",
3425
+ value: 0
3426
+ }
3427
+ ),
3428
+ /* @__PURE__ */ jsx16(
3429
+ ToggleButton4,
3430
+ {
3431
+ className: "vuuIconToggleButton",
3432
+ "data-icon": "text-Tt",
3433
+ value: 1
3434
+ }
3435
+ ),
3436
+ /* @__PURE__ */ jsx16(
3437
+ ToggleButton4,
3438
+ {
3439
+ className: "vuuIconToggleButton",
3440
+ "data-icon": "text-T",
3441
+ value: 2
3442
+ }
3443
+ )
3444
+ ]
3445
+ }
3446
+ )
3447
+ ] }),
3448
+ /* @__PURE__ */ jsxs13(FormField8, { children: [
3449
+ /* @__PURE__ */ jsx16(FormFieldLabel8, { children: "Grid separators" }),
3450
+ /* @__PURE__ */ jsxs13("div", { className: "saltToggleButtonGroup vuuToggleButtonGroup saltToggleButtonGroup-horizontal vuuGridSeparators", children: [
3451
+ /* @__PURE__ */ jsx16(
3452
+ ToggleButton4,
3453
+ {
3454
+ className: "vuuIconToggleButton",
3455
+ "data-icon": "row-striping",
3456
+ selected: (_a = tableConfig.zebraStripes) != null ? _a : false,
3457
+ onChange: onChangeTableAttribute,
3458
+ value: "zebraStripes"
3459
+ }
3460
+ ),
3461
+ /* @__PURE__ */ jsx16(
3462
+ ToggleButton4,
3463
+ {
3464
+ className: "vuuIconToggleButton",
3465
+ "data-icon": "row-lines",
3466
+ selected: (_b = tableConfig.rowSeparators) != null ? _b : false,
3467
+ onChange: onChangeTableAttribute,
3468
+ value: "rowSeparators"
3469
+ }
3470
+ ),
3471
+ /* @__PURE__ */ jsx16(
3472
+ ToggleButton4,
3473
+ {
3474
+ className: "vuuIconToggleButton",
3475
+ "data-icon": "col-lines",
3476
+ selected: (_c = tableConfig.columnSeparators) != null ? _c : false,
3477
+ onChange: onChangeTableAttribute,
3478
+ value: "columnSeparators"
3479
+ }
3480
+ )
3481
+ ] })
3482
+ ] }),
3483
+ /* @__PURE__ */ jsxs13(FormField8, { children: [
3484
+ /* @__PURE__ */ jsx16(FormFieldLabel8, { children: "Default Column Width" }),
3485
+ /* @__PURE__ */ jsx16(Input3, { className: "vuuInput" })
3486
+ ] }),
3487
+ /* @__PURE__ */ jsx16(
3488
+ ColumnList,
3489
+ {
3490
+ columnItems,
3491
+ onChange: onColumnChange,
3492
+ onMoveListItem,
3493
+ onNavigateToColumn
3494
+ }
3495
+ ),
3496
+ /* @__PURE__ */ jsxs13("div", { className: `${classBase14}-calculatedButtonbar`, children: [
3497
+ /* @__PURE__ */ jsx16(Button2, { "data-icon": "plus", onClick: onAddCalculatedColumn }),
3498
+ /* @__PURE__ */ jsx16("span", { className: `${classBase14}-calculatedLabel`, children: "Add calculated column" })
3499
+ ] })
3500
+ ] });
3501
+ };
3502
+ export {
3503
+ BackgroundCell,
3504
+ BackgroundCellConfigurationEditor,
3505
+ BaseNumericFormattingSettings,
3506
+ CaseValidator,
3507
+ ColumnExpressionInput,
3508
+ ColumnExpressionPanel,
3509
+ ColumnFormattingPanel,
3510
+ ColumnList,
3511
+ ColumnNamedTerms,
3512
+ ColumnSettingsPanel,
3513
+ DataSourceStats,
3514
+ DateTimeFormattingSettings,
3515
+ DropdownCell,
3516
+ LookupCell,
3517
+ PatternValidator,
3518
+ TableSettingsPanel,
3519
+ columnExpressionLanguageSupport,
3520
+ isCompleteExpression,
3521
+ isCompleteRelationalExpression,
3522
+ lastNamedChild,
3523
+ useColumnExpressionEditor,
3524
+ useColumnExpressionSuggestionProvider,
3525
+ useTableSettings,
3526
+ walkTree
3527
+ };
3
3528
  //# sourceMappingURL=index.js.map