@vuu-ui/vuu-table-extras 0.8.9 → 0.8.10-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/cjs/index.js CHANGED
@@ -1,2 +1,3992 @@
1
- "use strict";var Br=Object.create;var ft=Object.defineProperty;var Wr=Object.getOwnPropertyDescriptor;var Qr=Object.getOwnPropertyNames;var Gr=Object.getPrototypeOf,Ur=Object.prototype.hasOwnProperty;var Xr=(t,e)=>{for(var o in e)ft(t,o,{get:e[o],enumerable:!0})},Fo=(t,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Qr(e))!Ur.call(t,r)&&r!==o&&ft(t,r,{get:()=>e[r],enumerable:!(n=Wr(e,r))||n.enumerable});return t};var w=(t,e,o)=>(o=t!=null?Br(Gr(t)):{},Fo(e||!t||!t.__esModule?ft(o,"default",{value:t,enumerable:!0}):o,t)),_r=t=>Fo(ft({},"__esModule",{value:!0}),t);var Io=(t,e,o)=>{if(!e.has(t))throw TypeError("Cannot "+o)};var C=(t,e,o)=>(Io(t,e,"read from private field"),o?o.call(t):e.get(t)),G=(t,e,o)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,o)},ae=(t,e,o,n)=>(Io(t,e,"write to private field"),n?n.call(t,o):e.set(t,o),o);var vl={};Xr(vl,{BackgroundCell:()=>Xo,CaseValidator:()=>zo,ColumnExpressionInput:()=>fo,ColumnExpressionPanel:()=>bo,ColumnFormattingPanel:()=>Jt,ColumnList:()=>Gt,ColumnNamedTerms:()=>Rt,ColumnSettingsPanel:()=>$s,DataSourceStats:()=>Bs,NumericFormattingSettings:()=>Xt,PatternValidator:()=>$o,TableSettingsPanel:()=>yl,columnExpressionLanguageSupport:()=>Zt,isCompleteExpression:()=>so,isCompleteRelationalExpression:()=>io,lastNamedChild:()=>St,useColumnExpressionEditor:()=>po,useColumnExpressionSuggestionProvider:()=>Co,useTableAndColumnSettings:()=>Sr,useTableSettings:()=>Oo,walkTree:()=>ro});module.exports=_r(vl);var Ko=require("@vuu-ui/vuu-utils"),Yr=t=>typeof t=="string",zo=(t,e)=>Yr(e)?e===""?!0:t.value==="lower"&&e.toLowerCase()!==e?"value must be all lowercase":t.value==="upper"&&e.toUpperCase()!==e?"value must be all uppercase":!0:"value must be a string";(0,Ko.registerComponent)("vuu-case",zo,"data-edit-validator",{});var Vo=require("@vuu-ui/vuu-utils"),Jr=t=>typeof t=="string",Zr="value does not match expected pattern",$o=(t,e)=>{if(typeof t.value!="string")throw Error("Pattern validation rule must provide pattern");if(Jr(e)){if(e==="")return!0;{let{message:o=Zr}=t;return new RegExp(t.value).test(e)||o}}else return"value must be a string"};(0,Vo.registerComponent)("vuu-pattern",$o,"data-edit-validator",{});var F=require("@vuu-ui/vuu-utils"),Wo=w(require("classnames"),1);var pe=require("@vuu-ui/vuu-utils"),gt=require("react"),qr=[void 0,void 0,void 0,void 0];function Bo(t,e,o){var d;let n=(0,gt.useRef)(),[r,s,i,l]=n.current||qr,{type:u}=o,c=(0,pe.isTypeDescriptor)(u)?(d=u.formatting)==null?void 0:d.decimals:void 0,m=t===r&&(0,pe.isValidNumber)(e)&&(0,pe.isValidNumber)(s)&&o===i?(0,pe.getMovingValueDirection)(e,l,s,c):"";return(0,gt.useEffect)(()=>{n.current=[t,e,o,m]}),m}var bt=require("react/jsx-runtime"),jr=String.fromCharCode(11014),es=String.fromCharCode(11015),{KEY:ts}=F.metadataKeys,Ct="vuuBackgroundCellDeprecated",Qe={ArrowOnly:"arrow",BackgroundOnly:"bg-only",ArrowBackground:"arrow-bg"},os=t=>(0,F.isTypeDescriptor)(t)&&t.renderer&&"flashStyle"in t.renderer?t.renderer.flashStyle:Qe.BackgroundOnly,ns=({column:t,row:e})=>{let{key:o,type:n,valueFormatter:r}=t,s=e[o],i=os(n),l=Bo(e[ts],s,t),u=i===Qe.ArrowOnly||i===Qe.ArrowBackground?l===F.UP1||l===F.UP2?jr:l===F.DOWN1||l===F.DOWN2?es:null:null,c=l?" "+l:"",m=(0,Wo.default)(Ct,c,{[`${Ct}-arrowOnly`]:i===Qe.ArrowOnly,[`${Ct}-arrowBackground`]:i===Qe.ArrowBackground});return(0,bt.jsxs)("div",{className:m,tabIndex:-1,children:[(0,bt.jsx)("div",{className:`${Ct}-flasher`,children:u}),r(e[t.key])]})};(0,F.registerComponent)("background",ns,"cell-renderer",{description:"Background Cell renderer for VuuTable",label:"Background Cell (deprecated)",serverDataType:["long","int","double"]});var j=require("@vuu-ui/vuu-utils"),Qo=w(require("classnames"),1);var de=require("react/jsx-runtime"),Ge="vuuProgressCell",rs=({column:t,columnMap:e,row:o})=>{let{type:n}=t,r=o[t.key],s=!1,i=0;if((0,j.isTypeDescriptor)(n)&&(0,j.isColumnTypeRenderer)(n.renderer)){let{associatedField:u}=n.renderer;if(u){let c=o[e[u]];if(typeof(0,j.isValidNumber)(r)&&(0,j.isValidNumber)(c))i=Math.min(Math.round(r/c*100),100),i=Math.min(Math.round(r/c*100),100),s=isFinite(i);else{let m=parseFloat(r);if(Number.isFinite(m)){let d=parseFloat(c);Number.isFinite(d)&&(i=Math.min(Math.round(m/d*100),100),s=isFinite(i))}}}else throw Error("ProgressCell associatedField is required to render")}let l=(0,Qo.default)(Ge,{});return(0,de.jsxs)("div",{className:l,tabIndex:-1,children:[s?(0,de.jsxs)("span",{className:`${Ge}-track`,children:[(0,de.jsx)("span",{className:`${Ge}-bg`}),(0,de.jsx)("span",{className:`${Ge}-bar`,style:{"--progress-bar-pct":`-${100-i}%`}})]}):null,(0,de.jsx)("span",{className:`${Ge}-text`,children:`${i} %`})]})};(0,j.registerComponent)("vuu.progress",rs,"cell-renderer",{description:"Progress formatter",label:"Progress formatter",serverDataType:["long","int","double"]});var I=require("@vuu-ui/vuu-utils"),Uo=w(require("classnames"),1);var fe=require("@vuu-ui/vuu-utils"),ht=require("react"),ss=[void 0,void 0,void 0,void 0];function Go(t,e,o){var d;let n=(0,ht.useRef)(),[r,s,i,l]=n.current||ss,{type:u}=o,c=(0,fe.isTypeDescriptor)(u)?(d=u.formatting)==null?void 0:d.decimals:void 0,m=t===r&&(0,fe.isValidNumber)(e)&&(0,fe.isValidNumber)(s)&&o===i?(0,fe.getMovingValueDirection)(e,l,s,c):"";return(0,ht.useEffect)(()=>{n.current=[t,e,o,m]}),m}var yt=require("react/jsx-runtime"),is=String.fromCharCode(11014),ls=String.fromCharCode(11015),{KEY:as}=I.metadataKeys,xt="vuuBackgroundCell",Ue={ArrowOnly:"arrow",BackgroundOnly:"bg-only",ArrowBackground:"arrow-bg"},us=t=>(0,I.isTypeDescriptor)(t)&&t.renderer&&"flashStyle"in t.renderer?t.renderer.flashStyle:Ue.BackgroundOnly,Xo=({column:t,row:e})=>{let{key:o,type:n,valueFormatter:r}=t,s=e[o],i=us(n),l=Go(e[as],s,t),u=i===Ue.ArrowOnly||i===Ue.ArrowBackground?l===I.UP1||l===I.UP2?is:l===I.DOWN1||l===I.DOWN2?ls:null:null,c=l?" "+l:"",m=(0,Uo.default)(xt,c,{[`${xt}-arrowOnly`]:i===Ue.ArrowOnly,[`${xt}-arrowBackground`]:i===Ue.ArrowBackground});return(0,yt.jsxs)("div",{className:m,tabIndex:-1,children:[(0,yt.jsx)("div",{className:`${xt}-flasher`,children:u}),r(e[t.key])]})};console.log("register BackgroundCellNext");(0,I.registerComponent)("background-next",Xo,"cell-renderer",{description:"Change background color of cell when value changes",label:"Background Flash",serverDataType:["long","int","double"]});var vt=require("@vuu-ui/vuu-ui-controls"),_o=require("@salt-ds/core"),Yo=require("@salt-ds/lab"),Jo=w(require("classnames"),1),Zo=require("react");var K=require("react/jsx-runtime"),ee="vuuColumnList",qo="vuuColumnListItem",cs=({className:t,item:e,...o})=>{var n;return(0,K.jsxs)(vt.ListItem,{...o,className:(0,Jo.default)(t,qo),"data-name":e==null?void 0:e.name,children:[e!=null&&e.isCalculated?(0,K.jsx)("span",{className:`${ee}-icon`,"data-icon":"function"}):(0,K.jsx)(Yo.Switch,{className:`${ee}-switch`,checked:e==null?void 0:e.subscribed}),(0,K.jsx)("span",{className:`${ee}-text`,children:(n=e==null?void 0:e.label)!=null?n:e==null?void 0:e.name}),(0,K.jsx)(_o.Checkbox,{className:`${ee}-checkBox`,checked:(e==null?void 0:e.hidden)!==!0,disabled:(e==null?void 0:e.subscribed)!==!0})]})},Gt=({columnItems:t,onChange:e,onMoveListItem:o,...n})=>{let r=(0,Zo.useCallback)(s=>{let i=s.target,l=i.closest(`.${qo}`),{dataset:{name:u}}=l;if(u){let c=i.closest(`.${ee}-switch`),m=i.closest(`.${ee}-checkBox`);c?e(u,"subscribed",i.checked):m&&e(u,"hidden",i.checked===!1)}},[e]);return(0,K.jsxs)("div",{...n,className:ee,children:[(0,K.jsx)("div",{className:`${ee}-header`,children:(0,K.jsx)("span",{children:"Column Selection"})}),(0,K.jsxs)("div",{className:`${ee}-colHeadings`,children:[(0,K.jsx)("span",{children:"Column subscription"}),(0,K.jsx)("span",{children:"Visibility"})]}),(0,K.jsx)(vt.List,{ListItem:cs,allowDragDrop:!0,height:"100%",onChange:r,onMoveListItem:o,selectionStrategy:"none",source:t,itemHeight:33})]})};var Ot=require("@vuu-ui/vuu-utils"),D=require("@salt-ds/core");var en=require("@vuu-ui/vuu-ui-controls"),Tt=require("@salt-ds/core"),Yt=w(require("classnames"),1),tn=require("react");var X=require("@salt-ds/core"),Ut=require("@salt-ds/lab"),jo=require("@vuu-ui/vuu-utils"),ge=require("react"),W=require("react/jsx-runtime"),ms="vuuFormattingSettings",Xt=({column:t,onChange:e})=>{var u;let[o,n]=(0,ge.useState)((0,jo.getTypeSettingsFromColumn)(t)),r=(0,ge.useCallback)(c=>{(c.key==="Enter"||c.key==="Tab")&&e(o)},[o,e]),s=(0,ge.useCallback)(c=>{let{value:m}=c.target,d=m===""||isNaN(parseInt(m))?void 0:parseInt(m),b={...o,decimals:d};n(b)},[o]),i=(0,ge.useCallback)(c=>{let{checked:m}=c.target,d={...o,alignOnDecimals:m};n(d),e(d)},[o,e]),l=(0,ge.useCallback)(c=>{let{checked:m}=c.target,d={...o,zeroPad:m};n(d),e(d)},[o,e]);return(0,W.jsxs)("div",{className:ms,children:[(0,W.jsxs)(X.FormField,{"data-field":"decimals",children:[(0,W.jsx)(X.FormFieldLabel,{children:"Number of decimals"}),(0,W.jsx)(X.Input,{className:"vuuInput",onChange:s,onKeyDown:r,value:(u=o.decimals)!=null?u:""})]}),(0,W.jsxs)(X.FormField,{labelPlacement:"left",children:[(0,W.jsx)(X.FormFieldLabel,{children:"Align on decimals"}),(0,W.jsx)(Ut.Switch,{checked:o.alignOnDecimals,onChange:i,value:"align-decimals"})]}),(0,W.jsxs)(X.FormField,{labelPlacement:"left",children:[(0,W.jsx)(X.FormFieldLabel,{children:"Zero pad decimals"}),(0,W.jsx)(Ut.Switch,{checked:o.zeroPad,onChange:l,value:"zero-pad"})]})]})};var te=require("react/jsx-runtime"),_t="vuuColumnFormattingPanel",ps=t=>{var e;return(e=t.label)!=null?e:t.name},Jt=({availableRenderers:t,selectedCellRenderer:e,className:o,column:n,onChangeFormatting:r,onChangeRenderer:s,...i})=>{let l=(0,tn.useMemo)(()=>{switch(n.serverDataType){case"double":case"int":case"long":return(0,te.jsx)(Xt,{column:n,onChange:r});default:return null}},[n,r]),{serverDataType:u="string"}=n;return(0,te.jsxs)("div",{...i,className:"vuuColumnSettingsPanel-header",children:[(0,te.jsx)("div",{children:"Formatting"}),(0,te.jsxs)(Tt.FormField,{children:[(0,te.jsx)(Tt.FormFieldLabel,{children:"Renderer"}),(0,te.jsx)(en.Dropdown,{className:(0,Yt.default)(`${_t}-renderer`),itemToString:ps,onSelectionChange:s,selected:e,source:t,width:"100%"})]}),(0,te.jsx)("div",{className:(0,Yt.default)(_t,o,`${_t}-${u}`),children:l})]})};var L=require("@vuu-ui/vuu-utils"),k=require("react"),ds=[{description:"Default formatter for columns with data type integer",label:"Default Renderer (data type int, long)",name:"default-int"}],fs=[{description:"Default formatter for columns with data type double",label:"Default Renderer (data type double)",name:"default-double"},...(0,L.getRegisteredCellRenderers)("double")],on=[{description:"Default formatter for columns with data type string",label:"Default Renderer (data type string)",name:"default-string"}],rn=t=>{switch(t.serverDataType){case"char":case"string":return on;case"int":case"long":return ds;case"double":return fs;default:return on}},nn=(t,e)=>{if((0,L.isTypeDescriptor)(e.type)){let{renderer:n}=e.type;if((0,L.isColumnTypeRenderer)(n)){let r=t.find(s=>s.name===n.name);if(r)return r}}return rn(e)[0]},gs=t=>{let e=t.closest(".saltFormField");if(e&&e.dataset.field){let{dataset:{field:o}}=e;return o}else throw Error("named form field not found")},Cs=(t,e)=>{if(e.name==="::")return e;{let o=t.find(n=>n.name===e.name);if(o)return o;throw Error(`columns does not contain column ${name}`)}},Xe=(t,e)=>({...t,columns:t.columns.map(o=>o.name===e.name?e:o)}),sn=({column:t,onConfigChange:e,onCreateCalculatedColumn:o,tableConfig:n})=>{let[r,s]=(0,k.useState)(Cs(n.columns,t)),i=(0,k.useMemo)(()=>rn(r),[r]),l=(0,k.useRef)(nn(i,r)),u=(0,k.useCallback)(()=>{e(Xe(n,r))},[r,e,n]),c=(0,k.useCallback)(f=>{let h=f.target,v=gs(h),{value:E}=h;switch(v){case"column-label":s(y=>({...y,label:E}));break;case"column-name":s(y=>(0,L.setCalculatedColumnName)(y,E));break;case"column-width":s(y=>({...y,width:parseInt(E)}));break;case"column-alignment":if((0,L.isValidColumnAlignment)(E)){let y={...r,align:E||void 0};s(y),e(Xe(n,y))}break;case"column-pin":if((0,L.isValidPinLocation)(E)){let y={...r,pin:E||void 0};s(y),e(Xe(n,y));break}}},[r,e,n]),m=(0,k.useCallback)((f,h)=>{if(h){let v=(0,L.updateColumnRenderer)(r,h);l.current=h,s(v),e(Xe(n,v))}},[r,e,n]),d=(0,k.useCallback)(f=>{let h=(0,L.updateColumnType)(r,f);s(h),e(Xe(n,h))},[r,e,n]),b=(0,k.useCallback)(({moveBy:f})=>{let{columns:h}=n,v=h.indexOf(r)+f,E=h[v];E&&(l.current=nn(i,E),s(E))},[i,r,n]),a=(0,k.useCallback)(()=>{b({moveBy:1})},[b]),p=(0,k.useCallback)(()=>{b({moveBy:-1})},[b]),g=(0,k.useCallback)(f=>{o({...r,...f})},[r,o]);return{availableRenderers:i,selectedCellRenderer:l.current,column:r,navigateNextColumn:a,navigatePrevColumn:p,onChange:c,onChangeFormatting:d,onChangeRenderer:m,onInputCommit:u,onSave:g}};var yn=require("@vuu-ui/vuu-ui-controls"),Le=require("@vuu-ui/vuu-utils"),z=require("@salt-ds/core"),Ht=require("react");var M=require("@vuu-ui/vuu-codemirror"),mo=require("@vuu-ui/vuu-utils"),ue=require("react");var U=require("@vuu-ui/vuu-codemirror");var ln=require("@lezer/lr"),Et=ln.LRParser.deserialize({version:14,states:"&fOVQPOOO!SQPO'#C^OVQPO'#CcQ!pQPOOO#OQPO'#CkO#TQPO'#CrOOQO'#Cy'#CyO#YQPO,58}OVQPO,59QOVQPO,59QOVQPO,59VOVQPO'#CtOOQO,59^,59^OOQO1G.i1G.iOOQO1G.l1G.lO#kQPO1G.lO$fQPO'#CmO%WQQO1G.qOOQO'#C{'#C{O%cQPO,59`OOQO'#Cn'#CnO%wQPO,59XOVQPO,59ZOVQPO,59[OVQPO7+$]OVQPO'#CuO&`QPO1G.zOOQO1G.z1G.zO&hQQO'#C^O&rQQO1G.sO'ZQQO1G.uOOQO1G.v1G.vO'fQPO<<GwO'wQPO,59aOOQO-E6s-E6sOOQO7+$f7+$fOVQPOAN=cO(]QQO1G.lO(tQPOG22}OOQOLD(iLD(iO%wQPO,59QO%wQPO,59Q",stateData:")[~OlOS~ORUOSUOTUOUUOWQO`SOnPO~OWgXZQX[QX]QX^QXeQX~OjQXXQXpQXqQXrQXsQXtQXuQX~PnOZWO[WO]XO^XO~OWYO~OWZO~OX]OZWO[WO]XO^XO~OZWO[WO]Yi^YijYiXYipYiqYirYisYitYiuYieYi~OZWO[WO]XO^XOpdOqdOrdOsdOtdOudO~OehOvfOwgO~OXkOZWO[WO]XO^XOeiO~ORUOSUOTUOUUOWQO`SOnlO~OXsOeiO~OvQXwQX~PnOZxO[xO]yO^yOeaivaiwai~OwgOecivci~OZWO[WO]XO^XOetO~OZWO[WO]XO^XOXiaeia~OZxO[xO]Yi^YieYivYiwYi~OXwOZWO[WO]XO^XO~O`UTn~",goto:"#spPPqPPPPqPPqPPPPqP!R!W!R!RPq!Z!k!nPPP!tP#jmUOQWXYZefghitxyVbYfgRe`mTOQWXYZefghitxyR[TQjcRrjQROQVQS^WxQ_XU`YfgQcZQmeQphQqiQuyRvtQaYQnfRog",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:375});var bs=U.LRLanguage.define({name:"VuuColumnExpression",parser:Et.configure({props:[(0,U.styleTags)({Function:U.tags.variableName,String:U.tags.string,Or:U.tags.emphasis,Operator:U.tags.operator})]})}),Zt=()=>new U.LanguageSupport(bs);var qt=class{constructor(e){switch(this.value=e,typeof e){case"boolean":this.type="booleanLiteralExpression";break;case"number":this.type="numericLiteralExpression";break;default:this.type="stringLiteralExpression"}}toJSON(){return{type:this.type,value:this.value}}},jt=class{constructor(e){this.type="colExpression";this.column=e}toJSON(){return{type:this.type,column:this.column}}},Ye,be,eo=class{constructor(e="unknown"){G(this,Ye,[{type:"unknown"},{type:"unknown"}]);G(this,be,void 0);this.type="arithmeticExpression";ae(this,be,e)}get op(){return C(this,be)}set op(e){ae(this,be,e)}get expressions(){return C(this,Ye)}toJSON(){return{type:this.type,op:C(this,be),expressions:C(this,Ye)}}};Ye=new WeakMap,be=new WeakMap;var Re,to=class{constructor(e){G(this,Re,[]);this.type="callExpression";this.functionName=e}get expressions(){return C(this,Re)}get arguments(){return C(this,Re)}toJSON(){return{type:this.type,functionName:this.functionName,arguments:C(this,Re).map(e=>{var o;return(o=e.toJSON)==null?void 0:o.call(e)})}}};Re=new WeakMap;var Je,Se,we=class{constructor(){G(this,Je,[{type:"unknown"},{type:"unknown"}]);G(this,Se,"unknown");this.type="relationalExpression"}get op(){return C(this,Se)}set op(e){ae(this,Se,e)}get expressions(){return C(this,Je)}toJSON(){return{type:this.type,op:C(this,Se),expressions:C(this,Je)}}};Je=new WeakMap,Se=new WeakMap;var Ze,Pe,De=class{constructor(e){G(this,Ze,[{type:"unknown"},{type:"unknown"}]);G(this,Pe,void 0);this.type="booleanCondition";ae(this,Pe,e)}get op(){return C(this,Pe)}get expressions(){return C(this,Ze)}toJSON(){return{type:this.type,op:C(this,Pe),expressions:C(this,Ze).map(e=>{var o;return(o=e.toJSON)==null?void 0:o.call(e)})}}};Ze=new WeakMap,Pe=new WeakMap;var _,_e=class{constructor(e){G(this,_,void 0);this.type="conditionalExpression";ae(this,_,[e?new De(e):new we,{type:"unknown"},{type:"unknown"}])}get expressions(){return C(this,_)}get condition(){return C(this,_)[0]}get truthyExpression(){return C(this,_)[1]}set truthyExpression(e){C(this,_)[1]=e}get falsyExpression(){return C(this,_)[2]}set falsyExpression(e){C(this,_)[2]=e}toJSON(){var e,o,n,r,s;return{type:this.type,condition:(o=(e=this.condition).toJSON)==null?void 0:o.call(e),truthyExpression:this.truthyExpression,falsyExpression:(s=(r=(n=this.falsyExpression)==null?void 0:n.toJSON)==null?void 0:r.call(n))!=null?s:this.falsyExpression}}};_=new WeakMap;var Ce=t=>t.type==="unknown",wt=t=>t.type==="arithmeticExpression",hs=t=>t.type==="callExpression",Ee=t=>t.type==="conditionalExpression",xs=t=>t.type==="relationalExpression"||t.type==="booleanCondition";var ys=t=>t.type==="booleanCondition",no=t=>(t==null?void 0:t.type)==="relationalExpression";var Q=t=>{if(Ce(t))return t;if(no(t)){let[e,o]=t.expressions;if(N(e))return Q(e);if(t.op==="unknown")return t;if(N(o))return Q(o)}else if(xs(t)){let{expressions:e=[]}=t;for(let o of e)if(N(o))return Q(o)}else if(Ee(t)){let{condition:e,truthyExpression:o,falsyExpression:n}=t;if(N(e))return Q(e);if(N(o))return Q(o);if(N(n))return Q(n)}else if(wt(t)){let{expressions:e=[]}=t;for(let o of e)if(N(o))return Q(o)}},Dt=(t,e,o)=>{let{expressions:n=[]}=t;if(n.includes(e)){let r=n.indexOf(e);return n.splice(r,1,o),!0}else for(let r of n)if(Dt(r,e,o))return!0;return!1},N=t=>Ce(t)?!0:Ee(t)?N(t.condition)||N(t.truthyExpression)||N(t.falsyExpression):no(t)||ys(t)?t.op===void 0||t.expressions.some(e=>N(e)):!1,an=(t,e)=>{let o=Q(t);o?o.expressions?o.expressions.push(e):console.warn("don't know how to treat targetExpression"):console.error("no target expression found")},x,he,oo=class{constructor(){G(this,x,void 0);G(this,he,[])}setCondition(e){if(C(this,x)===void 0)this.addExpression(new _e(e));else if(Ee(C(this,x))){if(N(C(this,x).condition)){let o=e?new De(e):new we;this.addExpression(o)}else if(Ce(C(this,x).truthyExpression))C(this,x).truthyExpression=new _e(e);else if(N(C(this,x).truthyExpression)){let o=e?new De(e):new we;this.addExpression(o)}else if(Ce(C(this,x).falsyExpression))C(this,x).falsyExpression=new _e(e);else if(N(C(this,x).falsyExpression)){let o=e?new De(e):new we;this.addExpression(o)}}else console.error("setCondition called unexpectedly")}addExpression(e){if(C(this,he).length>0){let o=C(this,he).at(-1);o==null||o.arguments.push(e)}else if(C(this,x)===void 0)ae(this,x,e);else if(wt(C(this,x))){let o=Q(C(this,x));o&&Ce(o)&&Dt(C(this,x),o,e)}else if(Ee(C(this,x))&&N(C(this,x))){let o=Q(C(this,x));o&&Ce(o)?Dt(C(this,x),o,e):o&&an(o,e)}}setFunction(e){let o=new to(e);this.addExpression(o),C(this,he).push(o)}setColumn(e){this.addExpression(new jt(e))}setArithmeticOp(e){let o=e,n=C(this,x);wt(n)&&(n.op=o)}setRelationalOperator(e){let o=e;if(C(this,x)&&Ee(C(this,x))){let n=Q(C(this,x));no(n)?n.op=o:console.error(`no target expression found (op = ${e})`)}}setValue(e){let o=new qt(e);if(C(this,x)===void 0)ae(this,x,o);else if(wt(C(this,x)))this.addExpression(o);else if(hs(C(this,x)))C(this,x).arguments.push(o);else if(Ee(C(this,x)))if(N(C(this,x))){let n=Q(C(this,x));n&&Ce(n)?Dt(C(this,x),n,o):n&&an(n,o)}else console.log("what do we do with value, in a complete expression")}closeBrace(){C(this,he).pop()}get expression(){return C(this,x)}toJSON(){var e;return(e=C(this,x))==null?void 0:e.toJSON()}};x=new WeakMap,he=new WeakMap;var ro=(t,e)=>{let o=new oo,n=t.cursor();do{let{name:r,from:s,to:i}=n;switch(r){case"AndCondition":o.setCondition("and");break;case"OrCondition":o.setCondition("or");break;case"RelationalExpression":o.setCondition();break;case"ArithmeticExpression":o.addExpression(new eo);break;case"Column":{let l=e.substring(s,i);o.setColumn(l)}break;case"Function":{let l=e.substring(s,i);o.setFunction(l)}break;case"Times":case"Divide":case"Plus":case"Minus":{let l=e.substring(s,i);o.setArithmeticOp(l)}break;case"RelationalOperator":{let l=e.substring(s,i);o.setRelationalOperator(l)}break;case"False":case"True":{let l=e.substring(s,i);o.setValue(l==="true")}break;case"String":o.setValue(e.substring(s+1,i-1));break;case"Number":o.setValue(parseFloat(e.substring(s,i)));break;case"CloseBrace":o.closeBrace();break;default:}}while(n.next());return o.toJSON()};var vs=Et.configure({strict:!0}),un=["Number","String"],Rt=[...un,"AndCondition","ArithmeticExpression","BooleanOperator","RelationalOperatorOperator","CallExpression","CloseBrace","Column","Comma","ConditionalExpression","Divide","Equal","If","Minus","OpenBrace","OrCondition","ParenthesizedExpression","Plus","RelationalExpression","RelationalOperator","Times"],so=t=>{try{return vs.parse(t),!0}catch{return!1}},St=t=>{let{lastChild:e}=t;for(;e&&!Rt.includes(e.name);)e=e.prevSibling,console.log(e==null?void 0:e.name);return e},io=t=>{if((t==null?void 0:t.name)==="RelationalExpression"){let{firstChild:e}=t,o=St(t);if((e==null?void 0:e.name)==="Column"&&typeof(o==null?void 0:o.name)=="string"&&un.includes(o.name))return!0}return!1};var xe=require("@vuu-ui/vuu-codemirror"),Ts=xe.HighlightStyle.define([{tag:xe.tags.variableName,color:"var(--vuuFilterEditor-variableColor)"},{tag:xe.tags.comment,color:"green",fontStyle:"italic"}]),cn=(0,xe.syntaxHighlighting)(Ts);var mn=require("@vuu-ui/vuu-codemirror"),pn=mn.EditorView.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-tooltip":{background:"var(--vuuFilterEditor-tooltipBackground)",border:"var(--vuuFilterEditor-tooltipBorder)",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});var P=require("@vuu-ui/vuu-codemirror"),uo=require("react");var Es=(t,e)=>e?t.map(o=>{var n;return{...o,apply:typeof o.apply=="function"?o.apply:`${e}${(n=o.apply)!=null?n:o.label}`}}):t,ws=t=>t===void 0?!1:["Times","Divide","Plus","Minus"].includes(t.name),qe=t=>({apply:()=>{t==null||t()},label:"Done",boost:10}),Me=(t,e)=>{var r;let{lastChild:o}=t,{pos:n}=e;for(;o;)if(o.from<n&&Rt.includes(o.name)){if(o.name==="ParenthesizedExpression"){let i=(r=o.firstChild)==null?void 0:r.nextSibling;i&&(o=i)}return o}else o=o.prevSibling},dn=(t,e)=>{var o;if(t.name==="ArgList"){let n=t.prevSibling;if(n)return(0,P.getValue)(n,e)}else if(t.name==="OpenBrace"){let n=(o=t.parent)==null?void 0:o.prevSibling;if((n==null?void 0:n.name)==="Function")return(0,P.getValue)(n,e)}},fn=(t,e)=>{if(t.name==="RelationalExpression"){let o=St(t);if((o==null?void 0:o.name)==="RelationalOperator")return(0,P.getValue)(o,e)}else{let o=t.prevSibling;if((o==null?void 0:o.name)==="RelationalOperator")return(0,P.getValue)(o,e)}},co=(t,e)=>{var o;if(t.name==="RelationalExpression"){if(((o=t.firstChild)==null?void 0:o.name)==="Column")return(0,P.getValue)(t.firstChild,e)}else{let n=t.prevSibling;if((n==null?void 0:n.name)==="Column")return(0,P.getValue)(n,e);if((n==null?void 0:n.name)==="RelationalOperator")return co(n,e)}},lo=async(t,e,o,n={})=>{let r=await e.getSuggestions(o,n),{startsWith:s=""}=n;return{from:t.pos-s.length,options:r}},ao=(t,e,o,n,r)=>{let s=Me(t,e);switch(console.log(`conditional expression last child ${s==null?void 0:s.name}`),s==null?void 0:s.name){case"If":return lo(e,o,"expression",{prefix:"( "});case"OpenBrace":return lo(e,o,"expression");case"Condition":return lo(e,o,"expression",{prefix:", "});case"CloseBrace":if(n){let i=[qe(r)];return{from:e.pos,options:i}}}},Ds=(t,e)=>{let o=[qe(e)];return{from:t.pos,options:o}},gn=(t,e)=>{let o=(0,uo.useCallback)(async(n,r,s={})=>{let i=await t.getSuggestions(r,s),{startsWith:l=""}=s;return{from:n.pos-l.length,options:i}},[t]);return(0,uo.useCallback)(async n=>{var d,b;let{state:r,pos:s}=n,i=(d=n.matchBefore(/\w*/))!=null?d:{from:0,to:0,text:void 0},u=(0,P.syntaxTree)(r).resolveInner(s,-1),c=r.doc.toString(),m=so(c);switch(u.name){case"If":return console.log("conditional expression If"),o(n,"expression",{prefix:"( "});case"Condition":{let a=Me(u,n);if((a==null?void 0:a.name)==="Column"){let p=(0,P.getPreviousNode)(a);if((p==null?void 0:p.name)!=="RelationalOperator")return o(n,"condition-operator",{columnName:(0,P.getValue)(a,r)})}else if((a==null?void 0:a.name)==="RelationalOperator")return o(n,"expression");console.log(`condition last child ${a==null?void 0:a.name}`)}break;case"ConditionalExpression":return ao(u,n,t);case"RelationalExpression":{if(io(u))return{from:n.pos,options:P.booleanJoinSuggestions.concat({label:", <truthy expression>, <falsy expression>",apply:", "})};{let a=fn(u,r),p=co(u,r);if(a)return o(n,"expression");{let g=await t.getSuggestions("condition-operator",{columnName:p});return{from:n.pos,options:g}}}}break;case"RelationalOperator":return o(n,"expression");case"String":{let a=fn(u,r),p=co(u,r),{from:g,to:f}=u;if(f-g===2&&n.pos===g+1){if(p&&a)return o(n,"columnValue",{columnName:p,operator:a,startsWith:i.text})}else if(f-g>2&&n.pos===f)return o(n,"expression",{prefix:", "})}break;case"ArithmeticExpression":{let a=Me(u,n);if((a==null?void 0:a.name)==="Column")return o(n,"expression");if(ws(a)){let p=a.name;return o(n,"column",{operator:p})}}break;case"OpenBrace":{let a=dn(u,r);return o(n,"expression",{functionName:a})}break;case"ArgList":{let a=dn(u,r),p=Me(u,n),g=(p==null?void 0:p.name)==="OpenBrace"?void 0:",",f=await t.getSuggestions("expression",{functionName:a});return f=g?Es(f,", "):f,(p==null?void 0:p.name)!=="OpenBrace"&&(p==null?void 0:p.name)!=="Comma"&&(f=[{apply:") ",boost:10,label:"Done - no more arguments"}].concat(f)),{from:n.pos,options:f}}case"Equal":if(c.trim()==="=")return o(n,"expression");break;case"ParenthesizedExpression":case"ColumnDefinitionExpression":if(n.pos===0)return o(n,"expression");{let a=Me(u,n);if((a==null?void 0:a.name)==="Column"){if(m){let p=[qe(e.current)],g=(0,P.getValue)(a,r),f=await t.getSuggestions("operator",{columnName:g});return{from:n.pos,options:p.concat(f)}}}else if((a==null?void 0:a.name)==="CallExpression"){if(m)return{from:n.pos,options:[qe(e.current)]}}else if((a==null?void 0:a.name)==="ArithmeticExpression"){if(m){let p=[qe(e.current)],g=Me(a,n);if((g==null?void 0:g.name)==="Column"){let f=(0,P.getValue)(g,r),h=await t.getSuggestions("operator",{columnName:f});p=p.concat(h)}return{from:n.pos,options:p}}}else if((a==null?void 0:a.name)==="ConditionalExpression")return ao(a,n,t,m,e.current);break}case"Column":if(await t.isPartialMatch("expression",void 0,i.text))return o(n,"expression",{startsWith:i.text});break;case"Comma":{let a=(0,P.getNamedParentNode)(u);if((a==null?void 0:a.name)==="ConditionalExpression")return o(n,"expression")}break;case"CloseBrace":{let a=(0,P.getNamedParentNode)(u);if((a==null?void 0:a.name)==="ConditionalExpression")return ao(a,n,t,m,e.current);if((a==null?void 0:a.name)==="ArgList"&&m)return Ds(n,e.current)}break;default:((b=u==null?void 0:u.prevSibling)==null?void 0:b.name)==="FilterClause"&&console.log("looks like we ight be a or|and operator")}},[o,e,t])};var Pt=t=>{if(t.current==null)throw Error("EditorView not defined");return t.current},Rs=()=>"vuuSuggestion",Ss=()=>console.log("noooop"),Ps=t=>"expressionType"in t,Ms=t=>{if(Ps(t)){let e=(0,mo.createEl)("div","expression-type-container"),o=(0,mo.createEl)("span","expression-type",t.expressionType);return e.appendChild(o),e}else return null},po=({onChange:t,onSubmitExpression:e,source:o,suggestionProvider:n})=>{let r=(0,ue.useRef)(null),s=(0,ue.useRef)(Ss),i=(0,ue.useRef)(),l=gn(n,s),[u,c]=(0,ue.useMemo)(()=>{let m=()=>{let g=Pt(i),f=g.state.doc.toString(),h=(0,M.ensureSyntaxTree)(g.state,g.state.doc.length,5e3);if(h){let v=ro(h,f);return[f,v]}else return["",void 0]},d=()=>{Pt(i).setState(p())},b=()=>{let[g,f]=m();e==null||e(g,f)},a=g=>M.keymap.of([{key:g,run(){return(0,M.startCompletion)(Pt(i)),!0}}]),p=()=>M.EditorState.create({doc:o,extensions:[M.minimalSetup,(0,M.autocompletion)({addToOptions:[{render:Ms,position:70}],override:[l],optionClass:Rs}),Zt(),M.keymap.of(M.defaultKeymap),a("ArrowDown"),M.EditorView.updateListener.of(g=>{let f=Pt(i);if(g.docChanged){(0,M.startCompletion)(f);let h=f.state.doc.toString();t==null||t(h)}}),pn,cn]});return s.current=()=>{b()},[p,d]},[l,t,e,o]);return(0,ue.useEffect)(()=>{if(!r.current)throw Error("editor not in dom");return i.current=new M.EditorView({state:u(),parent:r.current}),()=>{var m;(m=i.current)==null||m.destroy()}},[l,u]),{editorRef:r,clearInput:c}};var Cn=require("react/jsx-runtime"),Hs="vuuColumnExpressionInput",fo=({onChange:t,onSubmitExpression:e,source:o="",suggestionProvider:n})=>{let{editorRef:r}=po({onChange:t,onSubmitExpression:e,source:o,suggestionProvider:n});return(0,Cn.jsx)("div",{className:`${Hs}`,ref:r})};var J=require("@vuu-ui/vuu-codemirror"),Mt=require("@vuu-ui/vuu-data-react"),Ae=require("@vuu-ui/vuu-utils"),Oe=require("react");var He=[{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:"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"}];var Y=require("@vuu-ui/vuu-utils"),bn=({name:t,description:e,example:o,params:n,type:r})=>{let s=(0,Y.createEl)("div","vuuFunctionDoc"),i=(0,Y.createEl)("div","function-heading"),l=(0,Y.createEl)("span","function-name",t),u=(0,Y.createEl)("span","param-list",n.description),c=(0,Y.createEl)("span","function-type",r);i.appendChild(l),i.appendChild(u),i.appendChild(c);let m=(0,Y.createEl)("p",void 0,e);if(s.appendChild(i),s.appendChild(m),o){let d=(0,Y.createEl)("div","example-container","Example:"),b=(0,Y.createEl)("div","example-expression",o.expression),a=(0,Y.createEl)("div","example-result",o.result);d.appendChild(b),d.appendChild(a),s.appendChild(d)}return s};var Os=[],ye=t=>t.map(e=>{var o;return{...e,apply:((o=e.apply)!=null?o:e.label)+" "}}),As=(t,{functionName:e,operator:o})=>{if(o)return t.filter(Ae.isNumericColumn);if(e){let n=He.find(r=>r.name===e);if(n)switch(n.accepts){case"string":return t.filter(Ae.isTextColumn);case"number":return t.filter(Ae.isNumericColumn);default:return t}}return t},hn=(t,e)=>As(t,e).map(n=>{var s;let r=(s=n.label)!=null?s:n.name;return{apply:e.prefix?`${e.prefix}${r}`:r,label:r,boost:5,type:"column",expressionType:n.serverDataType}}),Ls=[{apply:"* ",boost:2,label:"*",type:"operator"},{apply:"/ ",boost:2,label:"/",type:"operator"},{apply:"+ ",boost:2,label:"+",type:"operator"},{apply:"- ",boost:2,label:"-",type:"operator"}],Ns=t=>t===void 0||(0,Ae.isNumericColumn)(t)?Ls:Os,ks=t=>{switch(t.serverDataType){case"string":case"char":return ye(J.stringOperators);case"int":case"long":case"double":return ye(J.numericOperators)}},go=t=>({apply:`${t.name}( `,boost:2,expressionType:t.type,info:()=>bn(t),label:t.name,type:"function"}),Fs=t=>{if(t){if(typeof t.accepts=="string")return t.accepts;if(Array.isArray(t.accepts))return t.accepts.every(e=>e==="string")?"string":"any"}return"any"},Is=He.map(go),Ks=({functionName:t})=>{if(t){let e=He.find(n=>n.name===t),o=Fs(e);if(e)switch(o){case"string":return He.filter(n=>n.type==="string"||n.type==="variable").map(go);case"number":return He.filter(n=>n.type==="number"||n.type==="variable").map(go);default:}}return Is},zs={},Co=({columns:t,table:e})=>{let o=(0,Oe.useCallback)(l=>l?t.find(u=>u.name===l):void 0,[t]),n=(0,Oe.useRef)(),r=(0,Mt.useTypeaheadSuggestions)(),s=(0,Oe.useCallback)(async(l,u=zs)=>{let{columnName:c,functionName:m,operator:d,prefix:b}=u;switch(l){case"expression":{let a=await ye(hn(t,{functionName:m,prefix:b})).concat(Ks(u));return n.current=a}case"column":{let a=await hn(t,u);return n.current=ye(a)}case"operator":{let a=await Ns(o(c));return n.current=ye(a)}case"relational-operator":{let a=await(0,J.getRelationalOperators)(o(c));return n.current=ye(a)}case"condition-operator":{let a=o(c);if(a){let p=await ks(a);if(p)return n.current=ye(p)}}break;case"columnValue":if(c&&d){let a=(0,Mt.getTypeaheadParams)(e,c),p=await r(a);return n.current=(0,J.toSuggestions)(p,{suffix:""}),n.current.forEach(g=>{g.apply=(f,h,v)=>{let E=new J.AnnotationType,y=v+h.label.length+1;f.dispatch({changes:{from:v,insert:h.label},selection:{anchor:y,head:y},annotations:E.of(h)})}}),n.current}break}return[]},[t,o,r,e]),i=(0,Oe.useCallback)(async(l,u,c)=>{let{current:m}=n,d=!1,b=m||await s(l,{columnName:u});if(c&&b)for(let a of b){if(a.label===c)return!1;a.label.startsWith(c)&&(d=!0)}return d},[s]);return{getSuggestions:s,isPartialMatch:i}};var ne=require("@vuu-ui/vuu-utils"),oe=require("react"),Vs=t=>{let[e,o,n]=(0,ne.getCalculatedColumnDetails)(t);return n===""?{...t,name:`${e}:${o}:string`}:t},xn=({column:t,onSave:e})=>{let[o,n]=(0,oe.useState)(Vs(t)),r=(0,oe.useRef)((0,ne.getCalculatedColumnDetails)(o)[1]),s=(0,oe.useCallback)(c=>{let{value:m}=c.target;n(d=>(0,ne.setCalculatedColumnName)(d,m))},[]),i=(0,oe.useCallback)(c=>{r.current=c.trim()},[]),l=(0,oe.useCallback)((c,m)=>{typeof m=="string"&&n(d=>(0,ne.setCalculatedColumnType)(d,m))},[]),u=(0,oe.useCallback)(()=>{let c=(0,ne.setCalculatedColumnExpression)(o,r.current);n(c),e(c)},[o,e]);return{column:o,onChangeExpression:i,onChangeName:s,onChangeType:l,onSave:u}};var A=require("react/jsx-runtime"),je="vuuColumnExpressionPanel",bo=({column:t,onSave:e,tableConfig:o,vuuTable:n})=>{let r=(0,Ht.useRef)(null),{column:s,onChangeExpression:i,onChangeName:l,onChangeType:u,onSave:c}=xn({column:t,onSave:e}),m=Co({columns:o.columns,table:n}),d=(0,Ht.useCallback)(()=>{requestAnimationFrame(()=>{var b,a;(a=(b=r.current)==null?void 0:b.querySelector("button"))==null||a.focus()})},[]);return(0,A.jsxs)("div",{className:je,children:[(0,A.jsx)("div",{className:"vuuColumnSettingsPanel-header",children:(0,A.jsx)("span",{children:"Calculation"})}),(0,A.jsxs)(z.FormField,{"data-field":"column-name",children:[(0,A.jsx)(z.FormFieldLabel,{children:"Column Name"}),(0,A.jsx)(z.Input,{className:"vuuInput",onChange:l,value:(0,Le.getCalculatedColumnName)(s)})]}),(0,A.jsxs)(z.FormField,{"data-field":"column-expression",children:[(0,A.jsx)(z.FormFieldLabel,{children:"Expression"}),(0,A.jsx)(fo,{onChange:i,onSubmitExpression:d,source:(0,Le.getCalculatedColumnExpression)(s),suggestionProvider:m})]}),(0,A.jsxs)(z.FormField,{"data-field":"type",children:[(0,A.jsx)(z.FormFieldLabel,{children:"Column type"}),(0,A.jsx)(yn.Dropdown,{className:`${je}-type`,onSelectionChange:u,ref:r,selected:(0,Le.getCalculatedColumnType)(s)||null,source:["double","long","string"],width:"100%"})]}),(0,A.jsxs)("div",{className:"vuuColumnSettingsPanel-buttonBar","data-align":"right",children:[(0,A.jsx)(z.Button,{className:`${je}-buttonCancel`,tabIndex:-1,children:"cancel"}),(0,A.jsx)(z.Button,{className:`${je}-buttonApply`,tabIndex:-1,children:"apply"}),(0,A.jsx)(z.Button,{className:`${je}-buttonSave`,onClick:c,variant:"cta",children:"save"})]})]})};var ho=require("@vuu-ui/vuu-ui-controls");var T=require("react/jsx-runtime"),et="vuuColumnSettingsPanel",$s=({column:t,onConfigChange:e,onCreateCalculatedColumn:o,tableConfig:n,vuuTable:r})=>{let s=t.name==="::",{availableRenderers:i,selectedCellRenderer:l,column:u,navigateNextColumn:c,navigatePrevColumn:m,onChange:d,onChangeFormatting:b,onChangeRenderer:a,onInputCommit:p,onSave:g}=sn({column:t,onConfigChange:e,onCreateCalculatedColumn:o,tableConfig:n}),{serverDataType:f,align:h=(0,Ot.getDefaultAlignment)(f),name:v,label:E=v,pin:y,width:B}=u;return(0,T.jsxs)("div",{className:et,children:[(0,T.jsx)("div",{className:`${et}-header`,children:(0,T.jsx)("span",{children:v})}),(0,T.jsxs)(D.FormField,{"data-field":"column-label",children:[(0,T.jsx)(D.FormFieldLabel,{children:"Column Label"}),(0,T.jsx)(ho.VuuInput,{className:"vuuInput",onChange:d,onCommit:p,value:E})]}),(0,T.jsxs)(D.FormField,{"data-field":"column-width",children:[(0,T.jsx)(D.FormFieldLabel,{children:"Column Width"}),(0,T.jsx)(ho.VuuInput,{className:"vuuInput",onChange:d,value:B,onCommit:p})]}),(0,T.jsxs)(D.FormField,{"data-field":"column-alignment",children:[(0,T.jsx)(D.FormFieldLabel,{children:"Alignment"}),(0,T.jsxs)(D.ToggleButtonGroup,{className:"vuuToggleButtonGroup",onChange:d,value:h,children:[(0,T.jsx)(D.ToggleButton,{"data-icon":"align-left",className:"vuuIconToggleButton",value:"left"}),(0,T.jsx)(D.ToggleButton,{"data-icon":"align-right",className:"vuuIconToggleButton",value:"right"})]})]}),(0,T.jsxs)(D.FormField,{"data-field":"column-pin",children:[(0,T.jsx)(D.FormFieldLabel,{children:"Pin Column"}),(0,T.jsxs)(D.ToggleButtonGroup,{className:"vuuToggleButtonGroup",onChange:d,value:y!=null?y:"",children:[(0,T.jsx)(D.ToggleButton,{className:"vuuIconToggleButton","data-icon":"cross-circle",value:""}),(0,T.jsx)(D.ToggleButton,{className:"vuuIconToggleButton","data-icon":"pin-left",value:"left"}),(0,T.jsx)(D.ToggleButton,{className:"vuuIconToggleButton","data-icon":"pin-float",value:"floating"}),(0,T.jsx)(D.ToggleButton,{className:"vuuIconToggleButton","data-icon":"pin-right",value:"right"})]})]}),(0,T.jsx)(Jt,{availableRenderers:i,selectedCellRenderer:l,column:u,onChangeFormatting:b,onChangeRenderer:a}),(0,Ot.isCalculatedColumn)(u.name)?(0,T.jsx)(bo,{column:u,onSave:g,tableConfig:n,vuuTable:r}):(0,T.jsxs)("div",{className:`${et}-buttonBar`,"data-align":s?"right":void 0,children:[(0,T.jsx)(D.Button,{className:`${et}-buttonNavPrev`,variant:"secondary","data-icon":"arrow-left",onClick:m,children:"PREVIOUS"}),(0,T.jsx)(D.Button,{className:`${et}-buttonNavNext`,variant:"secondary","data-icon":"arrow-right",onClick:c,children:"NEXT"})]})]})};var ot=require("react"),vn=w(require("classnames"),1);var re=require("react/jsx-runtime"),tt="vuuDatasourceStats",xo=new Intl.NumberFormat,Bs=({className:t,dataSource:e})=>{let[o,n]=(0,ot.useState)(e.range),[r,s]=(0,ot.useState)(e.size);(0,ot.useEffect)(()=>{s(e.size),e.on("resize",s),e.on("range",n)},[e]);let i=(0,vn.default)(tt,t),l=xo.format(o.from),u=xo.format(o.to-1),c=xo.format(r);return(0,re.jsxs)("div",{className:i,children:[(0,re.jsx)("span",{className:`${tt}-label`,children:"Row count"}),(0,re.jsx)("span",{className:`${tt}-range`,children:l}),(0,re.jsx)("span",{children:"-"}),(0,re.jsx)("span",{className:`${tt}-range`,children:u}),(0,re.jsx)("span",{children:"of"}),(0,re.jsx)("span",{className:`${tt}-size`,children:c})]})};var S=require("@salt-ds/core");var Ir=require("@vuu-ui/vuu-layout");var Tn=require("react");var Ws=require("react/jsx-runtime");var Qs=require("@vuu-ui/vuu-utils");var Gs=require("@vuu-ui/vuu-utils"),Ne=require("@vuu-ui/vuu-utils");var{Average:oc,Count:nc,Distinct:rc,High:sc,Low:ic,Sum:lc}=Ne.AggregationType;var Pi=require("@vuu-ui/vuu-popups"),Zn=require("@salt-ds/core");var ve=require("@vuu-ui/vuu-utils"),kn=require("react");var V=require("@vuu-ui/vuu-utils"),Mn=w(require("classnames")),rt=require("react");var At=require("@vuu-ui/vuu-utils"),wn=require("@vuu-ui/vuu-ui-controls"),Dn=w(require("classnames")),se=require("react");var nt=require("react/jsx-runtime"),{KEY:En}=At.metadataKeys,yo=(0,se.memo)(({className:t,column:e,columnMap:o,onClick:n,row:r})=>{let s=(0,se.useRef)(null),{align:i,CellRenderer:l,key:u,pin:c,editable:m,resizing:d,valueFormatter:b}=e,[a,p]=(0,se.useState)(!1),g=b(r[u]),[f,h]=(0,se.useState)(g),v=()=>{var q;(q=s.current)==null||q.focus()},E=q=>{q.key==="Enter"&&p(!0)},y=(0,se.useCallback)(q=>{n==null||n(q,e)},[e,n]),B=()=>{p(!0)},We=(q="",No="",Vr=!0,$r=!1)=>{var ko;p(!1),$r?h(q):No!==q&&h(No),Vr===!1&&((ko=s.current)==null||ko.focus())},Qt=(0,Dn.default)(t,{vuuAlignRight:i==="right",vuuPinFloating:c==="floating",vuuPinLeft:c==="left",vuuPinRight:c==="right","vuuTableCell-resizing":d})||void 0,Lo=(0,At.getColumnStyle)(e);return m?(0,nt.jsx)("div",{className:Qt,"data-editable":!0,role:"cell",style:Lo,onKeyDown:E,children:(0,nt.jsx)(wn.EditableLabel,{editing:a,value:f,onChange:h,onMouseDownCapture:v,onEnterEditMode:B,onExitEditMode:We,onKeyDown:E,ref:s,tabIndex:0},"title")}):(0,nt.jsx)("div",{className:Qt,role:"cell",style:Lo,onClick:y,children:l?(0,nt.jsx)(l,{column:e,columnMap:o,row:r}):g})},Us);yo.displayName="TableCell";function Us(t,e){return t.column===e.column&&t.onClick===e.onClick&&t.row[En]===e.row[En]&&t.row[t.column.key]===e.row[e.column.key]}var Fe=require("@vuu-ui/vuu-utils"),Rn=require("react");var ke=require("react/jsx-runtime"),{IS_LEAF:Xs}=Fe.metadataKeys,Sn=({column:t,onClick:e,row:o})=>{let{columns:n}=t,[r,s]=(0,Fe.getGroupValueAndOffset)(n,o),i=(0,Rn.useCallback)(m=>{e==null||e(m,t)},[t,e]),l=(0,Fe.getColumnStyle)(t),u=o[Xs],c=Array(s).fill(0).map((m,d)=>(0,ke.jsx)("span",{className:"vuuTableGroupCell-spacer"},d));return(0,ke.jsxs)("div",{className:"vuuTableGroupCell vuuPinLeft",onClick:u?void 0:i,role:"cell",style:l,children:[c,u?null:(0,ke.jsx)("span",{className:"vuuTableGroupCell-toggle","data-icon":"triangle-right"}),(0,ke.jsx)("span",{children:r})]})};var st=require("react/jsx-runtime"),{IDX:_s,IS_EXPANDED:Ys,SELECTED:Js}=V.metadataKeys,{True:Pn,First:Zs,Last:qs}=V.RowSelected,Ie="vuuTableRow",js=(0,rt.memo)(function({columnMap:e,columns:o,offset:n,onClick:r,onToggleGroup:s,virtualColSpan:i=0,row:l}){let{[_s]:u,[Ys]:c,[Js]:m}=l,d=(0,Mn.default)(Ie,{[`${Ie}-even`]:u%2===0,[`${Ie}-expanded`]:c,[`${Ie}-selected`]:m&Pn,[`${Ie}-selectedStart`]:m&Zs,[`${Ie}-selectedEnd`]:m&qs}),b=(0,rt.useCallback)(p=>{let g=p.shiftKey,f=p.ctrlKey||p.metaKey;r==null||r(l,g,f)},[r,l]),a=(0,rt.useCallback)((p,g)=>{((0,V.isGroupColumn)(g)||(0,V.isJsonGroup)(g,l))&&(p.stopPropagation(),s==null||s(l,g))},[s,l]);return(0,st.jsxs)("div",{"aria-selected":m&Pn?!0:void 0,"aria-rowindex":u,className:d,onClick:b,role:"row",style:{transform:`translate3d(0px, ${n}px, 0px)`},children:[i>0?(0,st.jsx)("div",{role:"cell",style:{width:i}}):null,o.filter(V.notHidden).map(p=>{let g=(0,V.isGroupColumn)(p),f=(0,V.isJsonColumn)(p);return(0,st.jsx)(g?Sn:yo,{column:p,columnMap:e,onClick:g||f?a:void 0,row:l},p.name)})]})});var oi=w(require("classnames")),ni=require("react");var Hn=require("react");var On=require("react/jsx-runtime");var ui=w(require("classnames")),Ln=require("react");var ri=w(require("classnames"));var An=require("react/jsx-runtime");var ci=require("@vuu-ui/vuu-popups");var si=require("@vuu-ui/vuu-popups"),ii=w(require("classnames")),li=require("react");var ai=require("react/jsx-runtime");var Nn=require("react/jsx-runtime");var Fn=require("react/jsx-runtime");var{RENDER_IDX:bm}=ve.metadataKeys;var Ri=require("@vuu-ui/vuu-popups"),Ke=require("@vuu-ui/vuu-utils"),ct=require("react");var In=require("@vuu-ui/vuu-data-react"),Lt=require("@vuu-ui/vuu-utils"),it=require("react"),{SELECTED:xm}=Lt.metadataKeys;var mi=require("@vuu-ui/vuu-ui-controls"),Kn=require("react");var hi=require("@vuu-ui/vuu-utils"),lt=require("react");function pi(t,...e){let o=new Set(t);for(let n of e)for(let r of n)o.add(r);return o}var zn="ArrowUp",Vn="ArrowDown",$n="ArrowLeft",Bn="ArrowRight";var Wn="Home",Qn="End",Gn="PageUp",Un="PageDown";var di=new Set(["Enter","Delete"," "]),fi=new Set(["Tab"]),gi=new Set(["ArrowRight","ArrowLeft"]),Ci=new Set([Wn,Qn,Gn,Un,Vn,$n,Bn,zn]),bi=new Set(["F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12"]),Em=pi(di,Ci,gi,bi,fi);var vi=require("@vuu-ui/vuu-utils"),Nt=require("react");var vo=require("react");var xi=new Map,yi=(t,e,o)=>{switch(o){case"height":return e.height;case"clientHeight":return t.clientHeight;case"clientWidth":return t.clientWidth;case"contentHeight":return e.contentHeight;case"contentWidth":return e.contentWidth;case"scrollHeight":return Math.ceil(t.scrollHeight);case"scrollWidth":return Math.ceil(t.scrollWidth);case"width":return e.width;default:return 0}},km=new ResizeObserver(t=>{for(let e of t){let{target:o,borderBoxSize:n,contentBoxSize:r}=e,s=xi.get(o);if(s){let[{blockSize:i,inlineSize:l}]=n,[{blockSize:u,inlineSize:c}]=r,{onResize:m,measurements:d}=s,b=!1;for(let[a,p]of Object.entries(d)){let g=yi(o,{height:i,width:l,contentHeight:u,contentWidth:c},a);g!==p&&(b=!0,d[a]=g)}b&&m&&m(d)}}});var at=require("@vuu-ui/vuu-utils"),Xn=require("react"),{IDX:Bm}=at.metadataKeys;var H=require("@vuu-ui/vuu-utils"),Ti=require("react");var Gm=H.metadataKeys.count;var _n=require("react");var To=require("react"),Yn=require("@vuu-ui/vuu-utils");var Jn=require("@vuu-ui/vuu-utils"),ut=require("react");var{KEY:yp,IS_EXPANDED:vp,IS_LEAF:Tp}=Ke.metadataKeys;var Mi=w(require("classnames"));var Hi=require("@vuu-ui/vuu-utils"),qn=require("react/jsx-runtime");var jn=w(require("classnames")),Ve=require("@vuu-ui/vuu-utils");var ze=require("react/jsx-runtime"),mt="vuuJsonCell",{IS_EXPANDED:Oi,KEY:Ai}=Ve.metadataKeys,Li=t=>{let e=t.lastIndexOf("|");return e===-1?"":t.slice(e+1)},Ni=({column:t,row:e})=>{let{key:o}=t,n=e[o],r=!1;(0,Ve.isJsonAttribute)(n)&&(n=n.slice(0,-1),r=!0);let s=Li(e[Ai]),i=(0,jn.default)({[`${mt}-name`]:s===n,[`${mt}-value`]:s!==n,[`${mt}-group`]:r});if(r){let l=e[Oi]?"minus-box":"plus-box";return(0,ze.jsxs)("span",{className:i,children:[(0,ze.jsx)("span",{className:`${mt}-value`,children:n}),(0,ze.jsx)("span",{className:`${mt}-toggle`,"data-icon":l})]})}else return n?(0,ze.jsx)("span",{className:i,children:n}):null};(0,Ve.registerComponent)("json",Ni,"cell-renderer",{description:"JSON formatter",label:"JSON formatter",serverDataType:"json"});var zi=w(require("classnames")),Vi=require("react");var er=require("react");var ki=require("react/jsx-runtime");var Eo=require("react");var tr=require("@vuu-ui/vuu-utils"),or=w(require("classnames")),nr=require("react"),Te=(t,e,o)=>(0,nr.useMemo)(()=>{let n=(0,or.default)(e,{vuuPinFloating:t.pin==="floating",vuuPinLeft:t.pin==="left",vuuPinRight:t.pin==="right",vuuEndPin:o&&t.endPin,[`${e}-editable`]:t.editable,[`${e}-right`]:t.align==="right"}),r=(0,tr.getColumnStyle)(t);return{className:n,style:r}},[t,e,o]);var Fi=w(require("classnames")),Ii=require("react");var rr=require("react/jsx-runtime");var sr=require("react/jsx-runtime");var ir=require("react/jsx-runtime");var ur=require("react/jsx-runtime"),$i=require("react");var Bi=w(require("classnames")),Do=require("react");var cr=require("@vuu-ui/vuu-layout");var mr=require("react/jsx-runtime"),Wi=require("react");var pr=require("react");var Qi=require("@vuu-ui/vuu-popups"),Gi=w(require("classnames")),Ro=require("react");var Ui=require("react/jsx-runtime");var Xi=w(require("classnames"));var dr=require("react/jsx-runtime");var ul=require("@vuu-ui/vuu-popups"),Vt=require("@vuu-ui/vuu-utils"),cl=w(require("classnames")),ml=require("react");var $=require("@vuu-ui/vuu-utils"),yr=w(require("classnames")),pt=require("react");var fr=require("@vuu-ui/vuu-utils"),gr=require("react");var So=require("react/jsx-runtime"),{IDX:_i}=fr.metadataKeys,Yi="vuuTableNextCell",Cr=({column:t,columnMap:e,onDataEdited:o,row:n})=>{let{className:r,style:s}=Te(t,Yi),{CellRenderer:i,name:l,valueFormatter:u}=t,c=e[l],m=(0,gr.useCallback)(d=>(o==null||o(n[_i],l,d),!0),[l,o,n]);return(0,So.jsx)("div",{className:r,role:"cell",style:s,children:i?(0,So.jsx)(i,{column:t,columnMap:e,onCommit:m,row:n}):u(n[c])})};var kt=require("@vuu-ui/vuu-utils"),br=require("react");var hr=w(require("classnames"));var $e=require("react/jsx-runtime"),{IS_LEAF:Ji}=kt.metadataKeys,Po="vuuTableNextGroupCell",xr=({column:t,onClick:e,row:o})=>{let{columns:n}=t,[r,s]=(0,kt.getGroupValueAndOffset)(n,o),{className:i,style:l}=Te(t,Po),u=(0,br.useCallback)(d=>{e==null||e(d,t)},[t,e]),c=o[Ji],m=Array(s).fill(0).map((d,b)=>(0,$e.jsx)("span",{className:`${Po}-spacer`},b));return(0,$e.jsxs)("div",{className:(0,hr.default)(i,"vuuTableNextCell"),role:"cell",style:l,onClick:c?void 0:u,children:[m,c?null:(0,$e.jsx)("span",{className:`${Po}-toggle`,"data-icon":"triangle-right"}),(0,$e.jsx)("span",{children:r})]})};var Ft=require("react/jsx-runtime"),Tr=require("react"),{IDX:Zi,IS_EXPANDED:qi,SELECTED:ji}=$.metadataKeys,ce="vuuTableNextRow",vr=(0,pt.memo)(({className:t,columnMap:e,columns:o,row:n,offset:r,onClick:s,onDataEdited:i,onToggleGroup:l,zebraStripes:u=!1,...c})=>{let{[Zi]:m,[qi]:d,[ji]:b}=n,a=(0,pt.useCallback)(y=>{let B=y.shiftKey,We=y.ctrlKey||y.metaKey;s==null||s(n,B,We)},[s,n]),{True:p,First:g,Last:f}=$.RowSelected,h=(0,yr.default)(ce,t,{[`${ce}-even`]:u&&m%2===0,[`${ce}-expanded`]:d,[`${ce}-selected`]:b&p,[`${ce}-selectedStart`]:b&g,[`${ce}-selectedEnd`]:b&f}),v={transform:`translate3d(0px, ${r}px, 0px)`},E=(0,pt.useCallback)((y,B)=>{((0,$.isGroupColumn)(B)||(0,$.isJsonGroup)(B,n))&&(y.stopPropagation(),l==null||l(n,B))},[l,n]);return(0,Tr.createElement)("div",{...c,"aria-rowindex":n[0],key:`row-${n[0]}`,role:"row",className:h,onClick:a,style:v},(0,Ft.jsx)("span",{className:`${ce}-selectionDecorator vuuStickyLeft`}),o.filter($.notHidden).map(y=>{let B=(0,$.isGroupColumn)(y),We=(0,$.isJsonColumn)(y);return(0,Ft.jsx)(B?xr:Cr,{column:y,columnMap:e,onClick:B||We?E:void 0,onDataEdited:i,row:n},y.key)}),(0,Ft.jsx)("span",{className:`${ce}-selectionDecorator vuuStickyRight`}))});vr.displayName="Row";var ll=require("@vuu-ui/vuu-layout");var al=require("@vuu-ui/vuu-ui-controls");var It=require("react");var ie=require("@vuu-ui/vuu-utils"),zt=require("react");var Kt=(t,e)=>{switch(e.type){case"col-size":return{...t,columns:t.columns.map(o=>o.name===e.column.name?{...o,width:e.width}:o)};case"column-prop":return{...t,columns:t.columns.map(o=>o.name===e.column.name?{...o,[e.property]:e.value}:o)};default:return t}};var Er=require("@vuu-ui/vuu-data-react/src"),wr=require("@vuu-ui/vuu-utils"),dt=require("react");var Mo=require("@vuu-ui/vuu-utils"),{SELECTED:Uf}=Mo.metadataKeys;var Dr=require("react");var el=require("@vuu-ui/vuu-utils"),tl=require("react"),ol=require("@vuu-ui/vuu-popups");var nl=require("@vuu-ui/vuu-utils"),rl=require("react");var O=require("@vuu-ui/vuu-utils"),sl=require("@vuu-ui/vuu-ui-controls"),il=require("react"),{info:sg}=(0,O.logger)("useTableModel");var ig=O.metadataKeys.count;var Rr=require("react");var Ho=require("react");var{KEY:Vg,IS_EXPANDED:$g,IS_LEAF:Bg}=ie.metadataKeys;var Mr=require("@vuu-ui/vuu-layout");var Hr=require("react/jsx-runtime"),pl=require("react");var{IDX:eC,RENDER_IDX:tC}=Vt.metadataKeys;var Or=require("@vuu-ui/vuu-ui-controls"),Be=require("@vuu-ui/vuu-utils");var $t=require("react"),Ar=require("react/jsx-runtime"),dl="vuuTableDropdownCell",fl=["Enter"," "],gl=({column:t,columnMap:e,row:o})=>{var u,c,m;let n=(0,Be.isTypeDescriptor)(t.type)&&(0,Be.isColumnTypeRenderer)((u=t.type)==null?void 0:u.renderer)?(m=(c=t.type)==null?void 0:c.renderer)==null?void 0:m.values:[],r=e[t.name],[s,i]=(0,$t.useState)(o[r]),l=(0,$t.useCallback)((d,b)=>{b&&i(b)},[]);return(0,Ar.jsx)(Or.Dropdown,{className:dl,onSelectionChange:l,openKeys:fl,selected:s,source:n,width:t.width-17})};(0,Be.registerComponent)("dropdown-cell",gl,"cell-renderer",{});var Lr=require("@vuu-ui/vuu-utils"),Nr=require("@salt-ds/core"),kr=require("@vuu-ui/vuu-ui-controls"),Fr=w(require("classnames"));var Wt=require("react/jsx-runtime"),Bt="vuuTableInputCell",Cl=()=>(console.warn("onCommit handler has not been provided to InputCell cell renderer"),!0),bl=({column:t,columnMap:e,onCommit:o=Cl,row:n})=>{let r=e[t.name],{align:s="left",clientSideEditValidationCheck:i,valueFormatter:l}=t,{warningMessage:u,...c}=(0,kr.useEditableText)({initialValue:l(n[r]),onCommit:o,clientSideEditValidationCheck:i}),m=u&&s==="left"?(0,Wt.jsx)("span",{className:`${Bt}-icon`,"data-icon":"error"}):void 0,d=u&&s==="right"?(0,Wt.jsx)("span",{className:`${Bt}-icon`,"data-icon":"error"}):void 0;return(0,Wt.jsx)(Nr.Input,{...c,className:(0,Fr.default)(Bt,{[`${Bt}-error`]:u!==void 0}),endAdornment:m,startAdornment:d})};(0,Lr.registerComponent)("input-cell",bl,"cell-renderer",{});var me=require("@vuu-ui/vuu-utils"),le=require("react"),hl=(t,e)=>{let o=[];for(let{name:n}of t){let r=e.find(s=>s.name===n);r&&o.push(r)}return o},xl=(t,e)=>t.map(({name:o,serverDataType:n})=>{let r=e.find(s=>s.name===o);return{hidden:r==null?void 0:r.hidden,isCalculated:(0,me.isCalculatedColumn)(o),label:r==null?void 0:r.label,name:o,serverDataType:n,subscribed:r!==void 0}}),Oo=({availableColumns:t,onConfigChange:e,onDataSourceConfigChange:o,tableConfig:n})=>{let[{availableColumns:r,tableConfig:s},i]=(0,le.useState)({availableColumns:t,tableConfig:n}),l=(0,le.useMemo)(()=>xl(r,s.columns),[r,s.columns]),u=(0,le.useCallback)((a,p)=>{i(g=>{let f=(0,me.moveItem)(g.availableColumns,a,p),h=hl(f,s.columns);return{availableColumns:f,tableConfig:{...g.tableConfig,columns:h}}})},[s.columns]),c=(0,le.useCallback)((a,p,g)=>{let f=l.find(h=>h.name===a);if(p==="subscribed")if(f!=null&&f.subscribed){let h=s.columns.filter(v=>v.name!==a).map(v=>v.name);i(v=>({...v,tableConfig:{...s,columns:s.columns.filter((0,me.subscribedOnly)(h))}})),o({columns:h})}else{let h={...s,columns:(0,me.addColumnToSubscribedColumns)(s.columns,r,a)};i(E=>({...E,tableConfig:h}));let v=h.columns.map(E=>E.name);o({columns:v})}else if(f!=null&&f.subscribed){let h=s.columns.find(v=>v.name===a);if(h){let v=Kt(s,{type:"column-prop",property:p,column:h,value:g});i(E=>({...E,tableConfig:v}))}}},[r,l,o,s]),m=(0,le.useCallback)(a=>{let{value:p}=a.target,g=p==="0"?void 0:p==="1"?"capitalize":"uppercase";i(f=>({...f,tableConfig:{...f.tableConfig,columnFormatHeader:g}}))},[]),d=(0,le.useCallback)(a=>{let{ariaChecked:p,value:g}=a.target;i(f=>({...f,tableConfig:{...f.tableConfig,[g]:p!=="true"}}))},[]);(0,Ir.useLayoutEffectSkipFirst)(()=>{e==null||e(s)},[e,s]);let b=s.columnFormatHeader===void 0?0:s.columnFormatHeader==="capitalize"?1:2;return{columnItems:l,columnLabelsValue:b,onChangeColumnLabels:m,onChangeTableAttribute:d,onColumnChange:c,onMoveListItem:u,tableConfig:s}};var R=require("react/jsx-runtime"),Ao="vuuTableSettingsPanel",yl=({availableColumns:t,onAddCalculatedColumn:e,onConfigChange:o,onDataSourceConfigChange:n,tableConfig:r,...s})=>{let{columnItems:i,columnLabelsValue:l,onChangeColumnLabels:u,onChangeTableAttribute:c,onColumnChange:m,onMoveListItem:d,tableConfig:b}=Oo({availableColumns:t,onConfigChange:o,onDataSourceConfigChange:n,tableConfig:r});return(0,R.jsxs)("div",{...s,className:Ao,children:[(0,R.jsxs)(S.FormField,{children:[(0,R.jsx)(S.FormFieldLabel,{children:"Column Labels"}),(0,R.jsxs)(S.ToggleButtonGroup,{className:"vuuToggleButtonGroup",onChange:u,value:l,children:[(0,R.jsx)(S.ToggleButton,{className:"vuuIconToggleButton","data-icon":"text-strikethrough",value:0}),(0,R.jsx)(S.ToggleButton,{className:"vuuIconToggleButton","data-icon":"text-Tt",value:1}),(0,R.jsx)(S.ToggleButton,{className:"vuuIconToggleButton","data-icon":"text-T",value:2})]})]}),(0,R.jsxs)(S.FormField,{children:[(0,R.jsx)(S.FormFieldLabel,{children:"Grid separators"}),(0,R.jsxs)("div",{className:"saltToggleButtonGroup vuuToggleButtonGroup saltToggleButtonGroup-horizontal vuuGridSeparators",children:[(0,R.jsx)(S.ToggleButton,{className:"vuuIconToggleButton","data-icon":"row-striping",selected:b.zebraStripes,onChange:c,value:"zebraStripes"}),(0,R.jsx)(S.ToggleButton,{className:"vuuIconToggleButton","data-icon":"row-lines",selected:b.rowSeparators,onChange:c,value:"rowSeparators"}),(0,R.jsx)(S.ToggleButton,{className:"vuuIconToggleButton","data-icon":"col-lines",selected:b.columnSeparators,onChange:c,value:"columnSeparators"})]})]}),(0,R.jsxs)(S.FormField,{children:[(0,R.jsx)(S.FormFieldLabel,{children:"Default Column Width"}),(0,R.jsx)(S.Input,{className:"vuuInput"})]}),(0,R.jsx)(Gt,{columnItems:i,onChange:m,onMoveListItem:d}),(0,R.jsxs)("div",{className:`${Ao}-calculatedButtonbar`,children:[(0,R.jsx)(S.Button,{"data-icon":"plus",onClick:e}),(0,R.jsx)("span",{className:`${Ao}-calculatedLabel`,children:"Add calculated column"})]})]})};var Kr=require("@vuu-ui/vuu-layout"),zr=require("@vuu-ui/vuu-utils"),Z=require("react"),Sr=({availableColumns:t,onAvailableColumnsChange:e,onConfigChange:o,onCreateCalculatedColumn:n,onDataSourceConfigChange:r,tableConfig:s})=>{let i=(0,Kr.useLayoutProviderDispatch)(),l=(0,Z.useRef)(),[u,c]=(0,Z.useState)(t),m=(0,Z.useCallback)((p,g,f)=>{i({type:"set-props",path:"#context-panel",props:{expanded:!0,content:{type:p,props:f},title:g}})},[i]),d=(0,Z.useCallback)(p=>{let g=u.concat({name:p.name,serverDataType:(0,zr.getCalculatedColumnType)(p)});c(g),e==null||e(g),requestAnimationFrame(()=>{var f;(f=l.current)==null||f.call(l)}),n(p)},[u,e,n]),b=(0,Z.useCallback)(p=>{m("ColumnSettings","Column Settings",{column:p.column,onConfigChange:o,onCreateCalculatedColumn:d,tableConfig:s,vuuTable:p.vuuTable})},[d,o,m,s]),a=(0,Z.useCallback)(()=>{b({column:{name:"::",serverDataType:"string"},type:"columnSettings",vuuTable:{module:"SIMUL",table:"instruments"}})},[b]);return l.current=(0,Z.useCallback)(()=>{m("TableSettings","DataGrid Settings",{availableColumns:u!=null?u:s.columns.map(({name:p,serverDataType:g})=>({name:p,serverDataType:g})),onAddCalculatedColumn:a,onConfigChange:o,onDataSourceConfigChange:r,tableConfig:s})},[u,a,o,r,m,s]),{showColumnSettingsPanel:b,showTableSettingsPanel:l.current}};
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name2 in all)
10
+ __defProp(target, name2, { get: all[name2], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var __accessCheck = (obj, member, msg) => {
30
+ if (!member.has(obj))
31
+ throw TypeError("Cannot " + msg);
32
+ };
33
+ var __privateGet = (obj, member, getter) => {
34
+ __accessCheck(obj, member, "read from private field");
35
+ return getter ? getter.call(obj) : member.get(obj);
36
+ };
37
+ var __privateAdd = (obj, member, value) => {
38
+ if (member.has(obj))
39
+ throw TypeError("Cannot add the same private member more than once");
40
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
41
+ };
42
+ var __privateSet = (obj, member, value, setter) => {
43
+ __accessCheck(obj, member, "write to private field");
44
+ setter ? setter.call(obj, value) : member.set(obj, value);
45
+ return value;
46
+ };
47
+
48
+ // src/index.ts
49
+ var src_exports = {};
50
+ __export(src_exports, {
51
+ BackgroundCell: () => BackgroundCell2,
52
+ CaseValidator: () => CaseValidator,
53
+ ColumnExpressionInput: () => ColumnExpressionInput,
54
+ ColumnExpressionPanel: () => ColumnExpressionPanel,
55
+ ColumnFormattingPanel: () => ColumnFormattingPanel,
56
+ ColumnList: () => ColumnList,
57
+ ColumnNamedTerms: () => ColumnNamedTerms,
58
+ ColumnSettingsPanel: () => ColumnSettingsPanel,
59
+ DataSourceStats: () => DataSourceStats,
60
+ NumericFormattingSettings: () => NumericFormattingSettings,
61
+ PatternValidator: () => PatternValidator,
62
+ TableSettingsPanel: () => TableSettingsPanel,
63
+ columnExpressionLanguageSupport: () => columnExpressionLanguageSupport,
64
+ isCompleteExpression: () => isCompleteExpression,
65
+ isCompleteRelationalExpression: () => isCompleteRelationalExpression,
66
+ lastNamedChild: () => lastNamedChild,
67
+ useColumnExpressionEditor: () => useColumnExpressionEditor,
68
+ useColumnExpressionSuggestionProvider: () => useColumnExpressionSuggestionProvider,
69
+ useTableAndColumnSettings: () => useTableAndColumnSettings,
70
+ useTableSettings: () => useTableSettings,
71
+ walkTree: () => walkTree
72
+ });
73
+ module.exports = __toCommonJS(src_exports);
74
+
75
+ // src/cell-edit-validators/CaseValidator.ts
76
+ var import_vuu_utils = require("@vuu-ui/vuu-utils");
77
+ var isString = (value) => typeof value === "string";
78
+ var CaseValidator = (rule, value) => {
79
+ if (isString(value)) {
80
+ if (value === "") {
81
+ return true;
82
+ } else if (rule.value === "lower" && value.toLowerCase() !== value) {
83
+ return "value must be all lowercase";
84
+ } else if (rule.value === "upper" && value.toUpperCase() !== value) {
85
+ return "value must be all uppercase";
86
+ } else {
87
+ return true;
88
+ }
89
+ } else {
90
+ return "value must be a string";
91
+ }
92
+ };
93
+ (0, import_vuu_utils.registerComponent)("vuu-case", CaseValidator, "data-edit-validator", {});
94
+
95
+ // src/cell-edit-validators/PatternValidator.ts
96
+ var import_vuu_utils2 = require("@vuu-ui/vuu-utils");
97
+ var isString2 = (value) => typeof value === "string";
98
+ var defaultMessage = "value does not match expected pattern";
99
+ var PatternValidator = (rule, value) => {
100
+ if (typeof rule.value !== "string") {
101
+ throw Error("Pattern validation rule must provide pattern");
102
+ }
103
+ if (isString2(value)) {
104
+ if (value === "") {
105
+ return true;
106
+ } else {
107
+ const { message = defaultMessage } = rule;
108
+ const pattern = new RegExp(rule.value);
109
+ return pattern.test(value) || message;
110
+ }
111
+ } else {
112
+ return "value must be a string";
113
+ }
114
+ };
115
+ (0, import_vuu_utils2.registerComponent)("vuu-pattern", PatternValidator, "data-edit-validator", {});
116
+
117
+ // src/cell-renderers/background-cell/BackgroundCell.tsx
118
+ var import_vuu_utils4 = require("@vuu-ui/vuu-utils");
119
+ var import_classnames = __toESM(require("classnames"), 1);
120
+
121
+ // src/cell-renderers/background-cell/useDirection.ts
122
+ var import_vuu_utils3 = require("@vuu-ui/vuu-utils");
123
+ var import_react = require("react");
124
+ var INITIAL_VALUE = [void 0, void 0, void 0, void 0];
125
+ function useDirection(key, value, column) {
126
+ var _a;
127
+ const ref = (0, import_react.useRef)();
128
+ const [prevKey, prevValue, prevColumn, prevDirection] = ref.current || INITIAL_VALUE;
129
+ const { type: dataType } = column;
130
+ const decimals = (0, import_vuu_utils3.isTypeDescriptor)(dataType) ? (_a = dataType.formatting) == null ? void 0 : _a.decimals : void 0;
131
+ const direction = key === prevKey && (0, import_vuu_utils3.isValidNumber)(value) && (0, import_vuu_utils3.isValidNumber)(prevValue) && column === prevColumn ? (0, import_vuu_utils3.getMovingValueDirection)(value, prevDirection, prevValue, decimals) : "";
132
+ (0, import_react.useEffect)(() => {
133
+ ref.current = [key, value, column, direction];
134
+ });
135
+ return direction;
136
+ }
137
+
138
+ // src/cell-renderers/background-cell/BackgroundCell.tsx
139
+ var import_jsx_runtime = require("react/jsx-runtime");
140
+ var CHAR_ARROW_UP = String.fromCharCode(11014);
141
+ var CHAR_ARROW_DOWN = String.fromCharCode(11015);
142
+ var { KEY } = import_vuu_utils4.metadataKeys;
143
+ var classBase = "vuuBackgroundCellDeprecated";
144
+ var FlashStyle = {
145
+ ArrowOnly: "arrow",
146
+ BackgroundOnly: "bg-only",
147
+ ArrowBackground: "arrow-bg"
148
+ };
149
+ var getFlashStyle = (colType) => {
150
+ if ((0, import_vuu_utils4.isTypeDescriptor)(colType) && colType.renderer) {
151
+ if ("flashStyle" in colType.renderer) {
152
+ return colType.renderer["flashStyle"];
153
+ }
154
+ }
155
+ return FlashStyle.BackgroundOnly;
156
+ };
157
+ var BackgroundCell = ({ column, row }) => {
158
+ const { key, type, valueFormatter } = column;
159
+ const value = row[key];
160
+ const flashStyle = getFlashStyle(type);
161
+ const direction = useDirection(row[KEY], value, column);
162
+ const arrow = flashStyle === FlashStyle.ArrowOnly || flashStyle === FlashStyle.ArrowBackground ? direction === import_vuu_utils4.UP1 || direction === import_vuu_utils4.UP2 ? CHAR_ARROW_UP : direction === import_vuu_utils4.DOWN1 || direction === import_vuu_utils4.DOWN2 ? CHAR_ARROW_DOWN : null : null;
163
+ const dirClass = direction ? ` ` + direction : "";
164
+ const className = (0, import_classnames.default)(classBase, dirClass, {
165
+ [`${classBase}-arrowOnly`]: flashStyle === FlashStyle.ArrowOnly,
166
+ [`${classBase}-arrowBackground`]: flashStyle === FlashStyle.ArrowBackground
167
+ });
168
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className, tabIndex: -1, children: [
169
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: `${classBase}-flasher`, children: arrow }),
170
+ valueFormatter(row[column.key])
171
+ ] });
172
+ };
173
+ (0, import_vuu_utils4.registerComponent)("background", BackgroundCell, "cell-renderer", {
174
+ description: "Background Cell renderer for VuuTable",
175
+ label: "Background Cell (deprecated)",
176
+ serverDataType: ["long", "int", "double"]
177
+ });
178
+
179
+ // src/cell-renderers/progress-cell/ProgressCell.tsx
180
+ var import_vuu_utils5 = require("@vuu-ui/vuu-utils");
181
+ var import_classnames2 = __toESM(require("classnames"), 1);
182
+ var import_jsx_runtime2 = require("react/jsx-runtime");
183
+ var classBase2 = "vuuProgressCell";
184
+ var ProgressCell = ({ column, columnMap, row }) => {
185
+ const { type } = column;
186
+ const value = row[column.key];
187
+ let showProgress = false;
188
+ let percentage = 0;
189
+ if ((0, import_vuu_utils5.isTypeDescriptor)(type) && (0, import_vuu_utils5.isColumnTypeRenderer)(type.renderer)) {
190
+ const { associatedField } = type.renderer;
191
+ if (associatedField) {
192
+ const associatedValue = row[columnMap[associatedField]];
193
+ if (typeof (0, import_vuu_utils5.isValidNumber)(value) && (0, import_vuu_utils5.isValidNumber)(associatedValue)) {
194
+ percentage = Math.min(Math.round(value / associatedValue * 100), 100);
195
+ percentage = Math.min(Math.round(value / associatedValue * 100), 100);
196
+ showProgress = isFinite(percentage);
197
+ } else {
198
+ const floatValue = parseFloat(value);
199
+ if (Number.isFinite(floatValue)) {
200
+ const floatOtherValue = parseFloat(associatedValue);
201
+ if (Number.isFinite(floatOtherValue)) {
202
+ percentage = Math.min(
203
+ Math.round(floatValue / floatOtherValue * 100),
204
+ 100
205
+ );
206
+ showProgress = isFinite(percentage);
207
+ }
208
+ }
209
+ }
210
+ } else {
211
+ throw Error("ProgressCell associatedField is required to render");
212
+ }
213
+ }
214
+ const className = (0, import_classnames2.default)(classBase2, {});
215
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className, tabIndex: -1, children: [
216
+ showProgress ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: `${classBase2}-track`, children: [
217
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `${classBase2}-bg` }),
218
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
219
+ "span",
220
+ {
221
+ className: `${classBase2}-bar`,
222
+ style: { "--progress-bar-pct": `-${100 - percentage}%` }
223
+ }
224
+ )
225
+ ] }) : null,
226
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `${classBase2}-text`, children: `${percentage} %` })
227
+ ] });
228
+ };
229
+ (0, import_vuu_utils5.registerComponent)("vuu.progress", ProgressCell, "cell-renderer", {
230
+ description: "Progress formatter",
231
+ label: "Progress formatter",
232
+ serverDataType: ["long", "int", "double"]
233
+ });
234
+
235
+ // src/cell-renderers-next/background-cell/BackgroundCell.tsx
236
+ var import_vuu_utils7 = require("@vuu-ui/vuu-utils");
237
+ var import_classnames3 = __toESM(require("classnames"), 1);
238
+
239
+ // src/cell-renderers-next/background-cell/useDirection.ts
240
+ var import_vuu_utils6 = require("@vuu-ui/vuu-utils");
241
+ var import_react2 = require("react");
242
+ var INITIAL_VALUE2 = [void 0, void 0, void 0, void 0];
243
+ function useDirection2(key, value, column) {
244
+ var _a;
245
+ const ref = (0, import_react2.useRef)();
246
+ const [prevKey, prevValue, prevColumn, prevDirection] = ref.current || INITIAL_VALUE2;
247
+ const { type: dataType } = column;
248
+ const decimals = (0, import_vuu_utils6.isTypeDescriptor)(dataType) ? (_a = dataType.formatting) == null ? void 0 : _a.decimals : void 0;
249
+ const direction = key === prevKey && (0, import_vuu_utils6.isValidNumber)(value) && (0, import_vuu_utils6.isValidNumber)(prevValue) && column === prevColumn ? (0, import_vuu_utils6.getMovingValueDirection)(value, prevDirection, prevValue, decimals) : "";
250
+ (0, import_react2.useEffect)(() => {
251
+ ref.current = [key, value, column, direction];
252
+ });
253
+ return direction;
254
+ }
255
+
256
+ // src/cell-renderers-next/background-cell/BackgroundCell.tsx
257
+ var import_jsx_runtime3 = require("react/jsx-runtime");
258
+ var CHAR_ARROW_UP2 = String.fromCharCode(11014);
259
+ var CHAR_ARROW_DOWN2 = String.fromCharCode(11015);
260
+ var { KEY: KEY2 } = import_vuu_utils7.metadataKeys;
261
+ var classBase3 = "vuuBackgroundCell";
262
+ var FlashStyle2 = {
263
+ ArrowOnly: "arrow",
264
+ BackgroundOnly: "bg-only",
265
+ ArrowBackground: "arrow-bg"
266
+ };
267
+ var getFlashStyle2 = (colType) => {
268
+ if ((0, import_vuu_utils7.isTypeDescriptor)(colType) && colType.renderer) {
269
+ if ("flashStyle" in colType.renderer) {
270
+ return colType.renderer["flashStyle"];
271
+ }
272
+ }
273
+ return FlashStyle2.BackgroundOnly;
274
+ };
275
+ var BackgroundCell2 = ({ column, row }) => {
276
+ const { key, type, valueFormatter } = column;
277
+ const value = row[key];
278
+ const flashStyle = getFlashStyle2(type);
279
+ const direction = useDirection2(row[KEY2], value, column);
280
+ const arrow = flashStyle === FlashStyle2.ArrowOnly || flashStyle === FlashStyle2.ArrowBackground ? direction === import_vuu_utils7.UP1 || direction === import_vuu_utils7.UP2 ? CHAR_ARROW_UP2 : direction === import_vuu_utils7.DOWN1 || direction === import_vuu_utils7.DOWN2 ? CHAR_ARROW_DOWN2 : null : null;
281
+ const dirClass = direction ? ` ` + direction : "";
282
+ const className = (0, import_classnames3.default)(classBase3, dirClass, {
283
+ [`${classBase3}-arrowOnly`]: flashStyle === FlashStyle2.ArrowOnly,
284
+ [`${classBase3}-arrowBackground`]: flashStyle === FlashStyle2.ArrowBackground
285
+ });
286
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className, tabIndex: -1, children: [
287
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: `${classBase3}-flasher`, children: arrow }),
288
+ valueFormatter(row[column.key])
289
+ ] });
290
+ };
291
+ console.log("register BackgroundCellNext");
292
+ (0, import_vuu_utils7.registerComponent)("background-next", BackgroundCell2, "cell-renderer", {
293
+ description: "Change background color of cell when value changes",
294
+ label: "Background Flash",
295
+ serverDataType: ["long", "int", "double"]
296
+ });
297
+
298
+ // src/column-list/ColumnList.tsx
299
+ var import_vuu_ui_controls = require("@vuu-ui/vuu-ui-controls");
300
+ var import_core = require("@salt-ds/core");
301
+ var import_lab = require("@salt-ds/lab");
302
+ var import_classnames4 = __toESM(require("classnames"), 1);
303
+ var import_react3 = require("react");
304
+ var import_jsx_runtime4 = require("react/jsx-runtime");
305
+ var classBase4 = "vuuColumnList";
306
+ var classBaseListItem = "vuuColumnListItem";
307
+ var ColumnListItem = ({
308
+ className: classNameProp,
309
+ item,
310
+ ...listItemProps
311
+ }) => {
312
+ var _a;
313
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
314
+ import_vuu_ui_controls.ListItem,
315
+ {
316
+ ...listItemProps,
317
+ className: (0, import_classnames4.default)(classNameProp, classBaseListItem),
318
+ "data-name": item == null ? void 0 : item.name,
319
+ children: [
320
+ (item == null ? void 0 : item.isCalculated) ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: `${classBase4}-icon`, "data-icon": "function" }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lab.Switch, { className: `${classBase4}-switch`, checked: item == null ? void 0 : item.subscribed }),
321
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: `${classBase4}-text`, children: (_a = item == null ? void 0 : item.label) != null ? _a : item == null ? void 0 : item.name }),
322
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
323
+ import_core.Checkbox,
324
+ {
325
+ className: `${classBase4}-checkBox`,
326
+ checked: (item == null ? void 0 : item.hidden) !== true,
327
+ disabled: (item == null ? void 0 : item.subscribed) !== true
328
+ }
329
+ )
330
+ ]
331
+ }
332
+ );
333
+ };
334
+ var ColumnList = ({
335
+ columnItems,
336
+ onChange,
337
+ onMoveListItem,
338
+ ...htmlAttributes
339
+ }) => {
340
+ const handleChange = (0, import_react3.useCallback)(
341
+ (evt) => {
342
+ const input = evt.target;
343
+ const listItem = input.closest(`.${classBaseListItem}`);
344
+ const {
345
+ dataset: { name: name2 }
346
+ } = listItem;
347
+ if (name2) {
348
+ const saltSwitch = input.closest(`.${classBase4}-switch`);
349
+ const saltCheckbox = input.closest(
350
+ `.${classBase4}-checkBox`
351
+ );
352
+ if (saltSwitch) {
353
+ onChange(name2, "subscribed", input.checked);
354
+ } else if (saltCheckbox) {
355
+ onChange(name2, "hidden", input.checked === false);
356
+ }
357
+ }
358
+ },
359
+ [onChange]
360
+ );
361
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { ...htmlAttributes, className: classBase4, children: [
362
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: `${classBase4}-header`, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Column Selection" }) }),
363
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: `${classBase4}-colHeadings`, children: [
364
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Column subscription" }),
365
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Visibility" })
366
+ ] }),
367
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
368
+ import_vuu_ui_controls.List,
369
+ {
370
+ ListItem: ColumnListItem,
371
+ allowDragDrop: true,
372
+ height: "100%",
373
+ onChange: handleChange,
374
+ onMoveListItem,
375
+ selectionStrategy: "none",
376
+ source: columnItems,
377
+ itemHeight: 33
378
+ }
379
+ )
380
+ ] });
381
+ };
382
+
383
+ // src/column-settings/ColumnSettingsPanel.tsx
384
+ var import_vuu_utils15 = require("@vuu-ui/vuu-utils");
385
+ var import_core5 = require("@salt-ds/core");
386
+
387
+ // src/column-formatting-settings/ColumnFormattingPanel.tsx
388
+ var import_vuu_ui_controls2 = require("@vuu-ui/vuu-ui-controls");
389
+ var import_core3 = require("@salt-ds/core");
390
+ var import_classnames5 = __toESM(require("classnames"), 1);
391
+ var import_react5 = require("react");
392
+
393
+ // src/column-formatting-settings/NumericFormattingSettings.tsx
394
+ var import_core2 = require("@salt-ds/core");
395
+ var import_lab2 = require("@salt-ds/lab");
396
+ var import_vuu_utils8 = require("@vuu-ui/vuu-utils");
397
+ var import_react4 = require("react");
398
+ var import_jsx_runtime5 = require("react/jsx-runtime");
399
+ var classBase5 = "vuuFormattingSettings";
400
+ var NumericFormattingSettings = ({
401
+ column,
402
+ onChange
403
+ }) => {
404
+ var _a;
405
+ const [formattingSettings, setFormattingSettings] = (0, import_react4.useState)(
406
+ (0, import_vuu_utils8.getTypeSettingsFromColumn)(column)
407
+ );
408
+ const handleInputKeyDown = (0, import_react4.useCallback)(
409
+ (evt) => {
410
+ if (evt.key === "Enter" || evt.key === "Tab") {
411
+ onChange(formattingSettings);
412
+ }
413
+ },
414
+ [formattingSettings, onChange]
415
+ );
416
+ const handleChangeDecimals = (0, import_react4.useCallback)(
417
+ (evt) => {
418
+ const { value } = evt.target;
419
+ const numericValue = value === "" ? void 0 : isNaN(parseInt(value)) ? void 0 : parseInt(value);
420
+ const newFormattingSettings = {
421
+ ...formattingSettings,
422
+ decimals: numericValue
423
+ };
424
+ setFormattingSettings(newFormattingSettings);
425
+ },
426
+ [formattingSettings]
427
+ );
428
+ const handleChangeAlignDecimals = (0, import_react4.useCallback)(
429
+ (evt) => {
430
+ const { checked } = evt.target;
431
+ const newFormattingSettings = {
432
+ ...formattingSettings,
433
+ alignOnDecimals: checked
434
+ };
435
+ setFormattingSettings(newFormattingSettings);
436
+ onChange(newFormattingSettings);
437
+ },
438
+ [formattingSettings, onChange]
439
+ );
440
+ const handleChangeZeroPad = (0, import_react4.useCallback)(
441
+ (evt) => {
442
+ const { checked } = evt.target;
443
+ const newFormattingSettings = {
444
+ ...formattingSettings,
445
+ zeroPad: checked
446
+ };
447
+ setFormattingSettings(newFormattingSettings);
448
+ onChange(newFormattingSettings);
449
+ },
450
+ [formattingSettings, onChange]
451
+ );
452
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: classBase5, children: [
453
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core2.FormField, { "data-field": "decimals", children: [
454
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core2.FormFieldLabel, { children: "Number of decimals" }),
455
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
456
+ import_core2.Input,
457
+ {
458
+ className: "vuuInput",
459
+ onChange: handleChangeDecimals,
460
+ onKeyDown: handleInputKeyDown,
461
+ value: (_a = formattingSettings.decimals) != null ? _a : ""
462
+ }
463
+ )
464
+ ] }),
465
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core2.FormField, { labelPlacement: "left", children: [
466
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core2.FormFieldLabel, { children: "Align on decimals" }),
467
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
468
+ import_lab2.Switch,
469
+ {
470
+ checked: formattingSettings.alignOnDecimals,
471
+ onChange: handleChangeAlignDecimals,
472
+ value: "align-decimals"
473
+ }
474
+ )
475
+ ] }),
476
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_core2.FormField, { labelPlacement: "left", children: [
477
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_core2.FormFieldLabel, { children: "Zero pad decimals" }),
478
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
479
+ import_lab2.Switch,
480
+ {
481
+ checked: formattingSettings.zeroPad,
482
+ onChange: handleChangeZeroPad,
483
+ value: "zero-pad"
484
+ }
485
+ )
486
+ ] })
487
+ ] });
488
+ };
489
+
490
+ // src/column-formatting-settings/ColumnFormattingPanel.tsx
491
+ var import_jsx_runtime6 = require("react/jsx-runtime");
492
+ var classBase6 = "vuuColumnFormattingPanel";
493
+ var itemToString = (item) => {
494
+ var _a;
495
+ return (_a = item.label) != null ? _a : item.name;
496
+ };
497
+ var ColumnFormattingPanel = ({
498
+ availableRenderers,
499
+ selectedCellRenderer,
500
+ className,
501
+ column,
502
+ onChangeFormatting,
503
+ onChangeRenderer,
504
+ ...htmlAttributes
505
+ }) => {
506
+ const content = (0, import_react5.useMemo)(() => {
507
+ switch (column.serverDataType) {
508
+ case "double":
509
+ case "int":
510
+ case "long":
511
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
512
+ NumericFormattingSettings,
513
+ {
514
+ column,
515
+ onChange: onChangeFormatting
516
+ }
517
+ );
518
+ default:
519
+ return null;
520
+ }
521
+ }, [column, onChangeFormatting]);
522
+ const { serverDataType = "string" } = column;
523
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { ...htmlAttributes, className: `vuuColumnSettingsPanel-header`, children: [
524
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { children: "Formatting" }),
525
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_core3.FormField, { children: [
526
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core3.FormFieldLabel, { children: "Renderer" }),
527
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
528
+ import_vuu_ui_controls2.Dropdown,
529
+ {
530
+ className: (0, import_classnames5.default)(`${classBase6}-renderer`),
531
+ itemToString,
532
+ onSelectionChange: onChangeRenderer,
533
+ selected: selectedCellRenderer,
534
+ source: availableRenderers,
535
+ width: "100%"
536
+ }
537
+ )
538
+ ] }),
539
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
540
+ "div",
541
+ {
542
+ className: (0, import_classnames5.default)(classBase6, className, `${classBase6}-${serverDataType}`),
543
+ children: content
544
+ }
545
+ )
546
+ ] });
547
+ };
548
+
549
+ // src/column-settings/useColumnSettings.ts
550
+ var import_vuu_utils9 = require("@vuu-ui/vuu-utils");
551
+ var import_react6 = require("react");
552
+ var integerCellRenderers = [
553
+ {
554
+ description: "Default formatter for columns with data type integer",
555
+ label: "Default Renderer (data type int, long)",
556
+ name: "default-int"
557
+ }
558
+ ];
559
+ var doubleCellRenderers = [
560
+ {
561
+ description: "Default formatter for columns with data type double",
562
+ label: "Default Renderer (data type double)",
563
+ name: "default-double"
564
+ },
565
+ ...(0, import_vuu_utils9.getRegisteredCellRenderers)("double")
566
+ ];
567
+ var stringCellRenderers = [
568
+ {
569
+ description: "Default formatter for columns with data type string",
570
+ label: "Default Renderer (data type string)",
571
+ name: "default-string"
572
+ }
573
+ ];
574
+ var getAvailableCellRenderers = (column) => {
575
+ switch (column.serverDataType) {
576
+ case "char":
577
+ case "string":
578
+ return stringCellRenderers;
579
+ case "int":
580
+ case "long":
581
+ return integerCellRenderers;
582
+ case "double":
583
+ return doubleCellRenderers;
584
+ default:
585
+ return stringCellRenderers;
586
+ }
587
+ };
588
+ var getCellRendererDescriptor = (availableRenderers, column) => {
589
+ if ((0, import_vuu_utils9.isTypeDescriptor)(column.type)) {
590
+ const { renderer } = column.type;
591
+ if ((0, import_vuu_utils9.isColumnTypeRenderer)(renderer)) {
592
+ const cellRenderer = availableRenderers.find(
593
+ (r) => r.name === renderer.name
594
+ );
595
+ if (cellRenderer) {
596
+ return cellRenderer;
597
+ }
598
+ }
599
+ }
600
+ const typedAvailableRenderers = getAvailableCellRenderers(column);
601
+ return typedAvailableRenderers[0];
602
+ };
603
+ var getFieldName = (input) => {
604
+ const saltFormField = input.closest(".saltFormField");
605
+ if (saltFormField && saltFormField.dataset.field) {
606
+ const {
607
+ dataset: { field }
608
+ } = saltFormField;
609
+ return field;
610
+ } else {
611
+ throw Error("named form field not found");
612
+ }
613
+ };
614
+ var getColumn = (columns, column) => {
615
+ if (column.name === "::") {
616
+ return column;
617
+ } else {
618
+ const col = columns.find((col2) => col2.name === column.name);
619
+ if (col) {
620
+ return col;
621
+ }
622
+ throw Error(`columns does not contain column ${name}`);
623
+ }
624
+ };
625
+ var replaceColumn = (tableConfig, column) => ({
626
+ ...tableConfig,
627
+ columns: tableConfig.columns.map(
628
+ (col) => col.name === column.name ? column : col
629
+ )
630
+ });
631
+ var useColumnSettings = ({
632
+ column: columnProp,
633
+ onConfigChange,
634
+ onCreateCalculatedColumn,
635
+ tableConfig
636
+ }) => {
637
+ const [column, setColumn] = (0, import_react6.useState)(
638
+ getColumn(tableConfig.columns, columnProp)
639
+ );
640
+ const availableRenderers = (0, import_react6.useMemo)(() => {
641
+ return getAvailableCellRenderers(column);
642
+ }, [column]);
643
+ const selectedCellRendererRef = (0, import_react6.useRef)(
644
+ getCellRendererDescriptor(availableRenderers, column)
645
+ );
646
+ const handleInputCommit = (0, import_react6.useCallback)(() => {
647
+ onConfigChange(replaceColumn(tableConfig, column));
648
+ }, [column, onConfigChange, tableConfig]);
649
+ const handleChange = (0, import_react6.useCallback)(
650
+ (evt) => {
651
+ const input = evt.target;
652
+ const fieldName = getFieldName(input);
653
+ const { value } = input;
654
+ switch (fieldName) {
655
+ case "column-label":
656
+ setColumn((state) => ({ ...state, label: value }));
657
+ break;
658
+ case "column-name":
659
+ setColumn((state) => (0, import_vuu_utils9.setCalculatedColumnName)(state, value));
660
+ break;
661
+ case "column-width":
662
+ setColumn((state) => ({ ...state, width: parseInt(value) }));
663
+ break;
664
+ case "column-alignment":
665
+ if ((0, import_vuu_utils9.isValidColumnAlignment)(value)) {
666
+ const newColumn = {
667
+ ...column,
668
+ align: value || void 0
669
+ };
670
+ setColumn(newColumn);
671
+ onConfigChange(replaceColumn(tableConfig, newColumn));
672
+ }
673
+ break;
674
+ case "column-pin":
675
+ if ((0, import_vuu_utils9.isValidPinLocation)(value)) {
676
+ const newColumn = {
677
+ ...column,
678
+ pin: value || void 0
679
+ };
680
+ setColumn(newColumn);
681
+ onConfigChange(replaceColumn(tableConfig, newColumn));
682
+ break;
683
+ }
684
+ }
685
+ },
686
+ [column, onConfigChange, tableConfig]
687
+ );
688
+ const handleChangeRenderer = (0, import_react6.useCallback)(
689
+ (evt, cellRenderer) => {
690
+ if (cellRenderer) {
691
+ const newColumn = (0, import_vuu_utils9.updateColumnRenderer)(
692
+ column,
693
+ cellRenderer
694
+ );
695
+ selectedCellRendererRef.current = cellRenderer;
696
+ setColumn(newColumn);
697
+ onConfigChange(replaceColumn(tableConfig, newColumn));
698
+ }
699
+ },
700
+ [column, onConfigChange, tableConfig]
701
+ );
702
+ const handleChangeFormatting = (0, import_react6.useCallback)(
703
+ (formatting) => {
704
+ const newColumn = (0, import_vuu_utils9.updateColumnType)(column, formatting);
705
+ setColumn(newColumn);
706
+ onConfigChange(replaceColumn(tableConfig, newColumn));
707
+ },
708
+ [column, onConfigChange, tableConfig]
709
+ );
710
+ const navigateColumn = (0, import_react6.useCallback)(
711
+ ({ moveBy }) => {
712
+ const { columns } = tableConfig;
713
+ const index = columns.indexOf(column) + moveBy;
714
+ const newColumn = columns[index];
715
+ if (newColumn) {
716
+ selectedCellRendererRef.current = getCellRendererDescriptor(
717
+ availableRenderers,
718
+ newColumn
719
+ );
720
+ setColumn(newColumn);
721
+ }
722
+ },
723
+ [availableRenderers, column, tableConfig]
724
+ );
725
+ const navigateNextColumn = (0, import_react6.useCallback)(() => {
726
+ navigateColumn({ moveBy: 1 });
727
+ }, [navigateColumn]);
728
+ const navigatePrevColumn = (0, import_react6.useCallback)(() => {
729
+ navigateColumn({ moveBy: -1 });
730
+ }, [navigateColumn]);
731
+ const handleSaveCalculatedColumn = (0, import_react6.useCallback)(
732
+ (calculatedColumn) => {
733
+ onCreateCalculatedColumn({
734
+ ...column,
735
+ ...calculatedColumn
736
+ });
737
+ },
738
+ [column, onCreateCalculatedColumn]
739
+ );
740
+ return {
741
+ availableRenderers,
742
+ selectedCellRenderer: selectedCellRendererRef.current,
743
+ column,
744
+ navigateNextColumn,
745
+ navigatePrevColumn,
746
+ onChange: handleChange,
747
+ onChangeFormatting: handleChangeFormatting,
748
+ onChangeRenderer: handleChangeRenderer,
749
+ onInputCommit: handleInputCommit,
750
+ onSave: handleSaveCalculatedColumn
751
+ };
752
+ };
753
+
754
+ // src/column-expression-panel/ColumnExpressionPanel.tsx
755
+ var import_vuu_ui_controls3 = require("@vuu-ui/vuu-ui-controls");
756
+ var import_vuu_utils14 = require("@vuu-ui/vuu-utils");
757
+ var import_core4 = require("@salt-ds/core");
758
+ var import_react11 = require("react");
759
+
760
+ // src/column-expression-input/useColumnExpressionEditor.ts
761
+ var import_vuu_codemirror5 = require("@vuu-ui/vuu-codemirror");
762
+ var import_vuu_utils10 = require("@vuu-ui/vuu-utils");
763
+ var import_react8 = require("react");
764
+
765
+ // src/column-expression-input/column-language-parser/ColumnExpressionLanguage.ts
766
+ var import_vuu_codemirror = require("@vuu-ui/vuu-codemirror");
767
+
768
+ // src/column-expression-input/column-language-parser/generated/column-parser.js
769
+ var import_lr = require("@lezer/lr");
770
+ var parser = import_lr.LRParser.deserialize({
771
+ version: 14,
772
+ states: "&fOVQPOOO!SQPO'#C^OVQPO'#CcQ!pQPOOO#OQPO'#CkO#TQPO'#CrOOQO'#Cy'#CyO#YQPO,58}OVQPO,59QOVQPO,59QOVQPO,59VOVQPO'#CtOOQO,59^,59^OOQO1G.i1G.iOOQO1G.l1G.lO#kQPO1G.lO$fQPO'#CmO%WQQO1G.qOOQO'#C{'#C{O%cQPO,59`OOQO'#Cn'#CnO%wQPO,59XOVQPO,59ZOVQPO,59[OVQPO7+$]OVQPO'#CuO&`QPO1G.zOOQO1G.z1G.zO&hQQO'#C^O&rQQO1G.sO'ZQQO1G.uOOQO1G.v1G.vO'fQPO<<GwO'wQPO,59aOOQO-E6s-E6sOOQO7+$f7+$fOVQPOAN=cO(]QQO1G.lO(tQPOG22}OOQOLD(iLD(iO%wQPO,59QO%wQPO,59Q",
773
+ stateData: ")[~OlOS~ORUOSUOTUOUUOWQO`SOnPO~OWgXZQX[QX]QX^QXeQX~OjQXXQXpQXqQXrQXsQXtQXuQX~PnOZWO[WO]XO^XO~OWYO~OWZO~OX]OZWO[WO]XO^XO~OZWO[WO]Yi^YijYiXYipYiqYirYisYitYiuYieYi~OZWO[WO]XO^XOpdOqdOrdOsdOtdOudO~OehOvfOwgO~OXkOZWO[WO]XO^XOeiO~ORUOSUOTUOUUOWQO`SOnlO~OXsOeiO~OvQXwQX~PnOZxO[xO]yO^yOeaivaiwai~OwgOecivci~OZWO[WO]XO^XOetO~OZWO[WO]XO^XOXiaeia~OZxO[xO]Yi^YieYivYiwYi~OXwOZWO[WO]XO^XO~O`UTn~",
774
+ goto: "#spPPqPPPPqPPqPPPPqP!R!W!R!RPq!Z!k!nPPP!tP#jmUOQWXYZefghitxyVbYfgRe`mTOQWXYZefghitxyR[TQjcRrjQROQVQS^WxQ_XU`YfgQcZQmeQphQqiQuyRvtQaYQnfRog",
775
+ 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",
776
+ maxTerm: 39,
777
+ skippedNodes: [0],
778
+ repeatNodeCount: 1,
779
+ 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",
780
+ tokenizers: [0, 1],
781
+ topRules: { "ColumnDefinitionExpression": [0, 1] },
782
+ tokenPrec: 375
783
+ });
784
+
785
+ // src/column-expression-input/column-language-parser/ColumnExpressionLanguage.ts
786
+ var columnExpressionLanguage = import_vuu_codemirror.LRLanguage.define({
787
+ name: "VuuColumnExpression",
788
+ parser: parser.configure({
789
+ props: [
790
+ (0, import_vuu_codemirror.styleTags)({
791
+ Function: import_vuu_codemirror.tags.variableName,
792
+ String: import_vuu_codemirror.tags.string,
793
+ Or: import_vuu_codemirror.tags.emphasis,
794
+ Operator: import_vuu_codemirror.tags.operator
795
+ })
796
+ ]
797
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
798
+ })
799
+ });
800
+ var columnExpressionLanguageSupport = () => {
801
+ return new import_vuu_codemirror.LanguageSupport(
802
+ columnExpressionLanguage
803
+ /*, [exampleCompletion]*/
804
+ );
805
+ };
806
+
807
+ // src/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.ts
808
+ var LiteralExpressionImpl = class {
809
+ constructor(value) {
810
+ this.value = value;
811
+ switch (typeof value) {
812
+ case "boolean":
813
+ this.type = "booleanLiteralExpression";
814
+ break;
815
+ case "number":
816
+ this.type = "numericLiteralExpression";
817
+ break;
818
+ default:
819
+ this.type = "stringLiteralExpression";
820
+ }
821
+ }
822
+ toJSON() {
823
+ return {
824
+ type: this.type,
825
+ value: this.value
826
+ };
827
+ }
828
+ };
829
+ var ColumnExpressionImpl = class {
830
+ constructor(columnName) {
831
+ this.type = "colExpression";
832
+ this.column = columnName;
833
+ }
834
+ toJSON() {
835
+ return {
836
+ type: this.type,
837
+ column: this.column
838
+ };
839
+ }
840
+ };
841
+ var _expressions, _op;
842
+ var ArithmeticExpressionImpl = class {
843
+ constructor(op = "unknown") {
844
+ __privateAdd(this, _expressions, [
845
+ { type: "unknown" },
846
+ { type: "unknown" }
847
+ ]);
848
+ __privateAdd(this, _op, void 0);
849
+ this.type = "arithmeticExpression";
850
+ __privateSet(this, _op, op);
851
+ }
852
+ get op() {
853
+ return __privateGet(this, _op);
854
+ }
855
+ set op(op) {
856
+ __privateSet(this, _op, op);
857
+ }
858
+ get expressions() {
859
+ return __privateGet(this, _expressions);
860
+ }
861
+ toJSON() {
862
+ return {
863
+ type: this.type,
864
+ op: __privateGet(this, _op),
865
+ expressions: __privateGet(this, _expressions)
866
+ };
867
+ }
868
+ };
869
+ _expressions = new WeakMap();
870
+ _op = new WeakMap();
871
+ var _expressions2;
872
+ var CallExpressionImpl = class {
873
+ constructor(functionName) {
874
+ __privateAdd(this, _expressions2, []);
875
+ this.type = "callExpression";
876
+ this.functionName = functionName;
877
+ }
878
+ get expressions() {
879
+ return __privateGet(this, _expressions2);
880
+ }
881
+ get arguments() {
882
+ return __privateGet(this, _expressions2);
883
+ }
884
+ toJSON() {
885
+ return {
886
+ type: this.type,
887
+ functionName: this.functionName,
888
+ arguments: __privateGet(this, _expressions2).map((e) => {
889
+ var _a;
890
+ return (_a = e.toJSON) == null ? void 0 : _a.call(e);
891
+ })
892
+ };
893
+ }
894
+ };
895
+ _expressions2 = new WeakMap();
896
+ var _expressions3, _op2;
897
+ var RelationalExpressionImpl = class {
898
+ constructor() {
899
+ __privateAdd(this, _expressions3, [
900
+ { type: "unknown" },
901
+ { type: "unknown" }
902
+ ]);
903
+ __privateAdd(this, _op2, "unknown");
904
+ this.type = "relationalExpression";
905
+ }
906
+ get op() {
907
+ return __privateGet(this, _op2);
908
+ }
909
+ set op(op) {
910
+ __privateSet(this, _op2, op);
911
+ }
912
+ get expressions() {
913
+ return __privateGet(this, _expressions3);
914
+ }
915
+ toJSON() {
916
+ return {
917
+ type: this.type,
918
+ op: __privateGet(this, _op2),
919
+ expressions: __privateGet(this, _expressions3)
920
+ };
921
+ }
922
+ };
923
+ _expressions3 = new WeakMap();
924
+ _op2 = new WeakMap();
925
+ var _expressions4, _op3;
926
+ var BooleanConditionImp = class {
927
+ constructor(booleanOperator) {
928
+ __privateAdd(this, _expressions4, [
929
+ { type: "unknown" },
930
+ { type: "unknown" }
931
+ ]);
932
+ __privateAdd(this, _op3, void 0);
933
+ this.type = "booleanCondition";
934
+ __privateSet(this, _op3, booleanOperator);
935
+ }
936
+ get op() {
937
+ return __privateGet(this, _op3);
938
+ }
939
+ get expressions() {
940
+ return __privateGet(this, _expressions4);
941
+ }
942
+ toJSON() {
943
+ return {
944
+ type: this.type,
945
+ op: __privateGet(this, _op3),
946
+ expressions: __privateGet(this, _expressions4).map((e) => {
947
+ var _a;
948
+ return (_a = e.toJSON) == null ? void 0 : _a.call(e);
949
+ })
950
+ };
951
+ }
952
+ };
953
+ _expressions4 = new WeakMap();
954
+ _op3 = new WeakMap();
955
+ var _expressions5;
956
+ var ConditionalExpressionImpl = class {
957
+ constructor(booleanOperator) {
958
+ __privateAdd(this, _expressions5, void 0);
959
+ this.type = "conditionalExpression";
960
+ __privateSet(this, _expressions5, [
961
+ booleanOperator ? new BooleanConditionImp(booleanOperator) : new RelationalExpressionImpl(),
962
+ { type: "unknown" },
963
+ { type: "unknown" }
964
+ ]);
965
+ }
966
+ get expressions() {
967
+ return __privateGet(this, _expressions5);
968
+ }
969
+ get condition() {
970
+ return __privateGet(this, _expressions5)[0];
971
+ }
972
+ get truthyExpression() {
973
+ return __privateGet(this, _expressions5)[1];
974
+ }
975
+ set truthyExpression(expression) {
976
+ __privateGet(this, _expressions5)[1] = expression;
977
+ }
978
+ get falsyExpression() {
979
+ return __privateGet(this, _expressions5)[2];
980
+ }
981
+ set falsyExpression(expression) {
982
+ __privateGet(this, _expressions5)[2] = expression;
983
+ }
984
+ toJSON() {
985
+ var _a, _b, _c, _d, _e;
986
+ return {
987
+ type: this.type,
988
+ condition: (_b = (_a = this.condition).toJSON) == null ? void 0 : _b.call(_a),
989
+ truthyExpression: this.truthyExpression,
990
+ falsyExpression: (_e = (_d = (_c = this.falsyExpression) == null ? void 0 : _c.toJSON) == null ? void 0 : _d.call(_c)) != null ? _e : this.falsyExpression
991
+ };
992
+ }
993
+ };
994
+ _expressions5 = new WeakMap();
995
+ var isUnknown = (e) => e.type === "unknown";
996
+ var isArithmeticExpression = (expression) => expression.type === "arithmeticExpression";
997
+ var isCallExpression = (expression) => expression.type === "callExpression";
998
+ var isConditionalExpression = (expression) => expression.type === "conditionalExpression";
999
+ var isCondition = (expression) => expression.type === "relationalExpression" || expression.type === "booleanCondition";
1000
+ var isBooleanCondition = (expression) => expression.type === "booleanCondition";
1001
+ var isRelationalExpression = (expression) => (expression == null ? void 0 : expression.type) === "relationalExpression";
1002
+ var firstIncompleteExpression = (expression) => {
1003
+ if (isUnknown(expression)) {
1004
+ return expression;
1005
+ } else if (isRelationalExpression(expression)) {
1006
+ const [operand1, operand2] = expression.expressions;
1007
+ if (expressionIsIncomplete(operand1)) {
1008
+ return firstIncompleteExpression(operand1);
1009
+ } else if (expression.op === "unknown") {
1010
+ return expression;
1011
+ } else if (expressionIsIncomplete(operand2)) {
1012
+ return firstIncompleteExpression(operand2);
1013
+ }
1014
+ } else if (isCondition(expression)) {
1015
+ const { expressions = [] } = expression;
1016
+ for (const e of expressions) {
1017
+ if (expressionIsIncomplete(e)) {
1018
+ return firstIncompleteExpression(e);
1019
+ }
1020
+ }
1021
+ } else if (isConditionalExpression(expression)) {
1022
+ const { condition, truthyExpression, falsyExpression } = expression;
1023
+ if (expressionIsIncomplete(condition)) {
1024
+ return firstIncompleteExpression(condition);
1025
+ } else if (expressionIsIncomplete(truthyExpression)) {
1026
+ return firstIncompleteExpression(truthyExpression);
1027
+ } else if (expressionIsIncomplete(falsyExpression)) {
1028
+ return firstIncompleteExpression(falsyExpression);
1029
+ }
1030
+ } else if (isArithmeticExpression(expression)) {
1031
+ const { expressions = [] } = expression;
1032
+ for (const e of expressions) {
1033
+ if (expressionIsIncomplete(e)) {
1034
+ return firstIncompleteExpression(e);
1035
+ }
1036
+ }
1037
+ }
1038
+ };
1039
+ var replaceUnknownExpression = (incompleteExpression, unknownExpression, expression) => {
1040
+ const { expressions = [] } = incompleteExpression;
1041
+ if (expressions.includes(unknownExpression)) {
1042
+ const pos = expressions.indexOf(unknownExpression);
1043
+ expressions.splice(pos, 1, expression);
1044
+ return true;
1045
+ } else {
1046
+ for (const e of expressions) {
1047
+ if (replaceUnknownExpression(e, unknownExpression, expression)) {
1048
+ return true;
1049
+ }
1050
+ }
1051
+ }
1052
+ return false;
1053
+ };
1054
+ var expressionIsIncomplete = (expression) => {
1055
+ if (isUnknown(expression)) {
1056
+ return true;
1057
+ } else if (isConditionalExpression(expression)) {
1058
+ return expressionIsIncomplete(expression.condition) || expressionIsIncomplete(expression.truthyExpression) || expressionIsIncomplete(expression.falsyExpression);
1059
+ } else if (isRelationalExpression(expression) || isBooleanCondition(expression)) {
1060
+ return expression.op === void 0 || expression.expressions.some((e) => expressionIsIncomplete(e));
1061
+ }
1062
+ return false;
1063
+ };
1064
+ var addExpression = (expression, subExpression) => {
1065
+ const targetExpression = firstIncompleteExpression(expression);
1066
+ if (targetExpression) {
1067
+ if (targetExpression.expressions) {
1068
+ targetExpression.expressions.push(subExpression);
1069
+ } else {
1070
+ console.warn("don't know how to treat targetExpression");
1071
+ }
1072
+ } else {
1073
+ console.error("no target expression found");
1074
+ }
1075
+ };
1076
+ var _expression, _callStack;
1077
+ var ColumnExpression = class {
1078
+ constructor() {
1079
+ __privateAdd(this, _expression, void 0);
1080
+ __privateAdd(this, _callStack, []);
1081
+ }
1082
+ setCondition(booleanOperator) {
1083
+ if (__privateGet(this, _expression) === void 0) {
1084
+ this.addExpression(new ConditionalExpressionImpl(booleanOperator));
1085
+ } else if (isConditionalExpression(__privateGet(this, _expression))) {
1086
+ if (expressionIsIncomplete(__privateGet(this, _expression).condition)) {
1087
+ const condition = booleanOperator ? new BooleanConditionImp(booleanOperator) : new RelationalExpressionImpl();
1088
+ this.addExpression(condition);
1089
+ } else if (isUnknown(__privateGet(this, _expression).truthyExpression)) {
1090
+ __privateGet(this, _expression).truthyExpression = new ConditionalExpressionImpl(
1091
+ booleanOperator
1092
+ );
1093
+ } else if (expressionIsIncomplete(__privateGet(this, _expression).truthyExpression)) {
1094
+ const condition = booleanOperator ? new BooleanConditionImp(booleanOperator) : new RelationalExpressionImpl();
1095
+ this.addExpression(condition);
1096
+ } else if (isUnknown(__privateGet(this, _expression).falsyExpression)) {
1097
+ __privateGet(this, _expression).falsyExpression = new ConditionalExpressionImpl(
1098
+ booleanOperator
1099
+ );
1100
+ } else if (expressionIsIncomplete(__privateGet(this, _expression).falsyExpression)) {
1101
+ const condition = booleanOperator ? new BooleanConditionImp(booleanOperator) : new RelationalExpressionImpl();
1102
+ this.addExpression(condition);
1103
+ }
1104
+ } else {
1105
+ console.error("setCondition called unexpectedly");
1106
+ }
1107
+ }
1108
+ addExpression(expression) {
1109
+ if (__privateGet(this, _callStack).length > 0) {
1110
+ const currentCallExpression = __privateGet(this, _callStack).at(-1);
1111
+ currentCallExpression == null ? void 0 : currentCallExpression.arguments.push(expression);
1112
+ } else if (__privateGet(this, _expression) === void 0) {
1113
+ __privateSet(this, _expression, expression);
1114
+ } else if (isArithmeticExpression(__privateGet(this, _expression))) {
1115
+ const targetExpression = firstIncompleteExpression(__privateGet(this, _expression));
1116
+ if (targetExpression && isUnknown(targetExpression)) {
1117
+ replaceUnknownExpression(
1118
+ __privateGet(this, _expression),
1119
+ targetExpression,
1120
+ expression
1121
+ );
1122
+ }
1123
+ } else if (isConditionalExpression(__privateGet(this, _expression))) {
1124
+ if (expressionIsIncomplete(__privateGet(this, _expression))) {
1125
+ const targetExpression = firstIncompleteExpression(__privateGet(this, _expression));
1126
+ if (targetExpression && isUnknown(targetExpression)) {
1127
+ replaceUnknownExpression(
1128
+ __privateGet(this, _expression),
1129
+ targetExpression,
1130
+ expression
1131
+ );
1132
+ } else if (targetExpression) {
1133
+ addExpression(targetExpression, expression);
1134
+ }
1135
+ }
1136
+ }
1137
+ }
1138
+ setFunction(functionName) {
1139
+ const callExpression = new CallExpressionImpl(functionName);
1140
+ this.addExpression(callExpression);
1141
+ __privateGet(this, _callStack).push(callExpression);
1142
+ }
1143
+ setColumn(columnName) {
1144
+ this.addExpression(new ColumnExpressionImpl(columnName));
1145
+ }
1146
+ setArithmeticOp(value) {
1147
+ const op = value;
1148
+ const expression = __privateGet(this, _expression);
1149
+ if (isArithmeticExpression(expression)) {
1150
+ expression.op = op;
1151
+ }
1152
+ }
1153
+ setRelationalOperator(value) {
1154
+ const op = value;
1155
+ if (__privateGet(this, _expression) && isConditionalExpression(__privateGet(this, _expression))) {
1156
+ const targetExpression = firstIncompleteExpression(__privateGet(this, _expression));
1157
+ if (isRelationalExpression(targetExpression)) {
1158
+ targetExpression.op = op;
1159
+ } else {
1160
+ console.error(`no target expression found (op = ${value})`);
1161
+ }
1162
+ }
1163
+ }
1164
+ setValue(value) {
1165
+ const literalExpression = new LiteralExpressionImpl(value);
1166
+ if (__privateGet(this, _expression) === void 0) {
1167
+ __privateSet(this, _expression, literalExpression);
1168
+ } else if (isArithmeticExpression(__privateGet(this, _expression))) {
1169
+ this.addExpression(literalExpression);
1170
+ } else if (isCallExpression(__privateGet(this, _expression))) {
1171
+ __privateGet(this, _expression).arguments.push(literalExpression);
1172
+ } else if (isConditionalExpression(__privateGet(this, _expression))) {
1173
+ if (expressionIsIncomplete(__privateGet(this, _expression))) {
1174
+ const targetExpression = firstIncompleteExpression(__privateGet(this, _expression));
1175
+ if (targetExpression && isUnknown(targetExpression)) {
1176
+ replaceUnknownExpression(
1177
+ __privateGet(this, _expression),
1178
+ targetExpression,
1179
+ literalExpression
1180
+ );
1181
+ } else if (targetExpression) {
1182
+ addExpression(targetExpression, literalExpression);
1183
+ }
1184
+ } else {
1185
+ console.log("what do we do with value, in a complete expression");
1186
+ }
1187
+ }
1188
+ }
1189
+ closeBrace() {
1190
+ __privateGet(this, _callStack).pop();
1191
+ }
1192
+ get expression() {
1193
+ return __privateGet(this, _expression);
1194
+ }
1195
+ toJSON() {
1196
+ var _a;
1197
+ return (_a = __privateGet(this, _expression)) == null ? void 0 : _a.toJSON();
1198
+ }
1199
+ };
1200
+ _expression = new WeakMap();
1201
+ _callStack = new WeakMap();
1202
+ var walkTree = (tree, source) => {
1203
+ const columnExpression = new ColumnExpression();
1204
+ const cursor = tree.cursor();
1205
+ do {
1206
+ const { name: name2, from, to } = cursor;
1207
+ switch (name2) {
1208
+ case "AndCondition":
1209
+ columnExpression.setCondition("and");
1210
+ break;
1211
+ case "OrCondition":
1212
+ columnExpression.setCondition("or");
1213
+ break;
1214
+ case "RelationalExpression":
1215
+ columnExpression.setCondition();
1216
+ break;
1217
+ case "ArithmeticExpression":
1218
+ columnExpression.addExpression(new ArithmeticExpressionImpl());
1219
+ break;
1220
+ case "Column":
1221
+ {
1222
+ const columnName = source.substring(from, to);
1223
+ columnExpression.setColumn(columnName);
1224
+ }
1225
+ break;
1226
+ case "Function":
1227
+ {
1228
+ const functionName = source.substring(from, to);
1229
+ columnExpression.setFunction(functionName);
1230
+ }
1231
+ break;
1232
+ case "Times":
1233
+ case "Divide":
1234
+ case "Plus":
1235
+ case "Minus":
1236
+ {
1237
+ const op = source.substring(from, to);
1238
+ columnExpression.setArithmeticOp(op);
1239
+ }
1240
+ break;
1241
+ case "RelationalOperator":
1242
+ {
1243
+ const op = source.substring(from, to);
1244
+ columnExpression.setRelationalOperator(op);
1245
+ }
1246
+ break;
1247
+ case "False":
1248
+ case "True":
1249
+ {
1250
+ const value = source.substring(from, to);
1251
+ columnExpression.setValue(value === "true" ? true : false);
1252
+ }
1253
+ break;
1254
+ case "String":
1255
+ columnExpression.setValue(source.substring(from + 1, to - 1));
1256
+ break;
1257
+ case "Number":
1258
+ columnExpression.setValue(parseFloat(source.substring(from, to)));
1259
+ break;
1260
+ case "CloseBrace":
1261
+ columnExpression.closeBrace();
1262
+ break;
1263
+ default:
1264
+ }
1265
+ } while (cursor.next());
1266
+ return columnExpression.toJSON();
1267
+ };
1268
+
1269
+ // src/column-expression-input/column-language-parser/column-expression-parse-utils.ts
1270
+ var strictParser = parser.configure({ strict: true });
1271
+ var RelationalOperands = ["Number", "String"];
1272
+ var ColumnNamedTerms = [
1273
+ ...RelationalOperands,
1274
+ "AndCondition",
1275
+ "ArithmeticExpression",
1276
+ "BooleanOperator",
1277
+ "RelationalOperatorOperator",
1278
+ "CallExpression",
1279
+ "CloseBrace",
1280
+ "Column",
1281
+ "Comma",
1282
+ "ConditionalExpression",
1283
+ "Divide",
1284
+ "Equal",
1285
+ "If",
1286
+ "Minus",
1287
+ "OpenBrace",
1288
+ "OrCondition",
1289
+ "ParenthesizedExpression",
1290
+ "Plus",
1291
+ "RelationalExpression",
1292
+ "RelationalOperator",
1293
+ "Times"
1294
+ ];
1295
+ var isCompleteExpression = (src) => {
1296
+ try {
1297
+ strictParser.parse(src);
1298
+ return true;
1299
+ } catch (err) {
1300
+ return false;
1301
+ }
1302
+ };
1303
+ var lastNamedChild = (node) => {
1304
+ let { lastChild } = node;
1305
+ while (lastChild && !ColumnNamedTerms.includes(lastChild.name)) {
1306
+ lastChild = lastChild.prevSibling;
1307
+ console.log(lastChild == null ? void 0 : lastChild.name);
1308
+ }
1309
+ return lastChild;
1310
+ };
1311
+ var isCompleteRelationalExpression = (node) => {
1312
+ if ((node == null ? void 0 : node.name) === "RelationalExpression") {
1313
+ const { firstChild } = node;
1314
+ const lastChild = lastNamedChild(node);
1315
+ if ((firstChild == null ? void 0 : firstChild.name) === "Column" && typeof (lastChild == null ? void 0 : lastChild.name) === "string" && RelationalOperands.includes(lastChild.name)) {
1316
+ return true;
1317
+ }
1318
+ }
1319
+ return false;
1320
+ };
1321
+
1322
+ // src/column-expression-input/highlighting.ts
1323
+ var import_vuu_codemirror2 = require("@vuu-ui/vuu-codemirror");
1324
+ var myHighlightStyle = import_vuu_codemirror2.HighlightStyle.define([
1325
+ { tag: import_vuu_codemirror2.tags.variableName, color: "var(--vuuFilterEditor-variableColor)" },
1326
+ { tag: import_vuu_codemirror2.tags.comment, color: "green", fontStyle: "italic" }
1327
+ ]);
1328
+ var vuuHighlighting = (0, import_vuu_codemirror2.syntaxHighlighting)(myHighlightStyle);
1329
+
1330
+ // src/column-expression-input/theme.ts
1331
+ var import_vuu_codemirror3 = require("@vuu-ui/vuu-codemirror");
1332
+ var vuuTheme = import_vuu_codemirror3.EditorView.theme(
1333
+ {
1334
+ "&": {
1335
+ border: "solid 1px var(--salt-container-primary-borderColor)",
1336
+ color: "var(--vuuFilterEditor-color)",
1337
+ backgroundColor: "var(--vuuFilterEditor-background)"
1338
+ },
1339
+ ".cm-content": {
1340
+ caretColor: "var(--vuuFilterEditor-cursorColor)"
1341
+ },
1342
+ "&.cm-focused .cm-cursor": {
1343
+ borderLeftColor: "var(--vuuFilterEditor-cursorColor)"
1344
+ },
1345
+ "&.cm-focused .cm-selectionBackground, ::selection": {
1346
+ backgroundColor: "var(--vuuFilterEditor-selectionBackground)"
1347
+ },
1348
+ ".cm-selectionBackground, ::selection": {
1349
+ backgroundColor: "var(--vuuFilterEditor-selectionBackground)"
1350
+ },
1351
+ ".cm-scroller": {
1352
+ fontFamily: "var(--vuuFilterEditor-fontFamily)"
1353
+ },
1354
+ ".cm-tooltip": {
1355
+ background: "var(--vuuFilterEditor-tooltipBackground)",
1356
+ border: "var(--vuuFilterEditor-tooltipBorder)",
1357
+ boxShadow: "var(--vuuFilterEditor-tooltipElevation)",
1358
+ "&.cm-tooltip-autocomplete > ul": {
1359
+ fontFamily: "var(--vuuFilterEditor-fontFamily)",
1360
+ fontSize: "var(--vuuFilterEditor-fontSize)",
1361
+ maxHeight: "240px"
1362
+ },
1363
+ "&.cm-tooltip-autocomplete > ul > li": {
1364
+ height: "var(--vuuFilterEditor-suggestion-height)",
1365
+ padding: "0 3px",
1366
+ lineHeight: "var(--vuuFilterEditor-suggestion-height)"
1367
+ },
1368
+ "&.cm-tooltip-autocomplete li[aria-selected]": {
1369
+ background: "var(--vuuFilterEditor-suggestion-selectedBackground)",
1370
+ color: "var(--vuuFilterEditor-suggestion-selectedColor)"
1371
+ },
1372
+ "&.cm-tooltip-autocomplete li .cm-completionDetail": {
1373
+ color: "var(--vuuFilterEditor-suggestion-detailColor)"
1374
+ }
1375
+ }
1376
+ },
1377
+ { dark: false }
1378
+ );
1379
+
1380
+ // src/column-expression-input/useColumnAutoComplete.ts
1381
+ var import_vuu_codemirror4 = require("@vuu-ui/vuu-codemirror");
1382
+ var import_react7 = require("react");
1383
+ var applyPrefix = (completions, prefix) => prefix ? completions.map((completion) => {
1384
+ var _a;
1385
+ return {
1386
+ ...completion,
1387
+ apply: typeof completion.apply === "function" ? completion.apply : `${prefix}${(_a = completion.apply) != null ? _a : completion.label}`
1388
+ };
1389
+ }) : completions;
1390
+ var isOperator = (node) => node === void 0 ? false : ["Times", "Divide", "Plus", "Minus"].includes(node.name);
1391
+ var completionDone = (onSubmit) => ({
1392
+ apply: () => {
1393
+ onSubmit == null ? void 0 : onSubmit();
1394
+ },
1395
+ label: "Done",
1396
+ boost: 10
1397
+ });
1398
+ var getLastChild = (node, context) => {
1399
+ var _a;
1400
+ let { lastChild: childNode } = node;
1401
+ const { pos } = context;
1402
+ while (childNode) {
1403
+ const isBeforeCursor = childNode.from < pos;
1404
+ if (isBeforeCursor && ColumnNamedTerms.includes(childNode.name)) {
1405
+ if (childNode.name === "ParenthesizedExpression") {
1406
+ const expression = (_a = childNode.firstChild) == null ? void 0 : _a.nextSibling;
1407
+ if (expression) {
1408
+ childNode = expression;
1409
+ }
1410
+ }
1411
+ return childNode;
1412
+ } else {
1413
+ childNode = childNode.prevSibling;
1414
+ }
1415
+ }
1416
+ };
1417
+ var getFunctionName = (node, state) => {
1418
+ var _a;
1419
+ if (node.name === "ArgList") {
1420
+ const functionNode = node.prevSibling;
1421
+ if (functionNode) {
1422
+ return (0, import_vuu_codemirror4.getValue)(functionNode, state);
1423
+ }
1424
+ } else if (node.name === "OpenBrace") {
1425
+ const maybeFunction = (_a = node.parent) == null ? void 0 : _a.prevSibling;
1426
+ if ((maybeFunction == null ? void 0 : maybeFunction.name) === "Function") {
1427
+ return (0, import_vuu_codemirror4.getValue)(maybeFunction, state);
1428
+ }
1429
+ }
1430
+ };
1431
+ var getRelationalOperator = (node, state) => {
1432
+ if (node.name === "RelationalExpression") {
1433
+ const lastNode = lastNamedChild(node);
1434
+ if ((lastNode == null ? void 0 : lastNode.name) === "RelationalOperator") {
1435
+ return (0, import_vuu_codemirror4.getValue)(lastNode, state);
1436
+ }
1437
+ } else {
1438
+ const prevNode = node.prevSibling;
1439
+ if ((prevNode == null ? void 0 : prevNode.name) === "RelationalOperator") {
1440
+ return (0, import_vuu_codemirror4.getValue)(prevNode, state);
1441
+ }
1442
+ }
1443
+ };
1444
+ var getColumnName = (node, state) => {
1445
+ var _a;
1446
+ if (node.name === "RelationalExpression") {
1447
+ if (((_a = node.firstChild) == null ? void 0 : _a.name) === "Column") {
1448
+ return (0, import_vuu_codemirror4.getValue)(node.firstChild, state);
1449
+ }
1450
+ } else {
1451
+ const prevNode = node.prevSibling;
1452
+ if ((prevNode == null ? void 0 : prevNode.name) === "Column") {
1453
+ return (0, import_vuu_codemirror4.getValue)(prevNode, state);
1454
+ } else if ((prevNode == null ? void 0 : prevNode.name) === "RelationalOperator") {
1455
+ return getColumnName(prevNode, state);
1456
+ }
1457
+ }
1458
+ };
1459
+ var makeSuggestions = async (context, suggestionProvider, suggestionType, optionalArgs = {}) => {
1460
+ const options = await suggestionProvider.getSuggestions(
1461
+ suggestionType,
1462
+ optionalArgs
1463
+ );
1464
+ const { startsWith = "" } = optionalArgs;
1465
+ return { from: context.pos - startsWith.length, options };
1466
+ };
1467
+ var handleConditionalExpression = (node, context, suggestionProvider, maybeComplete, onSubmit) => {
1468
+ const lastChild = getLastChild(node, context);
1469
+ console.log(`conditional expression last child ${lastChild == null ? void 0 : lastChild.name}`);
1470
+ switch (lastChild == null ? void 0 : lastChild.name) {
1471
+ case "If":
1472
+ return makeSuggestions(context, suggestionProvider, "expression", {
1473
+ prefix: "( "
1474
+ });
1475
+ case "OpenBrace":
1476
+ return makeSuggestions(context, suggestionProvider, "expression");
1477
+ case "Condition":
1478
+ return makeSuggestions(context, suggestionProvider, "expression", {
1479
+ prefix: ", "
1480
+ });
1481
+ case "CloseBrace":
1482
+ if (maybeComplete) {
1483
+ const options = [completionDone(onSubmit)];
1484
+ return { from: context.pos, options };
1485
+ }
1486
+ }
1487
+ };
1488
+ var promptToSave = (context, onSubmit) => {
1489
+ const options = [completionDone(onSubmit)];
1490
+ return { from: context.pos, options };
1491
+ };
1492
+ var useColumnAutoComplete = (suggestionProvider, onSubmit) => {
1493
+ const makeSuggestions2 = (0, import_react7.useCallback)(
1494
+ async (context, suggestionType, optionalArgs = {}) => {
1495
+ const options = await suggestionProvider.getSuggestions(
1496
+ suggestionType,
1497
+ optionalArgs
1498
+ );
1499
+ const { startsWith = "" } = optionalArgs;
1500
+ return { from: context.pos - startsWith.length, options };
1501
+ },
1502
+ [suggestionProvider]
1503
+ );
1504
+ return (0, import_react7.useCallback)(
1505
+ async (context) => {
1506
+ var _a, _b;
1507
+ const { state, pos } = context;
1508
+ const word = (_a = context.matchBefore(/\w*/)) != null ? _a : {
1509
+ from: 0,
1510
+ to: 0,
1511
+ text: void 0
1512
+ };
1513
+ const tree = (0, import_vuu_codemirror4.syntaxTree)(state);
1514
+ const nodeBefore = tree.resolveInner(pos, -1);
1515
+ const text = state.doc.toString();
1516
+ const maybeComplete = isCompleteExpression(text);
1517
+ switch (nodeBefore.name) {
1518
+ case "If": {
1519
+ console.log(`conditional expression If`);
1520
+ return makeSuggestions2(context, "expression", { prefix: "( " });
1521
+ }
1522
+ case "Condition":
1523
+ {
1524
+ const lastChild = getLastChild(nodeBefore, context);
1525
+ if ((lastChild == null ? void 0 : lastChild.name) === "Column") {
1526
+ const prevChild = (0, import_vuu_codemirror4.getPreviousNode)(lastChild);
1527
+ if ((prevChild == null ? void 0 : prevChild.name) !== "RelationalOperator") {
1528
+ return makeSuggestions2(context, "condition-operator", {
1529
+ columnName: (0, import_vuu_codemirror4.getValue)(lastChild, state)
1530
+ });
1531
+ }
1532
+ } else if ((lastChild == null ? void 0 : lastChild.name) === "RelationalOperator") {
1533
+ return makeSuggestions2(context, "expression");
1534
+ }
1535
+ console.log(`condition last child ${lastChild == null ? void 0 : lastChild.name}`);
1536
+ }
1537
+ break;
1538
+ case "ConditionalExpression":
1539
+ return handleConditionalExpression(
1540
+ nodeBefore,
1541
+ context,
1542
+ suggestionProvider
1543
+ );
1544
+ case "RelationalExpression":
1545
+ {
1546
+ if (isCompleteRelationalExpression(nodeBefore)) {
1547
+ return {
1548
+ from: context.pos,
1549
+ options: import_vuu_codemirror4.booleanJoinSuggestions.concat({
1550
+ label: ", <truthy expression>, <falsy expression>",
1551
+ apply: ", "
1552
+ })
1553
+ };
1554
+ } else {
1555
+ const operator = getRelationalOperator(nodeBefore, state);
1556
+ const columnName = getColumnName(nodeBefore, state);
1557
+ if (!operator) {
1558
+ const options = await suggestionProvider.getSuggestions(
1559
+ "condition-operator",
1560
+ {
1561
+ columnName
1562
+ }
1563
+ );
1564
+ return { from: context.pos, options };
1565
+ } else {
1566
+ return makeSuggestions2(context, "expression");
1567
+ }
1568
+ }
1569
+ }
1570
+ break;
1571
+ case "RelationalOperator":
1572
+ return makeSuggestions2(context, "expression");
1573
+ case "String":
1574
+ {
1575
+ const operator = getRelationalOperator(
1576
+ nodeBefore,
1577
+ state
1578
+ );
1579
+ const columnName = getColumnName(nodeBefore, state);
1580
+ const { from, to } = nodeBefore;
1581
+ if (to - from === 2 && context.pos === from + 1) {
1582
+ if (columnName && operator) {
1583
+ return makeSuggestions2(context, "columnValue", {
1584
+ columnName,
1585
+ operator,
1586
+ startsWith: word.text
1587
+ });
1588
+ }
1589
+ } else if (to - from > 2 && context.pos === to) {
1590
+ return makeSuggestions2(context, "expression", {
1591
+ prefix: ", "
1592
+ });
1593
+ }
1594
+ }
1595
+ break;
1596
+ case "ArithmeticExpression":
1597
+ {
1598
+ const lastChild = getLastChild(nodeBefore, context);
1599
+ if ((lastChild == null ? void 0 : lastChild.name) === "Column") {
1600
+ return makeSuggestions2(context, "expression");
1601
+ } else if (isOperator(lastChild)) {
1602
+ const operator = lastChild.name;
1603
+ return makeSuggestions2(context, "column", { operator });
1604
+ }
1605
+ }
1606
+ break;
1607
+ case "OpenBrace":
1608
+ {
1609
+ const functionName = getFunctionName(nodeBefore, state);
1610
+ return makeSuggestions2(context, "expression", { functionName });
1611
+ }
1612
+ break;
1613
+ case "ArgList": {
1614
+ const functionName = getFunctionName(nodeBefore, state);
1615
+ const lastArgument = getLastChild(nodeBefore, context);
1616
+ const prefix = (lastArgument == null ? void 0 : lastArgument.name) === "OpenBrace" ? void 0 : ",";
1617
+ let options = await suggestionProvider.getSuggestions("expression", {
1618
+ functionName
1619
+ });
1620
+ options = prefix ? applyPrefix(options, ", ") : options;
1621
+ if ((lastArgument == null ? void 0 : lastArgument.name) !== "OpenBrace" && (lastArgument == null ? void 0 : lastArgument.name) !== "Comma") {
1622
+ options = [
1623
+ {
1624
+ apply: ") ",
1625
+ boost: 10,
1626
+ label: "Done - no more arguments"
1627
+ }
1628
+ ].concat(options);
1629
+ }
1630
+ return { from: context.pos, options };
1631
+ }
1632
+ case "Equal":
1633
+ if (text.trim() === "=") {
1634
+ return makeSuggestions2(context, "expression");
1635
+ }
1636
+ break;
1637
+ case "ParenthesizedExpression":
1638
+ case "ColumnDefinitionExpression":
1639
+ if (context.pos === 0) {
1640
+ return makeSuggestions2(context, "expression");
1641
+ } else {
1642
+ const lastChild = getLastChild(nodeBefore, context);
1643
+ if ((lastChild == null ? void 0 : lastChild.name) === "Column") {
1644
+ if (maybeComplete) {
1645
+ const options = [
1646
+ completionDone(onSubmit.current)
1647
+ ];
1648
+ const columnName = (0, import_vuu_codemirror4.getValue)(lastChild, state);
1649
+ const columnOptions = await suggestionProvider.getSuggestions("operator", {
1650
+ columnName
1651
+ });
1652
+ return {
1653
+ from: context.pos,
1654
+ options: options.concat(columnOptions)
1655
+ };
1656
+ }
1657
+ } else if ((lastChild == null ? void 0 : lastChild.name) === "CallExpression") {
1658
+ if (maybeComplete) {
1659
+ return {
1660
+ from: context.pos,
1661
+ options: [completionDone(onSubmit.current)]
1662
+ };
1663
+ }
1664
+ } else if ((lastChild == null ? void 0 : lastChild.name) === "ArithmeticExpression") {
1665
+ if (maybeComplete) {
1666
+ let options = [completionDone(onSubmit.current)];
1667
+ const lastExpressionChild = getLastChild(lastChild, context);
1668
+ if ((lastExpressionChild == null ? void 0 : lastExpressionChild.name) === "Column") {
1669
+ const columnName = (0, import_vuu_codemirror4.getValue)(lastExpressionChild, state);
1670
+ const suggestions = await suggestionProvider.getSuggestions(
1671
+ "operator",
1672
+ { columnName }
1673
+ );
1674
+ options = options.concat(suggestions);
1675
+ }
1676
+ return {
1677
+ from: context.pos,
1678
+ options
1679
+ };
1680
+ }
1681
+ } else if ((lastChild == null ? void 0 : lastChild.name) === "ConditionalExpression") {
1682
+ return handleConditionalExpression(
1683
+ lastChild,
1684
+ context,
1685
+ suggestionProvider,
1686
+ maybeComplete,
1687
+ onSubmit.current
1688
+ );
1689
+ }
1690
+ break;
1691
+ }
1692
+ case "Column":
1693
+ {
1694
+ const isPartialMatch = await suggestionProvider.isPartialMatch(
1695
+ "expression",
1696
+ void 0,
1697
+ word.text
1698
+ );
1699
+ if (isPartialMatch) {
1700
+ return makeSuggestions2(context, "expression", {
1701
+ startsWith: word.text
1702
+ });
1703
+ }
1704
+ }
1705
+ break;
1706
+ case "Comma":
1707
+ {
1708
+ const parentNode = (0, import_vuu_codemirror4.getNamedParentNode)(nodeBefore);
1709
+ if ((parentNode == null ? void 0 : parentNode.name) === "ConditionalExpression") {
1710
+ return makeSuggestions2(context, "expression");
1711
+ }
1712
+ }
1713
+ break;
1714
+ case "CloseBrace":
1715
+ {
1716
+ const parentNode = (0, import_vuu_codemirror4.getNamedParentNode)(nodeBefore);
1717
+ if ((parentNode == null ? void 0 : parentNode.name) === "ConditionalExpression") {
1718
+ return handleConditionalExpression(
1719
+ parentNode,
1720
+ context,
1721
+ suggestionProvider,
1722
+ maybeComplete,
1723
+ onSubmit.current
1724
+ );
1725
+ } else if ((parentNode == null ? void 0 : parentNode.name) === "ArgList") {
1726
+ if (maybeComplete) {
1727
+ return promptToSave(context, onSubmit.current);
1728
+ }
1729
+ }
1730
+ }
1731
+ break;
1732
+ default: {
1733
+ if (((_b = nodeBefore == null ? void 0 : nodeBefore.prevSibling) == null ? void 0 : _b.name) === "FilterClause") {
1734
+ console.log("looks like we ight be a or|and operator");
1735
+ }
1736
+ }
1737
+ }
1738
+ },
1739
+ [makeSuggestions2, onSubmit, suggestionProvider]
1740
+ );
1741
+ };
1742
+
1743
+ // src/column-expression-input/useColumnExpressionEditor.ts
1744
+ var getView = (ref) => {
1745
+ if (ref.current == void 0) {
1746
+ throw Error("EditorView not defined");
1747
+ }
1748
+ return ref.current;
1749
+ };
1750
+ var getOptionClass = () => {
1751
+ return "vuuSuggestion";
1752
+ };
1753
+ var noop = () => console.log("noooop");
1754
+ var hasExpressionType = (completion) => "expressionType" in completion;
1755
+ var injectOptionContent = (completion) => {
1756
+ if (hasExpressionType(completion)) {
1757
+ const div = (0, import_vuu_utils10.createEl)("div", "expression-type-container");
1758
+ const span = (0, import_vuu_utils10.createEl)("span", "expression-type", completion.expressionType);
1759
+ div.appendChild(span);
1760
+ return div;
1761
+ } else {
1762
+ return null;
1763
+ }
1764
+ };
1765
+ var useColumnExpressionEditor = ({
1766
+ onChange,
1767
+ onSubmitExpression,
1768
+ source,
1769
+ suggestionProvider
1770
+ }) => {
1771
+ const editorRef = (0, import_react8.useRef)(null);
1772
+ const onSubmitRef = (0, import_react8.useRef)(noop);
1773
+ const viewRef = (0, import_react8.useRef)();
1774
+ const completionFn = useColumnAutoComplete(suggestionProvider, onSubmitRef);
1775
+ const [createState, clearInput] = (0, import_react8.useMemo)(() => {
1776
+ const parseExpression = () => {
1777
+ const view = getView(viewRef);
1778
+ const source2 = view.state.doc.toString();
1779
+ const tree = (0, import_vuu_codemirror5.ensureSyntaxTree)(view.state, view.state.doc.length, 5e3);
1780
+ if (tree) {
1781
+ const expression = walkTree(tree, source2);
1782
+ return [source2, expression];
1783
+ } else {
1784
+ return ["", void 0];
1785
+ }
1786
+ };
1787
+ const clearInput2 = () => {
1788
+ getView(viewRef).setState(createState2());
1789
+ };
1790
+ const submitExpression = () => {
1791
+ const [source2, expression] = parseExpression();
1792
+ onSubmitExpression == null ? void 0 : onSubmitExpression(source2, expression);
1793
+ };
1794
+ const showSuggestions = (key) => {
1795
+ return import_vuu_codemirror5.keymap.of([
1796
+ {
1797
+ key,
1798
+ run() {
1799
+ (0, import_vuu_codemirror5.startCompletion)(getView(viewRef));
1800
+ return true;
1801
+ }
1802
+ }
1803
+ ]);
1804
+ };
1805
+ const createState2 = () => import_vuu_codemirror5.EditorState.create({
1806
+ doc: source,
1807
+ extensions: [
1808
+ import_vuu_codemirror5.minimalSetup,
1809
+ (0, import_vuu_codemirror5.autocompletion)({
1810
+ addToOptions: [
1811
+ {
1812
+ render: injectOptionContent,
1813
+ position: 70
1814
+ }
1815
+ ],
1816
+ override: [completionFn],
1817
+ optionClass: getOptionClass
1818
+ }),
1819
+ columnExpressionLanguageSupport(),
1820
+ import_vuu_codemirror5.keymap.of(import_vuu_codemirror5.defaultKeymap),
1821
+ showSuggestions("ArrowDown"),
1822
+ import_vuu_codemirror5.EditorView.updateListener.of((v) => {
1823
+ const view = getView(viewRef);
1824
+ if (v.docChanged) {
1825
+ (0, import_vuu_codemirror5.startCompletion)(view);
1826
+ const source2 = view.state.doc.toString();
1827
+ onChange == null ? void 0 : onChange(source2);
1828
+ }
1829
+ }),
1830
+ // Enforces single line view
1831
+ // EditorState.transactionFilter.of((tr) =>
1832
+ // tr.newDoc.lines > 1 ? [] : tr
1833
+ // ),
1834
+ vuuTheme,
1835
+ vuuHighlighting
1836
+ ]
1837
+ });
1838
+ onSubmitRef.current = () => {
1839
+ submitExpression();
1840
+ };
1841
+ return [createState2, clearInput2];
1842
+ }, [completionFn, onChange, onSubmitExpression, source]);
1843
+ (0, import_react8.useEffect)(() => {
1844
+ if (!editorRef.current) {
1845
+ throw Error("editor not in dom");
1846
+ }
1847
+ viewRef.current = new import_vuu_codemirror5.EditorView({
1848
+ state: createState(),
1849
+ parent: editorRef.current
1850
+ });
1851
+ return () => {
1852
+ var _a;
1853
+ (_a = viewRef.current) == null ? void 0 : _a.destroy();
1854
+ };
1855
+ }, [completionFn, createState]);
1856
+ return { editorRef, clearInput };
1857
+ };
1858
+
1859
+ // src/column-expression-input/ColumnExpressionInput.tsx
1860
+ var import_jsx_runtime7 = require("react/jsx-runtime");
1861
+ var classBase7 = "vuuColumnExpressionInput";
1862
+ var ColumnExpressionInput = ({
1863
+ onChange,
1864
+ onSubmitExpression,
1865
+ source = "",
1866
+ suggestionProvider
1867
+ }) => {
1868
+ const { editorRef } = useColumnExpressionEditor({
1869
+ onChange,
1870
+ onSubmitExpression,
1871
+ source,
1872
+ suggestionProvider
1873
+ });
1874
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: `${classBase7}`, ref: editorRef });
1875
+ };
1876
+
1877
+ // src/column-expression-input/useColumnExpressionSuggestionProvider.ts
1878
+ var import_vuu_codemirror6 = require("@vuu-ui/vuu-codemirror");
1879
+ var import_vuu_data_react = require("@vuu-ui/vuu-data-react");
1880
+ var import_vuu_utils12 = require("@vuu-ui/vuu-utils");
1881
+ var import_react9 = require("react");
1882
+
1883
+ // src/column-expression-input/column-function-descriptors.ts
1884
+ var columnFunctionDescriptors = [
1885
+ /**
1886
+ * concatenate()
1887
+ */
1888
+ {
1889
+ accepts: "string",
1890
+ 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.",
1891
+ example: {
1892
+ expression: 'concatenate("example", "-test")',
1893
+ result: '"example-test"'
1894
+ },
1895
+ name: "concatenate",
1896
+ params: {
1897
+ description: "( string, string, [ string* ] )"
1898
+ },
1899
+ type: "string"
1900
+ },
1901
+ /**
1902
+ * contains()
1903
+ */
1904
+ {
1905
+ accepts: ["string", "string"],
1906
+ 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>",
1907
+ example: {
1908
+ expression: 'contains("Royal Bank of Scotland", "bank")',
1909
+ result: "true"
1910
+ },
1911
+ name: "contains",
1912
+ params: {
1913
+ description: "( string )"
1914
+ },
1915
+ type: "boolean"
1916
+ },
1917
+ /**
1918
+ * left()
1919
+ */
1920
+ {
1921
+ accepts: ["string", "number"],
1922
+ description: "Returns the leftmost <number> characters from <string>. First argument may be a string literal, string column or other string expression.",
1923
+ example: {
1924
+ expression: 'left("USD Benchmark Report", 3)',
1925
+ result: '"USD"'
1926
+ },
1927
+ name: "left",
1928
+ params: {
1929
+ count: 2,
1930
+ description: "( string, number )"
1931
+ },
1932
+ type: "string"
1933
+ },
1934
+ /**
1935
+ * len()
1936
+ */
1937
+ {
1938
+ accepts: "string",
1939
+ description: "Returns the number of characters in <string>. Argument may be a string literal, string column or other string expression.",
1940
+ example: {
1941
+ expression: 'len("example")',
1942
+ result: "7"
1943
+ },
1944
+ name: "len",
1945
+ params: {
1946
+ description: "(string)"
1947
+ },
1948
+ type: "number"
1949
+ },
1950
+ /**
1951
+ * lower()
1952
+ */
1953
+ {
1954
+ accepts: "string",
1955
+ description: "Convert a string value to lowercase. Argument may be a string column or other string expression.",
1956
+ example: {
1957
+ expression: 'lower("examPLE")',
1958
+ result: '"example"'
1959
+ },
1960
+ name: "lower",
1961
+ params: {
1962
+ description: "( string )"
1963
+ },
1964
+ type: "string"
1965
+ },
1966
+ /**
1967
+ * upper()
1968
+ */
1969
+ {
1970
+ accepts: "string",
1971
+ description: "Convert a string value to uppercase. Argument may be a string column or other string expression.",
1972
+ example: {
1973
+ expression: 'upper("example")',
1974
+ result: '"EXAMPLE"'
1975
+ },
1976
+ name: "upper",
1977
+ params: {
1978
+ description: "( string )"
1979
+ },
1980
+ type: "string"
1981
+ },
1982
+ /**
1983
+ * right()
1984
+ */
1985
+ {
1986
+ accepts: ["string", "number"],
1987
+ description: "Returns the rightmost <number> characters from <string>. First argument may be a string literal, string column or other string expression.",
1988
+ example: {
1989
+ expression: "blah",
1990
+ result: "blah"
1991
+ },
1992
+ name: "right",
1993
+ params: {
1994
+ description: "( string )"
1995
+ },
1996
+ type: "string"
1997
+ },
1998
+ /**
1999
+ * replace()
2000
+ */
2001
+ {
2002
+ accepts: ["string", "string", "string"],
2003
+ 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>",
2004
+ example: {
2005
+ expression: "blah",
2006
+ result: "blah"
2007
+ },
2008
+ name: "replace",
2009
+ params: {
2010
+ description: "( string )"
2011
+ },
2012
+ type: "string"
2013
+ },
2014
+ /**
2015
+ * text()
2016
+ */
2017
+ {
2018
+ accepts: "number",
2019
+ description: "Converts a number to a string.",
2020
+ example: {
2021
+ expression: "blah",
2022
+ result: "blah"
2023
+ },
2024
+ name: "text",
2025
+ params: {
2026
+ description: "( string )"
2027
+ },
2028
+ type: "string"
2029
+ },
2030
+ /**
2031
+ * starts()
2032
+ */
2033
+ {
2034
+ accepts: "string",
2035
+ 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>.",
2036
+ example: {
2037
+ expression: "blah",
2038
+ result: "blah"
2039
+ },
2040
+ name: "starts",
2041
+ params: {
2042
+ description: "( string )"
2043
+ },
2044
+ type: "boolean"
2045
+ },
2046
+ /**
2047
+ * starts()
2048
+ */
2049
+ {
2050
+ accepts: "string",
2051
+ 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>.",
2052
+ example: {
2053
+ expression: "blah",
2054
+ result: "blah"
2055
+ },
2056
+ name: "ends",
2057
+ params: {
2058
+ description: "( string )"
2059
+ },
2060
+ type: "boolean"
2061
+ },
2062
+ {
2063
+ accepts: "number",
2064
+ description: "blah",
2065
+ example: {
2066
+ expression: "blah",
2067
+ result: "blah"
2068
+ },
2069
+ name: "min",
2070
+ params: {
2071
+ description: "( string )"
2072
+ },
2073
+ type: "number"
2074
+ },
2075
+ {
2076
+ accepts: "number",
2077
+ description: "blah",
2078
+ example: {
2079
+ expression: "blah",
2080
+ result: "blah"
2081
+ },
2082
+ name: "max",
2083
+ params: {
2084
+ description: "( string )"
2085
+ },
2086
+ type: "number"
2087
+ },
2088
+ {
2089
+ accepts: "number",
2090
+ description: "blah",
2091
+ example: {
2092
+ expression: "blah",
2093
+ result: "blah"
2094
+ },
2095
+ name: "sum",
2096
+ params: {
2097
+ description: "( string )"
2098
+ },
2099
+ type: "number"
2100
+ },
2101
+ {
2102
+ accepts: "number",
2103
+ description: "blah",
2104
+ example: {
2105
+ expression: "blah",
2106
+ result: "blah"
2107
+ },
2108
+ name: "round",
2109
+ params: {
2110
+ description: "( string )"
2111
+ },
2112
+ type: "number"
2113
+ },
2114
+ {
2115
+ accepts: "any",
2116
+ description: "blah",
2117
+ example: {
2118
+ expression: "blah",
2119
+ result: "blah"
2120
+ },
2121
+ name: "or",
2122
+ params: {
2123
+ description: "( string )"
2124
+ },
2125
+ type: "boolean"
2126
+ },
2127
+ {
2128
+ accepts: "any",
2129
+ description: "blah",
2130
+ example: {
2131
+ expression: "blah",
2132
+ result: "blah"
2133
+ },
2134
+ name: "and",
2135
+ params: {
2136
+ description: "( string )"
2137
+ },
2138
+ type: "boolean"
2139
+ },
2140
+ {
2141
+ accepts: "any",
2142
+ 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>. ",
2143
+ example: {
2144
+ expression: "blah",
2145
+ result: "blah"
2146
+ },
2147
+ name: "if",
2148
+ params: {
2149
+ description: "( filterExpression, expression1, expression 2)"
2150
+ },
2151
+ type: "variable"
2152
+ }
2153
+ ];
2154
+
2155
+ // src/column-expression-input/functionDocInfo.ts
2156
+ var import_vuu_utils11 = require("@vuu-ui/vuu-utils");
2157
+ var functionDocInfo = ({
2158
+ name: name2,
2159
+ description,
2160
+ example,
2161
+ params,
2162
+ type
2163
+ }) => {
2164
+ const rootElement = (0, import_vuu_utils11.createEl)("div", "vuuFunctionDoc");
2165
+ const headingElement = (0, import_vuu_utils11.createEl)("div", "function-heading");
2166
+ const nameElement = (0, import_vuu_utils11.createEl)("span", "function-name", name2);
2167
+ const paramElement = (0, import_vuu_utils11.createEl)("span", "param-list", params.description);
2168
+ const typeElement = (0, import_vuu_utils11.createEl)("span", "function-type", type);
2169
+ headingElement.appendChild(nameElement);
2170
+ headingElement.appendChild(paramElement);
2171
+ headingElement.appendChild(typeElement);
2172
+ const child2 = (0, import_vuu_utils11.createEl)("p", void 0, description);
2173
+ rootElement.appendChild(headingElement);
2174
+ rootElement.appendChild(child2);
2175
+ if (example) {
2176
+ const exampleElement = (0, import_vuu_utils11.createEl)("div", "example-container", "Example:");
2177
+ const expressionElement = (0, import_vuu_utils11.createEl)(
2178
+ "div",
2179
+ "example-expression",
2180
+ example.expression
2181
+ );
2182
+ const resultElement = (0, import_vuu_utils11.createEl)("div", "example-result", example.result);
2183
+ exampleElement.appendChild(expressionElement);
2184
+ exampleElement.appendChild(resultElement);
2185
+ rootElement.appendChild(exampleElement);
2186
+ }
2187
+ return rootElement;
2188
+ };
2189
+
2190
+ // src/column-expression-input/useColumnExpressionSuggestionProvider.ts
2191
+ var NO_OPERATORS = [];
2192
+ var withApplySpace = (suggestions) => suggestions.map((suggestion) => {
2193
+ var _a;
2194
+ return {
2195
+ ...suggestion,
2196
+ apply: ((_a = suggestion.apply) != null ? _a : suggestion.label) + " "
2197
+ };
2198
+ });
2199
+ var getValidColumns = (columns, { functionName, operator }) => {
2200
+ if (operator) {
2201
+ return columns.filter(import_vuu_utils12.isNumericColumn);
2202
+ } else if (functionName) {
2203
+ const fn = columnFunctionDescriptors.find((f) => f.name === functionName);
2204
+ if (fn) {
2205
+ switch (fn.accepts) {
2206
+ case "string":
2207
+ return columns.filter(import_vuu_utils12.isTextColumn);
2208
+ case "number":
2209
+ return columns.filter(import_vuu_utils12.isNumericColumn);
2210
+ default:
2211
+ return columns;
2212
+ }
2213
+ }
2214
+ }
2215
+ return columns;
2216
+ };
2217
+ var getColumns = (columns, options) => {
2218
+ const validColumns = getValidColumns(columns, options);
2219
+ return validColumns.map((column) => {
2220
+ var _a;
2221
+ const label = (_a = column.label) != null ? _a : column.name;
2222
+ return {
2223
+ apply: options.prefix ? `${options.prefix}${label}` : label,
2224
+ label,
2225
+ boost: 5,
2226
+ type: "column",
2227
+ expressionType: column.serverDataType
2228
+ };
2229
+ });
2230
+ };
2231
+ var arithmeticOperators = [
2232
+ { apply: "* ", boost: 2, label: "*", type: "operator" },
2233
+ { apply: "/ ", boost: 2, label: "/", type: "operator" },
2234
+ { apply: "+ ", boost: 2, label: "+", type: "operator" },
2235
+ { apply: "- ", boost: 2, label: "-", type: "operator" }
2236
+ ];
2237
+ var getOperators = (column) => {
2238
+ if (column === void 0 || (0, import_vuu_utils12.isNumericColumn)(column)) {
2239
+ return arithmeticOperators;
2240
+ } else {
2241
+ return NO_OPERATORS;
2242
+ }
2243
+ };
2244
+ var getConditionOperators = (column) => {
2245
+ switch (column.serverDataType) {
2246
+ case "string":
2247
+ case "char":
2248
+ return withApplySpace(
2249
+ import_vuu_codemirror6.stringOperators
2250
+ /*, startsWith*/
2251
+ );
2252
+ case "int":
2253
+ case "long":
2254
+ case "double":
2255
+ return withApplySpace(import_vuu_codemirror6.numericOperators);
2256
+ }
2257
+ };
2258
+ var toFunctionCompletion = (functionDescriptor) => ({
2259
+ apply: `${functionDescriptor.name}( `,
2260
+ boost: 2,
2261
+ expressionType: functionDescriptor.type,
2262
+ info: () => functionDocInfo(functionDescriptor),
2263
+ label: functionDescriptor.name,
2264
+ type: "function"
2265
+ });
2266
+ var getAcceptedTypes = (fn) => {
2267
+ if (fn) {
2268
+ if (typeof fn.accepts === "string") {
2269
+ return fn.accepts;
2270
+ } else if (Array.isArray(fn.accepts)) {
2271
+ if (fn.accepts.every((s) => s === "string")) {
2272
+ return "string";
2273
+ } else {
2274
+ return "any";
2275
+ }
2276
+ }
2277
+ }
2278
+ return "any";
2279
+ };
2280
+ var functions = columnFunctionDescriptors.map(toFunctionCompletion);
2281
+ var getFunctions = ({ functionName }) => {
2282
+ if (functionName) {
2283
+ const fn = columnFunctionDescriptors.find((f) => f.name === functionName);
2284
+ const acceptedTypes = getAcceptedTypes(fn);
2285
+ if (fn) {
2286
+ switch (acceptedTypes) {
2287
+ case "string":
2288
+ return columnFunctionDescriptors.filter((f) => f.type === "string" || f.type === "variable").map(toFunctionCompletion);
2289
+ case "number":
2290
+ return columnFunctionDescriptors.filter((f) => f.type === "number" || f.type === "variable").map(toFunctionCompletion);
2291
+ default:
2292
+ }
2293
+ }
2294
+ }
2295
+ return functions;
2296
+ };
2297
+ var NONE = {};
2298
+ var useColumnExpressionSuggestionProvider = ({
2299
+ columns,
2300
+ table
2301
+ }) => {
2302
+ const findColumn2 = (0, import_react9.useCallback)(
2303
+ (name2) => name2 ? columns.find((col) => col.name === name2) : void 0,
2304
+ [columns]
2305
+ );
2306
+ const latestSuggestionsRef = (0, import_react9.useRef)();
2307
+ const getTypeaheadSuggestions = (0, import_vuu_data_react.useTypeaheadSuggestions)();
2308
+ const getSuggestions = (0, import_react9.useCallback)(
2309
+ async (suggestionType, options = NONE) => {
2310
+ const { columnName, functionName, operator, prefix } = options;
2311
+ switch (suggestionType) {
2312
+ case "expression": {
2313
+ const suggestions = await withApplySpace(
2314
+ getColumns(columns, { functionName, prefix })
2315
+ ).concat(getFunctions(options));
2316
+ return latestSuggestionsRef.current = suggestions;
2317
+ }
2318
+ case "column": {
2319
+ const suggestions = await getColumns(columns, options);
2320
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
2321
+ }
2322
+ case "operator": {
2323
+ const suggestions = await getOperators(findColumn2(columnName));
2324
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
2325
+ }
2326
+ case "relational-operator": {
2327
+ const suggestions = await (0, import_vuu_codemirror6.getRelationalOperators)(
2328
+ findColumn2(columnName)
2329
+ );
2330
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
2331
+ }
2332
+ case "condition-operator":
2333
+ {
2334
+ const column = findColumn2(columnName);
2335
+ if (column) {
2336
+ const suggestions = await getConditionOperators(column);
2337
+ if (suggestions) {
2338
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
2339
+ }
2340
+ }
2341
+ }
2342
+ break;
2343
+ case "columnValue":
2344
+ if (columnName && operator) {
2345
+ const params = (0, import_vuu_data_react.getTypeaheadParams)(
2346
+ table,
2347
+ columnName
2348
+ /*, startsWith*/
2349
+ );
2350
+ const suggestions = await getTypeaheadSuggestions(params);
2351
+ latestSuggestionsRef.current = (0, import_vuu_codemirror6.toSuggestions)(suggestions, {
2352
+ suffix: ""
2353
+ });
2354
+ latestSuggestionsRef.current.forEach((suggestion) => {
2355
+ suggestion.apply = (view, completion, from) => {
2356
+ const annotation = new import_vuu_codemirror6.AnnotationType();
2357
+ const cursorPos = from + completion.label.length + 1;
2358
+ view.dispatch({
2359
+ changes: { from, insert: completion.label },
2360
+ selection: { anchor: cursorPos, head: cursorPos },
2361
+ annotations: annotation.of(completion)
2362
+ });
2363
+ };
2364
+ });
2365
+ return latestSuggestionsRef.current;
2366
+ }
2367
+ break;
2368
+ }
2369
+ return [];
2370
+ },
2371
+ [columns, findColumn2, getTypeaheadSuggestions, table]
2372
+ );
2373
+ const isPartialMatch = (0, import_react9.useCallback)(
2374
+ async (valueType, columnName, pattern) => {
2375
+ const { current: latestSuggestions } = latestSuggestionsRef;
2376
+ let maybe = false;
2377
+ const suggestions = latestSuggestions || await getSuggestions(valueType, { columnName });
2378
+ if (pattern && suggestions) {
2379
+ for (const option of suggestions) {
2380
+ if (option.label === pattern) {
2381
+ return false;
2382
+ } else if (option.label.startsWith(pattern)) {
2383
+ maybe = true;
2384
+ }
2385
+ }
2386
+ }
2387
+ return maybe;
2388
+ },
2389
+ [getSuggestions]
2390
+ );
2391
+ return {
2392
+ getSuggestions,
2393
+ isPartialMatch
2394
+ };
2395
+ };
2396
+
2397
+ // src/column-expression-panel/useColumnExpression.ts
2398
+ var import_vuu_utils13 = require("@vuu-ui/vuu-utils");
2399
+ var import_react10 = require("react");
2400
+ var applyDefaults = (column) => {
2401
+ const [name2, expression, type] = (0, import_vuu_utils13.getCalculatedColumnDetails)(column);
2402
+ if (type === "") {
2403
+ return {
2404
+ ...column,
2405
+ name: `${name2}:${expression}:string`
2406
+ };
2407
+ } else {
2408
+ return column;
2409
+ }
2410
+ };
2411
+ var useColumnExpression = ({
2412
+ column: columnProp,
2413
+ onSave: onSaveProp
2414
+ }) => {
2415
+ const [column, setColumn] = (0, import_react10.useState)(
2416
+ applyDefaults(columnProp)
2417
+ );
2418
+ const expressionRef = (0, import_react10.useRef)((0, import_vuu_utils13.getCalculatedColumnDetails)(column)[1]);
2419
+ const onChangeName = (0, import_react10.useCallback)((evt) => {
2420
+ const { value } = evt.target;
2421
+ setColumn((state) => (0, import_vuu_utils13.setCalculatedColumnName)(state, value));
2422
+ }, []);
2423
+ const onChangeExpression = (0, import_react10.useCallback)((value) => {
2424
+ expressionRef.current = value.trim();
2425
+ }, []);
2426
+ const onChangeType = (0, import_react10.useCallback)((evt, value) => {
2427
+ if (typeof value === "string") {
2428
+ setColumn((state) => (0, import_vuu_utils13.setCalculatedColumnType)(state, value));
2429
+ }
2430
+ }, []);
2431
+ const onSave = (0, import_react10.useCallback)(() => {
2432
+ const newColumn = (0, import_vuu_utils13.setCalculatedColumnExpression)(
2433
+ column,
2434
+ expressionRef.current
2435
+ );
2436
+ setColumn(newColumn);
2437
+ onSaveProp(newColumn);
2438
+ }, [column, onSaveProp]);
2439
+ return {
2440
+ column,
2441
+ onChangeExpression,
2442
+ onChangeName,
2443
+ onChangeType,
2444
+ onSave
2445
+ };
2446
+ };
2447
+
2448
+ // src/column-expression-panel/ColumnExpressionPanel.tsx
2449
+ var import_jsx_runtime8 = require("react/jsx-runtime");
2450
+ var classBase8 = "vuuColumnExpressionPanel";
2451
+ var ColumnExpressionPanel = ({
2452
+ column: columnProp,
2453
+ onSave: onSaveProp,
2454
+ tableConfig,
2455
+ vuuTable
2456
+ }) => {
2457
+ const typeRef = (0, import_react11.useRef)(null);
2458
+ const { column, onChangeExpression, onChangeName, onChangeType, onSave } = useColumnExpression({ column: columnProp, onSave: onSaveProp });
2459
+ const suggestionProvider = useColumnExpressionSuggestionProvider({
2460
+ columns: tableConfig.columns,
2461
+ table: vuuTable
2462
+ });
2463
+ const handleSubmitExpression = (0, import_react11.useCallback)(() => {
2464
+ requestAnimationFrame(() => {
2465
+ var _a, _b;
2466
+ (_b = (_a = typeRef.current) == null ? void 0 : _a.querySelector("button")) == null ? void 0 : _b.focus();
2467
+ });
2468
+ }, []);
2469
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: classBase8, children: [
2470
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "vuuColumnSettingsPanel-header", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: "Calculation" }) }),
2471
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core4.FormField, { "data-field": "column-name", children: [
2472
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core4.FormFieldLabel, { children: "Column Name" }),
2473
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2474
+ import_core4.Input,
2475
+ {
2476
+ className: "vuuInput",
2477
+ onChange: onChangeName,
2478
+ value: (0, import_vuu_utils14.getCalculatedColumnName)(column)
2479
+ }
2480
+ )
2481
+ ] }),
2482
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core4.FormField, { "data-field": "column-expression", children: [
2483
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core4.FormFieldLabel, { children: "Expression" }),
2484
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2485
+ ColumnExpressionInput,
2486
+ {
2487
+ onChange: onChangeExpression,
2488
+ onSubmitExpression: handleSubmitExpression,
2489
+ source: (0, import_vuu_utils14.getCalculatedColumnExpression)(column),
2490
+ suggestionProvider
2491
+ }
2492
+ )
2493
+ ] }),
2494
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core4.FormField, { "data-field": "type", children: [
2495
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core4.FormFieldLabel, { children: "Column type" }),
2496
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2497
+ import_vuu_ui_controls3.Dropdown,
2498
+ {
2499
+ className: `${classBase8}-type`,
2500
+ onSelectionChange: onChangeType,
2501
+ ref: typeRef,
2502
+ selected: (0, import_vuu_utils14.getCalculatedColumnType)(column) || null,
2503
+ source: ["double", "long", "string"],
2504
+ width: "100%"
2505
+ }
2506
+ )
2507
+ ] }),
2508
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "vuuColumnSettingsPanel-buttonBar", "data-align": "right", children: [
2509
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core4.Button, { className: `${classBase8}-buttonCancel`, tabIndex: -1, children: "cancel" }),
2510
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core4.Button, { className: `${classBase8}-buttonApply`, tabIndex: -1, children: "apply" }),
2511
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2512
+ import_core4.Button,
2513
+ {
2514
+ className: `${classBase8}-buttonSave`,
2515
+ onClick: onSave,
2516
+ variant: "cta",
2517
+ children: "save"
2518
+ }
2519
+ )
2520
+ ] })
2521
+ ] });
2522
+ };
2523
+
2524
+ // src/column-settings/ColumnSettingsPanel.tsx
2525
+ var import_vuu_ui_controls4 = require("@vuu-ui/vuu-ui-controls");
2526
+ var import_jsx_runtime9 = require("react/jsx-runtime");
2527
+ var classBase9 = "vuuColumnSettingsPanel";
2528
+ var ColumnSettingsPanel = ({
2529
+ column: columnProp,
2530
+ onConfigChange,
2531
+ onCreateCalculatedColumn,
2532
+ tableConfig,
2533
+ vuuTable
2534
+ }) => {
2535
+ const isNewCalculatedColumn = columnProp.name === "::";
2536
+ const {
2537
+ availableRenderers,
2538
+ selectedCellRenderer,
2539
+ column,
2540
+ navigateNextColumn,
2541
+ navigatePrevColumn,
2542
+ onChange,
2543
+ onChangeFormatting,
2544
+ onChangeRenderer,
2545
+ onInputCommit,
2546
+ onSave
2547
+ } = useColumnSettings({
2548
+ column: columnProp,
2549
+ onConfigChange,
2550
+ onCreateCalculatedColumn,
2551
+ tableConfig
2552
+ });
2553
+ const {
2554
+ serverDataType,
2555
+ align = (0, import_vuu_utils15.getDefaultAlignment)(serverDataType),
2556
+ name: name2,
2557
+ label = name2,
2558
+ pin,
2559
+ width
2560
+ } = column;
2561
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: classBase9, children: [
2562
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: `${classBase9}-header`, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: name2 }) }),
2563
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core5.FormField, { "data-field": "column-label", children: [
2564
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core5.FormFieldLabel, { children: "Column Label" }),
2565
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2566
+ import_vuu_ui_controls4.VuuInput,
2567
+ {
2568
+ className: "vuuInput",
2569
+ onChange,
2570
+ onCommit: onInputCommit,
2571
+ value: label
2572
+ }
2573
+ )
2574
+ ] }),
2575
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core5.FormField, { "data-field": "column-width", children: [
2576
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core5.FormFieldLabel, { children: "Column Width" }),
2577
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2578
+ import_vuu_ui_controls4.VuuInput,
2579
+ {
2580
+ className: "vuuInput",
2581
+ onChange,
2582
+ value: width,
2583
+ onCommit: onInputCommit
2584
+ }
2585
+ )
2586
+ ] }),
2587
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core5.FormField, { "data-field": "column-alignment", children: [
2588
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core5.FormFieldLabel, { children: "Alignment" }),
2589
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
2590
+ import_core5.ToggleButtonGroup,
2591
+ {
2592
+ className: "vuuToggleButtonGroup",
2593
+ onChange,
2594
+ value: align,
2595
+ children: [
2596
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2597
+ import_core5.ToggleButton,
2598
+ {
2599
+ "data-icon": "align-left",
2600
+ className: "vuuIconToggleButton",
2601
+ value: "left"
2602
+ }
2603
+ ),
2604
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2605
+ import_core5.ToggleButton,
2606
+ {
2607
+ "data-icon": "align-right",
2608
+ className: "vuuIconToggleButton",
2609
+ value: "right"
2610
+ }
2611
+ )
2612
+ ]
2613
+ }
2614
+ )
2615
+ ] }),
2616
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core5.FormField, { "data-field": "column-pin", children: [
2617
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core5.FormFieldLabel, { children: "Pin Column" }),
2618
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
2619
+ import_core5.ToggleButtonGroup,
2620
+ {
2621
+ className: "vuuToggleButtonGroup",
2622
+ onChange,
2623
+ value: pin != null ? pin : "",
2624
+ children: [
2625
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2626
+ import_core5.ToggleButton,
2627
+ {
2628
+ className: "vuuIconToggleButton",
2629
+ "data-icon": "cross-circle",
2630
+ value: ""
2631
+ }
2632
+ ),
2633
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2634
+ import_core5.ToggleButton,
2635
+ {
2636
+ className: "vuuIconToggleButton",
2637
+ "data-icon": "pin-left",
2638
+ value: "left"
2639
+ }
2640
+ ),
2641
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2642
+ import_core5.ToggleButton,
2643
+ {
2644
+ className: "vuuIconToggleButton",
2645
+ "data-icon": "pin-float",
2646
+ value: "floating"
2647
+ }
2648
+ ),
2649
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2650
+ import_core5.ToggleButton,
2651
+ {
2652
+ className: "vuuIconToggleButton",
2653
+ "data-icon": "pin-right",
2654
+ value: "right"
2655
+ }
2656
+ )
2657
+ ]
2658
+ }
2659
+ )
2660
+ ] }),
2661
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2662
+ ColumnFormattingPanel,
2663
+ {
2664
+ availableRenderers,
2665
+ selectedCellRenderer,
2666
+ column,
2667
+ onChangeFormatting,
2668
+ onChangeRenderer
2669
+ }
2670
+ ),
2671
+ (0, import_vuu_utils15.isCalculatedColumn)(column.name) ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2672
+ ColumnExpressionPanel,
2673
+ {
2674
+ column,
2675
+ onSave,
2676
+ tableConfig,
2677
+ vuuTable
2678
+ }
2679
+ ) : /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
2680
+ "div",
2681
+ {
2682
+ className: `${classBase9}-buttonBar`,
2683
+ "data-align": isNewCalculatedColumn ? "right" : void 0,
2684
+ children: [
2685
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2686
+ import_core5.Button,
2687
+ {
2688
+ className: `${classBase9}-buttonNavPrev`,
2689
+ variant: "secondary",
2690
+ "data-icon": "arrow-left",
2691
+ onClick: navigatePrevColumn,
2692
+ children: "PREVIOUS"
2693
+ }
2694
+ ),
2695
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2696
+ import_core5.Button,
2697
+ {
2698
+ className: `${classBase9}-buttonNavNext`,
2699
+ variant: "secondary",
2700
+ "data-icon": "arrow-right",
2701
+ onClick: navigateNextColumn,
2702
+ children: "NEXT"
2703
+ }
2704
+ )
2705
+ ]
2706
+ }
2707
+ )
2708
+ ] });
2709
+ };
2710
+
2711
+ // src/datasource-stats/DatasourceStats.tsx
2712
+ var import_react12 = require("react");
2713
+ var import_classnames6 = __toESM(require("classnames"), 1);
2714
+ var import_jsx_runtime10 = require("react/jsx-runtime");
2715
+ var classBase10 = "vuuDatasourceStats";
2716
+ var numberFormatter = new Intl.NumberFormat();
2717
+ var DataSourceStats = ({
2718
+ className: classNameProp,
2719
+ dataSource
2720
+ }) => {
2721
+ const [range, setRange] = (0, import_react12.useState)(dataSource.range);
2722
+ const [size, setSize] = (0, import_react12.useState)(dataSource.size);
2723
+ (0, import_react12.useEffect)(() => {
2724
+ setSize(dataSource.size);
2725
+ dataSource.on("resize", setSize);
2726
+ dataSource.on("range", setRange);
2727
+ }, [dataSource]);
2728
+ const className = (0, import_classnames6.default)(classBase10, classNameProp);
2729
+ const from = numberFormatter.format(range.from);
2730
+ const to = numberFormatter.format(range.to - 1);
2731
+ const value = numberFormatter.format(size);
2732
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className, children: [
2733
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: `${classBase10}-label`, children: "Row count" }),
2734
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: `${classBase10}-range`, children: from }),
2735
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "-" }),
2736
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: `${classBase10}-range`, children: to }),
2737
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "of" }),
2738
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: `${classBase10}-size`, children: value })
2739
+ ] });
2740
+ };
2741
+
2742
+ // src/table-settings/TableSettingsPanel.tsx
2743
+ var import_core8 = require("@salt-ds/core");
2744
+
2745
+ // src/table-settings/useTableSettings.ts
2746
+ var import_vuu_layout4 = require("@vuu-ui/vuu-layout");
2747
+
2748
+ // ../vuu-table/src/table/ColumnResizer.tsx
2749
+ var import_react13 = require("react");
2750
+ var import_jsx_runtime11 = require("react/jsx-runtime");
2751
+
2752
+ // ../vuu-table/src/table/context-menu/buildContextMenuDescriptors.ts
2753
+ var import_vuu_utils16 = require("@vuu-ui/vuu-utils");
2754
+
2755
+ // ../vuu-table/src/table/context-menu/useTableContextMenu.ts
2756
+ var import_vuu_utils17 = require("@vuu-ui/vuu-utils");
2757
+ var import_vuu_utils18 = require("@vuu-ui/vuu-utils");
2758
+ var { Average, Count, Distinct, High, Low, Sum } = import_vuu_utils18.AggregationType;
2759
+
2760
+ // ../vuu-table/src/table/Table.tsx
2761
+ var import_vuu_popups4 = require("@vuu-ui/vuu-popups");
2762
+ var import_core6 = require("@salt-ds/core");
2763
+
2764
+ // ../vuu-table/src/table/RowBasedTable.tsx
2765
+ var import_vuu_utils22 = require("@vuu-ui/vuu-utils");
2766
+ var import_react21 = require("react");
2767
+
2768
+ // ../vuu-table/src/table/TableRow.tsx
2769
+ var import_vuu_utils21 = require("@vuu-ui/vuu-utils");
2770
+ var import_classnames8 = __toESM(require("classnames"));
2771
+ var import_react16 = require("react");
2772
+
2773
+ // ../vuu-table/src/table/TableCell.tsx
2774
+ var import_vuu_utils19 = require("@vuu-ui/vuu-utils");
2775
+ var import_vuu_ui_controls5 = require("@vuu-ui/vuu-ui-controls");
2776
+ var import_classnames7 = __toESM(require("classnames"));
2777
+ var import_react14 = require("react");
2778
+ var import_jsx_runtime12 = require("react/jsx-runtime");
2779
+ var { KEY: KEY3 } = import_vuu_utils19.metadataKeys;
2780
+ var TableCell = (0, import_react14.memo)(
2781
+ ({
2782
+ className: classNameProp,
2783
+ column,
2784
+ columnMap,
2785
+ onClick,
2786
+ row
2787
+ }) => {
2788
+ const labelFieldRef = (0, import_react14.useRef)(null);
2789
+ const {
2790
+ align,
2791
+ CellRenderer,
2792
+ key,
2793
+ pin,
2794
+ editable,
2795
+ resizing,
2796
+ valueFormatter
2797
+ } = column;
2798
+ const [editing, setEditing] = (0, import_react14.useState)(false);
2799
+ const value = valueFormatter(row[key]);
2800
+ const [editableValue, setEditableValue] = (0, import_react14.useState)(value);
2801
+ const handleTitleMouseDown = () => {
2802
+ var _a;
2803
+ (_a = labelFieldRef.current) == null ? void 0 : _a.focus();
2804
+ };
2805
+ const handleTitleKeyDown = (evt) => {
2806
+ if (evt.key === "Enter") {
2807
+ setEditing(true);
2808
+ }
2809
+ };
2810
+ const handleClick = (0, import_react14.useCallback)(
2811
+ (evt) => {
2812
+ onClick == null ? void 0 : onClick(evt, column);
2813
+ },
2814
+ [column, onClick]
2815
+ );
2816
+ const handleEnterEditMode = () => {
2817
+ setEditing(true);
2818
+ };
2819
+ const handleExitEditMode = (originalValue = "", finalValue = "", allowDeactivation = true, editCancelled = false) => {
2820
+ var _a;
2821
+ setEditing(false);
2822
+ if (editCancelled) {
2823
+ setEditableValue(originalValue);
2824
+ } else if (finalValue !== originalValue) {
2825
+ setEditableValue(finalValue);
2826
+ }
2827
+ if (allowDeactivation === false) {
2828
+ (_a = labelFieldRef.current) == null ? void 0 : _a.focus();
2829
+ }
2830
+ };
2831
+ const className = (0, import_classnames7.default)(classNameProp, {
2832
+ vuuAlignRight: align === "right",
2833
+ vuuPinFloating: pin === "floating",
2834
+ vuuPinLeft: pin === "left",
2835
+ vuuPinRight: pin === "right",
2836
+ "vuuTableCell-resizing": resizing
2837
+ }) || void 0;
2838
+ const style = (0, import_vuu_utils19.getColumnStyle)(column);
2839
+ return editable ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2840
+ "div",
2841
+ {
2842
+ className,
2843
+ "data-editable": true,
2844
+ role: "cell",
2845
+ style,
2846
+ onKeyDown: handleTitleKeyDown,
2847
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2848
+ import_vuu_ui_controls5.EditableLabel,
2849
+ {
2850
+ editing,
2851
+ value: editableValue,
2852
+ onChange: setEditableValue,
2853
+ onMouseDownCapture: handleTitleMouseDown,
2854
+ onEnterEditMode: handleEnterEditMode,
2855
+ onExitEditMode: handleExitEditMode,
2856
+ onKeyDown: handleTitleKeyDown,
2857
+ ref: labelFieldRef,
2858
+ tabIndex: 0
2859
+ },
2860
+ "title"
2861
+ )
2862
+ }
2863
+ ) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2864
+ "div",
2865
+ {
2866
+ className,
2867
+ role: "cell",
2868
+ style,
2869
+ onClick: handleClick,
2870
+ children: CellRenderer ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(CellRenderer, { column, columnMap, row }) : value
2871
+ }
2872
+ );
2873
+ },
2874
+ cellValuesAreEqual
2875
+ );
2876
+ TableCell.displayName = "TableCell";
2877
+ function cellValuesAreEqual(prev, next) {
2878
+ return prev.column === next.column && prev.onClick === next.onClick && prev.row[KEY3] === next.row[KEY3] && prev.row[prev.column.key] === next.row[next.column.key];
2879
+ }
2880
+
2881
+ // ../vuu-table/src/table/TableGroupCell.tsx
2882
+ var import_vuu_utils20 = require("@vuu-ui/vuu-utils");
2883
+ var import_react15 = require("react");
2884
+ var import_jsx_runtime13 = require("react/jsx-runtime");
2885
+ var { IS_LEAF } = import_vuu_utils20.metadataKeys;
2886
+ var TableGroupCell = ({ column, onClick, row }) => {
2887
+ const { columns } = column;
2888
+ const [value, offset] = (0, import_vuu_utils20.getGroupValueAndOffset)(columns, row);
2889
+ const handleClick = (0, import_react15.useCallback)(
2890
+ (evt) => {
2891
+ onClick == null ? void 0 : onClick(evt, column);
2892
+ },
2893
+ [column, onClick]
2894
+ );
2895
+ const style = (0, import_vuu_utils20.getColumnStyle)(column);
2896
+ const isLeaf = row[IS_LEAF];
2897
+ const spacers = Array(offset).fill(0).map((n, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "vuuTableGroupCell-spacer" }, i));
2898
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
2899
+ "div",
2900
+ {
2901
+ className: "vuuTableGroupCell vuuPinLeft",
2902
+ onClick: isLeaf ? void 0 : handleClick,
2903
+ role: "cell",
2904
+ style,
2905
+ children: [
2906
+ spacers,
2907
+ isLeaf ? null : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "vuuTableGroupCell-toggle", "data-icon": "triangle-right" }),
2908
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: value })
2909
+ ]
2910
+ }
2911
+ );
2912
+ };
2913
+
2914
+ // ../vuu-table/src/table/TableRow.tsx
2915
+ var import_jsx_runtime14 = require("react/jsx-runtime");
2916
+ var { IDX, IS_EXPANDED, SELECTED } = import_vuu_utils21.metadataKeys;
2917
+ var { True, First, Last } = import_vuu_utils21.RowSelected;
2918
+ var classBase11 = "vuuTableRow";
2919
+ var TableRow = (0, import_react16.memo)(function Row({
2920
+ columnMap,
2921
+ columns,
2922
+ offset,
2923
+ onClick,
2924
+ onToggleGroup,
2925
+ virtualColSpan = 0,
2926
+ row
2927
+ }) {
2928
+ const {
2929
+ [IDX]: rowIndex,
2930
+ [IS_EXPANDED]: isExpanded,
2931
+ [SELECTED]: selectionStatus
2932
+ } = row;
2933
+ const className = (0, import_classnames8.default)(classBase11, {
2934
+ [`${classBase11}-even`]: rowIndex % 2 === 0,
2935
+ [`${classBase11}-expanded`]: isExpanded,
2936
+ [`${classBase11}-selected`]: selectionStatus & True,
2937
+ [`${classBase11}-selectedStart`]: selectionStatus & First,
2938
+ [`${classBase11}-selectedEnd`]: selectionStatus & Last
2939
+ });
2940
+ const handleRowClick = (0, import_react16.useCallback)(
2941
+ (evt) => {
2942
+ const rangeSelect = evt.shiftKey;
2943
+ const keepExistingSelection = evt.ctrlKey || evt.metaKey;
2944
+ onClick == null ? void 0 : onClick(row, rangeSelect, keepExistingSelection);
2945
+ },
2946
+ [onClick, row]
2947
+ );
2948
+ const handleGroupCellClick = (0, import_react16.useCallback)(
2949
+ (evt, column) => {
2950
+ if ((0, import_vuu_utils21.isGroupColumn)(column) || (0, import_vuu_utils21.isJsonGroup)(column, row)) {
2951
+ evt.stopPropagation();
2952
+ onToggleGroup == null ? void 0 : onToggleGroup(row, column);
2953
+ }
2954
+ },
2955
+ [onToggleGroup, row]
2956
+ );
2957
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
2958
+ "div",
2959
+ {
2960
+ "aria-selected": selectionStatus & True ? true : void 0,
2961
+ "aria-rowindex": rowIndex,
2962
+ className,
2963
+ onClick: handleRowClick,
2964
+ role: "row",
2965
+ style: {
2966
+ transform: `translate3d(0px, ${offset}px, 0px)`
2967
+ },
2968
+ children: [
2969
+ virtualColSpan > 0 ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { role: "cell", style: { width: virtualColSpan } }) : null,
2970
+ columns.filter(import_vuu_utils21.notHidden).map((column) => {
2971
+ const isGroup = (0, import_vuu_utils21.isGroupColumn)(column);
2972
+ const isJsonCell = (0, import_vuu_utils21.isJsonColumn)(column);
2973
+ const Cell = isGroup ? TableGroupCell : TableCell;
2974
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
2975
+ Cell,
2976
+ {
2977
+ column,
2978
+ columnMap,
2979
+ onClick: isGroup || isJsonCell ? handleGroupCellClick : void 0,
2980
+ row
2981
+ },
2982
+ column.name
2983
+ );
2984
+ })
2985
+ ]
2986
+ }
2987
+ );
2988
+ });
2989
+
2990
+ // ../vuu-table/src/table/TableGroupHeaderCell.tsx
2991
+ var import_classnames9 = __toESM(require("classnames"));
2992
+ var import_react18 = require("react");
2993
+
2994
+ // ../vuu-table/src/table/useTableColumnResize.tsx
2995
+ var import_react17 = require("react");
2996
+
2997
+ // ../vuu-table/src/table/TableGroupHeaderCell.tsx
2998
+ var import_jsx_runtime15 = require("react/jsx-runtime");
2999
+
3000
+ // ../vuu-table/src/table/TableHeaderCell.tsx
3001
+ var import_classnames12 = __toESM(require("classnames"));
3002
+ var import_react20 = require("react");
3003
+
3004
+ // ../vuu-table/src/table/SortIndicator.tsx
3005
+ var import_classnames10 = __toESM(require("classnames"));
3006
+ var import_jsx_runtime16 = require("react/jsx-runtime");
3007
+
3008
+ // ../vuu-table/src/table/TableHeaderCell.tsx
3009
+ var import_vuu_popups2 = require("@vuu-ui/vuu-popups");
3010
+
3011
+ // ../vuu-table/src/table/filter-indicator.tsx
3012
+ var import_vuu_popups = require("@vuu-ui/vuu-popups");
3013
+ var import_classnames11 = __toESM(require("classnames"));
3014
+ var import_react19 = require("react");
3015
+ var import_jsx_runtime17 = require("react/jsx-runtime");
3016
+
3017
+ // ../vuu-table/src/table/TableHeaderCell.tsx
3018
+ var import_jsx_runtime18 = require("react/jsx-runtime");
3019
+
3020
+ // ../vuu-table/src/table/RowBasedTable.tsx
3021
+ var import_jsx_runtime19 = require("react/jsx-runtime");
3022
+ var { RENDER_IDX } = import_vuu_utils22.metadataKeys;
3023
+
3024
+ // ../vuu-table/src/table/useTable.ts
3025
+ var import_vuu_popups3 = require("@vuu-ui/vuu-popups");
3026
+ var import_vuu_utils30 = require("@vuu-ui/vuu-utils");
3027
+ var import_react32 = require("react");
3028
+
3029
+ // ../vuu-table/src/table/useDataSource.ts
3030
+ var import_vuu_data_react2 = require("@vuu-ui/vuu-data-react");
3031
+ var import_vuu_utils23 = require("@vuu-ui/vuu-utils");
3032
+ var import_react22 = require("react");
3033
+ var { SELECTED: SELECTED2 } = import_vuu_utils23.metadataKeys;
3034
+
3035
+ // ../vuu-table/src/table/useDraggableColumn.ts
3036
+ var import_vuu_ui_controls6 = require("@vuu-ui/vuu-ui-controls");
3037
+ var import_react23 = require("react");
3038
+
3039
+ // ../vuu-table/src/table/useKeyboardNavigation.ts
3040
+ var import_vuu_utils24 = require("@vuu-ui/vuu-utils");
3041
+ var import_react24 = require("react");
3042
+
3043
+ // ../vuu-table/src/table/keyUtils.ts
3044
+ function union(set1, ...sets) {
3045
+ const result = new Set(set1);
3046
+ for (let set of sets) {
3047
+ for (let element of set) {
3048
+ result.add(element);
3049
+ }
3050
+ }
3051
+ return result;
3052
+ }
3053
+ var ArrowUp = "ArrowUp";
3054
+ var ArrowDown = "ArrowDown";
3055
+ var ArrowLeft = "ArrowLeft";
3056
+ var ArrowRight = "ArrowRight";
3057
+ var Home = "Home";
3058
+ var End = "End";
3059
+ var PageUp = "PageUp";
3060
+ var PageDown = "PageDown";
3061
+ var actionKeys = /* @__PURE__ */ new Set(["Enter", "Delete", " "]);
3062
+ var focusKeys = /* @__PURE__ */ new Set(["Tab"]);
3063
+ var arrowLeftRightKeys = /* @__PURE__ */ new Set(["ArrowRight", "ArrowLeft"]);
3064
+ var navigationKeys = /* @__PURE__ */ new Set([
3065
+ Home,
3066
+ End,
3067
+ PageUp,
3068
+ PageDown,
3069
+ ArrowDown,
3070
+ ArrowLeft,
3071
+ ArrowRight,
3072
+ ArrowUp
3073
+ ]);
3074
+ var functionKeys = /* @__PURE__ */ new Set([
3075
+ "F1",
3076
+ "F2",
3077
+ "F3",
3078
+ "F4",
3079
+ "F5",
3080
+ "F6",
3081
+ "F7",
3082
+ "F8",
3083
+ "F9",
3084
+ "F10",
3085
+ "F11",
3086
+ "F12"
3087
+ ]);
3088
+ var specialKeys = union(
3089
+ actionKeys,
3090
+ navigationKeys,
3091
+ arrowLeftRightKeys,
3092
+ functionKeys,
3093
+ focusKeys
3094
+ );
3095
+
3096
+ // ../vuu-table/src/table/useMeasuredContainer.ts
3097
+ var import_vuu_utils25 = require("@vuu-ui/vuu-utils");
3098
+ var import_react26 = require("react");
3099
+
3100
+ // ../vuu-table/src/table/useResizeObserver.ts
3101
+ var import_react25 = require("react");
3102
+ var observedMap = /* @__PURE__ */ new Map();
3103
+ var getTargetSize = (element, size, dimension) => {
3104
+ switch (dimension) {
3105
+ case "height":
3106
+ return size.height;
3107
+ case "clientHeight":
3108
+ return element.clientHeight;
3109
+ case "clientWidth":
3110
+ return element.clientWidth;
3111
+ case "contentHeight":
3112
+ return size.contentHeight;
3113
+ case "contentWidth":
3114
+ return size.contentWidth;
3115
+ case "scrollHeight":
3116
+ return Math.ceil(element.scrollHeight);
3117
+ case "scrollWidth":
3118
+ return Math.ceil(element.scrollWidth);
3119
+ case "width":
3120
+ return size.width;
3121
+ default:
3122
+ return 0;
3123
+ }
3124
+ };
3125
+ var resizeObserver = new ResizeObserver((entries) => {
3126
+ for (const entry of entries) {
3127
+ const { target, borderBoxSize, contentBoxSize } = entry;
3128
+ const observedTarget = observedMap.get(target);
3129
+ if (observedTarget) {
3130
+ const [{ blockSize: height, inlineSize: width }] = borderBoxSize;
3131
+ const [{ blockSize: contentHeight, inlineSize: contentWidth }] = contentBoxSize;
3132
+ const { onResize, measurements } = observedTarget;
3133
+ let sizeChanged = false;
3134
+ for (const [dimension, size] of Object.entries(measurements)) {
3135
+ const newSize = getTargetSize(
3136
+ target,
3137
+ { height, width, contentHeight, contentWidth },
3138
+ dimension
3139
+ );
3140
+ if (newSize !== size) {
3141
+ sizeChanged = true;
3142
+ measurements[dimension] = newSize;
3143
+ }
3144
+ }
3145
+ if (sizeChanged) {
3146
+ onResize && onResize(measurements);
3147
+ }
3148
+ }
3149
+ }
3150
+ });
3151
+
3152
+ // ../vuu-table/src/table/useSelection.ts
3153
+ var import_vuu_utils26 = require("@vuu-ui/vuu-utils");
3154
+ var import_react27 = require("react");
3155
+ var { IDX: IDX2 } = import_vuu_utils26.metadataKeys;
3156
+
3157
+ // ../vuu-table/src/table/useTableModel.ts
3158
+ var import_vuu_utils27 = require("@vuu-ui/vuu-utils");
3159
+ var import_react28 = require("react");
3160
+ var KEY_OFFSET = import_vuu_utils27.metadataKeys.count;
3161
+
3162
+ // ../vuu-table/src/table/useTableScroll.ts
3163
+ var import_react29 = require("react");
3164
+
3165
+ // ../vuu-table/src/table-next/useTableViewport.ts
3166
+ var import_react30 = require("react");
3167
+ var import_vuu_utils28 = require("@vuu-ui/vuu-utils");
3168
+
3169
+ // ../vuu-table/src/table/useVirtualViewport.ts
3170
+ var import_vuu_utils29 = require("@vuu-ui/vuu-utils");
3171
+ var import_react31 = require("react");
3172
+
3173
+ // ../vuu-table/src/table/useTable.ts
3174
+ var { KEY: KEY4, IS_EXPANDED: IS_EXPANDED2, IS_LEAF: IS_LEAF2 } = import_vuu_utils30.metadataKeys;
3175
+
3176
+ // ../vuu-table/src/table/Table.tsx
3177
+ var import_classnames13 = __toESM(require("classnames"));
3178
+ var import_vuu_utils31 = require("@vuu-ui/vuu-utils");
3179
+ var import_jsx_runtime20 = require("react/jsx-runtime");
3180
+
3181
+ // ../vuu-table/src/table/cell-renderers/json-cell/JsonCell.tsx
3182
+ var import_classnames14 = __toESM(require("classnames"));
3183
+ var import_vuu_utils32 = require("@vuu-ui/vuu-utils");
3184
+ var import_jsx_runtime21 = require("react/jsx-runtime");
3185
+ var classBase12 = "vuuJsonCell";
3186
+ var { IS_EXPANDED: IS_EXPANDED3, KEY: KEY5 } = import_vuu_utils32.metadataKeys;
3187
+ var localKey = (key) => {
3188
+ const pos = key.lastIndexOf("|");
3189
+ if (pos === -1) {
3190
+ return "";
3191
+ } else {
3192
+ return key.slice(pos + 1);
3193
+ }
3194
+ };
3195
+ var JsonCell = ({ column, row }) => {
3196
+ const {
3197
+ key: columnKey
3198
+ /*, type, valueFormatter */
3199
+ } = column;
3200
+ let value = row[columnKey];
3201
+ let isToggle = false;
3202
+ if ((0, import_vuu_utils32.isJsonAttribute)(value)) {
3203
+ value = value.slice(0, -1);
3204
+ isToggle = true;
3205
+ }
3206
+ const rowKey = localKey(row[KEY5]);
3207
+ const className = (0, import_classnames14.default)({
3208
+ [`${classBase12}-name`]: rowKey === value,
3209
+ [`${classBase12}-value`]: rowKey !== value,
3210
+ [`${classBase12}-group`]: isToggle
3211
+ });
3212
+ if (isToggle) {
3213
+ const toggleIcon = row[IS_EXPANDED3] ? "minus-box" : "plus-box";
3214
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("span", { className, children: [
3215
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: `${classBase12}-value`, children: value }),
3216
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: `${classBase12}-toggle`, "data-icon": toggleIcon })
3217
+ ] });
3218
+ } else if (value) {
3219
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className, children: value });
3220
+ } else {
3221
+ return null;
3222
+ }
3223
+ };
3224
+ (0, import_vuu_utils32.registerComponent)("json", JsonCell, "cell-renderer", {
3225
+ description: "JSON formatter",
3226
+ label: "JSON formatter",
3227
+ serverDataType: "json"
3228
+ });
3229
+
3230
+ // ../vuu-table/src/table-next/header-cell/GroupHeaderCell.tsx
3231
+ var import_classnames17 = __toESM(require("classnames"));
3232
+ var import_react37 = require("react");
3233
+
3234
+ // ../vuu-table/src/table-next/column-resizing/ColumnResizer.tsx
3235
+ var import_react33 = require("react");
3236
+ var import_jsx_runtime22 = require("react/jsx-runtime");
3237
+
3238
+ // ../vuu-table/src/table-next/column-resizing/useTableColumnResize.tsx
3239
+ var import_react34 = require("react");
3240
+
3241
+ // ../vuu-table/src/table-next/useCell.ts
3242
+ var import_vuu_utils33 = require("@vuu-ui/vuu-utils");
3243
+ var import_classnames15 = __toESM(require("classnames"));
3244
+ var import_react35 = require("react");
3245
+ var useCell = (column, classBase19, isHeader) => (
3246
+ // TODO measure perf without the memo, might not be worth the cost
3247
+ (0, import_react35.useMemo)(() => {
3248
+ const className = (0, import_classnames15.default)(classBase19, {
3249
+ vuuPinFloating: column.pin === "floating",
3250
+ vuuPinLeft: column.pin === "left",
3251
+ vuuPinRight: column.pin === "right",
3252
+ vuuEndPin: isHeader && column.endPin,
3253
+ // [`${classBase}-resizing`]: column.resizing,
3254
+ [`${classBase19}-editable`]: column.editable,
3255
+ [`${classBase19}-right`]: column.align === "right"
3256
+ });
3257
+ const style = (0, import_vuu_utils33.getColumnStyle)(column);
3258
+ return {
3259
+ className,
3260
+ style
3261
+ };
3262
+ }, [column, classBase19, isHeader])
3263
+ );
3264
+
3265
+ // ../vuu-table/src/table-next/column-header-pill/ColumnHeaderPill.tsx
3266
+ var import_classnames16 = __toESM(require("classnames"));
3267
+ var import_react36 = require("react");
3268
+ var import_jsx_runtime23 = require("react/jsx-runtime");
3269
+
3270
+ // ../vuu-table/src/table-next/column-header-pill/GroupColumnPill.tsx
3271
+ var import_jsx_runtime24 = require("react/jsx-runtime");
3272
+
3273
+ // ../vuu-table/src/table-next/column-header-pill/SortIndicator.tsx
3274
+ var import_jsx_runtime25 = require("react/jsx-runtime");
3275
+
3276
+ // ../vuu-table/src/table-next/header-cell/GroupHeaderCell.tsx
3277
+ var import_jsx_runtime26 = require("react/jsx-runtime");
3278
+ var import_react38 = require("react");
3279
+
3280
+ // ../vuu-table/src/table-next/header-cell/GroupHeaderCellNext.tsx
3281
+ var import_classnames18 = __toESM(require("classnames"));
3282
+ var import_react39 = require("react");
3283
+ var import_vuu_layout = require("@vuu-ui/vuu-layout");
3284
+ var import_jsx_runtime27 = require("react/jsx-runtime");
3285
+ var import_react40 = require("react");
3286
+
3287
+ // ../vuu-table/src/table-next/header-cell/HeaderCell.tsx
3288
+ var import_react42 = require("react");
3289
+
3290
+ // ../vuu-table/src/table-next/column-menu/ColumnMenu.tsx
3291
+ var import_vuu_popups5 = require("@vuu-ui/vuu-popups");
3292
+ var import_classnames19 = __toESM(require("classnames"));
3293
+ var import_react41 = require("react");
3294
+ var import_jsx_runtime28 = require("react/jsx-runtime");
3295
+
3296
+ // ../vuu-table/src/table-next/header-cell/HeaderCell.tsx
3297
+ var import_classnames20 = __toESM(require("classnames"));
3298
+ var import_jsx_runtime29 = require("react/jsx-runtime");
3299
+
3300
+ // ../vuu-table/src/table-next/TableNext.tsx
3301
+ var import_vuu_popups7 = require("@vuu-ui/vuu-popups");
3302
+ var import_vuu_utils43 = require("@vuu-ui/vuu-utils");
3303
+ var import_classnames23 = __toESM(require("classnames"));
3304
+ var import_react56 = require("react");
3305
+
3306
+ // ../vuu-table/src/table-next/Row.tsx
3307
+ var import_vuu_utils36 = require("@vuu-ui/vuu-utils");
3308
+ var import_classnames22 = __toESM(require("classnames"));
3309
+ var import_react45 = require("react");
3310
+
3311
+ // ../vuu-table/src/table-next/table-cell/TableCell.tsx
3312
+ var import_vuu_utils34 = require("@vuu-ui/vuu-utils");
3313
+ var import_react43 = require("react");
3314
+ var import_jsx_runtime30 = require("react/jsx-runtime");
3315
+ var { IDX: IDX3 } = import_vuu_utils34.metadataKeys;
3316
+ var classBase13 = "vuuTableNextCell";
3317
+ var TableCell2 = ({
3318
+ column,
3319
+ columnMap,
3320
+ onDataEdited,
3321
+ row
3322
+ }) => {
3323
+ const { className, style } = useCell(column, classBase13);
3324
+ const { CellRenderer, name: name2, valueFormatter } = column;
3325
+ const dataIdx = columnMap[name2];
3326
+ const handleDataItemEdited = (0, import_react43.useCallback)(
3327
+ (value) => {
3328
+ onDataEdited == null ? void 0 : onDataEdited(row[IDX3], name2, value);
3329
+ return true;
3330
+ },
3331
+ [name2, onDataEdited, row]
3332
+ );
3333
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className, role: "cell", style, children: CellRenderer ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3334
+ CellRenderer,
3335
+ {
3336
+ column,
3337
+ columnMap,
3338
+ onCommit: handleDataItemEdited,
3339
+ row
3340
+ }
3341
+ ) : valueFormatter(row[dataIdx]) });
3342
+ };
3343
+
3344
+ // ../vuu-table/src/table-next/table-cell/TableGroupCell.tsx
3345
+ var import_vuu_utils35 = require("@vuu-ui/vuu-utils");
3346
+ var import_react44 = require("react");
3347
+ var import_classnames21 = __toESM(require("classnames"));
3348
+ var import_jsx_runtime31 = require("react/jsx-runtime");
3349
+ var { IS_LEAF: IS_LEAF3 } = import_vuu_utils35.metadataKeys;
3350
+ var classBase14 = "vuuTableNextGroupCell";
3351
+ var TableGroupCell2 = ({ column, onClick, row }) => {
3352
+ const { columns } = column;
3353
+ const [value, offset] = (0, import_vuu_utils35.getGroupValueAndOffset)(columns, row);
3354
+ const { className, style } = useCell(column, classBase14);
3355
+ const handleClick = (0, import_react44.useCallback)(
3356
+ (evt) => {
3357
+ onClick == null ? void 0 : onClick(evt, column);
3358
+ },
3359
+ [column, onClick]
3360
+ );
3361
+ const isLeaf = row[IS_LEAF3];
3362
+ const spacers = Array(offset).fill(0).map((n, i) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: `${classBase14}-spacer` }, i));
3363
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
3364
+ "div",
3365
+ {
3366
+ className: (0, import_classnames21.default)(className, "vuuTableNextCell"),
3367
+ role: "cell",
3368
+ style,
3369
+ onClick: isLeaf ? void 0 : handleClick,
3370
+ children: [
3371
+ spacers,
3372
+ isLeaf ? null : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: `${classBase14}-toggle`, "data-icon": "triangle-right" }),
3373
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: value })
3374
+ ]
3375
+ }
3376
+ );
3377
+ };
3378
+
3379
+ // ../vuu-table/src/table-next/Row.tsx
3380
+ var import_jsx_runtime32 = require("react/jsx-runtime");
3381
+ var import_react46 = require("react");
3382
+ var { IDX: IDX4, IS_EXPANDED: IS_EXPANDED4, SELECTED: SELECTED3 } = import_vuu_utils36.metadataKeys;
3383
+ var classBase15 = "vuuTableNextRow";
3384
+ var Row2 = (0, import_react45.memo)(
3385
+ ({
3386
+ className: classNameProp,
3387
+ columnMap,
3388
+ columns,
3389
+ row,
3390
+ offset,
3391
+ onClick,
3392
+ onDataEdited,
3393
+ onToggleGroup,
3394
+ zebraStripes = false,
3395
+ ...htmlAttributes
3396
+ }) => {
3397
+ const {
3398
+ [IDX4]: rowIndex,
3399
+ [IS_EXPANDED4]: isExpanded,
3400
+ [SELECTED3]: selectionStatus
3401
+ } = row;
3402
+ const handleRowClick = (0, import_react45.useCallback)(
3403
+ (evt) => {
3404
+ const rangeSelect = evt.shiftKey;
3405
+ const keepExistingSelection = evt.ctrlKey || evt.metaKey;
3406
+ onClick == null ? void 0 : onClick(row, rangeSelect, keepExistingSelection);
3407
+ },
3408
+ [onClick, row]
3409
+ );
3410
+ const { True: True2, First: First2, Last: Last2 } = import_vuu_utils36.RowSelected;
3411
+ const className = (0, import_classnames22.default)(classBase15, classNameProp, {
3412
+ [`${classBase15}-even`]: zebraStripes && rowIndex % 2 === 0,
3413
+ [`${classBase15}-expanded`]: isExpanded,
3414
+ [`${classBase15}-selected`]: selectionStatus & True2,
3415
+ [`${classBase15}-selectedStart`]: selectionStatus & First2,
3416
+ [`${classBase15}-selectedEnd`]: selectionStatus & Last2
3417
+ });
3418
+ const style = { transform: `translate3d(0px, ${offset}px, 0px)` };
3419
+ const handleGroupCellClick = (0, import_react45.useCallback)(
3420
+ (evt, column) => {
3421
+ if ((0, import_vuu_utils36.isGroupColumn)(column) || (0, import_vuu_utils36.isJsonGroup)(column, row)) {
3422
+ evt.stopPropagation();
3423
+ onToggleGroup == null ? void 0 : onToggleGroup(row, column);
3424
+ }
3425
+ },
3426
+ [onToggleGroup, row]
3427
+ );
3428
+ return /* @__PURE__ */ (0, import_react46.createElement)(
3429
+ "div",
3430
+ {
3431
+ ...htmlAttributes,
3432
+ "aria-rowindex": row[0],
3433
+ key: `row-${row[0]}`,
3434
+ role: "row",
3435
+ className,
3436
+ onClick: handleRowClick,
3437
+ style
3438
+ },
3439
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: `${classBase15}-selectionDecorator vuuStickyLeft` }),
3440
+ columns.filter(import_vuu_utils36.notHidden).map((column) => {
3441
+ const isGroup = (0, import_vuu_utils36.isGroupColumn)(column);
3442
+ const isJsonCell = (0, import_vuu_utils36.isJsonColumn)(column);
3443
+ const Cell = isGroup ? TableGroupCell2 : TableCell2;
3444
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
3445
+ Cell,
3446
+ {
3447
+ column,
3448
+ columnMap,
3449
+ onClick: isGroup || isJsonCell ? handleGroupCellClick : void 0,
3450
+ onDataEdited,
3451
+ row
3452
+ },
3453
+ column.key
3454
+ );
3455
+ }),
3456
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: `${classBase15}-selectionDecorator vuuStickyRight` })
3457
+ );
3458
+ }
3459
+ );
3460
+ Row2.displayName = "Row";
3461
+
3462
+ // ../vuu-table/src/table-next/useTableNext.ts
3463
+ var import_vuu_layout2 = require("@vuu-ui/vuu-layout");
3464
+ var import_vuu_ui_controls8 = require("@vuu-ui/vuu-ui-controls");
3465
+
3466
+ // ../vuu-table/src/table-next/useKeyboardNavigation.ts
3467
+ var import_react47 = require("react");
3468
+
3469
+ // ../vuu-table/src/table-next/useTableNext.ts
3470
+ var import_vuu_utils42 = require("@vuu-ui/vuu-utils");
3471
+ var import_react55 = require("react");
3472
+
3473
+ // ../vuu-table/src/table-next/table-config.ts
3474
+ var updateTableConfig = (config, action) => {
3475
+ switch (action.type) {
3476
+ case "col-size":
3477
+ return {
3478
+ ...config,
3479
+ columns: config.columns.map(
3480
+ (col) => col.name === action.column.name ? { ...col, width: action.width } : col
3481
+ )
3482
+ };
3483
+ case "column-prop":
3484
+ return {
3485
+ ...config,
3486
+ columns: config.columns.map(
3487
+ (col) => col.name === action.column.name ? { ...col, [action.property]: action.value } : col
3488
+ )
3489
+ };
3490
+ default:
3491
+ return config;
3492
+ }
3493
+ };
3494
+
3495
+ // ../vuu-table/src/table-next/useDataSource.ts
3496
+ var import_src = require("@vuu-ui/vuu-data-react/src");
3497
+ var import_vuu_utils38 = require("@vuu-ui/vuu-utils");
3498
+ var import_react48 = require("react");
3499
+
3500
+ // ../vuu-table/src/table-next/moving-window.ts
3501
+ var import_vuu_utils37 = require("@vuu-ui/vuu-utils");
3502
+ var { SELECTED: SELECTED4 } = import_vuu_utils37.metadataKeys;
3503
+
3504
+ // ../vuu-table/src/table-next/useInitialValue.ts
3505
+ var import_react49 = require("react");
3506
+
3507
+ // ../vuu-table/src/table-next/useTableContextMenu.ts
3508
+ var import_vuu_utils39 = require("@vuu-ui/vuu-utils");
3509
+ var import_react50 = require("react");
3510
+ var import_vuu_popups6 = require("@vuu-ui/vuu-popups");
3511
+
3512
+ // ../vuu-table/src/table-next/useCellEditing.ts
3513
+ var import_vuu_utils40 = require("@vuu-ui/vuu-utils");
3514
+ var import_react51 = require("react");
3515
+
3516
+ // ../vuu-table/src/table-next/useTableModel.ts
3517
+ var import_vuu_utils41 = require("@vuu-ui/vuu-utils");
3518
+ var import_vuu_ui_controls7 = require("@vuu-ui/vuu-ui-controls");
3519
+ var import_react52 = require("react");
3520
+ var { info } = (0, import_vuu_utils41.logger)("useTableModel");
3521
+ var KEY_OFFSET2 = import_vuu_utils41.metadataKeys.count;
3522
+
3523
+ // ../vuu-table/src/table-next/useTableScroll.ts
3524
+ var import_react53 = require("react");
3525
+
3526
+ // ../vuu-table/src/table-next/useVirtualViewport.ts
3527
+ var import_react54 = require("react");
3528
+
3529
+ // ../vuu-table/src/table-next/useTableNext.ts
3530
+ var { KEY: KEY6, IS_EXPANDED: IS_EXPANDED5, IS_LEAF: IS_LEAF4 } = import_vuu_utils42.metadataKeys;
3531
+
3532
+ // ../vuu-table/src/table-next/TableNext.tsx
3533
+ var import_vuu_layout3 = require("@vuu-ui/vuu-layout");
3534
+ var import_jsx_runtime33 = require("react/jsx-runtime");
3535
+ var import_react57 = require("react");
3536
+ var { IDX: IDX5, RENDER_IDX: RENDER_IDX2 } = import_vuu_utils43.metadataKeys;
3537
+
3538
+ // ../vuu-table/src/table-next/cell-renderers/dropdown-cell/DropdownCell.tsx
3539
+ var import_vuu_ui_controls9 = require("@vuu-ui/vuu-ui-controls");
3540
+ var import_vuu_utils44 = require("@vuu-ui/vuu-utils");
3541
+ var import_react58 = require("react");
3542
+ var import_jsx_runtime34 = require("react/jsx-runtime");
3543
+ var classBase16 = "vuuTableDropdownCell";
3544
+ var openKeys = ["Enter", " "];
3545
+ var DropdownCell = ({ column, columnMap, row }) => {
3546
+ var _a, _b, _c;
3547
+ const values = (0, import_vuu_utils44.isTypeDescriptor)(column.type) && (0, import_vuu_utils44.isColumnTypeRenderer)((_a = column.type) == null ? void 0 : _a.renderer) ? (_c = (_b = column.type) == null ? void 0 : _b.renderer) == null ? void 0 : _c.values : [];
3548
+ const dataIdx = columnMap[column.name];
3549
+ const [value, setValue] = (0, import_react58.useState)(row[dataIdx]);
3550
+ const handleSelectionChange = (0, import_react58.useCallback)(
3551
+ (evt, selectedItem) => {
3552
+ if (selectedItem) {
3553
+ setValue(selectedItem);
3554
+ }
3555
+ },
3556
+ []
3557
+ );
3558
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3559
+ import_vuu_ui_controls9.Dropdown,
3560
+ {
3561
+ className: classBase16,
3562
+ onSelectionChange: handleSelectionChange,
3563
+ openKeys,
3564
+ selected: value,
3565
+ source: values,
3566
+ width: column.width - 17
3567
+ }
3568
+ );
3569
+ };
3570
+ (0, import_vuu_utils44.registerComponent)("dropdown-cell", DropdownCell, "cell-renderer", {});
3571
+
3572
+ // ../vuu-table/src/table-next/cell-renderers/input-cell/InputCell.tsx
3573
+ var import_vuu_utils45 = require("@vuu-ui/vuu-utils");
3574
+ var import_core7 = require("@salt-ds/core");
3575
+ var import_vuu_ui_controls10 = require("@vuu-ui/vuu-ui-controls");
3576
+ var import_classnames24 = __toESM(require("classnames"));
3577
+ var import_jsx_runtime35 = require("react/jsx-runtime");
3578
+ var classBase17 = "vuuTableInputCell";
3579
+ var WarnCommit = () => {
3580
+ console.warn(
3581
+ "onCommit handler has not been provided to InputCell cell renderer"
3582
+ );
3583
+ return true;
3584
+ };
3585
+ var InputCell = ({
3586
+ column,
3587
+ columnMap,
3588
+ onCommit = WarnCommit,
3589
+ row
3590
+ }) => {
3591
+ const dataIdx = columnMap[column.name];
3592
+ const {
3593
+ align = "left",
3594
+ clientSideEditValidationCheck,
3595
+ valueFormatter
3596
+ } = column;
3597
+ const { warningMessage, ...editProps } = (0, import_vuu_ui_controls10.useEditableText)({
3598
+ initialValue: valueFormatter(row[dataIdx]),
3599
+ onCommit,
3600
+ clientSideEditValidationCheck
3601
+ });
3602
+ const endAdornment = warningMessage && align === "left" ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: `${classBase17}-icon`, "data-icon": "error" }) : void 0;
3603
+ const startAdornment = warningMessage && align === "right" ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: `${classBase17}-icon`, "data-icon": "error" }) : void 0;
3604
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
3605
+ import_core7.Input,
3606
+ {
3607
+ ...editProps,
3608
+ className: (0, import_classnames24.default)(classBase17, {
3609
+ [`${classBase17}-error`]: warningMessage !== void 0
3610
+ }),
3611
+ endAdornment,
3612
+ startAdornment
3613
+ }
3614
+ );
3615
+ };
3616
+ (0, import_vuu_utils45.registerComponent)("input-cell", InputCell, "cell-renderer", {});
3617
+
3618
+ // src/table-settings/useTableSettings.ts
3619
+ var import_vuu_utils46 = require("@vuu-ui/vuu-utils");
3620
+ var import_react59 = require("react");
3621
+ var sortOrderFromAvailableColumns = (availableColumns, columns) => {
3622
+ const sortedColumns = [];
3623
+ for (const { name: name2 } of availableColumns) {
3624
+ const column = columns.find((col) => col.name === name2);
3625
+ if (column) {
3626
+ sortedColumns.push(column);
3627
+ }
3628
+ }
3629
+ return sortedColumns;
3630
+ };
3631
+ var buildColumnItems = (availableColumns, configuredColumns) => {
3632
+ return availableColumns.map(({ name: name2, serverDataType }) => {
3633
+ const configuredColumn = configuredColumns.find((col) => col.name === name2);
3634
+ return {
3635
+ hidden: configuredColumn == null ? void 0 : configuredColumn.hidden,
3636
+ isCalculated: (0, import_vuu_utils46.isCalculatedColumn)(name2),
3637
+ label: configuredColumn == null ? void 0 : configuredColumn.label,
3638
+ name: name2,
3639
+ serverDataType,
3640
+ subscribed: configuredColumn !== void 0
3641
+ };
3642
+ });
3643
+ };
3644
+ var useTableSettings = ({
3645
+ availableColumns: availableColumnsProp,
3646
+ onConfigChange,
3647
+ onDataSourceConfigChange,
3648
+ tableConfig: tableConfigProp
3649
+ }) => {
3650
+ const [{ availableColumns, tableConfig }, setColumnState] = (0, import_react59.useState)({
3651
+ availableColumns: availableColumnsProp,
3652
+ tableConfig: tableConfigProp
3653
+ });
3654
+ const columnItems = (0, import_react59.useMemo)(
3655
+ () => buildColumnItems(availableColumns, tableConfig.columns),
3656
+ [availableColumns, tableConfig.columns]
3657
+ );
3658
+ const handleMoveListItem = (0, import_react59.useCallback)(
3659
+ (fromIndex, toIndex) => {
3660
+ setColumnState((state) => {
3661
+ const newAvailableColumns = (0, import_vuu_utils46.moveItem)(
3662
+ state.availableColumns,
3663
+ fromIndex,
3664
+ toIndex
3665
+ );
3666
+ const newColumns = sortOrderFromAvailableColumns(
3667
+ newAvailableColumns,
3668
+ tableConfig.columns
3669
+ );
3670
+ return {
3671
+ availableColumns: newAvailableColumns,
3672
+ tableConfig: {
3673
+ ...state.tableConfig,
3674
+ columns: newColumns
3675
+ }
3676
+ };
3677
+ });
3678
+ },
3679
+ [tableConfig.columns]
3680
+ );
3681
+ const handleColumnChange = (0, import_react59.useCallback)(
3682
+ (name2, property, value) => {
3683
+ const columnItem = columnItems.find((col) => col.name === name2);
3684
+ if (property === "subscribed") {
3685
+ if (columnItem == null ? void 0 : columnItem.subscribed) {
3686
+ const subscribedColumns = tableConfig.columns.filter((col) => col.name !== name2).map((col) => col.name);
3687
+ setColumnState((state) => ({
3688
+ ...state,
3689
+ tableConfig: {
3690
+ ...tableConfig,
3691
+ columns: tableConfig.columns.filter(
3692
+ (0, import_vuu_utils46.subscribedOnly)(subscribedColumns)
3693
+ )
3694
+ }
3695
+ }));
3696
+ onDataSourceConfigChange({
3697
+ columns: subscribedColumns
3698
+ });
3699
+ } else {
3700
+ const newConfig = {
3701
+ ...tableConfig,
3702
+ columns: (0, import_vuu_utils46.addColumnToSubscribedColumns)(
3703
+ tableConfig.columns,
3704
+ availableColumns,
3705
+ name2
3706
+ )
3707
+ };
3708
+ setColumnState((state) => ({
3709
+ ...state,
3710
+ tableConfig: newConfig
3711
+ }));
3712
+ const subscribedColumns = newConfig.columns.map((col) => col.name);
3713
+ onDataSourceConfigChange({
3714
+ columns: subscribedColumns
3715
+ });
3716
+ }
3717
+ } else if (columnItem == null ? void 0 : columnItem.subscribed) {
3718
+ const column = tableConfig.columns.find((col) => col.name === name2);
3719
+ if (column) {
3720
+ const newConfig = updateTableConfig(tableConfig, {
3721
+ type: "column-prop",
3722
+ property,
3723
+ column,
3724
+ value
3725
+ });
3726
+ setColumnState((state) => ({
3727
+ ...state,
3728
+ tableConfig: newConfig
3729
+ }));
3730
+ }
3731
+ }
3732
+ },
3733
+ [availableColumns, columnItems, onDataSourceConfigChange, tableConfig]
3734
+ );
3735
+ const handleChangeColumnLabels = (0, import_react59.useCallback)((evt) => {
3736
+ const { value } = evt.target;
3737
+ const columnFormatHeader = value === "0" ? void 0 : value === "1" ? "capitalize" : "uppercase";
3738
+ setColumnState((state) => ({
3739
+ ...state,
3740
+ tableConfig: {
3741
+ ...state.tableConfig,
3742
+ columnFormatHeader
3743
+ }
3744
+ }));
3745
+ }, []);
3746
+ const handleChangeTableAttribute = (0, import_react59.useCallback)(
3747
+ (evt) => {
3748
+ const { ariaChecked, value } = evt.target;
3749
+ setColumnState((state) => ({
3750
+ ...state,
3751
+ tableConfig: {
3752
+ ...state.tableConfig,
3753
+ [value]: ariaChecked !== "true"
3754
+ }
3755
+ }));
3756
+ },
3757
+ []
3758
+ );
3759
+ (0, import_vuu_layout4.useLayoutEffectSkipFirst)(() => {
3760
+ onConfigChange == null ? void 0 : onConfigChange(tableConfig);
3761
+ }, [onConfigChange, tableConfig]);
3762
+ const columnLabelsValue = tableConfig.columnFormatHeader === void 0 ? 0 : tableConfig.columnFormatHeader === "capitalize" ? 1 : 2;
3763
+ return {
3764
+ columnItems,
3765
+ columnLabelsValue,
3766
+ onChangeColumnLabels: handleChangeColumnLabels,
3767
+ onChangeTableAttribute: handleChangeTableAttribute,
3768
+ onColumnChange: handleColumnChange,
3769
+ onMoveListItem: handleMoveListItem,
3770
+ tableConfig
3771
+ };
3772
+ };
3773
+
3774
+ // src/table-settings/TableSettingsPanel.tsx
3775
+ var import_jsx_runtime36 = require("react/jsx-runtime");
3776
+ var classBase18 = "vuuTableSettingsPanel";
3777
+ var TableSettingsPanel = ({
3778
+ availableColumns,
3779
+ onAddCalculatedColumn,
3780
+ onConfigChange,
3781
+ onDataSourceConfigChange,
3782
+ tableConfig: tableConfigProp,
3783
+ ...htmlAttributes
3784
+ }) => {
3785
+ const {
3786
+ columnItems,
3787
+ columnLabelsValue,
3788
+ onChangeColumnLabels,
3789
+ onChangeTableAttribute,
3790
+ onColumnChange,
3791
+ onMoveListItem,
3792
+ tableConfig
3793
+ } = useTableSettings({
3794
+ availableColumns,
3795
+ onConfigChange,
3796
+ onDataSourceConfigChange,
3797
+ tableConfig: tableConfigProp
3798
+ });
3799
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { ...htmlAttributes, className: classBase18, children: [
3800
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core8.FormField, { children: [
3801
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core8.FormFieldLabel, { children: "Column Labels" }),
3802
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
3803
+ import_core8.ToggleButtonGroup,
3804
+ {
3805
+ className: "vuuToggleButtonGroup",
3806
+ onChange: onChangeColumnLabels,
3807
+ value: columnLabelsValue,
3808
+ children: [
3809
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3810
+ import_core8.ToggleButton,
3811
+ {
3812
+ className: "vuuIconToggleButton",
3813
+ "data-icon": "text-strikethrough",
3814
+ value: 0
3815
+ }
3816
+ ),
3817
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3818
+ import_core8.ToggleButton,
3819
+ {
3820
+ className: "vuuIconToggleButton",
3821
+ "data-icon": "text-Tt",
3822
+ value: 1
3823
+ }
3824
+ ),
3825
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3826
+ import_core8.ToggleButton,
3827
+ {
3828
+ className: "vuuIconToggleButton",
3829
+ "data-icon": "text-T",
3830
+ value: 2
3831
+ }
3832
+ )
3833
+ ]
3834
+ }
3835
+ )
3836
+ ] }),
3837
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core8.FormField, { children: [
3838
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core8.FormFieldLabel, { children: "Grid separators" }),
3839
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "saltToggleButtonGroup vuuToggleButtonGroup saltToggleButtonGroup-horizontal vuuGridSeparators", children: [
3840
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3841
+ import_core8.ToggleButton,
3842
+ {
3843
+ className: "vuuIconToggleButton",
3844
+ "data-icon": "row-striping",
3845
+ selected: tableConfig.zebraStripes,
3846
+ onChange: onChangeTableAttribute,
3847
+ value: "zebraStripes"
3848
+ }
3849
+ ),
3850
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3851
+ import_core8.ToggleButton,
3852
+ {
3853
+ className: "vuuIconToggleButton",
3854
+ "data-icon": "row-lines",
3855
+ selected: tableConfig.rowSeparators,
3856
+ onChange: onChangeTableAttribute,
3857
+ value: "rowSeparators"
3858
+ }
3859
+ ),
3860
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3861
+ import_core8.ToggleButton,
3862
+ {
3863
+ className: "vuuIconToggleButton",
3864
+ "data-icon": "col-lines",
3865
+ selected: tableConfig.columnSeparators,
3866
+ onChange: onChangeTableAttribute,
3867
+ value: "columnSeparators"
3868
+ }
3869
+ )
3870
+ ] })
3871
+ ] }),
3872
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core8.FormField, { children: [
3873
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core8.FormFieldLabel, { children: "Default Column Width" }),
3874
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core8.Input, { className: "vuuInput" })
3875
+ ] }),
3876
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3877
+ ColumnList,
3878
+ {
3879
+ columnItems,
3880
+ onChange: onColumnChange,
3881
+ onMoveListItem
3882
+ }
3883
+ ),
3884
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: `${classBase18}-calculatedButtonbar`, children: [
3885
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core8.Button, { "data-icon": "plus", onClick: onAddCalculatedColumn }),
3886
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: `${classBase18}-calculatedLabel`, children: "Add calculated column" })
3887
+ ] })
3888
+ ] });
3889
+ };
3890
+
3891
+ // src/useTableAndColumnSettings.ts
3892
+ var import_vuu_layout5 = require("@vuu-ui/vuu-layout");
3893
+ var import_vuu_utils47 = require("@vuu-ui/vuu-utils");
3894
+ var import_react60 = require("react");
3895
+ var useTableAndColumnSettings = ({
3896
+ availableColumns: availableColumnsProps,
3897
+ onAvailableColumnsChange,
3898
+ onConfigChange,
3899
+ onCreateCalculatedColumn,
3900
+ onDataSourceConfigChange,
3901
+ tableConfig
3902
+ }) => {
3903
+ const dispatchLayoutAction = (0, import_vuu_layout5.useLayoutProviderDispatch)();
3904
+ const showTableSettingsRef = (0, import_react60.useRef)();
3905
+ const [availableColumns, setAvailableColumns] = (0, import_react60.useState)(
3906
+ availableColumnsProps
3907
+ );
3908
+ const showContextPanel = (0, import_react60.useCallback)(
3909
+ (componentType, title, props) => {
3910
+ dispatchLayoutAction({
3911
+ type: "set-props",
3912
+ path: "#context-panel",
3913
+ props: {
3914
+ expanded: true,
3915
+ content: {
3916
+ type: componentType,
3917
+ props
3918
+ },
3919
+ title
3920
+ }
3921
+ });
3922
+ },
3923
+ [dispatchLayoutAction]
3924
+ );
3925
+ const handleCreateCalculatedColumn = (0, import_react60.useCallback)(
3926
+ (column) => {
3927
+ const newAvailableColumns = availableColumns.concat({
3928
+ name: column.name,
3929
+ serverDataType: (0, import_vuu_utils47.getCalculatedColumnType)(column)
3930
+ });
3931
+ setAvailableColumns(newAvailableColumns);
3932
+ onAvailableColumnsChange == null ? void 0 : onAvailableColumnsChange(newAvailableColumns);
3933
+ requestAnimationFrame(() => {
3934
+ var _a;
3935
+ (_a = showTableSettingsRef.current) == null ? void 0 : _a.call(showTableSettingsRef);
3936
+ });
3937
+ onCreateCalculatedColumn(column);
3938
+ },
3939
+ [availableColumns, onAvailableColumnsChange, onCreateCalculatedColumn]
3940
+ );
3941
+ const showColumnSettingsPanel = (0, import_react60.useCallback)(
3942
+ (action) => {
3943
+ showContextPanel("ColumnSettings", "Column Settings", {
3944
+ column: action.column,
3945
+ onConfigChange,
3946
+ onCreateCalculatedColumn: handleCreateCalculatedColumn,
3947
+ tableConfig,
3948
+ vuuTable: action.vuuTable
3949
+ });
3950
+ },
3951
+ [
3952
+ handleCreateCalculatedColumn,
3953
+ onConfigChange,
3954
+ showContextPanel,
3955
+ tableConfig
3956
+ ]
3957
+ );
3958
+ const handleAddCalculatedColumn = (0, import_react60.useCallback)(() => {
3959
+ showColumnSettingsPanel({
3960
+ column: {
3961
+ name: "::",
3962
+ serverDataType: "string"
3963
+ },
3964
+ type: "columnSettings",
3965
+ vuuTable: { module: "SIMUL", table: "instruments" }
3966
+ });
3967
+ }, [showColumnSettingsPanel]);
3968
+ showTableSettingsRef.current = (0, import_react60.useCallback)(() => {
3969
+ showContextPanel("TableSettings", "DataGrid Settings", {
3970
+ availableColumns: availableColumns != null ? availableColumns : tableConfig.columns.map(({ name: name2, serverDataType }) => ({
3971
+ name: name2,
3972
+ serverDataType
3973
+ })),
3974
+ onAddCalculatedColumn: handleAddCalculatedColumn,
3975
+ onConfigChange,
3976
+ onDataSourceConfigChange,
3977
+ tableConfig
3978
+ });
3979
+ }, [
3980
+ availableColumns,
3981
+ handleAddCalculatedColumn,
3982
+ onConfigChange,
3983
+ onDataSourceConfigChange,
3984
+ showContextPanel,
3985
+ tableConfig
3986
+ ]);
3987
+ return {
3988
+ showColumnSettingsPanel,
3989
+ showTableSettingsPanel: showTableSettingsRef.current
3990
+ };
3991
+ };
2
3992
  //# sourceMappingURL=index.js.map