@vuu-ui/vuu-filters 0.6.10-debug → 0.6.11-debug-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 +1538 -1
- package/cjs/index.js.map +2 -2
- package/esm/index.js +1560 -1
- package/esm/index.js.map +2 -2
- package/index.css +56 -1
- package/index.css.map +1 -1
- package/package.json +7 -5
- package/types/filter-evaluation-utils.d.ts +6 -0
- package/types/filter-input/FilterInput.d.ts +10 -0
- package/types/filter-input/codemirror-basic-setup.d.ts +3 -0
- package/types/filter-input/filter-language-parser/FilterLanguage.d.ts +2 -0
- package/types/filter-input/filter-language-parser/FilterParser.d.ts +2 -0
- package/types/filter-input/filter-language-parser/FilterTreeWalker.d.ts +3 -0
- package/types/filter-input/filter-language-parser/generated/filter-parser.d.ts +2 -0
- package/types/filter-input/filter-language-parser/generated/filter-parser.terms.d.ts +27 -0
- package/types/filter-input/filter-language-parser/index.d.ts +1 -0
- package/types/filter-input/filterInfo.d.ts +1 -0
- package/types/filter-input/highlighting.d.ts +1 -0
- package/types/filter-input/index.d.ts +3 -0
- package/types/filter-input/theme.d.ts +1 -0
- package/types/filter-input/useCodeMirrorEditor.d.ts +29 -0
- package/types/filter-input/useFilterAutoComplete.d.ts +7 -0
- package/types/filter-input/useFilterSuggestionProvider.d.ts +13 -0
- package/types/filter-toolbar/FilterDropdown.d.ts +8 -0
- package/types/filter-toolbar/FilterDropdownMultiSelect.d.ts +8 -0
- package/types/filter-toolbar/FilterToolbar.d.ts +9 -0
- package/types/filter-toolbar/index.d.ts +1 -0
- package/types/filter-toolbar/useFilterToolbar.d.ts +7 -0
- package/types/filter-utils.d.ts +44 -0
- package/types/filterTypes.d.ts +9 -0
- package/types/index.d.ts +5 -0
package/esm/index.js
CHANGED
|
@@ -1,4 +1,1563 @@
|
|
|
1
|
-
var Ae=Object.create;var Z=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var Ie=Object.getOwnPropertyNames;var De=Object.getPrototypeOf,We=Object.prototype.hasOwnProperty;var $e=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ue=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ie(t))!We.call(e,o)&&o!==r&&Z(e,o,{get:()=>t[o],enumerable:!(n=Me(t,o))||n.enumerable});return e};var K=(e,t,r)=>(r=e!=null?Ae(De(e)):{},Ue(t||!e||!e.__esModule?Z(r,"default",{value:e,enumerable:!0}):r,e));var J=(e,t,r)=>{if(!t.has(e))throw TypeError("Cannot "+r)};var F=(e,t,r)=>(J(e,t,"read from private field"),r?r.call(e):t.get(e)),ee=(e,t,r)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,r)},W=(e,t,r,n)=>(J(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);var $=$e((Pr,V)=>{(function(){"use strict";var e={}.hasOwnProperty,t="[native code]";function r(){for(var n=[],o=0;o<arguments.length;o++){var i=arguments[o];if(i){var s=typeof i;if(s==="string"||s==="number")n.push(i);else if(Array.isArray(i)){if(i.length){var c=r.apply(null,i);c&&n.push(c)}}else if(s==="object"){if(i.toString!==Object.prototype.toString&&!i.toString.toString().includes("[native code]")){n.push(i.toString());continue}for(var u in i)e.call(i,u)&&i[u]&&n.push(u)}}}return n.join(" ")}typeof V<"u"&&V.exports?(r.default=r,V.exports=r):typeof define=="function"&&typeof define.amd=="object"&&define.amd?define("classnames",[],function(){return r}):window.classNames=r})()});import{Button as Oe}from"@salt-ds/core";var ge=K($(),1);import{autocompletion as dt,defaultKeymap as gt,ensureSyntaxTree as ft,EditorState as ce,EditorView as me,keymap as L,startCompletion as de}from"@vuu-ui/vuu-codemirror";import{useEffect as Ot,useMemo as Ft,useRef as X}from"react";import{defaultHighlightStyle as Le,defaultKeymap as Xe,drawSelection as He,highlightSpecialChars as _e,history as je,historyKeymap as Be,keymap as Ye,syntaxHighlighting as Ge}from"@vuu-ui/vuu-codemirror";var te=(()=>[_e(),je(),He(),Ge(Le,{fallback:!0}),Ye.of([...Xe,...Be])])();import{LanguageSupport as ze,LRLanguage as Ze,styleTags as Ke,tags as k}from"@vuu-ui/vuu-codemirror";import{LRParser as qe}from"@vuu-ui/vuu-codemirror";var N=qe.deserialize({version:14,states:"%QOVQPOOOOQO'#C_'#C_O_QQO'#C^OOQO'#DO'#DOOvQQO'#C|OOQO'#DR'#DROVQPO'#CuOOQO'#C}'#C}QOQPOOOOQO'#C`'#C`O!UQQO,58xO!dQPO,59VOVQPO,59]OVQPO,59_O!iQPO,59hO!nQQO,59aOOQO'#DQ'#DQOOQO1G.d1G.dO!UQQO1G.qO!yQQO1G.wOOQO1G.y1G.yOOQO'#Cw'#CwOOQO1G/S1G/SOOQO1G.{1G.{O#[QPO'#CnO#dQPO7+$]O!UQQO'#CxO#iQPO,59YOOQO<<Gw<<GwOOQO,59d,59dOOQO-E6v-E6v",stateData:"#q~OoOS~OsPOvUO~OTXOUXOVXOWXOXXOYXO`ZO~Of[Oh]Oj^OmpX~OZ`O[`O]`O^`O~OabO~OseO~Of[Oh]OwgO~Oh]Ofeijeimeiwei~OcjOdbX~OdlO~OcjOdba~O",goto:"#YvPPw}!TPPPPPPPPPPwPP!WPP!ZP!ZP!aP!g!jPPP!p!s!aP#P!aXROU[]XQOU[]RYQRibXTOU[]XVOU[]Rf^QkhRnkRWOQSOQ_UQc[Rd]QaYQhbRmj",nodeNames:"\u26A0 Filter ColumnValueExpression Column Operator Eq NotEq Gt Lt Starts Ends Number String True False ColumnSetExpression In LBrack Values Comma RBrack AndExpression And OrExpression Or ParenthesizedExpression As FilterName",maxTerm:39,skippedNodes:[0],repeatNodeCount:1,tokenData:"6p~RnXY#PYZ#P]^#Ppq#Pqr#brs#mxy$eyz$j|}$o!O!P$t!Q![%S!^!_%_!_!`%d!`!a%i!c!}%n!}#O&V#P#Q&[#R#S%n#T#U&a#U#X%n#X#Y(w#Y#Z+]#Z#]%n#]#^.]#^#c%n#c#d/e#d#g%n#g#h0m#h#i4[#i#o%n~#USo~XY#PYZ#P]^#Ppq#P~#eP!_!`#h~#mOU~~#pWOX#mZ]#m^r#mrs$Ys#O#m#P;'S#m;'S;=`$_<%lO#m~$_O[~~$bP;=`<%l#m~$jOv~~$oOw~~$tOc~~$wP!Q![$z~%PPZ~!Q![$z~%XQZ~!O!P$t!Q![%S~%dOW~~%iOT~~%nOV~P%sUsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%n~&[Oa~~&aOd~R&fYsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c'U#c#g%n#g#h(^#h#o%nR'ZWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#W%n#W#X's#X#o%nR'zUfQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR(eUjQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR(|WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c)f#c#o%nR)kWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#W%n#W#X*T#X#o%nR*YWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h*r#h#o%nR*yUYQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR+bVsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#U+w#U#o%nR+|WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#`%n#`#a,f#a#o%nR,kWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h-T#h#o%nR-YWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#X%n#X#Y-r#Y#o%nR-yU^QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR.bWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c.z#c#o%nR/RU`QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR/jWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g0S#g#o%nR0ZUhQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR0rWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#h%n#h#i1[#i#o%nR1aVsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#U1v#U#o%nR1{WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g2e#g#o%nR2jWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#h%n#h#i3S#i#o%nR3XWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h3q#h#o%nR3xUXQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR4aWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g4y#g#o%nR5OWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#i%n#i#j5h#j#o%nR5mWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#X%n#X#Y6V#Y#o%nR6^U]QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%n",tokenizers:[0,1],topRules:{Filter:[0,1]},tokenPrec:0});var Je=Ze.define({name:"VuuFilterQuery",parser:N.configure({props:[Ke({Identifier:k.variableName,String:k.string,Or:k.emphasis,Operator:k.operator})]})}),re=()=>new ze(Je);import{isMultiClauseFilter as x,isMultiValueFilter as et,isSingleValueFilter as tt}from"@vuu-ui/vuu-utils";var g,U=class{constructor(){ee(this,g,void 0)}setFilterCombinatorOp(t,r=F(this,g)){x(r)&&r.op===t||W(this,g,{op:t,filters:[F(this,g)]})}add(t){if(F(this,g)===void 0)W(this,g,t);else if(x(F(this,g)))F(this,g).filters.push(t);else throw Error("Invalid filter passed to FilterExpression")}setColumn(t,r=F(this,g)){if(x(r)){let n=r.filters.at(-1);n&&this.setColumn(t,n)}else r&&(r.column=t)}setOp(t,r=F(this,g)){if(x(r)){let n=r.filters.at(-1);n&&this.setOp(t,n)}else r&&(r.op=t)}setValue(t,r=F(this,g)){var n;if(x(r)){let o=r.filters.at(-1);o&&this.setValue(t,o)}else et(r)?((n=r.values)!=null||(r.values=[]),r.values.push(t)):tt(r)&&(r.value=t)}toJSON(t=F(this,g)){return this.name?{...t,name:this.name}:t}};g=new WeakMap;var A=(e,t)=>{let r=new U,n=e.cursor();do{let{name:o,from:i,to:s}=n;switch(o){case"ColumnValueExpression":r.add({});break;case"ColumnSetExpression":r.add({op:"in"});break;case"Or":case"And":r.setFilterCombinatorOp(t.substring(i,s));break;case"Column":r.setColumn(t.substring(i,s));break;case"Operator":r.setOp(t.substring(i,s));break;case"String":r.setValue(t.substring(i+1,s-1));break;case"Number":r.setValue(parseFloat(t.substring(i,s)));break;case"True":r.setValue(!0);break;case"False":r.setValue(!1);break;case"FilterName":r.name=t.substring(i,s);break;default:}}while(n.next());return r.toJSON()};import{HighlightStyle as rt,syntaxHighlighting as nt,tags as ne}from"@vuu-ui/vuu-codemirror";var ot=rt.define([{tag:ne.variableName,color:"var(--vuuFilterEditor-variableColor)"},{tag:ne.comment,color:"green",fontStyle:"italic"}]),oe=nt(ot);import{EditorView as it}from"@vuu-ui/vuu-codemirror";var ie=it.theme({"&":{color:"var(--vuuFilterEditor-color)",backgroundColor:"var(--vuuFilterEditor-background)",fontSize:"var(--vuuFilterEditor-fontSize)"},".cm-content":{caretColor:"var(--vuuFilterEditor-cursorColor)",padding:0},".cm-line":{lineHeight:"var(--vuuFilterEditor-lineHeight)"},"&.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":{alignItems:"center",display:"flex",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-completionIcon":{height:"18px",flex:"0 0 16px"},".cm-completionLabel":{flex:"1 1 auto"},".cm-completionIcon-filter":{position:"relative","&:after":{background:"var(--salt-text-secondary-foreground)",content:"''","-webkit-mask":"var(--svg-filter) center center/13px 13px","-webkit-mask-repeat":"no-repeat",position:"absolute",height:"18px",left:"0px",top:"0px",width:"16px"}}},{dark:!1});import{syntaxTree as st}from"@vuu-ui/vuu-codemirror";import{useCallback as se}from"react";var C=(e,t)=>t.doc.sliceString(e.from,e.to),y=(e,t)=>{var r;if(((r=e.firstChild)==null?void 0:r.name)==="Column")return C(e.firstChild,t);{let n=e.prevSibling||e.parent;for(;n&&n.name!=="Column";)n=n.prevSibling||n.parent;if(n)return C(n,t)}},lt=(e,t)=>{let r=e.prevSibling||e.parent;for(;r&&!["Column","Operator","In"].includes(r.name);)r=r.prevSibling||r.parent;if((r==null?void 0:r.name)==="In"||(r==null?void 0:r.name)==="Operator")return C(r,t)},at=(e,t,r)=>{let n=C(e,t);if(!(r===void 0||n===r)&&["contains","ends","starts"].some(o=>o.startsWith(n.toLowerCase())))return n},le=(e,t)=>{let r=e.prevSibling||e.parent||e.lastChild;for(;r&&r.name==="\u26A0";)r=r.prevSibling;if(r&&["As","Or","And"].includes(r.name))return C(r,t)},ut=(e,t)=>{let r=e.lastChild,n=[];for(;r&&r.name!=="In";){let o=C(r,t);if(o)n.push(o);else break;r=r.prevSibling}return n},ae=e=>({from:e.pos,options:[{label:"enter name for this filter",boost:5}]}),pt=[{label:"and",apply:"and ",boost:5},{label:"or",apply:"or ",boost:3},{label:"as",apply:"as ",boost:1}],ue=(e,t,r=!0)=>{let n=t?[{label:"REPLACE existing filter",apply:()=>e("replace"),boost:8},{label:"AND existing filter",apply:()=>e("and"),boost:7},{label:"OR existing filter",apply:()=>e("or"),boost:7}]:[{label:"Press ENTER to submit",apply:()=>e(),boost:6}];return r?n.concat(pt):n},ct=(e,t,r)=>({from:e.pos,options:ue(t,r)}),mt=(e,t,r)=>({from:e.pos,options:ue(t,r,!1)}),pe=(e,t,r)=>{let n=se(async(o,i,s={})=>{let c=await e.getSuggestions(i,s),{startsWith:u=""}=s;return{from:o.pos-u.length,options:c}},[e]);return se(async o=>{var m,p;let{state:i,pos:s}=o,c=(m=o.matchBefore(/\w*/))!=null?m:{from:0,to:0,text:void 0},a=st(i).resolveInner(s,-1);switch(console.log({nodeBeforeName:a.name}),a.name){case"Filter":return o.pos===0?n(o,"column"):le(a,i)==="as"?ae(o):ct(o,t.current,r);case"As":return ae(o);case"FilterName":return mt(o,t.current,r);case"Column":{let l=C(a,i);return await e.isPartialMatch("column",void 0,l)?n(o,"column",{startsWith:l}):n(o,"operator",{columnName:l})}case"\u26A0":{let l=y(a,i),f=lt(a,i),P=f?void 0:at(a,i,l);return P?n(o,"operator",{columnName:l,startsWith:P}):n(o,"columnValue",{columnName:l,operator:f,startsWith:c.text})}case"Identifier":if(le(a,i)==="as")return{from:o.pos,options:[{label:"press ENTER to apply filter and save",apply:()=>t.current(),boost:5}]};break;case"ColumnSetExpression":case"Values":{let l=y(a,i),f=ut(a,i);return n(o,"columnValue",{columnName:l,selection:f})}case"Comma":case"LBrack":{let l=y(a,i);return n(o,"columnValue",{columnName:l})}case"ColumnValueExpression":{let l=(p=a.lastChild)==null?void 0:p.prevSibling;if((l==null?void 0:l.name)==="Column")return n(o,"operator",{columnName:y(a,i)});if((l==null?void 0:l.name)==="Operator")return n(o,"columnValue",{columnName:y(l,i),operator:C(l,i)})}break;case"In":return{from:o.pos,options:[{label:"[",apply:" [",type:"text"}]};case"Eq":return n(o,"columnValue",{columnName:y(a,i)});case"AndExpression":case"OrExpression":return n(o,"column");default:}},[r,n,t,e])};var w=e=>{if(e.current==null)throw Error("EditorView not defined");return e.current},St=e=>(0,ge.default)("vuuSuggestion",{vuuIllustration:e.isIllustration}),Ct=e=>{let t=e.lastIndexOf(" as ");return t!==-1?e.slice(0,t):e},Pt=()=>console.log("noooop"),fe=({existingFilter:e,onSubmitFilter:t,suggestionProvider:r})=>{let n=X(null),o=X(Pt),i=X(),s=pe(r,o,e),[c,u]=Ft(()=>{let a=()=>{let d=w(i),S=d.state.doc.toString(),v=ft(d.state,d.state.doc.length,5e3);if(v){let Q=A(v,S);return[Q,Ct(S),Q.name]}else return[void 0,"",void 0]},m=()=>{w(i).setState(P())},p=d=>{let[S,v,Q]=a();t==null||t(S,v,d,Q),m()},l=d=>L.of([{key:d,run(){return p(),!0}}]),f=d=>L.of([{key:d,run(){return de(w(i)),!0}}]),P=()=>ce.create({doc:"",extensions:[te,dt({override:[s],optionClass:St}),re(),L.of(gt),l("Ctrl-Enter"),f("ArrowDown"),me.updateListener.of(d=>{let S=w(i);d.docChanged&&de(S)}),ce.transactionFilter.of(d=>d.newDoc.lines>1?[]:d),ie,oe]});return o.current=d=>{p(d),setTimeout(()=>{w(i).focus()},100)},[P,m]},[s,t]);return Ot(()=>{if(!n.current)throw Error("editor not in dom");return i.current=new me({state:c(),parent:n.current}),()=>{var a;(a=i.current)==null||a.destroy()}},[s,c]),{editorRef:n,clearInput:u}};import{jsx as H,jsxs as bt}from"react/jsx-runtime";var M="vuuFilterInput",dn=({existingFilter:e,namedFilters:t,onSubmitFilter:r,suggestionProvider:n,...o})=>{let{editorRef:i,clearInput:s}=fe({existingFilter:e,onSubmitFilter:r,suggestionProvider:n});return bt("div",{...o,className:M,children:[H(Oe,{className:`${M}-FilterButton`,"data-icon":"filter"}),H("div",{className:`${M}-Editor`,ref:i}),H(Oe,{className:`${M}-ClearButton`,"data-icon":"close-circle",onClick:s})]})};import{useTypeaheadSuggestions as ht}from"@vuu-ui/vuu-data";import{useCallback as Se,useRef as vt}from"react";import{createEl as I}from"@vuu-ui/vuu-utils";var Fe=(e,t)=>{let r=I("div","vuuFunctionDoc"),n=I("div","function-heading"),o=I("span","function-name",e);n.appendChild(o);let i=I("p",void 0,t);return r.appendChild(n),r.appendChild(i),r};var yt=[],Tt={},xt=e=>e.map(t=>({boost:5,label:t.name})),wt=e=>e?Array.from(e.entries()).map(([t,r])=>({info:()=>Fe(t,r),label:t,type:"filter"})):yt,Et={label:"Done",apply:"] ",type:"keyword",boost:10},Ce=[{label:"=",boost:10},{label:"!=",boost:9}],Rt=[...Ce,{label:"in",boost:6},{label:"starts",boost:5},{label:"ends",boost:4}],Qt=[...Ce,{label:">",boost:8},{label:"<",boost:7}],Vt=(e,t=!1,r="",n=!1)=>{let o=t?'"':"";return e.map(i=>({isIllustration:n,label:i,apply:n?`${o}${r}${o}`:`${r}${o}${i}${o} `}))},D=(e,t="")=>e.filter(r=>t===""||r.label.startsWith(t)).map(r=>({...r,apply:r.label+" "})),Nt=(e,t,r="",n=[])=>r!==""&&!n.includes(r.toLowerCase())?[e,t,r]:[e,t],bn=({columns:e,namedFilters:t,table:r})=>{let n=vt(),o=ht(),i=Se(async(c,{columnName:u,operator:a,startsWith:m,selection:p}=Tt)=>{if(c==="operator"){let l=e.find(f=>f.name===u);if(l)switch(l.serverDataType){case"string":case"char":return D(Rt,m);case"int":case"long":case"double":return D(Qt)}else console.warn(`'${u}' does not match any column name`)}else if(c==="column"){let l=await xt(e),f=await wt(t);return(n.current=D(l)).concat(D(f))}if(u){let l=e.find(v=>v.name===u),f=Array.isArray(p)?p.length===0?"[":",":"",P=Nt(r,u,m),d=await o(P),S=a==="starts";return n.current=Vt(d,(l==null?void 0:l.serverDataType)==="string",S?m:f,S),Array.isArray(p)&&(p==null?void 0:p.length)>1?[Et,...n.current]:n.current}return[]},[e,o,t,r]),s=Se(async(c,u,a)=>{let m=await i(c,{columnName:u});if(a&&m)for(let p of m){if(p.label===a)return!1;if(p.label.startsWith(a))return!0}return!1},[i]);return{getSuggestions:i,isPartialMatch:s}};var Ee=K($(),1);import{Toolbar as _t}from"@heswell/salt-lab";import{ToggleButton as Ht,ToolbarField as ye}from"@heswell/salt-lab";import{Dropdown as kt}from"@heswell/salt-lab";import{useCallback as At,useState as Mt}from"react";import{jsx as Dt}from"react/jsx-runtime";var It=e=>typeof e=="string",Pe=e=>It(e)?e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e:e.map(Pe),be=({column:e,selected:t,suggestionProvider:r,...n})=>{let o=t!=null?Pe(t):void 0,i=Array.isArray(o)?o:o!=null?[o]:[],[s,c]=Mt(i);console.log({initialValues:i});let u=At(async a=>{if(a){let m=await r.getSuggestions("columnValue",{columnName:e});console.log({values:m}),c(m.map(p=>p.label))}},[e,r]);return Dt(kt,{...n,onOpenChange:u,selected:o,source:s})};import{Dropdown as Wt}from"@heswell/salt-lab";import{useCallback as $t,useState as Ut}from"react";import{jsx as Xt}from"react/jsx-runtime";var Lt=e=>typeof e=="string",he=e=>{if(e!==void 0)return Lt(e)?e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e:e.map(he)},ve=({column:e,selected:t,suggestionProvider:r,...n})=>{let o=he(t),i=Array.isArray(o)?o:o!=null?[o]:[],[s,c]=Ut(i),u=$t(async a=>{if(a){let m=await r.getSuggestions("columnValue",{columnName:e});console.log({values:m}),c(m.map(p=>p.label))}},[e,r]);return Xt(Wt,{...n,onOpenChange:u,selected:o,selectionStrategy:"multiple",source:s})};import{jsx as E}from"react/jsx-runtime";var Te=(e,t)=>{if(we(e))return E(Ht,{className:"vuuToggleButton",toggled:!0,variant:"secondary",children:e.name});if(T(e)){let{column:r,value:n}=e;return E(ye,{className:"vuuFilterDropdown",label:r,labelPlacement:"top",children:E(be,{column:r,selected:n.toString(),selectionStrategy:"default",source:[n.toString()],suggestionProvider:t,style:{width:100}})},r)}if(b(e)){let r=e.values.map(n=>n.toString());return E(ye,{className:"vuuFilterDropdown",label:e.column,labelPlacement:"top",children:E(ve,{column:e.column,selected:r,source:r,suggestionProvider:t,style:{width:100}})},e.column)}return e.filters.map(r=>Te(r,t))},xe=({filter:e,suggestionProvider:t})=>e?Te(e,t):[];import{jsx as jt}from"react/jsx-runtime";var Zn=({className:e,filter:t,suggestionProvider:r,...n})=>{console.log(`FilterToolbar ${JSON.stringify(t,null,2)}`);let o=xe({filter:t,suggestionProvider:r});return jt(_t,{className:(0,Ee.default)("vuuFilterToolbar",e),...n,children:o})};var Bt=N.configure({strict:!0}),Re=e=>{let t=Bt.parse(e);return A(t,e)};var Qe=new Map,Yt=()=>!1,so=(e,t)=>{let r=Qe.get(t);if(r)return r;try{let n=Re(t);return r=_(e,n),Qe.set(t,r),r}catch{return console.warn(`filter-evaluation-utils, failed to parse filter "${t}"`),Yt}};function _(e,t){switch(t.op){case"in":return Gt(e,t);case"=":return qt(e,t);case">":return zt(e,t);case">=":return Zt(e,t);case"<":return Kt(e,t);case"<=":return Jt(e,t);case"starts":return er(e,t);case"and":return tr(e,t);case"or":return rr(e,t);default:return console.log(`unrecognized filter type ${t.op}`),()=>!0}}var Gt=(e,t)=>r=>t.values.indexOf(r[e[t.column]])!==-1,qt=(e,t)=>r=>r[e[t.column]]===t.value,zt=(e,t)=>r=>r[e[t.column]]>t.value,Zt=(e,t)=>r=>r[e[t.column]]>=t.value,Kt=(e,t)=>r=>r[e[t.column]]<t.value,Jt=(e,t)=>r=>r[e[t.column]]<=t.value,er=(e,t)=>{let r=t.value;if(typeof r!="string")throw Error("string filter applied to value of wrong type");return n=>{let o=n[e[t.column]];if(typeof o!="string")throw Error("string filter applied to value of wrong type");return o.toLowerCase().startsWith(r.toLowerCase())}},tr=(e,t)=>{let r=t.filters.map(n=>_(e,n));return n=>r.every(o=>o(n))};function rr(e,t){let r=t.filters.map(n=>_(e,n));return n=>r.some(o=>o(n))}import{extractFilterForColumn as or,partition as ir}from"@vuu-ui/vuu-utils";var nr=new Set(["=","!=",">",">=","<","<=","starts","ends"]),we=e=>e!==void 0&&e.name!==void 0,T=e=>e!==void 0&&nr.has(e.op),ao=e=>e!==void 0&&(T(e)||b(e)),b=e=>e!==void 0&&e.op==="in",R=e=>e.op==="in",j=e=>e.op==="and",Ve=e=>e.op==="or";function h(e){return e!==void 0&&(e.op==="and"||e.op==="or")}var O="and",B="=",go=">",fo="<",sr="or",Ne="starts",Oo="ends",lr="in",ar=(e,t=[])=>(e&&(h(e)?e.filters.forEach(r=>t.push(...ar(r))):t.push(e)),t),ur={combineWith:"and"},Fo=(e,t,{combineWith:r=O}=ur)=>{var n;if(z(t))h(t)||(e=G(e,{name:t.column}));else if(cr(t))return h(t),G(e,{name:(n=t.column)!=null?n:""});if(!e)return t;if(!t)return e;if(e.op===O&&t.op===O)return{op:O,filters:gr(e.filters,t.filters)};if(e.op===O){let o=mr(e.filters,t);return o.length>1?{op:O,filters:o}:o[0]}return t.op===O?{op:O,filters:t.filters.concat(e)}:q(e,t,!0)?t:ke(e,t)?dr(e,t):{op:r,filters:[e,t]}},z=e=>e?R(e)&&e.values.length===0?!0:j(e)&&e.filters.some(t=>z(t)):!1,pr=e=>typeof e=="string"?`"${e}"`:e,Y=(e,t={})=>h(e)?e.filters.map(r=>Y(r)).join(` ${e.op} `):b(e)?`${e.column} ${e.op} [${e.values.join(",")}]`:`${e.column} ${e.op} ${pr(e.value)}`,cr=e=>e?e.op===Ne&&e.value===""?!0:e.op===Ne&&e.value==="":!1,mr=(e,t)=>e.concat(t),dr=(e,t)=>z(t)?t:R(e)&&R(t)?{...e,values:[...e.values,...t.values.filter(r=>!e.values.includes(r))]}:R(e)&&t.op===B?{...e,values:e.values.concat([t.value])}:e.op===B&&t.op===B?{column:e.column,op:lr,values:[e.value,t.value]}:t,gr=(e,t)=>{let r=({op:i},{op:s})=>i===s||i[0]===s[0],n=(i,s)=>i.column===s.column&&r(i,s),o=i=>t.some(s=>n(i,s))===!1;return e.filter(o).concat(t)},So=(e,t)=>{if(h(t)){let[r,n]=t.filters;if(r.column===e.name)return[n,Y(n)];if(n.column===e.name)return[r,Y(r)]}return[void 0,""]},Co=(e,t)=>{if(q(e,t,!0))return null;if(e.op!==O)throw Error(`removeFilter cannot remove ${JSON.stringify(t)} from ${JSON.stringify(e)}`);let r=e.filters.filter(n=>!q(n,t));return r.length>0?{type:O,filters:r}:null},Po=(e,t)=>{if(!e)return[null,null];if(e.column===t)return[e,null];if(e.op!==O)return[null,e];let[[r=null],n]=ir(e.filters,o=>o.column===t);return n.length===1?[r,n[0]]:[r,{op:O,filters:n}]},fr=(e,t)=>h(e)?{op:e.op,filters:e.filters.map(r=>fr(r,t))}:{...e,column:t},Or=(e,t)=>{if(!e)return!1;let{op:r,column:n}=e;switch(r){case O:case sr:return e.filters!=null&&e.filters.some(o=>Or(o,t));default:return n===t.name}},G=(e,t)=>{let r=t.name;if(e&&e.column!==r){if(j(e)||Ve(e)){let{op:n}=e,i=e.filters.filter(s=>s.column!==r);switch(i.length){case 0:return;case 1:return i[0];default:return{op:n,filters:i}}}return e}},ke=(e,t)=>e.column===t.column&&(e.op==="="||e.op==="in")&&(t.op==="="||t.op==="in"),Fr=(e,t)=>{if(e===t)return!0;if(e.length===t.length){let r=e.slice().sort(),n=t.slice().sort();return r.join("|")===n.join("|")}return!1},q=(e,t,r=!1)=>r?e&&t&&ke(e,t)?e.op===t.op&&(T(e)&&T(t)&&e.value===t.value||b(e)&&b(t)&&Fr(e.values,t.values)):!1:!0,Sr=(e,t,r)=>{if(e&&t){if(r==="replace")return t;if(e.op==="and")return{...e,filters:e.filters.concat(t)};let{column:n}=t;if(n&&(t.column?or(e,n):void 0)&&n){let i=G(e,{name:n});return Sr(i,t,"add")}return{op:"and",filters:[e,t]}}return t||e};export{O as AND,Oo as ENDS_WITH,B as EQUALS,dn as FilterInput,Zn as FilterToolbar,go as GREATER_THAN,lr as IN,fo as LESS_THAN,sr as OR,Ne as STARTS_WITH,Fo as addFilter,Y as filterAsQuery,ar as filterClauses,q as filterEquals,Or as filterIncludesColumn,_ as filterPredicate,so as getFilterPredicate,j as isAndFilter,ao as isFilterClause,R as isInFilter,h as isMultiClauseFilter,b as isMultiValueFilter,we as isNamedFilter,Ve as isOrFilter,T as isSingleValueFilter,fr as overrideColName,So as removeColumnFromFilter,Co as removeFilter,Po as splitFilterOnColumn,Sr as updateFilter,fe as useCodeMirrorEditor,bn as useFilterSuggestionProvider};
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
8
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
19
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
20
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
21
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
22
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
23
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
24
|
+
mod
|
|
25
|
+
));
|
|
26
|
+
var __accessCheck = (obj, member, msg) => {
|
|
27
|
+
if (!member.has(obj))
|
|
28
|
+
throw TypeError("Cannot " + msg);
|
|
29
|
+
};
|
|
30
|
+
var __privateGet = (obj, member, getter) => {
|
|
31
|
+
__accessCheck(obj, member, "read from private field");
|
|
32
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
33
|
+
};
|
|
34
|
+
var __privateAdd = (obj, member, value) => {
|
|
35
|
+
if (member.has(obj))
|
|
36
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
37
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
38
|
+
};
|
|
39
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
40
|
+
__accessCheck(obj, member, "write to private field");
|
|
41
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
42
|
+
return value;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// ../../node_modules/classnames/index.js
|
|
46
|
+
var require_classnames = __commonJS({
|
|
47
|
+
"../../node_modules/classnames/index.js"(exports, module) {
|
|
48
|
+
(function() {
|
|
49
|
+
"use strict";
|
|
50
|
+
var hasOwn = {}.hasOwnProperty;
|
|
51
|
+
var nativeCodeString = "[native code]";
|
|
52
|
+
function classNames() {
|
|
53
|
+
var classes = [];
|
|
54
|
+
for (var i = 0; i < arguments.length; i++) {
|
|
55
|
+
var arg = arguments[i];
|
|
56
|
+
if (!arg)
|
|
57
|
+
continue;
|
|
58
|
+
var argType = typeof arg;
|
|
59
|
+
if (argType === "string" || argType === "number") {
|
|
60
|
+
classes.push(arg);
|
|
61
|
+
} else if (Array.isArray(arg)) {
|
|
62
|
+
if (arg.length) {
|
|
63
|
+
var inner = classNames.apply(null, arg);
|
|
64
|
+
if (inner) {
|
|
65
|
+
classes.push(inner);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
} else if (argType === "object") {
|
|
69
|
+
if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes("[native code]")) {
|
|
70
|
+
classes.push(arg.toString());
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
for (var key in arg) {
|
|
74
|
+
if (hasOwn.call(arg, key) && arg[key]) {
|
|
75
|
+
classes.push(key);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return classes.join(" ");
|
|
81
|
+
}
|
|
82
|
+
if (typeof module !== "undefined" && module.exports) {
|
|
83
|
+
classNames.default = classNames;
|
|
84
|
+
module.exports = classNames;
|
|
85
|
+
} else if (typeof define === "function" && typeof define.amd === "object" && define.amd) {
|
|
86
|
+
define("classnames", [], function() {
|
|
87
|
+
return classNames;
|
|
88
|
+
});
|
|
89
|
+
} else {
|
|
90
|
+
window.classNames = classNames;
|
|
91
|
+
}
|
|
92
|
+
})();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// src/filter-input/FilterInput.tsx
|
|
97
|
+
import { Button } from "@salt-ds/core";
|
|
98
|
+
|
|
99
|
+
// src/filter-input/useCodeMirrorEditor.ts
|
|
100
|
+
var import_classnames = __toESM(require_classnames(), 1);
|
|
101
|
+
import {
|
|
102
|
+
autocompletion,
|
|
103
|
+
defaultKeymap as defaultKeymap2,
|
|
104
|
+
ensureSyntaxTree,
|
|
105
|
+
EditorState as EditorState2,
|
|
106
|
+
EditorView as EditorView2,
|
|
107
|
+
keymap as keymap2,
|
|
108
|
+
startCompletion
|
|
109
|
+
} from "@vuu-ui/vuu-codemirror";
|
|
110
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
111
|
+
|
|
112
|
+
// src/filter-input/codemirror-basic-setup.ts
|
|
113
|
+
import {
|
|
114
|
+
defaultHighlightStyle,
|
|
115
|
+
defaultKeymap,
|
|
116
|
+
drawSelection,
|
|
117
|
+
highlightSpecialChars,
|
|
118
|
+
history,
|
|
119
|
+
historyKeymap,
|
|
120
|
+
keymap,
|
|
121
|
+
syntaxHighlighting
|
|
122
|
+
} from "@vuu-ui/vuu-codemirror";
|
|
123
|
+
var minimalSetup = (() => [
|
|
124
|
+
highlightSpecialChars(),
|
|
125
|
+
history(),
|
|
126
|
+
drawSelection(),
|
|
127
|
+
syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
|
|
128
|
+
keymap.of([...defaultKeymap, ...historyKeymap])
|
|
129
|
+
])();
|
|
130
|
+
|
|
131
|
+
// src/filter-input/filter-language-parser/FilterLanguage.ts
|
|
132
|
+
import {
|
|
133
|
+
LanguageSupport,
|
|
134
|
+
LRLanguage,
|
|
135
|
+
styleTags,
|
|
136
|
+
tags as tag
|
|
137
|
+
} from "@vuu-ui/vuu-codemirror";
|
|
138
|
+
|
|
139
|
+
// src/filter-input/filter-language-parser/generated/filter-parser.js
|
|
140
|
+
import { LRParser } from "@vuu-ui/vuu-codemirror";
|
|
141
|
+
var parser = LRParser.deserialize({
|
|
142
|
+
version: 14,
|
|
143
|
+
states: "%QOVQPOOOOQO'#C_'#C_O_QQO'#C^OOQO'#DO'#DOOvQQO'#C|OOQO'#DR'#DROVQPO'#CuOOQO'#C}'#C}QOQPOOOOQO'#C`'#C`O!UQQO,58xO!dQPO,59VOVQPO,59]OVQPO,59_O!iQPO,59hO!nQQO,59aOOQO'#DQ'#DQOOQO1G.d1G.dO!UQQO1G.qO!yQQO1G.wOOQO1G.y1G.yOOQO'#Cw'#CwOOQO1G/S1G/SOOQO1G.{1G.{O#[QPO'#CnO#dQPO7+$]O!UQQO'#CxO#iQPO,59YOOQO<<Gw<<GwOOQO,59d,59dOOQO-E6v-E6v",
|
|
144
|
+
stateData: "#q~OoOS~OsPOvUO~OTXOUXOVXOWXOXXOYXO`ZO~Of[Oh]Oj^OmpX~OZ`O[`O]`O^`O~OabO~OseO~Of[Oh]OwgO~Oh]Ofeijeimeiwei~OcjOdbX~OdlO~OcjOdba~O",
|
|
145
|
+
goto: "#YvPPw}!TPPPPPPPPPPwPP!WPP!ZP!ZP!aP!g!jPPP!p!s!aP#P!aXROU[]XQOU[]RYQRibXTOU[]XVOU[]Rf^QkhRnkRWOQSOQ_UQc[Rd]QaYQhbRmj",
|
|
146
|
+
nodeNames: "\u26A0 Filter ColumnValueExpression Column Operator Eq NotEq Gt Lt Starts Ends Number String True False ColumnSetExpression In LBrack Values Comma RBrack AndExpression And OrExpression Or ParenthesizedExpression As FilterName",
|
|
147
|
+
maxTerm: 39,
|
|
148
|
+
skippedNodes: [0],
|
|
149
|
+
repeatNodeCount: 1,
|
|
150
|
+
tokenData: "6p~RnXY#PYZ#P]^#Ppq#Pqr#brs#mxy$eyz$j|}$o!O!P$t!Q![%S!^!_%_!_!`%d!`!a%i!c!}%n!}#O&V#P#Q&[#R#S%n#T#U&a#U#X%n#X#Y(w#Y#Z+]#Z#]%n#]#^.]#^#c%n#c#d/e#d#g%n#g#h0m#h#i4[#i#o%n~#USo~XY#PYZ#P]^#Ppq#P~#eP!_!`#h~#mOU~~#pWOX#mZ]#m^r#mrs$Ys#O#m#P;'S#m;'S;=`$_<%lO#m~$_O[~~$bP;=`<%l#m~$jOv~~$oOw~~$tOc~~$wP!Q![$z~%PPZ~!Q![$z~%XQZ~!O!P$t!Q![%S~%dOW~~%iOT~~%nOV~P%sUsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%n~&[Oa~~&aOd~R&fYsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c'U#c#g%n#g#h(^#h#o%nR'ZWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#W%n#W#X's#X#o%nR'zUfQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR(eUjQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR(|WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c)f#c#o%nR)kWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#W%n#W#X*T#X#o%nR*YWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h*r#h#o%nR*yUYQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR+bVsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#U+w#U#o%nR+|WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#`%n#`#a,f#a#o%nR,kWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h-T#h#o%nR-YWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#X%n#X#Y-r#Y#o%nR-yU^QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR.bWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c.z#c#o%nR/RU`QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR/jWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g0S#g#o%nR0ZUhQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR0rWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#h%n#h#i1[#i#o%nR1aVsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#U1v#U#o%nR1{WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g2e#g#o%nR2jWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#h%n#h#i3S#i#o%nR3XWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h3q#h#o%nR3xUXQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR4aWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g4y#g#o%nR5OWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#i%n#i#j5h#j#o%nR5mWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#X%n#X#Y6V#Y#o%nR6^U]QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%n",
|
|
151
|
+
tokenizers: [0, 1],
|
|
152
|
+
topRules: { "Filter": [0, 1] },
|
|
153
|
+
tokenPrec: 0
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// src/filter-input/filter-language-parser/FilterLanguage.ts
|
|
157
|
+
var filterLanguage = LRLanguage.define({
|
|
158
|
+
name: "VuuFilterQuery",
|
|
159
|
+
parser: parser.configure({
|
|
160
|
+
props: [
|
|
161
|
+
styleTags({
|
|
162
|
+
Identifier: tag.variableName,
|
|
163
|
+
String: tag.string,
|
|
164
|
+
Or: tag.emphasis,
|
|
165
|
+
Operator: tag.operator
|
|
166
|
+
})
|
|
167
|
+
]
|
|
168
|
+
})
|
|
169
|
+
});
|
|
170
|
+
var filterLanguageSupport = () => {
|
|
171
|
+
return new LanguageSupport(filterLanguage);
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// src/filter-input/filter-language-parser/FilterTreeWalker.ts
|
|
175
|
+
import {
|
|
176
|
+
isMultiClauseFilter,
|
|
177
|
+
isMultiValueFilter,
|
|
178
|
+
isSingleValueFilter
|
|
179
|
+
} from "@vuu-ui/vuu-utils";
|
|
180
|
+
var _filter;
|
|
181
|
+
var FilterExpression = class {
|
|
182
|
+
constructor() {
|
|
183
|
+
__privateAdd(this, _filter, void 0);
|
|
184
|
+
}
|
|
185
|
+
setFilterCombinatorOp(op, filter = __privateGet(this, _filter)) {
|
|
186
|
+
if (isMultiClauseFilter(filter) && filter.op === op) {
|
|
187
|
+
return;
|
|
188
|
+
} else {
|
|
189
|
+
__privateSet(this, _filter, {
|
|
190
|
+
op,
|
|
191
|
+
filters: [__privateGet(this, _filter)]
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
add(filter) {
|
|
196
|
+
if (__privateGet(this, _filter) === void 0) {
|
|
197
|
+
__privateSet(this, _filter, filter);
|
|
198
|
+
} else if (isMultiClauseFilter(__privateGet(this, _filter))) {
|
|
199
|
+
__privateGet(this, _filter).filters.push(filter);
|
|
200
|
+
} else {
|
|
201
|
+
throw Error(`Invalid filter passed to FilterExpression`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
setColumn(column, filter = __privateGet(this, _filter)) {
|
|
205
|
+
if (isMultiClauseFilter(filter)) {
|
|
206
|
+
const target = filter.filters.at(-1);
|
|
207
|
+
if (target) {
|
|
208
|
+
this.setColumn(column, target);
|
|
209
|
+
}
|
|
210
|
+
} else if (filter) {
|
|
211
|
+
filter.column = column;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
setOp(value, filter = __privateGet(this, _filter)) {
|
|
215
|
+
if (isMultiClauseFilter(filter)) {
|
|
216
|
+
const target = filter.filters.at(-1);
|
|
217
|
+
if (target) {
|
|
218
|
+
this.setOp(value, target);
|
|
219
|
+
}
|
|
220
|
+
} else if (filter) {
|
|
221
|
+
filter.op = value;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
setValue(value, filter = __privateGet(this, _filter)) {
|
|
225
|
+
var _a;
|
|
226
|
+
if (isMultiClauseFilter(filter)) {
|
|
227
|
+
const target = filter.filters.at(-1);
|
|
228
|
+
if (target) {
|
|
229
|
+
this.setValue(value, target);
|
|
230
|
+
}
|
|
231
|
+
} else if (isMultiValueFilter(filter)) {
|
|
232
|
+
(_a = filter.values) != null ? _a : filter.values = [];
|
|
233
|
+
filter.values.push(value);
|
|
234
|
+
} else if (isSingleValueFilter(filter)) {
|
|
235
|
+
filter.value = value;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
toJSON(filter = __privateGet(this, _filter)) {
|
|
239
|
+
if (this.name) {
|
|
240
|
+
return {
|
|
241
|
+
...filter,
|
|
242
|
+
name: this.name
|
|
243
|
+
};
|
|
244
|
+
} else {
|
|
245
|
+
return filter;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
_filter = new WeakMap();
|
|
250
|
+
var walkTree = (tree, source) => {
|
|
251
|
+
const filterExpression = new FilterExpression();
|
|
252
|
+
const cursor = tree.cursor();
|
|
253
|
+
do {
|
|
254
|
+
const { name, from, to } = cursor;
|
|
255
|
+
switch (name) {
|
|
256
|
+
case "ColumnValueExpression":
|
|
257
|
+
filterExpression.add({});
|
|
258
|
+
break;
|
|
259
|
+
case "ColumnSetExpression":
|
|
260
|
+
filterExpression.add({ op: "in" });
|
|
261
|
+
break;
|
|
262
|
+
case "Or":
|
|
263
|
+
case "And":
|
|
264
|
+
filterExpression.setFilterCombinatorOp(source.substring(from, to));
|
|
265
|
+
break;
|
|
266
|
+
case "Column":
|
|
267
|
+
filterExpression.setColumn(source.substring(from, to));
|
|
268
|
+
break;
|
|
269
|
+
case "Operator":
|
|
270
|
+
filterExpression.setOp(source.substring(from, to));
|
|
271
|
+
break;
|
|
272
|
+
case "String":
|
|
273
|
+
filterExpression.setValue(source.substring(from + 1, to - 1));
|
|
274
|
+
break;
|
|
275
|
+
case "Number":
|
|
276
|
+
filterExpression.setValue(parseFloat(source.substring(from, to)));
|
|
277
|
+
break;
|
|
278
|
+
case "True":
|
|
279
|
+
filterExpression.setValue(true);
|
|
280
|
+
break;
|
|
281
|
+
case "False":
|
|
282
|
+
filterExpression.setValue(false);
|
|
283
|
+
break;
|
|
284
|
+
case "FilterName":
|
|
285
|
+
filterExpression.name = source.substring(from, to);
|
|
286
|
+
break;
|
|
287
|
+
default:
|
|
288
|
+
}
|
|
289
|
+
} while (cursor.next());
|
|
290
|
+
return filterExpression.toJSON();
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
// src/filter-input/highlighting.ts
|
|
294
|
+
import {
|
|
295
|
+
HighlightStyle,
|
|
296
|
+
syntaxHighlighting as syntaxHighlighting2,
|
|
297
|
+
tags
|
|
298
|
+
} from "@vuu-ui/vuu-codemirror";
|
|
299
|
+
var myHighlightStyle = HighlightStyle.define([
|
|
300
|
+
{ tag: tags.variableName, color: "var(--vuuFilterEditor-variableColor)" },
|
|
301
|
+
{ tag: tags.comment, color: "green", fontStyle: "italic" }
|
|
302
|
+
]);
|
|
303
|
+
var vuuHighlighting = syntaxHighlighting2(myHighlightStyle);
|
|
304
|
+
|
|
305
|
+
// src/filter-input/theme.ts
|
|
306
|
+
import { EditorView } from "@vuu-ui/vuu-codemirror";
|
|
307
|
+
var vuuTheme = EditorView.theme(
|
|
308
|
+
{
|
|
309
|
+
"&": {
|
|
310
|
+
color: "var(--vuuFilterEditor-color)",
|
|
311
|
+
backgroundColor: "var(--vuuFilterEditor-background)",
|
|
312
|
+
fontSize: "var(--vuuFilterEditor-fontSize)"
|
|
313
|
+
},
|
|
314
|
+
".cm-content": {
|
|
315
|
+
caretColor: "var(--vuuFilterEditor-cursorColor)",
|
|
316
|
+
padding: 0
|
|
317
|
+
},
|
|
318
|
+
".cm-line": {
|
|
319
|
+
lineHeight: "var(--vuuFilterEditor-lineHeight)"
|
|
320
|
+
},
|
|
321
|
+
"&.cm-focused .cm-cursor": {
|
|
322
|
+
borderLeftColor: "var(--vuuFilterEditor-cursorColor)"
|
|
323
|
+
},
|
|
324
|
+
"&.cm-focused .cm-selectionBackground, ::selection": {
|
|
325
|
+
backgroundColor: "var(--vuuFilterEditor-selectionBackground)"
|
|
326
|
+
},
|
|
327
|
+
".cm-selectionBackground, ::selection": {
|
|
328
|
+
backgroundColor: "var(--vuuFilterEditor-selectionBackground)"
|
|
329
|
+
},
|
|
330
|
+
".cm-scroller": {
|
|
331
|
+
fontFamily: "var(--vuuFilterEditor-fontFamily)"
|
|
332
|
+
},
|
|
333
|
+
".cm-tooltip": {
|
|
334
|
+
background: "var(--vuuFilterEditor-tooltipBackground)",
|
|
335
|
+
border: "var(--vuuFilterEditor-tooltipBorder)",
|
|
336
|
+
boxShadow: "var(--vuuFilterEditor-tooltipElevation)",
|
|
337
|
+
"&.cm-tooltip-autocomplete > ul": {
|
|
338
|
+
fontFamily: "var(--vuuFilterEditor-fontFamily)",
|
|
339
|
+
fontSize: "var(--vuuFilterEditor-fontSize)",
|
|
340
|
+
maxHeight: "240px"
|
|
341
|
+
},
|
|
342
|
+
"&.cm-tooltip-autocomplete > ul > li": {
|
|
343
|
+
alignItems: "center",
|
|
344
|
+
display: "flex",
|
|
345
|
+
height: "var(--vuuFilterEditor-suggestion-height)",
|
|
346
|
+
padding: "0 3px",
|
|
347
|
+
lineHeight: "var(--vuuFilterEditor-suggestion-height)"
|
|
348
|
+
},
|
|
349
|
+
"&.cm-tooltip-autocomplete li[aria-selected]": {
|
|
350
|
+
background: "var(--vuuFilterEditor-suggestion-selectedBackground)",
|
|
351
|
+
color: "var(--vuuFilterEditor-suggestion-selectedColor)"
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
".cm-completionIcon": {
|
|
355
|
+
height: "18px",
|
|
356
|
+
flex: "0 0 16px"
|
|
357
|
+
},
|
|
358
|
+
".cm-completionLabel": {
|
|
359
|
+
flex: "1 1 auto"
|
|
360
|
+
},
|
|
361
|
+
".cm-completionIcon-filter": {
|
|
362
|
+
position: "relative",
|
|
363
|
+
"&:after": {
|
|
364
|
+
background: "var(--salt-text-secondary-foreground)",
|
|
365
|
+
content: "''",
|
|
366
|
+
"-webkit-mask": "var(--svg-filter) center center/13px 13px",
|
|
367
|
+
"-webkit-mask-repeat": "no-repeat",
|
|
368
|
+
position: "absolute",
|
|
369
|
+
height: "18px",
|
|
370
|
+
left: "0px",
|
|
371
|
+
top: "0px",
|
|
372
|
+
width: "16px"
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
{ dark: false }
|
|
377
|
+
);
|
|
378
|
+
|
|
379
|
+
// src/filter-input/useFilterAutoComplete.ts
|
|
380
|
+
import {
|
|
381
|
+
syntaxTree
|
|
382
|
+
} from "@vuu-ui/vuu-codemirror";
|
|
383
|
+
import { useCallback } from "react";
|
|
384
|
+
var getValue = (node, state) => state.doc.sliceString(node.from, node.to);
|
|
385
|
+
var getColumnName = (node, state) => {
|
|
386
|
+
var _a;
|
|
387
|
+
if (((_a = node.firstChild) == null ? void 0 : _a.name) === "Column") {
|
|
388
|
+
return getValue(node.firstChild, state);
|
|
389
|
+
} else {
|
|
390
|
+
let maybeColumnNode = node.prevSibling || node.parent;
|
|
391
|
+
while (maybeColumnNode && maybeColumnNode.name !== "Column") {
|
|
392
|
+
maybeColumnNode = maybeColumnNode.prevSibling || maybeColumnNode.parent;
|
|
393
|
+
}
|
|
394
|
+
if (maybeColumnNode) {
|
|
395
|
+
return getValue(maybeColumnNode, state);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
var getOperator = (node, state) => {
|
|
400
|
+
let maybeColumnNode = node.prevSibling || node.parent;
|
|
401
|
+
while (maybeColumnNode && !["Column", "Operator", "In"].includes(maybeColumnNode.name)) {
|
|
402
|
+
maybeColumnNode = maybeColumnNode.prevSibling || maybeColumnNode.parent;
|
|
403
|
+
}
|
|
404
|
+
if ((maybeColumnNode == null ? void 0 : maybeColumnNode.name) === "In" || (maybeColumnNode == null ? void 0 : maybeColumnNode.name) === "Operator") {
|
|
405
|
+
return getValue(maybeColumnNode, state);
|
|
406
|
+
} else {
|
|
407
|
+
return void 0;
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
var getPartialOperator = (maybeOperatorNode, state, columnName) => {
|
|
411
|
+
const value = getValue(maybeOperatorNode, state);
|
|
412
|
+
if (columnName === void 0 || value === columnName) {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
if (["contains", "ends", "starts"].some(
|
|
416
|
+
(val) => val.startsWith(value.toLowerCase())
|
|
417
|
+
)) {
|
|
418
|
+
return value;
|
|
419
|
+
} else {
|
|
420
|
+
return void 0;
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
var getClauseOperator = (node, state) => {
|
|
424
|
+
let maybeTargetNode = node.prevSibling || node.parent || node.lastChild;
|
|
425
|
+
while (maybeTargetNode && maybeTargetNode.name === "\u26A0")
|
|
426
|
+
maybeTargetNode = maybeTargetNode.prevSibling;
|
|
427
|
+
if (maybeTargetNode && ["As", "Or", "And"].includes(maybeTargetNode.name)) {
|
|
428
|
+
return getValue(maybeTargetNode, state);
|
|
429
|
+
} else {
|
|
430
|
+
return void 0;
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
var getSetValues = (node, state) => {
|
|
434
|
+
let maybeTargetNode = node.lastChild;
|
|
435
|
+
const values = [];
|
|
436
|
+
while (maybeTargetNode && maybeTargetNode.name !== "In") {
|
|
437
|
+
const value = getValue(maybeTargetNode, state);
|
|
438
|
+
if (value) {
|
|
439
|
+
values.push(value);
|
|
440
|
+
} else {
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
maybeTargetNode = maybeTargetNode.prevSibling;
|
|
444
|
+
}
|
|
445
|
+
return values;
|
|
446
|
+
};
|
|
447
|
+
var promptForFilterName = (context) => ({
|
|
448
|
+
from: context.pos,
|
|
449
|
+
options: [
|
|
450
|
+
{
|
|
451
|
+
label: "enter name for this filter",
|
|
452
|
+
boost: 5
|
|
453
|
+
}
|
|
454
|
+
]
|
|
455
|
+
});
|
|
456
|
+
var joinSuggestions = [
|
|
457
|
+
{ label: "and", apply: "and ", boost: 5 },
|
|
458
|
+
{ label: "or", apply: "or ", boost: 3 },
|
|
459
|
+
{ label: "as", apply: "as ", boost: 1 }
|
|
460
|
+
];
|
|
461
|
+
var makeSaveOrExtendSuggestions = (onSubmit, existingFilter, withJoinSuggestions = true) => {
|
|
462
|
+
const result = existingFilter ? [
|
|
463
|
+
{
|
|
464
|
+
label: "REPLACE existing filter",
|
|
465
|
+
apply: () => onSubmit("replace"),
|
|
466
|
+
boost: 8
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
label: "AND existing filter",
|
|
470
|
+
apply: () => onSubmit("and"),
|
|
471
|
+
boost: 7
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
label: "OR existing filter",
|
|
475
|
+
apply: () => onSubmit("or"),
|
|
476
|
+
boost: 7
|
|
477
|
+
}
|
|
478
|
+
] : [
|
|
479
|
+
{
|
|
480
|
+
label: "Press ENTER to submit",
|
|
481
|
+
apply: () => onSubmit(),
|
|
482
|
+
boost: 6
|
|
483
|
+
}
|
|
484
|
+
];
|
|
485
|
+
return withJoinSuggestions ? result.concat(joinSuggestions) : result;
|
|
486
|
+
};
|
|
487
|
+
var promptToSaveOrExtend = (context, onSubmit, existingFilter) => ({
|
|
488
|
+
from: context.pos,
|
|
489
|
+
options: makeSaveOrExtendSuggestions(onSubmit, existingFilter)
|
|
490
|
+
});
|
|
491
|
+
var promptToSave = (context, onSubmit, existingFilter) => ({
|
|
492
|
+
from: context.pos,
|
|
493
|
+
options: makeSaveOrExtendSuggestions(onSubmit, existingFilter, false)
|
|
494
|
+
});
|
|
495
|
+
var useAutoComplete = (suggestionProvider, onSubmit, existingFilter) => {
|
|
496
|
+
const makeSuggestions = useCallback(
|
|
497
|
+
async (context, suggestionType, optionalArgs = {}) => {
|
|
498
|
+
const options = await suggestionProvider.getSuggestions(
|
|
499
|
+
suggestionType,
|
|
500
|
+
optionalArgs
|
|
501
|
+
);
|
|
502
|
+
const { startsWith = "" } = optionalArgs;
|
|
503
|
+
return { from: context.pos - startsWith.length, options };
|
|
504
|
+
},
|
|
505
|
+
[suggestionProvider]
|
|
506
|
+
);
|
|
507
|
+
return useCallback(
|
|
508
|
+
async (context) => {
|
|
509
|
+
var _a, _b;
|
|
510
|
+
const { state, pos } = context;
|
|
511
|
+
const word = (_a = context.matchBefore(/\w*/)) != null ? _a : {
|
|
512
|
+
from: 0,
|
|
513
|
+
to: 0,
|
|
514
|
+
text: void 0
|
|
515
|
+
};
|
|
516
|
+
const tree = syntaxTree(state);
|
|
517
|
+
const nodeBefore = tree.resolveInner(pos, -1);
|
|
518
|
+
console.log({ nodeBeforeName: nodeBefore.name });
|
|
519
|
+
switch (nodeBefore.name) {
|
|
520
|
+
case "Filter":
|
|
521
|
+
if (context.pos === 0) {
|
|
522
|
+
return makeSuggestions(context, "column");
|
|
523
|
+
} else {
|
|
524
|
+
const clauseOperator = getClauseOperator(nodeBefore, state);
|
|
525
|
+
if (clauseOperator === "as") {
|
|
526
|
+
return promptForFilterName(context);
|
|
527
|
+
} else {
|
|
528
|
+
return promptToSaveOrExtend(
|
|
529
|
+
context,
|
|
530
|
+
onSubmit.current,
|
|
531
|
+
existingFilter
|
|
532
|
+
);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
case "As":
|
|
536
|
+
return promptForFilterName(context);
|
|
537
|
+
case "FilterName":
|
|
538
|
+
return promptToSave(context, onSubmit.current, existingFilter);
|
|
539
|
+
case "Column": {
|
|
540
|
+
const columnName = getValue(nodeBefore, state);
|
|
541
|
+
const isPartialMatch = await suggestionProvider.isPartialMatch(
|
|
542
|
+
"column",
|
|
543
|
+
void 0,
|
|
544
|
+
columnName
|
|
545
|
+
);
|
|
546
|
+
if (isPartialMatch) {
|
|
547
|
+
return makeSuggestions(context, "column", {
|
|
548
|
+
startsWith: columnName
|
|
549
|
+
});
|
|
550
|
+
} else {
|
|
551
|
+
return makeSuggestions(context, "operator", { columnName });
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
case "\u26A0": {
|
|
555
|
+
const columnName = getColumnName(nodeBefore, state);
|
|
556
|
+
const operator = getOperator(nodeBefore, state);
|
|
557
|
+
const partialOperator = operator ? void 0 : getPartialOperator(nodeBefore, state, columnName);
|
|
558
|
+
if (partialOperator) {
|
|
559
|
+
return makeSuggestions(context, "operator", {
|
|
560
|
+
columnName,
|
|
561
|
+
startsWith: partialOperator
|
|
562
|
+
});
|
|
563
|
+
} else {
|
|
564
|
+
return makeSuggestions(context, "columnValue", {
|
|
565
|
+
columnName,
|
|
566
|
+
operator,
|
|
567
|
+
startsWith: word.text
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
case "Identifier":
|
|
572
|
+
{
|
|
573
|
+
const clauseOperator = getClauseOperator(nodeBefore, state);
|
|
574
|
+
if (clauseOperator === "as") {
|
|
575
|
+
return {
|
|
576
|
+
from: context.pos,
|
|
577
|
+
options: [
|
|
578
|
+
{
|
|
579
|
+
label: "press ENTER to apply filter and save",
|
|
580
|
+
apply: () => onSubmit.current(),
|
|
581
|
+
boost: 5
|
|
582
|
+
}
|
|
583
|
+
]
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
break;
|
|
588
|
+
case "ColumnSetExpression":
|
|
589
|
+
case "Values": {
|
|
590
|
+
const columnName = getColumnName(nodeBefore, state);
|
|
591
|
+
const selection = getSetValues(nodeBefore, state);
|
|
592
|
+
return makeSuggestions(context, "columnValue", {
|
|
593
|
+
columnName,
|
|
594
|
+
selection
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
case "Comma":
|
|
598
|
+
case "LBrack": {
|
|
599
|
+
const columnName = getColumnName(nodeBefore, state);
|
|
600
|
+
return makeSuggestions(context, "columnValue", { columnName });
|
|
601
|
+
}
|
|
602
|
+
case "ColumnValueExpression":
|
|
603
|
+
{
|
|
604
|
+
const lastToken = (_b = nodeBefore.lastChild) == null ? void 0 : _b.prevSibling;
|
|
605
|
+
if ((lastToken == null ? void 0 : lastToken.name) === "Column") {
|
|
606
|
+
return makeSuggestions(context, "operator", {
|
|
607
|
+
columnName: getColumnName(nodeBefore, state)
|
|
608
|
+
});
|
|
609
|
+
} else if ((lastToken == null ? void 0 : lastToken.name) === "Operator") {
|
|
610
|
+
return makeSuggestions(context, "columnValue", {
|
|
611
|
+
columnName: getColumnName(lastToken, state),
|
|
612
|
+
operator: getValue(lastToken, state)
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
break;
|
|
617
|
+
case "In": {
|
|
618
|
+
return {
|
|
619
|
+
from: context.pos,
|
|
620
|
+
options: [{ label: "[", apply: " [", type: "text" }]
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
case "Eq": {
|
|
624
|
+
return makeSuggestions(context, "columnValue", {
|
|
625
|
+
columnName: getColumnName(nodeBefore, state)
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
case "AndExpression":
|
|
629
|
+
case "OrExpression": {
|
|
630
|
+
return makeSuggestions(context, "column");
|
|
631
|
+
}
|
|
632
|
+
default:
|
|
633
|
+
}
|
|
634
|
+
},
|
|
635
|
+
[existingFilter, makeSuggestions, onSubmit, suggestionProvider]
|
|
636
|
+
);
|
|
637
|
+
};
|
|
638
|
+
|
|
639
|
+
// src/filter-input/useCodeMirrorEditor.ts
|
|
640
|
+
var getView = (ref) => {
|
|
641
|
+
if (ref.current == void 0) {
|
|
642
|
+
throw Error("EditorView not defined");
|
|
643
|
+
}
|
|
644
|
+
return ref.current;
|
|
645
|
+
};
|
|
646
|
+
var getOptionClass = (completion) => {
|
|
647
|
+
return (0, import_classnames.default)("vuuSuggestion", {
|
|
648
|
+
vuuIllustration: completion.isIllustration
|
|
649
|
+
});
|
|
650
|
+
};
|
|
651
|
+
var stripName = (filterQuery) => {
|
|
652
|
+
const pos = filterQuery.lastIndexOf(" as ");
|
|
653
|
+
if (pos !== -1) {
|
|
654
|
+
return filterQuery.slice(0, pos);
|
|
655
|
+
} else {
|
|
656
|
+
return filterQuery;
|
|
657
|
+
}
|
|
658
|
+
};
|
|
659
|
+
var noop = () => console.log("noooop");
|
|
660
|
+
var useCodeMirrorEditor = ({
|
|
661
|
+
existingFilter,
|
|
662
|
+
onSubmitFilter,
|
|
663
|
+
suggestionProvider
|
|
664
|
+
}) => {
|
|
665
|
+
const editorRef = useRef(null);
|
|
666
|
+
const onSubmit = useRef(noop);
|
|
667
|
+
const viewRef = useRef();
|
|
668
|
+
const completionFn = useAutoComplete(
|
|
669
|
+
suggestionProvider,
|
|
670
|
+
onSubmit,
|
|
671
|
+
existingFilter
|
|
672
|
+
);
|
|
673
|
+
const [createState, clearInput] = useMemo(() => {
|
|
674
|
+
const parseFilter2 = () => {
|
|
675
|
+
const view = getView(viewRef);
|
|
676
|
+
const source = view.state.doc.toString();
|
|
677
|
+
const tree = ensureSyntaxTree(view.state, view.state.doc.length, 5e3);
|
|
678
|
+
if (tree) {
|
|
679
|
+
const filter = walkTree(tree, source);
|
|
680
|
+
return [filter, stripName(source), filter.name];
|
|
681
|
+
} else {
|
|
682
|
+
return [void 0, "", void 0];
|
|
683
|
+
}
|
|
684
|
+
};
|
|
685
|
+
const clearInput2 = () => {
|
|
686
|
+
getView(viewRef).setState(createState2());
|
|
687
|
+
};
|
|
688
|
+
const submitFilterAndClearInput = (mode) => {
|
|
689
|
+
const [filter, filterQuery, filterName] = parseFilter2();
|
|
690
|
+
onSubmitFilter == null ? void 0 : onSubmitFilter(filter, filterQuery, mode, filterName);
|
|
691
|
+
clearInput2();
|
|
692
|
+
};
|
|
693
|
+
const submitFilter = (key) => {
|
|
694
|
+
return keymap2.of([
|
|
695
|
+
{
|
|
696
|
+
key,
|
|
697
|
+
run() {
|
|
698
|
+
submitFilterAndClearInput();
|
|
699
|
+
return true;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
]);
|
|
703
|
+
};
|
|
704
|
+
const showSuggestions = (key) => {
|
|
705
|
+
return keymap2.of([
|
|
706
|
+
{
|
|
707
|
+
key,
|
|
708
|
+
run() {
|
|
709
|
+
startCompletion(getView(viewRef));
|
|
710
|
+
return true;
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
]);
|
|
714
|
+
};
|
|
715
|
+
const createState2 = () => EditorState2.create({
|
|
716
|
+
doc: "",
|
|
717
|
+
extensions: [
|
|
718
|
+
minimalSetup,
|
|
719
|
+
autocompletion({
|
|
720
|
+
override: [completionFn],
|
|
721
|
+
optionClass: getOptionClass
|
|
722
|
+
}),
|
|
723
|
+
filterLanguageSupport(),
|
|
724
|
+
keymap2.of(defaultKeymap2),
|
|
725
|
+
submitFilter("Ctrl-Enter"),
|
|
726
|
+
showSuggestions("ArrowDown"),
|
|
727
|
+
EditorView2.updateListener.of((v) => {
|
|
728
|
+
const view = getView(viewRef);
|
|
729
|
+
if (v.docChanged) {
|
|
730
|
+
startCompletion(view);
|
|
731
|
+
}
|
|
732
|
+
}),
|
|
733
|
+
EditorState2.transactionFilter.of(
|
|
734
|
+
(tr) => tr.newDoc.lines > 1 ? [] : tr
|
|
735
|
+
),
|
|
736
|
+
vuuTheme,
|
|
737
|
+
vuuHighlighting
|
|
738
|
+
]
|
|
739
|
+
});
|
|
740
|
+
onSubmit.current = (mode) => {
|
|
741
|
+
submitFilterAndClearInput(mode);
|
|
742
|
+
setTimeout(() => {
|
|
743
|
+
getView(viewRef).focus();
|
|
744
|
+
}, 100);
|
|
745
|
+
};
|
|
746
|
+
return [createState2, clearInput2];
|
|
747
|
+
}, [completionFn, onSubmitFilter]);
|
|
748
|
+
useEffect(() => {
|
|
749
|
+
if (!editorRef.current) {
|
|
750
|
+
throw Error("editor not in dom");
|
|
751
|
+
}
|
|
752
|
+
viewRef.current = new EditorView2({
|
|
753
|
+
state: createState(),
|
|
754
|
+
parent: editorRef.current
|
|
755
|
+
});
|
|
756
|
+
return () => {
|
|
757
|
+
var _a;
|
|
758
|
+
(_a = viewRef.current) == null ? void 0 : _a.destroy();
|
|
759
|
+
};
|
|
760
|
+
}, [completionFn, createState]);
|
|
761
|
+
return { editorRef, clearInput };
|
|
762
|
+
};
|
|
763
|
+
|
|
764
|
+
// src/filter-input/FilterInput.tsx
|
|
765
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
766
|
+
var classBase = "vuuFilterInput";
|
|
767
|
+
var FilterInput = ({
|
|
768
|
+
existingFilter,
|
|
769
|
+
namedFilters,
|
|
770
|
+
onSubmitFilter,
|
|
771
|
+
suggestionProvider,
|
|
772
|
+
...props
|
|
773
|
+
}) => {
|
|
774
|
+
const { editorRef, clearInput } = useCodeMirrorEditor({
|
|
775
|
+
existingFilter,
|
|
776
|
+
onSubmitFilter,
|
|
777
|
+
suggestionProvider
|
|
778
|
+
});
|
|
779
|
+
return /* @__PURE__ */ jsxs("div", { ...props, className: classBase, children: [
|
|
780
|
+
/* @__PURE__ */ jsx(Button, { className: `${classBase}-FilterButton`, "data-icon": "filter" }),
|
|
781
|
+
/* @__PURE__ */ jsx("div", { className: `${classBase}-Editor`, ref: editorRef }),
|
|
782
|
+
/* @__PURE__ */ jsx(
|
|
783
|
+
Button,
|
|
784
|
+
{
|
|
785
|
+
className: `${classBase}-ClearButton`,
|
|
786
|
+
"data-icon": "close-circle",
|
|
787
|
+
onClick: clearInput
|
|
788
|
+
}
|
|
789
|
+
)
|
|
790
|
+
] });
|
|
791
|
+
};
|
|
792
|
+
|
|
793
|
+
// src/filter-input/useFilterSuggestionProvider.ts
|
|
794
|
+
import { useTypeaheadSuggestions } from "@vuu-ui/vuu-data";
|
|
795
|
+
import { useCallback as useCallback2, useRef as useRef2 } from "react";
|
|
796
|
+
|
|
797
|
+
// src/filter-input/filterInfo.ts
|
|
798
|
+
import { createEl } from "@vuu-ui/vuu-utils";
|
|
799
|
+
var filterInfo = (filterName, filterQuery) => {
|
|
800
|
+
const rootElement = createEl("div", "vuuFunctionDoc");
|
|
801
|
+
const headingElement = createEl("div", "function-heading");
|
|
802
|
+
const nameElement = createEl("span", "function-name", filterName);
|
|
803
|
+
headingElement.appendChild(nameElement);
|
|
804
|
+
const child2 = createEl("p", void 0, filterQuery);
|
|
805
|
+
rootElement.appendChild(headingElement);
|
|
806
|
+
rootElement.appendChild(child2);
|
|
807
|
+
return rootElement;
|
|
808
|
+
};
|
|
809
|
+
|
|
810
|
+
// src/filter-input/useFilterSuggestionProvider.ts
|
|
811
|
+
var NO_NAMED_FILTERS = [];
|
|
812
|
+
var NO_OPTIONS = {};
|
|
813
|
+
var suggestColumns = (columns) => columns.map((column) => ({
|
|
814
|
+
boost: 5,
|
|
815
|
+
label: column.name
|
|
816
|
+
}));
|
|
817
|
+
var suggestNamedFilters = (namedFilters) => namedFilters ? Array.from(namedFilters.entries()).map(([filterName, filterQuery]) => ({
|
|
818
|
+
info: () => filterInfo(filterName, filterQuery),
|
|
819
|
+
label: filterName,
|
|
820
|
+
type: "filter"
|
|
821
|
+
})) : NO_NAMED_FILTERS;
|
|
822
|
+
var doneCommand = {
|
|
823
|
+
label: "Done",
|
|
824
|
+
apply: "] ",
|
|
825
|
+
type: "keyword",
|
|
826
|
+
boost: 10
|
|
827
|
+
};
|
|
828
|
+
var equalityOperators = [
|
|
829
|
+
{ label: "=", boost: 10 },
|
|
830
|
+
{ label: "!=", boost: 9 }
|
|
831
|
+
];
|
|
832
|
+
var stringOperators = [
|
|
833
|
+
...equalityOperators,
|
|
834
|
+
{ label: "in", boost: 6 },
|
|
835
|
+
{ label: "starts", boost: 5 },
|
|
836
|
+
{ label: "ends", boost: 4 }
|
|
837
|
+
];
|
|
838
|
+
var numericOperators = [
|
|
839
|
+
...equalityOperators,
|
|
840
|
+
{ label: ">", boost: 8 },
|
|
841
|
+
{ label: "<", boost: 7 }
|
|
842
|
+
];
|
|
843
|
+
var toSuggestions = (values, quoted = false, prefix = "", isIllustration = false) => {
|
|
844
|
+
const quote = quoted ? '"' : "";
|
|
845
|
+
return values.map((value) => ({
|
|
846
|
+
isIllustration,
|
|
847
|
+
label: value,
|
|
848
|
+
apply: isIllustration ? `${quote}${prefix}${quote}` : `${prefix}${quote}${value}${quote} `
|
|
849
|
+
}));
|
|
850
|
+
};
|
|
851
|
+
var withApplySpace = (suggestions, startsWith = "") => suggestions.filter((sugg) => startsWith === "" || sugg.label.startsWith(startsWith)).map((suggestion) => ({
|
|
852
|
+
...suggestion,
|
|
853
|
+
apply: suggestion.label + " "
|
|
854
|
+
}));
|
|
855
|
+
var getTypeaheadParams = (table, column, text = "", selectedValues = []) => {
|
|
856
|
+
if (text !== "" && !selectedValues.includes(text.toLowerCase())) {
|
|
857
|
+
return [table, column, text];
|
|
858
|
+
}
|
|
859
|
+
return [table, column];
|
|
860
|
+
};
|
|
861
|
+
var useFilterSuggestionProvider = ({
|
|
862
|
+
columns,
|
|
863
|
+
namedFilters,
|
|
864
|
+
table
|
|
865
|
+
}) => {
|
|
866
|
+
const latestSuggestionsRef = useRef2();
|
|
867
|
+
const getTypeaheadSuggestions = useTypeaheadSuggestions();
|
|
868
|
+
const getSuggestions = useCallback2(
|
|
869
|
+
async (valueType, { columnName, operator, startsWith, selection } = NO_OPTIONS) => {
|
|
870
|
+
if (valueType === "operator") {
|
|
871
|
+
const column = columns.find((col) => col.name === columnName);
|
|
872
|
+
if (column) {
|
|
873
|
+
switch (column.serverDataType) {
|
|
874
|
+
case "string":
|
|
875
|
+
case "char":
|
|
876
|
+
return withApplySpace(stringOperators, startsWith);
|
|
877
|
+
case "int":
|
|
878
|
+
case "long":
|
|
879
|
+
case "double":
|
|
880
|
+
return withApplySpace(numericOperators);
|
|
881
|
+
}
|
|
882
|
+
} else {
|
|
883
|
+
console.warn(`'${columnName}' does not match any column name`);
|
|
884
|
+
}
|
|
885
|
+
} else if (valueType === "column") {
|
|
886
|
+
const columnSuggestions = await suggestColumns(columns);
|
|
887
|
+
const filterSuggestions = await suggestNamedFilters(namedFilters);
|
|
888
|
+
return (latestSuggestionsRef.current = withApplySpace(columnSuggestions)).concat(
|
|
889
|
+
withApplySpace(filterSuggestions)
|
|
890
|
+
);
|
|
891
|
+
}
|
|
892
|
+
if (columnName) {
|
|
893
|
+
const column = columns.find((col) => col.name === columnName);
|
|
894
|
+
const prefix = Array.isArray(selection) ? selection.length === 0 ? "[" : "," : "";
|
|
895
|
+
const params = getTypeaheadParams(table, columnName, startsWith);
|
|
896
|
+
const suggestions = await getTypeaheadSuggestions(params);
|
|
897
|
+
const isIllustration = operator === "starts";
|
|
898
|
+
latestSuggestionsRef.current = toSuggestions(
|
|
899
|
+
suggestions,
|
|
900
|
+
(column == null ? void 0 : column.serverDataType) === "string",
|
|
901
|
+
isIllustration ? startsWith : prefix,
|
|
902
|
+
isIllustration
|
|
903
|
+
);
|
|
904
|
+
if (Array.isArray(selection) && (selection == null ? void 0 : selection.length) > 1) {
|
|
905
|
+
return [doneCommand, ...latestSuggestionsRef.current];
|
|
906
|
+
}
|
|
907
|
+
return latestSuggestionsRef.current;
|
|
908
|
+
}
|
|
909
|
+
return [];
|
|
910
|
+
},
|
|
911
|
+
[columns, getTypeaheadSuggestions, namedFilters, table]
|
|
912
|
+
);
|
|
913
|
+
const isPartialMatch = useCallback2(
|
|
914
|
+
async (valueType, columnName, pattern) => {
|
|
915
|
+
const suggestions = (
|
|
916
|
+
// latestSuggestions && latestSuggestions.length > 0
|
|
917
|
+
// ? latestSuggestions
|
|
918
|
+
await getSuggestions(valueType, { columnName })
|
|
919
|
+
);
|
|
920
|
+
if (pattern && suggestions) {
|
|
921
|
+
for (const option of suggestions) {
|
|
922
|
+
if (option.label === pattern) {
|
|
923
|
+
return false;
|
|
924
|
+
} else if (option.label.startsWith(pattern)) {
|
|
925
|
+
return true;
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
return false;
|
|
930
|
+
},
|
|
931
|
+
[getSuggestions]
|
|
932
|
+
);
|
|
933
|
+
return {
|
|
934
|
+
getSuggestions,
|
|
935
|
+
isPartialMatch
|
|
936
|
+
};
|
|
937
|
+
};
|
|
938
|
+
|
|
939
|
+
// src/filter-toolbar/FilterToolbar.tsx
|
|
940
|
+
var import_classnames2 = __toESM(require_classnames(), 1);
|
|
941
|
+
import { Toolbar } from "@heswell/salt-lab";
|
|
942
|
+
|
|
943
|
+
// src/filter-toolbar/useFilterToolbar.tsx
|
|
944
|
+
import { ToggleButton, ToolbarField } from "@heswell/salt-lab";
|
|
945
|
+
|
|
946
|
+
// src/filter-toolbar/FilterDropdown.tsx
|
|
947
|
+
import { Dropdown } from "@heswell/salt-lab";
|
|
948
|
+
import { useCallback as useCallback3, useState } from "react";
|
|
949
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
950
|
+
var isString = (s) => typeof s === "string";
|
|
951
|
+
var stripQuotes = (selected) => {
|
|
952
|
+
if (isString(selected)) {
|
|
953
|
+
if (selected.startsWith('"') && selected.endsWith('"')) {
|
|
954
|
+
return selected.slice(1, -1);
|
|
955
|
+
} else {
|
|
956
|
+
return selected;
|
|
957
|
+
}
|
|
958
|
+
} else {
|
|
959
|
+
return selected.map(stripQuotes);
|
|
960
|
+
}
|
|
961
|
+
};
|
|
962
|
+
var FilterDropdown = ({
|
|
963
|
+
column,
|
|
964
|
+
selected: selectedProp,
|
|
965
|
+
suggestionProvider,
|
|
966
|
+
...props
|
|
967
|
+
}) => {
|
|
968
|
+
const selected = selectedProp != null ? stripQuotes(selectedProp) : void 0;
|
|
969
|
+
const initialValues = Array.isArray(selected) ? selected : selected != null ? [selected] : [];
|
|
970
|
+
const [values, setValues] = useState(initialValues);
|
|
971
|
+
console.log({ initialValues });
|
|
972
|
+
const handleOpenChange = useCallback3(
|
|
973
|
+
async (isOpen) => {
|
|
974
|
+
if (isOpen) {
|
|
975
|
+
const values2 = await suggestionProvider.getSuggestions("columnValue", {
|
|
976
|
+
columnName: column
|
|
977
|
+
});
|
|
978
|
+
console.log({ values: values2 });
|
|
979
|
+
setValues(values2.map((suggestion) => suggestion.label));
|
|
980
|
+
}
|
|
981
|
+
},
|
|
982
|
+
[column, suggestionProvider]
|
|
983
|
+
);
|
|
984
|
+
return /* @__PURE__ */ jsx2(
|
|
985
|
+
Dropdown,
|
|
986
|
+
{
|
|
987
|
+
...props,
|
|
988
|
+
onOpenChange: handleOpenChange,
|
|
989
|
+
selected,
|
|
990
|
+
source: values
|
|
991
|
+
}
|
|
992
|
+
);
|
|
993
|
+
};
|
|
994
|
+
|
|
995
|
+
// src/filter-toolbar/FilterDropdownMultiSelect.tsx
|
|
996
|
+
import { Dropdown as Dropdown2 } from "@heswell/salt-lab";
|
|
997
|
+
import { useCallback as useCallback4, useState as useState2 } from "react";
|
|
998
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
999
|
+
var isString2 = (s) => typeof s === "string";
|
|
1000
|
+
var stripQuotes2 = (selected) => {
|
|
1001
|
+
if (selected === void 0) {
|
|
1002
|
+
return void 0;
|
|
1003
|
+
} else if (isString2(selected)) {
|
|
1004
|
+
if (selected.startsWith('"') && selected.endsWith('"')) {
|
|
1005
|
+
return selected.slice(1, -1);
|
|
1006
|
+
} else {
|
|
1007
|
+
return selected;
|
|
1008
|
+
}
|
|
1009
|
+
} else {
|
|
1010
|
+
return selected.map(stripQuotes2);
|
|
1011
|
+
}
|
|
1012
|
+
};
|
|
1013
|
+
var FilterDropdownMultiSelect = ({
|
|
1014
|
+
column,
|
|
1015
|
+
selected: selectedProp,
|
|
1016
|
+
suggestionProvider,
|
|
1017
|
+
...props
|
|
1018
|
+
}) => {
|
|
1019
|
+
const selected = stripQuotes2(selectedProp);
|
|
1020
|
+
const initialValues = Array.isArray(selected) ? selected : selected != null ? [selected] : [];
|
|
1021
|
+
const [values, setValues] = useState2(initialValues);
|
|
1022
|
+
const handleOpenChange = useCallback4(
|
|
1023
|
+
async (isOpen) => {
|
|
1024
|
+
if (isOpen) {
|
|
1025
|
+
const values2 = await suggestionProvider.getSuggestions("columnValue", {
|
|
1026
|
+
columnName: column
|
|
1027
|
+
});
|
|
1028
|
+
console.log({ values: values2 });
|
|
1029
|
+
setValues(values2.map((suggestion) => suggestion.label));
|
|
1030
|
+
}
|
|
1031
|
+
},
|
|
1032
|
+
[column, suggestionProvider]
|
|
1033
|
+
);
|
|
1034
|
+
return /* @__PURE__ */ jsx3(
|
|
1035
|
+
Dropdown2,
|
|
1036
|
+
{
|
|
1037
|
+
...props,
|
|
1038
|
+
onOpenChange: handleOpenChange,
|
|
1039
|
+
selected,
|
|
1040
|
+
selectionStrategy: "multiple",
|
|
1041
|
+
source: values
|
|
1042
|
+
}
|
|
1043
|
+
);
|
|
1044
|
+
};
|
|
1045
|
+
|
|
1046
|
+
// src/filter-toolbar/useFilterToolbar.tsx
|
|
1047
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
1048
|
+
var filterToControl = (filter, suggestionProvider) => {
|
|
1049
|
+
if (isNamedFilter(filter)) {
|
|
1050
|
+
return /* @__PURE__ */ jsx4(
|
|
1051
|
+
ToggleButton,
|
|
1052
|
+
{
|
|
1053
|
+
className: "vuuToggleButton",
|
|
1054
|
+
toggled: true,
|
|
1055
|
+
variant: "secondary",
|
|
1056
|
+
children: filter.name
|
|
1057
|
+
}
|
|
1058
|
+
);
|
|
1059
|
+
}
|
|
1060
|
+
if (isSingleValueFilter2(filter)) {
|
|
1061
|
+
const { column, value } = filter;
|
|
1062
|
+
return /* @__PURE__ */ jsx4(
|
|
1063
|
+
ToolbarField,
|
|
1064
|
+
{
|
|
1065
|
+
className: "vuuFilterDropdown",
|
|
1066
|
+
label: column,
|
|
1067
|
+
labelPlacement: "top",
|
|
1068
|
+
children: /* @__PURE__ */ jsx4(
|
|
1069
|
+
FilterDropdown,
|
|
1070
|
+
{
|
|
1071
|
+
column,
|
|
1072
|
+
selected: value.toString(),
|
|
1073
|
+
selectionStrategy: "default",
|
|
1074
|
+
source: [value.toString()],
|
|
1075
|
+
suggestionProvider,
|
|
1076
|
+
style: { width: 100 }
|
|
1077
|
+
}
|
|
1078
|
+
)
|
|
1079
|
+
},
|
|
1080
|
+
column
|
|
1081
|
+
);
|
|
1082
|
+
}
|
|
1083
|
+
if (isMultiValueFilter2(filter)) {
|
|
1084
|
+
const values = filter.values.map((v) => v.toString());
|
|
1085
|
+
return /* @__PURE__ */ jsx4(
|
|
1086
|
+
ToolbarField,
|
|
1087
|
+
{
|
|
1088
|
+
className: "vuuFilterDropdown",
|
|
1089
|
+
label: filter.column,
|
|
1090
|
+
labelPlacement: "top",
|
|
1091
|
+
children: /* @__PURE__ */ jsx4(
|
|
1092
|
+
FilterDropdownMultiSelect,
|
|
1093
|
+
{
|
|
1094
|
+
column: filter.column,
|
|
1095
|
+
selected: values,
|
|
1096
|
+
source: values,
|
|
1097
|
+
suggestionProvider,
|
|
1098
|
+
style: { width: 100 }
|
|
1099
|
+
}
|
|
1100
|
+
)
|
|
1101
|
+
},
|
|
1102
|
+
filter.column
|
|
1103
|
+
);
|
|
1104
|
+
}
|
|
1105
|
+
return filter.filters.map(
|
|
1106
|
+
(filter2) => filterToControl(filter2, suggestionProvider)
|
|
1107
|
+
);
|
|
1108
|
+
};
|
|
1109
|
+
var useFilterToolbar = ({
|
|
1110
|
+
filter,
|
|
1111
|
+
suggestionProvider
|
|
1112
|
+
}) => {
|
|
1113
|
+
if (filter) {
|
|
1114
|
+
return filterToControl(filter, suggestionProvider);
|
|
1115
|
+
}
|
|
1116
|
+
return [];
|
|
1117
|
+
};
|
|
1118
|
+
|
|
1119
|
+
// src/filter-toolbar/FilterToolbar.tsx
|
|
1120
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
1121
|
+
var FilterToolbar = ({
|
|
1122
|
+
className,
|
|
1123
|
+
filter,
|
|
1124
|
+
suggestionProvider,
|
|
1125
|
+
...props
|
|
1126
|
+
}) => {
|
|
1127
|
+
console.log(`FilterToolbar ${JSON.stringify(filter, null, 2)}`);
|
|
1128
|
+
const toolbarItems = useFilterToolbar({ filter, suggestionProvider });
|
|
1129
|
+
return /* @__PURE__ */ jsx5(Toolbar, { className: (0, import_classnames2.default)("vuuFilterToolbar", className), ...props, children: toolbarItems });
|
|
1130
|
+
};
|
|
1131
|
+
|
|
1132
|
+
// src/filter-input/filter-language-parser/FilterParser.ts
|
|
1133
|
+
var strictParser = parser.configure({ strict: true });
|
|
1134
|
+
var parseFilter = (filterQuery) => {
|
|
1135
|
+
const parseTree = strictParser.parse(filterQuery);
|
|
1136
|
+
const filter = walkTree(parseTree, filterQuery);
|
|
1137
|
+
return filter;
|
|
1138
|
+
};
|
|
1139
|
+
|
|
1140
|
+
// src/filter-evaluation-utils.ts
|
|
1141
|
+
var filterPredicateMap = /* @__PURE__ */ new Map();
|
|
1142
|
+
var filterReject = () => false;
|
|
1143
|
+
var getFilterPredicate = (columnMap, filterQuery) => {
|
|
1144
|
+
let predicate = filterPredicateMap.get(filterQuery);
|
|
1145
|
+
if (predicate) {
|
|
1146
|
+
return predicate;
|
|
1147
|
+
}
|
|
1148
|
+
try {
|
|
1149
|
+
const filter = parseFilter(filterQuery);
|
|
1150
|
+
predicate = filterPredicate(columnMap, filter);
|
|
1151
|
+
filterPredicateMap.set(filterQuery, predicate);
|
|
1152
|
+
return predicate;
|
|
1153
|
+
} catch (err) {
|
|
1154
|
+
console.warn(
|
|
1155
|
+
`filter-evaluation-utils, failed to parse filter "${filterQuery}"`
|
|
1156
|
+
);
|
|
1157
|
+
return filterReject;
|
|
1158
|
+
}
|
|
1159
|
+
};
|
|
1160
|
+
function filterPredicate(columnMap, filter) {
|
|
1161
|
+
switch (filter.op) {
|
|
1162
|
+
case "in":
|
|
1163
|
+
return testInclude(columnMap, filter);
|
|
1164
|
+
case "=":
|
|
1165
|
+
return testEQ(columnMap, filter);
|
|
1166
|
+
case ">":
|
|
1167
|
+
return testGT(columnMap, filter);
|
|
1168
|
+
case ">=":
|
|
1169
|
+
return testGE(columnMap, filter);
|
|
1170
|
+
case "<":
|
|
1171
|
+
return testLT(columnMap, filter);
|
|
1172
|
+
case "<=":
|
|
1173
|
+
return testLE(columnMap, filter);
|
|
1174
|
+
case "starts":
|
|
1175
|
+
return testSW(columnMap, filter);
|
|
1176
|
+
case "and":
|
|
1177
|
+
return testAND(columnMap, filter);
|
|
1178
|
+
case "or":
|
|
1179
|
+
return testOR(columnMap, filter);
|
|
1180
|
+
default:
|
|
1181
|
+
console.log(`unrecognized filter type ${filter.op}`);
|
|
1182
|
+
return () => true;
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
var testInclude = (columnMap, filter) => {
|
|
1186
|
+
return (row) => filter.values.indexOf(row[columnMap[filter.column]]) !== -1;
|
|
1187
|
+
};
|
|
1188
|
+
var testEQ = (columnMap, filter) => {
|
|
1189
|
+
return (row) => row[columnMap[filter.column]] === filter.value;
|
|
1190
|
+
};
|
|
1191
|
+
var testGT = (columnMap, filter) => {
|
|
1192
|
+
return (row) => row[columnMap[filter.column]] > filter.value;
|
|
1193
|
+
};
|
|
1194
|
+
var testGE = (columnMap, filter) => {
|
|
1195
|
+
return (row) => row[columnMap[filter.column]] >= filter.value;
|
|
1196
|
+
};
|
|
1197
|
+
var testLT = (columnMap, filter) => {
|
|
1198
|
+
return (row) => row[columnMap[filter.column]] < filter.value;
|
|
1199
|
+
};
|
|
1200
|
+
var testLE = (columnMap, filter) => {
|
|
1201
|
+
return (row) => row[columnMap[filter.column]] <= filter.value;
|
|
1202
|
+
};
|
|
1203
|
+
var testSW = (columnMap, filter) => {
|
|
1204
|
+
const filterValue2 = filter.value;
|
|
1205
|
+
if (typeof filterValue2 !== "string") {
|
|
1206
|
+
throw Error("string filter applied to value of wrong type");
|
|
1207
|
+
}
|
|
1208
|
+
return (row) => {
|
|
1209
|
+
const rowValue = row[columnMap[filter.column]];
|
|
1210
|
+
if (typeof rowValue !== "string") {
|
|
1211
|
+
throw Error("string filter applied to value of wrong type");
|
|
1212
|
+
}
|
|
1213
|
+
return rowValue.toLowerCase().startsWith(filterValue2.toLowerCase());
|
|
1214
|
+
};
|
|
1215
|
+
};
|
|
1216
|
+
var testAND = (columnMap, filter) => {
|
|
1217
|
+
const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));
|
|
1218
|
+
return (row) => filters.every((fn) => fn(row));
|
|
1219
|
+
};
|
|
1220
|
+
function testOR(columnMap, filter) {
|
|
1221
|
+
const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));
|
|
1222
|
+
return (row) => filters.some((fn) => fn(row));
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
// src/filter-utils.ts
|
|
1226
|
+
import { extractFilterForColumn, partition } from "@vuu-ui/vuu-utils";
|
|
1227
|
+
|
|
1228
|
+
// src/filterTypes.ts
|
|
1229
|
+
var singleValueFilterOps = /* @__PURE__ */ new Set([
|
|
1230
|
+
"=",
|
|
1231
|
+
"!=",
|
|
1232
|
+
">",
|
|
1233
|
+
">=",
|
|
1234
|
+
"<",
|
|
1235
|
+
"<=",
|
|
1236
|
+
"starts",
|
|
1237
|
+
"ends"
|
|
1238
|
+
]);
|
|
1239
|
+
var isNamedFilter = (f) => f !== void 0 && f.name !== void 0;
|
|
1240
|
+
var isSingleValueFilter2 = (f) => f !== void 0 && singleValueFilterOps.has(f.op);
|
|
1241
|
+
var isFilterClause = (f) => f !== void 0 && (isSingleValueFilter2(f) || isMultiValueFilter2(f));
|
|
1242
|
+
var isMultiValueFilter2 = (f) => f !== void 0 && f.op === "in";
|
|
1243
|
+
var isInFilter = (f) => f.op === "in";
|
|
1244
|
+
var isAndFilter = (f) => f.op === "and";
|
|
1245
|
+
var isOrFilter = (f) => f.op === "or";
|
|
1246
|
+
function isMultiClauseFilter2(f) {
|
|
1247
|
+
return f !== void 0 && (f.op === "and" || f.op === "or");
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
// src/filter-utils.ts
|
|
1251
|
+
var AND = "and";
|
|
1252
|
+
var EQUALS = "=";
|
|
1253
|
+
var GREATER_THAN = ">";
|
|
1254
|
+
var LESS_THAN = "<";
|
|
1255
|
+
var OR = "or";
|
|
1256
|
+
var STARTS_WITH = "starts";
|
|
1257
|
+
var ENDS_WITH = "ends";
|
|
1258
|
+
var IN = "in";
|
|
1259
|
+
var filterClauses = (filter, clauses = []) => {
|
|
1260
|
+
if (filter) {
|
|
1261
|
+
if (isMultiClauseFilter2(filter)) {
|
|
1262
|
+
filter.filters.forEach((f) => clauses.push(...filterClauses(f)));
|
|
1263
|
+
} else {
|
|
1264
|
+
clauses.push(filter);
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
return clauses;
|
|
1268
|
+
};
|
|
1269
|
+
var DEFAULT_ADD_FILTER_OPTS = {
|
|
1270
|
+
combineWith: "and"
|
|
1271
|
+
};
|
|
1272
|
+
var addFilter = (existingFilter, filter, { combineWith = AND } = DEFAULT_ADD_FILTER_OPTS) => {
|
|
1273
|
+
var _a;
|
|
1274
|
+
if (includesNoValues(filter)) {
|
|
1275
|
+
if (isMultiClauseFilter2(filter)) {
|
|
1276
|
+
} else {
|
|
1277
|
+
existingFilter = removeFilterForColumn(existingFilter, {
|
|
1278
|
+
name: filter.column
|
|
1279
|
+
});
|
|
1280
|
+
}
|
|
1281
|
+
} else if (includesAllValues(filter)) {
|
|
1282
|
+
if (isMultiClauseFilter2(filter)) {
|
|
1283
|
+
}
|
|
1284
|
+
return removeFilterForColumn(existingFilter, { name: (_a = filter.column) != null ? _a : "" });
|
|
1285
|
+
}
|
|
1286
|
+
if (!existingFilter) {
|
|
1287
|
+
return filter;
|
|
1288
|
+
}
|
|
1289
|
+
if (!filter) {
|
|
1290
|
+
return existingFilter;
|
|
1291
|
+
}
|
|
1292
|
+
if (existingFilter.op === AND && filter.op === AND) {
|
|
1293
|
+
return {
|
|
1294
|
+
op: AND,
|
|
1295
|
+
filters: combine(existingFilter.filters, filter.filters)
|
|
1296
|
+
};
|
|
1297
|
+
}
|
|
1298
|
+
if (existingFilter.op === AND) {
|
|
1299
|
+
const filters = replaceOrInsert(existingFilter.filters, filter);
|
|
1300
|
+
return filters.length > 1 ? { op: AND, filters } : filters[0];
|
|
1301
|
+
}
|
|
1302
|
+
if (filter.op === AND) {
|
|
1303
|
+
return { op: AND, filters: filter.filters.concat(existingFilter) };
|
|
1304
|
+
}
|
|
1305
|
+
if (filterEquals(existingFilter, filter, true)) {
|
|
1306
|
+
return filter;
|
|
1307
|
+
}
|
|
1308
|
+
if (canMerge(existingFilter, filter)) {
|
|
1309
|
+
return merge(existingFilter, filter);
|
|
1310
|
+
}
|
|
1311
|
+
return { op: combineWith, filters: [existingFilter, filter] };
|
|
1312
|
+
};
|
|
1313
|
+
var includesNoValues = (filter) => {
|
|
1314
|
+
if (!filter) {
|
|
1315
|
+
return false;
|
|
1316
|
+
}
|
|
1317
|
+
if (isInFilter(filter) && filter.values.length === 0) {
|
|
1318
|
+
return true;
|
|
1319
|
+
}
|
|
1320
|
+
return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));
|
|
1321
|
+
};
|
|
1322
|
+
var filterValue = (value) => typeof value === "string" ? `"${value}"` : value;
|
|
1323
|
+
var filterAsQuery = (f, namedFilters = {}) => {
|
|
1324
|
+
if (isMultiClauseFilter2(f)) {
|
|
1325
|
+
return f.filters.map((filter) => filterAsQuery(filter)).join(` ${f.op} `);
|
|
1326
|
+
} else if (isMultiValueFilter2(f)) {
|
|
1327
|
+
return `${f.column} ${f.op} [${f.values.join(",")}]`;
|
|
1328
|
+
} else {
|
|
1329
|
+
return `${f.column} ${f.op} ${filterValue(f.value)}`;
|
|
1330
|
+
}
|
|
1331
|
+
};
|
|
1332
|
+
var includesAllValues = (filter) => {
|
|
1333
|
+
if (!filter) {
|
|
1334
|
+
return false;
|
|
1335
|
+
}
|
|
1336
|
+
if (filter.op === STARTS_WITH && filter.value === "") {
|
|
1337
|
+
return true;
|
|
1338
|
+
}
|
|
1339
|
+
return filter.op === STARTS_WITH && filter.value === "";
|
|
1340
|
+
};
|
|
1341
|
+
var replaceOrInsert = (filters, filter) => {
|
|
1342
|
+
return filters.concat(filter);
|
|
1343
|
+
};
|
|
1344
|
+
var merge = (f1, f2) => {
|
|
1345
|
+
if (includesNoValues(f2)) {
|
|
1346
|
+
return f2;
|
|
1347
|
+
}
|
|
1348
|
+
if (isInFilter(f1) && isInFilter(f2)) {
|
|
1349
|
+
return {
|
|
1350
|
+
...f1,
|
|
1351
|
+
values: [
|
|
1352
|
+
...f1.values,
|
|
1353
|
+
...f2.values.filter(
|
|
1354
|
+
(v) => !f1.values.includes(v)
|
|
1355
|
+
)
|
|
1356
|
+
]
|
|
1357
|
+
};
|
|
1358
|
+
} else if (isInFilter(f1) && f2.op === EQUALS) {
|
|
1359
|
+
return {
|
|
1360
|
+
...f1,
|
|
1361
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
1362
|
+
// @ts-ignore
|
|
1363
|
+
values: f1.values.concat([f2.value])
|
|
1364
|
+
};
|
|
1365
|
+
} else if (f1.op === EQUALS && f2.op === EQUALS) {
|
|
1366
|
+
return {
|
|
1367
|
+
column: f1.column,
|
|
1368
|
+
op: IN,
|
|
1369
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
1370
|
+
// @ts-ignore
|
|
1371
|
+
values: [f1.value, f2.value]
|
|
1372
|
+
};
|
|
1373
|
+
}
|
|
1374
|
+
return f2;
|
|
1375
|
+
};
|
|
1376
|
+
var combine = (existingFilters, replacementFilters) => {
|
|
1377
|
+
const equivalentType = ({ op: t1 }, { op: t2 }) => {
|
|
1378
|
+
return t1 === t2 || t1[0] === t2[0];
|
|
1379
|
+
};
|
|
1380
|
+
const replaces = (existingFilter, replacementFilter) => {
|
|
1381
|
+
return existingFilter.column === replacementFilter.column && equivalentType(existingFilter, replacementFilter);
|
|
1382
|
+
};
|
|
1383
|
+
const stillApplicable = (existingFilter) => replacementFilters.some(
|
|
1384
|
+
(replacementFilter) => replaces(existingFilter, replacementFilter)
|
|
1385
|
+
) === false;
|
|
1386
|
+
return existingFilters.filter(stillApplicable).concat(replacementFilters);
|
|
1387
|
+
};
|
|
1388
|
+
var removeColumnFromFilter = (column, filter) => {
|
|
1389
|
+
if (isMultiClauseFilter2(filter)) {
|
|
1390
|
+
const [clause1, clause2] = filter.filters;
|
|
1391
|
+
if (clause1.column === column.name) {
|
|
1392
|
+
return [clause2, filterAsQuery(clause2)];
|
|
1393
|
+
}
|
|
1394
|
+
if (clause2.column === column.name) {
|
|
1395
|
+
return [clause1, filterAsQuery(clause1)];
|
|
1396
|
+
}
|
|
1397
|
+
}
|
|
1398
|
+
return [void 0, ""];
|
|
1399
|
+
};
|
|
1400
|
+
var removeFilter = (sourceFilter, filterToRemove) => {
|
|
1401
|
+
if (filterEquals(sourceFilter, filterToRemove, true)) {
|
|
1402
|
+
return null;
|
|
1403
|
+
}
|
|
1404
|
+
if (sourceFilter.op !== AND) {
|
|
1405
|
+
throw Error(
|
|
1406
|
+
`removeFilter cannot remove ${JSON.stringify(
|
|
1407
|
+
filterToRemove
|
|
1408
|
+
)} from ${JSON.stringify(sourceFilter)}`
|
|
1409
|
+
);
|
|
1410
|
+
}
|
|
1411
|
+
const filters = sourceFilter.filters.filter(
|
|
1412
|
+
(f) => !filterEquals(f, filterToRemove)
|
|
1413
|
+
);
|
|
1414
|
+
return filters.length > 0 ? { type: AND, filters } : null;
|
|
1415
|
+
};
|
|
1416
|
+
var splitFilterOnColumn = (filter, columnName) => {
|
|
1417
|
+
if (!filter) {
|
|
1418
|
+
return [null, null];
|
|
1419
|
+
}
|
|
1420
|
+
if (filter.column === columnName) {
|
|
1421
|
+
return [filter, null];
|
|
1422
|
+
}
|
|
1423
|
+
if (filter.op !== AND) {
|
|
1424
|
+
return [null, filter];
|
|
1425
|
+
}
|
|
1426
|
+
const [[columnFilter = null], filters] = partition(
|
|
1427
|
+
filter.filters,
|
|
1428
|
+
(f) => f.column === columnName
|
|
1429
|
+
);
|
|
1430
|
+
return filters.length === 1 ? [columnFilter, filters[0]] : [columnFilter, { op: AND, filters }];
|
|
1431
|
+
};
|
|
1432
|
+
var overrideColName = (filter, column) => {
|
|
1433
|
+
if (isMultiClauseFilter2(filter)) {
|
|
1434
|
+
return {
|
|
1435
|
+
op: filter.op,
|
|
1436
|
+
filters: filter.filters.map((f) => overrideColName(f, column))
|
|
1437
|
+
};
|
|
1438
|
+
}
|
|
1439
|
+
return { ...filter, column };
|
|
1440
|
+
};
|
|
1441
|
+
var filterIncludesColumn = (filter, column) => {
|
|
1442
|
+
if (!filter) {
|
|
1443
|
+
return false;
|
|
1444
|
+
}
|
|
1445
|
+
const { op, column: filterColName } = filter;
|
|
1446
|
+
switch (op) {
|
|
1447
|
+
case AND:
|
|
1448
|
+
case OR:
|
|
1449
|
+
return filter.filters != null && filter.filters.some((f) => filterIncludesColumn(f, column));
|
|
1450
|
+
default:
|
|
1451
|
+
return filterColName === column.name;
|
|
1452
|
+
}
|
|
1453
|
+
};
|
|
1454
|
+
var removeFilterForColumn = (sourceFilter, column) => {
|
|
1455
|
+
const colName = column.name;
|
|
1456
|
+
if (!sourceFilter) {
|
|
1457
|
+
return void 0;
|
|
1458
|
+
}
|
|
1459
|
+
if (sourceFilter.column === colName) {
|
|
1460
|
+
return void 0;
|
|
1461
|
+
}
|
|
1462
|
+
if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {
|
|
1463
|
+
const { op } = sourceFilter;
|
|
1464
|
+
const filters = sourceFilter.filters;
|
|
1465
|
+
const otherColFilters = filters.filter((f) => f.column !== colName);
|
|
1466
|
+
switch (otherColFilters.length) {
|
|
1467
|
+
case 0:
|
|
1468
|
+
return void 0;
|
|
1469
|
+
case 1:
|
|
1470
|
+
return otherColFilters[0];
|
|
1471
|
+
default:
|
|
1472
|
+
return { op, filters: otherColFilters };
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
return sourceFilter;
|
|
1476
|
+
};
|
|
1477
|
+
var canMerge = (f1, f2) => f1.column === f2.column && (f1.op === "=" || f1.op === "in") && (f2.op === "=" || f2.op === "in");
|
|
1478
|
+
var sameValues = (arr1, arr2) => {
|
|
1479
|
+
if (arr1 === arr2) {
|
|
1480
|
+
return true;
|
|
1481
|
+
}
|
|
1482
|
+
if (arr1.length === arr2.length) {
|
|
1483
|
+
const a = arr1.slice().sort();
|
|
1484
|
+
const b = arr2.slice().sort();
|
|
1485
|
+
return a.join("|") === b.join("|");
|
|
1486
|
+
}
|
|
1487
|
+
return false;
|
|
1488
|
+
};
|
|
1489
|
+
var filterEquals = (f1, f2, strict = false) => {
|
|
1490
|
+
if (!strict) {
|
|
1491
|
+
return true;
|
|
1492
|
+
}
|
|
1493
|
+
if (f1 && f2 && canMerge(f1, f2)) {
|
|
1494
|
+
return f1.op === f2.op && (isSingleValueFilter2(f1) && isSingleValueFilter2(f2) && f1.value === f2.value || isMultiValueFilter2(f1) && isMultiValueFilter2(f2) && sameValues(f1.values, f2.values));
|
|
1495
|
+
}
|
|
1496
|
+
return false;
|
|
1497
|
+
};
|
|
1498
|
+
var updateFilter = (filter, newFilter, mode) => {
|
|
1499
|
+
if (filter && newFilter) {
|
|
1500
|
+
if (mode === "replace") {
|
|
1501
|
+
return newFilter;
|
|
1502
|
+
}
|
|
1503
|
+
if (filter.op === "and") {
|
|
1504
|
+
return {
|
|
1505
|
+
...filter,
|
|
1506
|
+
filters: filter.filters.concat(newFilter)
|
|
1507
|
+
};
|
|
1508
|
+
}
|
|
1509
|
+
const { column: columnName } = newFilter;
|
|
1510
|
+
if (columnName) {
|
|
1511
|
+
const existingClause = newFilter.column ? extractFilterForColumn(filter, columnName) : void 0;
|
|
1512
|
+
if (existingClause && columnName) {
|
|
1513
|
+
const result = removeFilterForColumn(filter, { name: columnName });
|
|
1514
|
+
return updateFilter(result, newFilter, "add");
|
|
1515
|
+
}
|
|
1516
|
+
}
|
|
1517
|
+
return {
|
|
1518
|
+
op: "and",
|
|
1519
|
+
filters: [filter, newFilter]
|
|
1520
|
+
};
|
|
1521
|
+
}
|
|
1522
|
+
if (newFilter) {
|
|
1523
|
+
return newFilter;
|
|
1524
|
+
}
|
|
1525
|
+
return filter;
|
|
1526
|
+
};
|
|
1527
|
+
export {
|
|
1528
|
+
AND,
|
|
1529
|
+
ENDS_WITH,
|
|
1530
|
+
EQUALS,
|
|
1531
|
+
FilterInput,
|
|
1532
|
+
FilterToolbar,
|
|
1533
|
+
GREATER_THAN,
|
|
1534
|
+
IN,
|
|
1535
|
+
LESS_THAN,
|
|
1536
|
+
OR,
|
|
1537
|
+
STARTS_WITH,
|
|
1538
|
+
addFilter,
|
|
1539
|
+
filterAsQuery,
|
|
1540
|
+
filterClauses,
|
|
1541
|
+
filterEquals,
|
|
1542
|
+
filterIncludesColumn,
|
|
1543
|
+
filterPredicate,
|
|
1544
|
+
getFilterPredicate,
|
|
1545
|
+
isAndFilter,
|
|
1546
|
+
isFilterClause,
|
|
1547
|
+
isInFilter,
|
|
1548
|
+
isMultiClauseFilter2 as isMultiClauseFilter,
|
|
1549
|
+
isMultiValueFilter2 as isMultiValueFilter,
|
|
1550
|
+
isNamedFilter,
|
|
1551
|
+
isOrFilter,
|
|
1552
|
+
isSingleValueFilter2 as isSingleValueFilter,
|
|
1553
|
+
overrideColName,
|
|
1554
|
+
removeColumnFromFilter,
|
|
1555
|
+
removeFilter,
|
|
1556
|
+
splitFilterOnColumn,
|
|
1557
|
+
updateFilter,
|
|
1558
|
+
useCodeMirrorEditor,
|
|
1559
|
+
useFilterSuggestionProvider
|
|
1560
|
+
};
|
|
2
1561
|
/*! Bundled license information:
|
|
3
1562
|
|
|
4
1563
|
classnames/index.js:
|