@vuu-ui/vuu-filters 0.6.21 → 0.6.22-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 +1577 -1
- package/cjs/index.js.map +3 -3
- package/esm/index.js +1600 -1
- package/esm/index.js.map +3 -3
- package/index.css +56 -1
- package/index.css.map +1 -1
- package/package.json +4 -4
- package/types/filter-input/useCodeMirrorEditor.d.ts +10 -4
- package/types/filter-input/useFilterAutoComplete.d.ts +4 -1
- package/types/filter-input/useFilterSuggestionProvider.d.ts +6 -1
package/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../node_modules/classnames/index.js", "../../../packages/vuu-filters/src/index.ts", "../../../packages/vuu-filters/src/filter-input/FilterInput.tsx", "../../../packages/vuu-filters/src/filter-input/useCodeMirrorEditor.ts", "../../../packages/vuu-filters/src/filter-input/filter-language-parser/FilterLanguage.ts", "../../../packages/vuu-filters/src/filter-input/filter-language-parser/generated/filter-parser.js", "../../../packages/vuu-filters/src/filter-input/filter-language-parser/FilterTreeWalker.ts", "../../../packages/vuu-filters/src/filter-input/filter-language-parser/FilterParser.ts", "../../../packages/vuu-filters/src/filter-input/highlighting.ts", "../../../packages/vuu-filters/src/filter-input/theme.ts", "../../../packages/vuu-filters/src/filter-input/useFilterAutoComplete.ts", "../../../packages/vuu-filters/src/filter-input/useFilterSuggestionProvider.ts", "../../../packages/vuu-filters/src/filter-input/filterInfo.ts", "../../../packages/vuu-filters/src/filter-toolbar/FilterToolbar.tsx", "../../../packages/vuu-filters/src/filter-toolbar/useFilterToolbar.tsx", "../../../packages/vuu-filters/src/filter-toolbar/FilterDropdown.tsx", "../../../packages/vuu-filters/src/filter-toolbar/FilterDropdownMultiSelect.tsx", "../../../packages/vuu-filters/src/filter-evaluation-utils.ts", "../../../packages/vuu-filters/src/filter-utils.ts", "../../../packages/vuu-filters/src/filterTypes.ts"],
|
|
4
|
-
"sourcesContent": ["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\tvar nativeCodeString = '[native code]';\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n", "export * from \"./filter-input\";\nexport * from \"./filter-toolbar\";\nexport * from \"./filter-evaluation-utils\";\nexport * from \"./filter-utils\";\nexport * from \"./filterTypes\";\n", "import { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { Button } from \"@salt-ds/core\";\nimport { HTMLAttributes } from \"react\";\nimport {\n filterSubmissionHandler,\n SuggestionConsumer,\n useCodeMirrorEditor,\n} from \"./useCodeMirrorEditor\";\n\nimport \"./FilterInput.css\";\n\nconst classBase = \"vuuFilterInput\";\n\nexport interface FilterInputProps\n extends SuggestionConsumer,\n HTMLAttributes<HTMLDivElement> {\n existingFilter?: Filter;\n namedFilters?: Map<string, string>;\n onSubmitFilter?: filterSubmissionHandler;\n}\n\nexport const FilterInput = ({\n existingFilter,\n namedFilters,\n onSubmitFilter,\n suggestionProvider,\n ...props\n}: FilterInputProps) => {\n const { editorRef, clearInput } = useCodeMirrorEditor({\n existingFilter,\n onSubmitFilter,\n suggestionProvider,\n });\n\n return (\n <div {...props} className={classBase}>\n <Button className={`${classBase}-FilterButton`} data-icon=\"filter\" />\n <div className={`${classBase}-Editor`} ref={editorRef} />\n <Button\n className={`${classBase}-ClearButton`}\n data-icon=\"close-circle\"\n onClick={clearInput}\n />\n </div>\n );\n};\n", "import {\n autocompletion,\n Completion,\n defaultKeymap,\n EditorState,\n EditorView,\n ensureSyntaxTree,\n keymap,\n minimalSetup,\n startCompletion,\n VuuCompletion,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport cx from \"classnames\";\nimport { MutableRefObject, useEffect, useMemo, useRef } from \"react\";\nimport { filterLanguageSupport } from \"./filter-language-parser\";\nimport { walkTree } from \"./filter-language-parser/FilterTreeWalker\";\nimport { vuuHighlighting } from \"./highlighting\";\nimport { vuuTheme } from \"./theme\";\nimport {\n ApplyCompletion,\n FilterSubmissionMode,\n useAutoComplete,\n} from \"./useFilterAutoComplete\";\n\nexport type SuggestionType = \"column\" | \"columnValue\" | \"operator\";\n\nexport interface SuggestionOptions {\n columnName?: string;\n operator?: string;\n startsWith?: string;\n selection?: string[];\n}\n\nexport type getSuggestionsType = (\n suggestionType: SuggestionType,\n options?: SuggestionOptions\n) => Promise<Completion[]>;\n\nexport interface IFilterSuggestionProvider {\n getSuggestions: getSuggestionsType;\n isPartialMatch: (\n valueType: SuggestionType,\n columnName?: string,\n text?: string | undefined\n ) => Promise<boolean>;\n}\n\nexport interface SuggestionConsumer {\n suggestionProvider: IFilterSuggestionProvider;\n}\n\nconst getView = (ref: MutableRefObject<EditorView | undefined>): EditorView => {\n if (ref.current == undefined) {\n throw Error(\"EditorView not defined\");\n }\n return ref.current;\n};\n\nconst getOptionClass = (completion: VuuCompletion) => {\n return cx(\"vuuSuggestion\", {\n vuuIllustration: completion.isIllustration,\n });\n};\n\nconst stripName = (filterQuery: string) => {\n const pos = filterQuery.lastIndexOf(\" as \");\n if (pos !== -1) {\n return filterQuery.slice(0, pos);\n } else {\n return filterQuery;\n }\n};\n\nconst noop = () => console.log(\"noooop\");\n\nexport type filterSubmissionHandler = (\n filter: Filter | undefined,\n filterQuery: string,\n mode?: FilterSubmissionMode,\n filterName?: string\n) => void;\n\nexport interface CodeMirrorEditorProps {\n existingFilter?: Filter;\n onSubmitFilter?: filterSubmissionHandler;\n suggestionProvider: IFilterSuggestionProvider;\n}\n\nexport const useCodeMirrorEditor = ({\n existingFilter,\n onSubmitFilter,\n suggestionProvider,\n}: CodeMirrorEditorProps) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const onSubmit = useRef<ApplyCompletion>(noop);\n const viewRef = useRef<EditorView>();\n const completionFn = useAutoComplete(\n suggestionProvider,\n onSubmit,\n existingFilter\n );\n\n const [createState, clearInput] = useMemo(() => {\n const parseFilter = ():\n | [Filter, string, string | undefined]\n | [undefined, \"\", undefined] => {\n const view = getView(viewRef);\n const source = view.state.doc.toString();\n const tree = ensureSyntaxTree(view.state, view.state.doc.length, 5000);\n if (tree) {\n const filter = walkTree(tree, source) as Filter;\n return [filter, stripName(source), filter.name];\n } else {\n return [undefined, \"\", undefined];\n }\n };\n\n const clearInput = () => {\n getView(viewRef).setState(createState());\n };\n\n const submitFilterAndClearInput = (mode?: FilterSubmissionMode) => {\n const [filter, filterQuery, filterName] = parseFilter();\n onSubmitFilter?.(filter, filterQuery, mode, filterName);\n clearInput();\n };\n\n const submitFilter = (key: string) => {\n return keymap.of([\n {\n key,\n run() {\n submitFilterAndClearInput();\n return true;\n },\n },\n ]);\n };\n\n const showSuggestions = (key: string) => {\n return keymap.of([\n {\n key,\n run() {\n startCompletion(getView(viewRef));\n return true;\n },\n },\n ]);\n };\n\n const createState = (): EditorState =>\n EditorState.create({\n doc: \"\",\n extensions: [\n minimalSetup,\n autocompletion({\n override: [completionFn],\n optionClass: getOptionClass,\n }),\n filterLanguageSupport(),\n keymap.of(defaultKeymap),\n submitFilter(\"Ctrl-Enter\"),\n showSuggestions(\"ArrowDown\"),\n EditorView.updateListener.of((v) => {\n const view = getView(viewRef);\n if (v.docChanged) {\n startCompletion(view);\n }\n }),\n EditorState.transactionFilter.of((tr) =>\n tr.newDoc.lines > 1 ? [] : tr\n ),\n vuuTheme,\n vuuHighlighting,\n ],\n });\n\n onSubmit.current = (mode?: FilterSubmissionMode) => {\n submitFilterAndClearInput(mode);\n // TODO refocu sthe editor\n setTimeout(() => {\n getView(viewRef).focus();\n }, 100);\n };\n\n return [createState, clearInput];\n }, [completionFn, onSubmitFilter]);\n\n useEffect(() => {\n if (!editorRef.current) {\n throw Error(\"editor not in dom\");\n }\n\n viewRef.current = new EditorView({\n state: createState(),\n parent: editorRef.current,\n });\n\n return () => {\n viewRef.current?.destroy();\n };\n }, [completionFn, createState]);\n\n return { editorRef, clearInput };\n};\n", "import {\n LanguageSupport,\n LRLanguage,\n styleTags,\n tags as tag,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { parser } from \"./generated/filter-parser\";\n\nconst filterLanguage = LRLanguage.define({\n name: \"VuuFilterQuery\",\n parser: parser.configure({\n props: [\n styleTags({\n Identifier: tag.variableName,\n String: tag.string,\n Or: tag.emphasis,\n Operator: tag.operator,\n }),\n ],\n }),\n});\n\nexport const filterLanguageSupport = () => {\n return new LanguageSupport(filterLanguage);\n};\n", "// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@vuu-ui/vuu-codemirror\"\nexport const parser = LRParser.deserialize({\n version: 14,\n 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\",\n 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\",\n goto: \"#YvPPw}!TPPPPPPPPPPwPP!WPP!ZP!ZP!aP!g!jPPP!p!s!aP#P!aXROU[]XQOU[]RYQRibXTOU[]XVOU[]Rf^QkhRnkRWOQSOQ_UQc[Rd]QaYQhbRmj\",\n 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\",\n maxTerm: 39,\n skippedNodes: [0],\n repeatNodeCount: 1,\n 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\",\n tokenizers: [0, 1],\n topRules: {\"Filter\":[0,1]},\n tokenPrec: 0\n})\n", "import { Tree } from \"@lezer/common\";\nimport {\n Filter,\n FilterCombinatorOp,\n MultipleValueFilterClauseOp,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n isMultiClauseFilter,\n isMultiValueFilter,\n isSingleValueFilter,\n} from \"@vuu-ui/vuu-utils\";\n\nclass FilterExpression {\n public name: string | undefined;\n #filter: Partial<Filter> | undefined = undefined;\n\n setFilterCombinatorOp(op: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter) && filter.op === op) {\n return;\n } else {\n this.#filter = {\n op: op as FilterCombinatorOp,\n filters: [this.#filter as Filter],\n };\n }\n }\n\n add(filter: Partial<Filter>) {\n if (this.#filter === undefined) {\n this.#filter = filter;\n } else if (isMultiClauseFilter(this.#filter)) {\n this.#filter.filters.push(filter as Filter);\n } else {\n throw Error(`Invalid filter passed to FilterExpression`);\n }\n }\n\n setColumn(column: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setColumn(column, target);\n }\n } else if (filter) {\n filter.column = column;\n }\n }\n setOp(value: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setOp(value, target);\n }\n } else if (filter) {\n filter.op = value as\n | SingleValueFilterClauseOp\n | MultipleValueFilterClauseOp;\n }\n }\n setValue(value: string | number | boolean, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setValue(value, target);\n }\n } else if (isMultiValueFilter(filter)) {\n filter.values ??= [];\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filter.values.push(value);\n } else if (isSingleValueFilter(filter)) {\n filter.value = value;\n }\n }\n\n toJSON(filter = this.#filter) {\n if (this.name) {\n return {\n ...filter,\n name: this.name,\n };\n } else {\n return filter;\n }\n }\n}\n\nexport const walkTree = (tree: Tree, source: string) => {\n const filterExpression = new FilterExpression();\n const cursor = tree.cursor();\n do {\n const { name, from, to } = cursor;\n switch (name) {\n case \"ColumnValueExpression\":\n filterExpression.add({});\n break;\n case \"ColumnSetExpression\":\n filterExpression.add({ op: \"in\" });\n break;\n\n case \"Or\":\n case \"And\":\n filterExpression.setFilterCombinatorOp(source.substring(from, to));\n break;\n\n case \"Column\":\n filterExpression.setColumn(source.substring(from, to));\n break;\n\n case \"Operator\":\n filterExpression.setOp(source.substring(from, to));\n break;\n\n case \"String\":\n filterExpression.setValue(source.substring(from + 1, to - 1));\n break;\n\n case \"Number\":\n filterExpression.setValue(parseFloat(source.substring(from, to)));\n break;\n\n case \"True\":\n filterExpression.setValue(true);\n break;\n\n case \"False\":\n filterExpression.setValue(false);\n break;\n\n case \"FilterName\":\n filterExpression.name = source.substring(from, to);\n break;\n\n default:\n }\n } while (cursor.next());\n\n return filterExpression.toJSON();\n};\n", "import { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { parser } from \"./generated/filter-parser\";\nimport { walkTree } from \"./FilterTreeWalker\";\n\nconst strictParser = parser.configure({ strict: true });\n\nexport const parseFilter = (filterQuery: string): Filter => {\n const parseTree = strictParser.parse(filterQuery);\n const filter = walkTree(parseTree, filterQuery) as Filter;\n return filter;\n};\n", "import {\n HighlightStyle,\n syntaxHighlighting,\n tags,\n} from \"@vuu-ui/vuu-codemirror\";\n\nconst myHighlightStyle = HighlightStyle.define([\n { tag: tags.variableName, color: \"var(--vuuFilterEditor-variableColor)\" },\n { tag: tags.comment, color: \"green\", fontStyle: \"italic\" },\n]);\n\nexport const vuuHighlighting = syntaxHighlighting(myHighlightStyle);\n", "import { EditorView } from \"@vuu-ui/vuu-codemirror\";\n\nexport const vuuTheme = EditorView.theme(\n {\n \"&\": {\n color: \"var(--vuuFilterEditor-color)\",\n backgroundColor: \"var(--vuuFilterEditor-background)\",\n fontSize: \"var(--vuuFilterEditor-fontSize)\",\n },\n \".cm-content\": {\n caretColor: \"var(--vuuFilterEditor-cursorColor)\",\n padding: 0,\n },\n \".cm-line\": {\n lineHeight: \"var(--vuuFilterEditor-lineHeight)\",\n },\n \"&.cm-focused .cm-cursor\": {\n borderLeftColor: \"var(--vuuFilterEditor-cursorColor)\",\n },\n \"&.cm-focused .cm-selectionBackground, ::selection\": {\n backgroundColor: \"var(--vuuFilterEditor-selectionBackground)\",\n },\n \".cm-selectionBackground, ::selection\": {\n backgroundColor: \"var(--vuuFilterEditor-selectionBackground)\",\n },\n \".cm-scroller\": {\n fontFamily: \"var(--vuuFilterEditor-fontFamily)\",\n },\n \".cm-tooltip\": {\n background: \"var(--vuuFilterEditor-tooltipBackground)\",\n border: \"var(--vuuFilterEditor-tooltipBorder)\",\n boxShadow: \"var(--vuuFilterEditor-tooltipElevation)\",\n \"&.cm-tooltip-autocomplete > ul\": {\n fontFamily: \"var(--vuuFilterEditor-fontFamily)\",\n fontSize: \"var(--vuuFilterEditor-fontSize)\",\n maxHeight: \"240px\",\n },\n \"&.cm-tooltip-autocomplete > ul > li\": {\n alignItems: \"center\",\n display: \"flex\",\n height: \"var(--vuuFilterEditor-suggestion-height)\",\n padding: \"0 3px\",\n lineHeight: \"var(--vuuFilterEditor-suggestion-height)\",\n },\n \"&.cm-tooltip-autocomplete li[aria-selected]\": {\n background: \"var(--vuuFilterEditor-suggestion-selectedBackground)\",\n color: \"var(--vuuFilterEditor-suggestion-selectedColor)\",\n },\n },\n \".cm-completionIcon\": {\n height: \"18px\",\n flex: \"0 0 16px\",\n },\n \".cm-completionLabel\": {\n flex: \"1 1 auto\",\n },\n \".cm-completionIcon-filter\": {\n position: \"relative\",\n \"&:after\": {\n background: \"var(--salt-text-secondary-foreground)\",\n content: \"''\",\n \"-webkit-mask\": \"var(--svg-filter) center center/13px 13px\",\n \"-webkit-mask-repeat\": \"no-repeat\",\n position: \"absolute\",\n height: \"18px\",\n left: \"0px\",\n top: \"0px\",\n width: \"16px\",\n },\n },\n },\n { dark: false }\n);\n", "import {\n asNameSuggestion,\n booleanJoinSuggestions,\n Completion,\n CompletionContext,\n CompletionSource,\n EditorState,\n getNodeByName,\n getValue,\n syntaxTree,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { MutableRefObject, useCallback } from \"react\";\nimport {\n IFilterSuggestionProvider,\n SuggestionType,\n} from \"./useCodeMirrorEditor\";\n\nexport type FilterSubmissionMode = \"and\" | \"or\" | \"replace\";\n\nexport type ApplyCompletion = (mode?: FilterSubmissionMode) => void;\n\nconst getOperator = (node: SyntaxNode, state: EditorState) => {\n let maybeColumnNode = node.prevSibling || node.parent;\n while (\n maybeColumnNode &&\n ![\"Column\", \"Operator\", \"In\"].includes(maybeColumnNode.name)\n ) {\n maybeColumnNode = maybeColumnNode.prevSibling || maybeColumnNode.parent;\n }\n if (maybeColumnNode?.name === \"In\" || maybeColumnNode?.name === \"Operator\") {\n return getValue(maybeColumnNode, state);\n } else {\n return undefined;\n }\n};\n\n// Operators that are more than a single character in length may incur partial matches\n// TODO need to check that previous token is a column\nconst getPartialOperator = (\n maybeOperatorNode: SyntaxNode,\n state: EditorState,\n columnName?: string\n) => {\n const value = getValue(maybeOperatorNode, state);\n if (columnName === undefined || value === columnName) {\n return;\n }\n if (\n [\"contains\", \"ends\", \"starts\"].some((val) =>\n val.startsWith(value.toLowerCase())\n )\n ) {\n return value;\n } else {\n return undefined;\n }\n};\n\nconst getClauseOperator = (node: SyntaxNode, state: EditorState) => {\n let maybeTargetNode = node.prevSibling || node.parent || node.lastChild;\n while (maybeTargetNode && maybeTargetNode.name === \"\u26A0\")\n maybeTargetNode = maybeTargetNode.prevSibling;\n if (maybeTargetNode && [\"As\", \"Or\", \"And\"].includes(maybeTargetNode.name)) {\n return getValue(maybeTargetNode, state);\n } else {\n return undefined;\n }\n};\n\nconst getSetValues = (node: SyntaxNode, state: EditorState): string[] => {\n let maybeTargetNode = node.lastChild;\n const values: string[] = [];\n while (maybeTargetNode && maybeTargetNode.name !== \"In\") {\n const value = getValue(maybeTargetNode, state);\n if (value) {\n values.push(value);\n } else {\n break;\n }\n maybeTargetNode = maybeTargetNode.prevSibling;\n }\n return values;\n};\n\nconst promptForFilterName = (context: CompletionContext) => ({\n from: context.pos,\n options: [\n {\n label: \"enter name for this filter\",\n boost: 5,\n },\n ],\n});\n\nconst makeSaveOrExtendSuggestions = (\n onSubmit: (mode?: FilterSubmissionMode) => void,\n existingFilter?: Filter,\n withJoinSuggestions = true\n) => {\n const result = existingFilter\n ? ([\n {\n label: \"REPLACE existing filter\",\n apply: () => onSubmit(\"replace\"),\n boost: 8,\n },\n {\n label: \"AND existing filter\",\n apply: () => onSubmit(\"and\"),\n boost: 7,\n },\n {\n label: \"OR existing filter\",\n apply: () => onSubmit(\"or\"),\n boost: 7,\n },\n ] as Completion[])\n : ([\n {\n label: \"Press ENTER to submit\",\n apply: () => onSubmit(),\n boost: 6,\n },\n ] as Completion[]);\n\n return withJoinSuggestions\n ? result.concat(booleanJoinSuggestions).concat(asNameSuggestion)\n : result;\n};\n\nconst promptToSaveOrExtend = (\n context: CompletionContext,\n onSubmit: () => void,\n existingFilter?: Filter\n) => ({\n from: context.pos,\n options: makeSaveOrExtendSuggestions(onSubmit, existingFilter),\n});\n\nconst promptToSave = (\n context: CompletionContext,\n onSubmit: () => void,\n existingFilter?: Filter\n) => ({\n from: context.pos,\n options: makeSaveOrExtendSuggestions(onSubmit, existingFilter, false),\n});\n\nexport const useAutoComplete = (\n suggestionProvider: IFilterSuggestionProvider,\n onSubmit: MutableRefObject<ApplyCompletion>,\n existingFilter?: Filter\n) => {\n const makeSuggestions = useCallback(\n async (\n context: CompletionContext,\n suggestionType: SuggestionType,\n optionalArgs: {\n columnName?: string;\n operator?: string;\n selection?: string[];\n startsWith?: string;\n } = {}\n ) => {\n const options = await suggestionProvider.getSuggestions(\n suggestionType,\n optionalArgs\n );\n const { startsWith = \"\" } = optionalArgs;\n return { from: context.pos - startsWith.length, options };\n },\n [suggestionProvider]\n );\n\n return useCallback(\n async (context: CompletionContext) => {\n const { state, pos } = context;\n const word = context.matchBefore(/\\w*/) ?? {\n from: 0,\n to: 0,\n text: undefined,\n };\n\n const tree = syntaxTree(state);\n const nodeBefore = tree.resolveInner(pos, -1);\n console.log({ nodeBeforeName: nodeBefore.name });\n\n switch (nodeBefore.name) {\n case \"Filter\":\n if (context.pos === 0) {\n return makeSuggestions(context, \"column\");\n } else {\n const clauseOperator = getClauseOperator(nodeBefore, state);\n if (clauseOperator === \"as\") {\n return promptForFilterName(context);\n } else {\n return promptToSaveOrExtend(\n context,\n onSubmit.current,\n existingFilter\n );\n }\n }\n\n case \"As\":\n return promptForFilterName(context);\n\n case \"FilterName\":\n return promptToSave(context, onSubmit.current, existingFilter);\n\n case \"Column\": {\n const columnName = getValue(nodeBefore, state);\n const isPartialMatch = await suggestionProvider.isPartialMatch(\n \"column\",\n undefined,\n columnName\n );\n if (isPartialMatch) {\n return makeSuggestions(context, \"column\", {\n startsWith: columnName,\n });\n } else {\n return makeSuggestions(context, \"operator\", { columnName });\n }\n }\n\n case \"\u26A0\": {\n const columnName = getNodeByName(nodeBefore, state);\n const operator = getOperator(nodeBefore, state);\n // TODO check if we're mnatching a partial jojn operator\n const partialOperator = operator\n ? undefined\n : getPartialOperator(nodeBefore, state, columnName);\n\n if (partialOperator) {\n return makeSuggestions(context, \"operator\", {\n columnName,\n startsWith: partialOperator,\n });\n } else {\n return makeSuggestions(context, \"columnValue\", {\n columnName,\n operator,\n startsWith: word.text,\n });\n }\n }\n\n case \"Identifier\":\n {\n const clauseOperator = getClauseOperator(nodeBefore, state);\n if (clauseOperator === \"as\") {\n return {\n from: context.pos,\n options: [\n {\n label: \"press ENTER to apply filter and save\",\n apply: () => onSubmit.current(),\n boost: 5,\n },\n ],\n };\n }\n }\n break;\n case \"ColumnSetExpression\":\n case \"Values\": {\n const columnName = getNodeByName(nodeBefore, state);\n const selection = getSetValues(nodeBefore, state);\n return makeSuggestions(context, \"columnValue\", {\n columnName,\n selection,\n });\n }\n case \"Comma\":\n case \"LBrack\": {\n const columnName = getNodeByName(nodeBefore, state) as string;\n return makeSuggestions(context, \"columnValue\", { columnName });\n }\n\n case \"ColumnValueExpression\":\n {\n const lastToken = nodeBefore.lastChild?.prevSibling;\n if (lastToken?.name === \"Column\") {\n return makeSuggestions(context, \"operator\", {\n columnName: getNodeByName(nodeBefore, state),\n });\n } else if (lastToken?.name === \"Operator\") {\n return makeSuggestions(context, \"columnValue\", {\n columnName: getNodeByName(lastToken, state),\n operator: getValue(lastToken, state),\n });\n }\n }\n break;\n\n case \"In\": {\n return {\n from: context.pos,\n options: [{ label: \"[\", apply: \" [\", type: \"text\" }],\n };\n }\n\n case \"Eq\": {\n return makeSuggestions(context, \"columnValue\", {\n columnName: getNodeByName(nodeBefore, state),\n });\n }\n\n case \"AndExpression\":\n case \"OrExpression\": {\n return makeSuggestions(context, \"column\");\n }\n\n default:\n }\n },\n [existingFilter, makeSuggestions, onSubmit, suggestionProvider]\n ) as CompletionSource;\n};\n", "import {\n Completion,\n numericOperators,\n stringOperators,\n toSuggestions,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { getTypeaheadParams, useTypeaheadSuggestions } from \"@vuu-ui/vuu-data\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { IFilterSuggestionProvider, SuggestionType } from \"@vuu-ui/vuu-filters\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useRef } from \"react\";\nimport { filterInfo } from \"./filterInfo\";\n\nconst NO_NAMED_FILTERS = [] as Completion[];\nconst NONE = {};\n\nconst suggestColumns = (columns: ColumnDescriptor[]) =>\n columns.map((column) => ({\n boost: 5,\n label: column.name,\n }));\n\nconst suggestNamedFilters = (namedFilters?: Map<string, string>) =>\n namedFilters\n ? (Array.from(namedFilters.entries()).map(([filterName, filterQuery]) => ({\n info: () => filterInfo(filterName, filterQuery),\n label: filterName,\n type: \"filter\",\n })) as Completion[])\n : NO_NAMED_FILTERS;\n\nconst doneCommand: Completion = {\n label: \"Done\",\n apply: \"] \",\n type: \"keyword\",\n boost: 10,\n};\n\nconst withApplySpace = (\n suggestions: Completion[],\n startsWith = \"\"\n): Completion[] =>\n suggestions\n .filter((sugg) => startsWith === \"\" || sugg.label.startsWith(startsWith))\n .map((suggestion) => ({\n ...suggestion,\n apply: suggestion.label + \" \",\n }));\n\nexport interface SuggestionProviderHookProps {\n columns: ColumnDescriptor[];\n namedFilters?: Map<string, string>;\n table: VuuTable;\n}\n\nexport const useFilterSuggestionProvider = ({\n columns,\n namedFilters,\n table,\n}: SuggestionProviderHookProps): IFilterSuggestionProvider => {\n const latestSuggestionsRef = useRef<Completion[]>();\n const getTypeaheadSuggestions = useTypeaheadSuggestions();\n\n const getSuggestions: IFilterSuggestionProvider[\"getSuggestions\"] =\n useCallback(\n async (suggestionType, options = NONE): Promise<Completion[]> => {\n const { columnName, operator, startsWith, selection } = options;\n\n if (suggestionType === \"operator\") {\n const column = columns.find((col) => col.name === columnName);\n if (column) {\n switch (column.serverDataType) {\n case \"string\":\n case \"char\":\n return withApplySpace(stringOperators, startsWith);\n case \"int\":\n case \"long\":\n case \"double\":\n return withApplySpace(numericOperators);\n }\n } else {\n console.warn(`'${columnName}' does not match any column name`);\n }\n } else if (suggestionType === \"column\") {\n const columnSuggestions = await suggestColumns(columns);\n const filterSuggestions = await suggestNamedFilters(namedFilters);\n return (latestSuggestionsRef.current =\n withApplySpace(columnSuggestions)).concat(\n withApplySpace(filterSuggestions)\n );\n }\n\n if (columnName) {\n const column = columns.find((col) => col.name === columnName);\n const prefix = Array.isArray(selection)\n ? selection.length === 0\n ? \"[\"\n : \",\"\n : \"\";\n const params = getTypeaheadParams(table, columnName, startsWith);\n const suggestions = await getTypeaheadSuggestions(params);\n // prob don't want to save the prefix\n const isIllustration = operator === \"starts\";\n latestSuggestionsRef.current = toSuggestions(suggestions, {\n quoted: column?.serverDataType === \"string\",\n prefix: isIllustration ? startsWith : prefix,\n isIllustration,\n });\n if (Array.isArray(selection) && selection?.length > 1) {\n return [doneCommand, ...latestSuggestionsRef.current];\n }\n return latestSuggestionsRef.current;\n }\n\n return [];\n },\n [columns, getTypeaheadSuggestions, namedFilters, table]\n );\n\n const isPartialMatch = useCallback(\n async (\n valueType: SuggestionType,\n columnName?: string,\n pattern?: string\n ) => {\n // const { current: latestSuggestions } = latestSuggestionsRef;\n const suggestions =\n // latestSuggestions && latestSuggestions.length > 0\n // ? latestSuggestions\n await getSuggestions(valueType, { columnName });\n\n if (pattern && suggestions) {\n for (const option of suggestions) {\n if (option.label === pattern) {\n return false;\n } else if (option.label.startsWith(pattern)) {\n return true;\n }\n }\n }\n return false;\n },\n [getSuggestions]\n );\n\n return {\n getSuggestions,\n isPartialMatch,\n };\n};\n", "import { createEl } from \"@vuu-ui/vuu-utils\";\n\nexport const filterInfo = (\n filterName: string,\n filterQuery: string\n // filter: Filter\n) => {\n const rootElement = createEl(\"div\", \"vuuFunctionDoc\");\n const headingElement = createEl(\"div\", \"function-heading\");\n\n const nameElement = createEl(\"span\", \"function-name\", filterName);\n // const paramElement = createEl(\"span\", \"param-list\", params.description);\n // const typeElement = createEl(\"span\", \"function-type\", type);\n\n headingElement.appendChild(nameElement);\n // headingElement.appendChild(paramElement);\n // headingElement.appendChild(typeElement);\n\n const child2 = createEl(\"p\", undefined, filterQuery);\n\n rootElement.appendChild(headingElement);\n rootElement.appendChild(child2);\n\n return rootElement;\n};\n", "import { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { Toolbar, ToolbarProps } from \"@heswell/salt-lab\";\nimport cx from \"classnames\";\nimport { SuggestionConsumer } from \"../filter-input\";\nimport { useFilterToolbar } from \"./useFilterToolbar\";\n\nimport \"./FilterToolbar.css\";\n\nexport interface FilterToolbarProps extends SuggestionConsumer, ToolbarProps {\n filter?: Filter;\n}\n\nexport const FilterToolbar = ({\n className,\n filter,\n suggestionProvider,\n ...props\n}: FilterToolbarProps) => {\n console.log(`FilterToolbar ${JSON.stringify(filter, null, 2)}`);\n const toolbarItems = useFilterToolbar({ filter, suggestionProvider });\n return (\n <Toolbar className={cx(\"vuuFilterToolbar\", className)} {...props}>\n {toolbarItems}\n </Toolbar>\n );\n};\n", "import { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport {\n isMultiValueFilter,\n isNamedFilter,\n isSingleValueFilter,\n IFilterSuggestionProvider,\n SuggestionConsumer,\n} from \"@vuu-ui/vuu-filters\";\nimport { ToggleButton, ToolbarField } from \"@heswell/salt-lab\";\nimport { ReactElement } from \"react\";\nimport { FilterDropdown } from \"./FilterDropdown\";\nimport { FilterDropdownMultiSelect } from \"./FilterDropdownMultiSelect\";\n\nconst filterToControl = (\n filter: Filter,\n suggestionProvider: IFilterSuggestionProvider\n): ReactElement | ReactElement[] => {\n if (isNamedFilter(filter)) {\n return (\n <ToggleButton\n className=\"vuuToggleButton\"\n toggled={true}\n variant=\"secondary\"\n >\n {filter.name}\n </ToggleButton>\n );\n }\n if (isSingleValueFilter(filter)) {\n const { column, value } = filter;\n return (\n <ToolbarField\n className=\"vuuFilterDropdown\"\n key={column}\n label={column}\n labelPlacement=\"top\"\n >\n <FilterDropdown\n column={column}\n selected={value.toString()}\n selectionStrategy=\"default\"\n source={[value.toString()]}\n suggestionProvider={suggestionProvider}\n style={{ width: 100 }}\n />\n </ToolbarField>\n );\n }\n if (isMultiValueFilter(filter)) {\n const values = filter.values.map((v) => v.toString());\n return (\n <ToolbarField\n className=\"vuuFilterDropdown\"\n label={filter.column}\n key={filter.column}\n labelPlacement=\"top\"\n >\n <FilterDropdownMultiSelect\n column={filter.column}\n selected={values}\n source={values}\n suggestionProvider={suggestionProvider}\n style={{ width: 100 }}\n />\n </ToolbarField>\n );\n }\n return filter.filters.map((filter) =>\n filterToControl(filter, suggestionProvider)\n ) as ReactElement[];\n};\n\nexport interface FilterToolbarProps extends SuggestionConsumer {\n filter?: Filter;\n}\n\nexport const useFilterToolbar = ({\n filter,\n suggestionProvider,\n}: FilterToolbarProps) => {\n if (filter) {\n return filterToControl(filter, suggestionProvider);\n }\n return [];\n};\n", "import { Dropdown, DropdownProps } from \"@heswell/salt-lab\";\nimport { useCallback, useState } from \"react\";\nimport { IFilterSuggestionProvider } from \"../filter-input\";\n\nconst isString = (s: string | string[]): s is string => typeof s === \"string\";\n\nconst stripQuotes = <T extends string | string[]>(selected: T): T => {\n if (isString(selected)) {\n if (selected.startsWith('\"') && selected.endsWith('\"')) {\n return selected.slice(1, -1) as T;\n } else {\n return selected;\n }\n } else {\n return selected.map(stripQuotes) as T;\n }\n};\n\nexport interface FilterDropdownProps extends DropdownProps {\n column: string;\n suggestionProvider: IFilterSuggestionProvider;\n}\n\nexport const FilterDropdown = ({\n column,\n selected: selectedProp,\n suggestionProvider,\n ...props\n}: FilterDropdownProps) => {\n const selected = selectedProp != null ? stripQuotes(selectedProp) : undefined;\n const initialValues = Array.isArray(selected)\n ? selected\n : selected != null\n ? [selected]\n : [];\n const [values, setValues] = useState<string[]>(initialValues);\n console.log({ initialValues });\n const handleOpenChange = useCallback(\n async (isOpen) => {\n if (isOpen) {\n const values = await suggestionProvider.getSuggestions(\"columnValue\", {\n columnName: column,\n });\n console.log({ values });\n setValues(values.map((suggestion) => suggestion.label));\n }\n },\n [column, suggestionProvider]\n );\n\n return (\n <Dropdown\n {...props}\n onOpenChange={handleOpenChange}\n selected={selected}\n source={values}\n />\n );\n};\n", "import { Dropdown, DropdownProps } from \"@heswell/salt-lab\";\nimport { useCallback, useState } from \"react\";\nimport { IFilterSuggestionProvider } from \"../filter-input\";\n\nconst isString = (s?: string | string[]): s is string => typeof s === \"string\";\n\nconst stripQuotes = <T extends string | string[]>(\n selected?: T\n): T | undefined => {\n if (selected === undefined) {\n return undefined;\n } else if (isString(selected)) {\n if (selected.startsWith('\"') && selected.endsWith('\"')) {\n return selected.slice(1, -1) as T;\n } else {\n return selected;\n }\n } else {\n return selected.map(stripQuotes) as T;\n }\n};\n\nexport interface FilterDropdownProps extends DropdownProps<string, \"multiple\"> {\n column: string;\n suggestionProvider: IFilterSuggestionProvider;\n}\n\nexport const FilterDropdownMultiSelect = ({\n column,\n selected: selectedProp,\n suggestionProvider,\n ...props\n}: FilterDropdownProps) => {\n const selected = stripQuotes(selectedProp);\n const initialValues = Array.isArray(selected)\n ? selected\n : selected != null\n ? [selected]\n : [];\n const [values, setValues] = useState<string[]>(initialValues);\n const handleOpenChange = useCallback(\n async (isOpen) => {\n if (isOpen) {\n const values = await suggestionProvider.getSuggestions(\"columnValue\", {\n columnName: column,\n });\n console.log({ values });\n setValues(values.map((suggestion) => suggestion.label));\n }\n },\n [column, suggestionProvider]\n );\n\n return (\n <Dropdown<string, \"multiple\">\n {...props}\n onOpenChange={handleOpenChange}\n selected={selected}\n selectionStrategy=\"multiple\"\n source={values}\n />\n );\n};\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data\";\nimport {\n AndFilter,\n Filter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport { parseFilter } from \"./filter-input/filter-language-parser/FilterParser\";\n\nconst filterPredicateMap = new Map<string, FilterPredicate>();\nconst filterReject = () => false;\n\nexport const getFilterPredicate = (\n columnMap: ColumnMap,\n filterQuery: string\n): FilterPredicate => {\n let predicate = filterPredicateMap.get(filterQuery);\n if (predicate) {\n return predicate;\n }\n // TODO we need to clear cache if columns change. How do we identify this :\n try {\n const filter = parseFilter(filterQuery);\n predicate = filterPredicate(columnMap, filter);\n filterPredicateMap.set(filterQuery, predicate);\n return predicate;\n } catch (err) {\n console.warn(\n `filter-evaluation-utils, failed to parse filter \"${filterQuery}\"`\n );\n return filterReject;\n }\n};\n\nexport function filterPredicate(\n columnMap: ColumnMap,\n filter: Filter\n): FilterPredicate {\n //TODO convert filter to include colIdx ratherthan colName, so we don't have to pass cols\n switch (filter.op) {\n case \"in\":\n return testInclude(columnMap, filter);\n case \"=\":\n return testEQ(columnMap, filter);\n case \">\":\n return testGT(columnMap, filter);\n case \">=\":\n return testGE(columnMap, filter);\n case \"<\":\n return testLT(columnMap, filter);\n case \"<=\":\n return testLE(columnMap, filter);\n case \"starts\":\n return testSW(columnMap, filter);\n case \"and\":\n return testAND(columnMap, filter as AndFilter);\n case \"or\":\n return testOR(columnMap, filter as OrFilter);\n default:\n console.log(`unrecognized filter type ${filter.op}`);\n return () => true;\n }\n}\n\nexport type FilterPredicate = (row: DataSourceRow) => boolean;\n\nconst testInclude = (\n columnMap: ColumnMap,\n filter: MultiValueFilterClause\n): FilterPredicate => {\n return (row) =>\n (filter.values as unknown[]).indexOf(row[columnMap[filter.column]]) !== -1;\n};\n\nconst testEQ = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] === filter.value;\n};\n\nconst testGT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] > filter.value;\n};\nconst testGE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] >= filter.value;\n};\n\nconst testLT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] < filter.value;\n};\nconst testLE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] <= filter.value;\n};\n\nconst testSW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());\n };\n};\n\nconst testAND = (columnMap: ColumnMap, filter: AndFilter): FilterPredicate => {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.every((fn) => fn(row));\n};\n\nfunction testOR(columnMap: ColumnMap, filter: OrFilter): FilterPredicate {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.some((fn) => fn(row));\n}\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { extractFilterForColumn, partition } from \"@vuu-ui/vuu-utils\";\nimport {\n isAndFilter,\n isInFilter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isOrFilter,\n isSingleValueFilter,\n} from \"./filterTypes\";\nimport {\n AndFilter,\n Filter,\n FilterClause,\n FilterCombinatorOp,\n} from \"@vuu-ui/vuu-filter-types\";\n\nexport const AND = \"and\";\nexport const EQUALS = \"=\";\nexport const GREATER_THAN = \">\";\nexport const LESS_THAN = \"<\";\nexport const OR = \"or\";\nexport const STARTS_WITH = \"starts\";\nexport const ENDS_WITH = \"ends\";\nexport const IN = \"in\";\n\nexport type FilterType =\n | \"and\"\n | \"=\"\n | \">\"\n | \">=\"\n | \"in\"\n | \"<=\"\n | \"<\"\n | \"NOT_IN\"\n | \"NOT_SW\"\n | \"or\"\n | \"SW\";\n\nexport const filterClauses = (\n filter: Filter | null,\n clauses: FilterClause[] = []\n) => {\n if (filter) {\n if (isMultiClauseFilter(filter)) {\n filter.filters.forEach((f) => clauses.push(...filterClauses(f)));\n } else {\n clauses.push(filter);\n }\n }\n return clauses;\n};\n\ntype AddFilterOptions = {\n combineWith: FilterCombinatorOp;\n};\n\nconst DEFAULT_ADD_FILTER_OPTS: AddFilterOptions = {\n combineWith: \"and\",\n};\n\nexport const addFilter = (\n existingFilter: Filter | undefined,\n filter: Filter,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS\n): Filter | undefined => {\n if (includesNoValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the no-values filter\n } else {\n existingFilter = removeFilterForColumn(existingFilter, {\n name: filter.column,\n });\n }\n } else if (includesAllValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the all-values filter\n }\n return removeFilterForColumn(existingFilter, { name: filter.column ?? \"\" });\n }\n\n if (!existingFilter) {\n return filter;\n }\n if (!filter) {\n return existingFilter;\n }\n if (existingFilter.op === AND && filter.op === AND) {\n return {\n op: AND,\n filters: combine(existingFilter.filters, filter.filters),\n };\n }\n if (existingFilter.op === AND) {\n const filters = replaceOrInsert(existingFilter.filters, filter);\n return filters.length > 1 ? { op: AND, filters } : filters[0];\n }\n if (filter.op === AND) {\n return { op: AND, filters: filter.filters.concat(existingFilter) };\n }\n\n if (filterEquals(existingFilter, filter, true)) {\n return filter;\n }\n\n if (canMerge(existingFilter, filter)) {\n return merge(existingFilter, filter);\n }\n\n return { op: combineWith, filters: [existingFilter, filter] };\n};\n\nconst includesNoValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (isInFilter(filter) && filter.values.length === 0) {\n return true;\n }\n return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));\n};\n\nconst filterValue = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nexport const filterAsQuery = (f: Filter): string => {\n if (isMultiClauseFilter(f)) {\n return f.filters.map((filter) => filterAsQuery(filter)).join(` ${f.op} `);\n } else if (isMultiValueFilter(f)) {\n return `${f.column} ${f.op} [${f.values.join(\",\")}]`;\n } else {\n return `${f.column} ${f.op} ${filterValue(f.value)}`;\n }\n};\n\ninterface CommonFilter {\n colName?: string;\n otherColFilters?: Filter[];\n mode?: any;\n value?: any;\n values?: any;\n op?: \"or\" | \"and\";\n column?: string;\n filters?: Filter[];\n}\n\nexport interface OtherFilter extends CommonFilter {\n type: FilterType;\n values?: any[];\n}\n\nconst includesAllValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (filter.op === STARTS_WITH && filter.value === \"\") {\n return true;\n }\n return filter.op === STARTS_WITH && filter.value === \"\";\n};\n\nconst replaceOrInsert = (filters: Filter[], filter: Filter) => {\n return filters.concat(filter);\n};\n\nconst merge = (f1: Filter, f2: Filter): Filter | undefined => {\n if (includesNoValues(f2)) {\n return f2;\n }\n if (isInFilter(f1) && isInFilter(f2)) {\n return {\n ...f1,\n values: [\n ...f1.values,\n ...(f2.values as any[]).filter(\n (v: string | number) => !(f1.values as any[]).includes(v)\n ),\n ],\n };\n } else if (isInFilter(f1) && f2.op === EQUALS) {\n return {\n ...f1,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: f1.values.concat([f2.value]),\n };\n } else if (f1.op === EQUALS && f2.op === EQUALS) {\n return {\n column: f1.column,\n op: IN,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: [f1.value, f2.value],\n };\n }\n return f2;\n};\n\nconst combine = (existingFilters: Filter[], replacementFilters: Filter[]) => {\n const equivalentType = ({ op: t1 }: Filter, { op: t2 }: Filter) => {\n return t1 === t2 || t1[0] === t2[0];\n };\n const replaces = (existingFilter: Filter, replacementFilter: Filter) => {\n return (\n existingFilter.column === replacementFilter.column &&\n equivalentType(existingFilter, replacementFilter)\n );\n };\n const stillApplicable = (existingFilter: Filter) =>\n replacementFilters.some((replacementFilter) =>\n replaces(existingFilter, replacementFilter)\n ) === false;\n return existingFilters.filter(stillApplicable).concat(replacementFilters);\n};\n\nexport const removeColumnFromFilter = (\n column: KeyedColumnDescriptor,\n filter: Filter\n): [Filter | undefined, string] => {\n if (isMultiClauseFilter(filter)) {\n const [clause1, clause2] = filter.filters;\n if (clause1.column === column.name) {\n return [clause2, filterAsQuery(clause2)];\n }\n if (clause2.column === column.name) {\n return [clause1, filterAsQuery(clause1)];\n }\n }\n return [undefined, \"\"];\n};\n\nexport const removeFilter = (sourceFilter: Filter, filterToRemove: Filter) => {\n if (filterEquals(sourceFilter, filterToRemove, true)) {\n return null;\n }\n if (sourceFilter.op !== AND) {\n throw Error(\n `removeFilter cannot remove ${JSON.stringify(\n filterToRemove\n )} from ${JSON.stringify(sourceFilter)}`\n );\n }\n const filters = sourceFilter.filters.filter(\n (f) => !filterEquals(f, filterToRemove)\n );\n return filters.length > 0 ? { type: AND, filters } : null;\n};\n\nexport const splitFilterOnColumn = (\n filter: Filter | null,\n columnName: string\n): [Filter | null, Filter | null] => {\n if (!filter) {\n return [null, null];\n }\n if (filter.column === columnName) {\n return [filter, null];\n }\n if (filter.op !== AND) {\n return [null, filter];\n }\n const [[columnFilter = null], filters] = partition(\n (filter as AndFilter).filters,\n (f) => f.column === columnName\n );\n return filters.length === 1\n ? [columnFilter, filters[0]]\n : [columnFilter, { op: AND, filters }];\n};\n\nexport const overrideColName = (filter: Filter, column: string): Filter => {\n if (isMultiClauseFilter(filter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => overrideColName(f, column)),\n };\n }\n return { ...filter, column };\n};\n\nexport const filterIncludesColumn = (\n filter: Filter,\n column: KeyedColumnDescriptor\n): boolean => {\n if (!filter) {\n return false;\n }\n const { op, column: filterColName } = filter;\n switch (op) {\n case AND:\n case OR:\n return (\n filter.filters != null &&\n filter.filters.some((f) => filterIncludesColumn(f, column))\n );\n default:\n return filterColName === column.name;\n }\n};\n\nconst removeFilterForColumn = (\n sourceFilter: Filter | undefined,\n column: ColumnDescriptor\n): Filter | undefined => {\n const colName = column.name;\n if (!sourceFilter) {\n return undefined;\n }\n if (sourceFilter.column === colName) {\n return undefined;\n }\n if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {\n const { op } = sourceFilter;\n const filters = sourceFilter.filters;\n const otherColFilters = filters.filter((f) => f.column !== colName);\n switch (otherColFilters.length) {\n case 0:\n return undefined;\n case 1:\n return otherColFilters[0];\n default:\n return { op, filters: otherColFilters };\n }\n }\n return sourceFilter;\n};\n\nconst canMerge = (f1: Filter, f2: Filter) =>\n f1.column === f2.column &&\n (f1.op === \"=\" || f1.op === \"in\") &&\n (f2.op === \"=\" || f2.op === \"in\");\n\nconst sameValues = <T>(arr1: T[], arr2: T[]) => {\n if (arr1 === arr2) {\n return true;\n }\n if (arr1.length === arr2.length) {\n const a = arr1.slice().sort();\n const b = arr2.slice().sort();\n return a.join(\"|\") === b.join(\"|\");\n }\n return false;\n};\n\nexport const filterEquals = (f1?: Filter, f2?: Filter, strict = false) => {\n if (!strict) {\n return true;\n }\n if (f1 && f2 && canMerge(f1, f2)) {\n return (\n f1.op === f2.op &&\n ((isSingleValueFilter(f1) &&\n isSingleValueFilter(f2) &&\n f1.value === f2.value) ||\n (isMultiValueFilter(f1) &&\n isMultiValueFilter(f2) &&\n sameValues(f1.values as any[], f2.values)))\n );\n }\n return false;\n};\n\nexport const updateFilter = (\n filter: Filter | undefined,\n newFilter: Filter | undefined,\n mode: \"add\" | \"replace\"\n): Filter | undefined => {\n if (filter && newFilter) {\n if (mode === \"replace\") {\n return newFilter;\n }\n if (filter.op === \"and\") {\n return {\n ...filter,\n filters: filter.filters.concat(newFilter),\n };\n }\n const { column: columnName } = newFilter;\n if (columnName) {\n const existingClause = newFilter.column\n ? extractFilterForColumn(filter, columnName)\n : undefined;\n if (existingClause && columnName) {\n // The filter already contains a clause for this column, replace\n // with the new clause\n const result = removeFilterForColumn(filter, { name: columnName });\n return updateFilter(result, newFilter, \"add\");\n }\n }\n return {\n op: \"and\",\n filters: [filter, newFilter],\n };\n }\n if (newFilter) {\n return newFilter;\n }\n return filter;\n};\n", "//TODO these are duplicated in vuu-utils, that shoudl probably be the righful source\nimport {\n AndFilter,\n Filter,\n MultiClauseFilter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\n\nconst singleValueFilterOps = new Set<SingleValueFilterClauseOp>([\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"starts\",\n \"ends\",\n]);\n\n// convenience methods to check filter type\nexport const isNamedFilter = (f?: Filter) =>\n f !== undefined && f.name !== undefined;\n\n// ... with type constraints\nexport const isSingleValueFilter = (f?: Filter): f is SingleValueFilterClause =>\n f !== undefined &&\n singleValueFilterOps.has(f.op as SingleValueFilterClauseOp);\n\nexport const isFilterClause = (\n f?: Filter\n): f is SingleValueFilterClause | MultiValueFilterClause =>\n f !== undefined && (isSingleValueFilter(f) || isMultiValueFilter(f));\n\nexport const isMultiValueFilter = (f?: Filter): f is MultiValueFilterClause =>\n f !== undefined && f.op === \"in\";\n\nexport const isInFilter = (f: Filter): f is MultiValueFilterClause =>\n f.op === \"in\";\nexport const isAndFilter = (f: Filter): f is AndFilter => f.op === \"and\";\nexport const isOrFilter = (f: Filter): f is OrFilter => f.op === \"or\";\n\nexport function isMultiClauseFilter(f?: Filter): f is MultiClauseFilter {\n return f !== undefined && (f.op === \"and\" || f.op === \"or\");\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\tvar nativeCodeString = '[native code]';\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n", "export * from \"./filter-input\";\nexport * from \"./filter-toolbar\";\nexport * from \"./filter-evaluation-utils\";\nexport * from \"./filter-utils\";\nexport * from \"./filterTypes\";\n", "import { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { Button } from \"@salt-ds/core\";\nimport { HTMLAttributes } from \"react\";\nimport {\n filterSubmissionHandler,\n SuggestionConsumer,\n useCodeMirrorEditor,\n} from \"./useCodeMirrorEditor\";\n\nimport \"./FilterInput.css\";\n\nconst classBase = \"vuuFilterInput\";\n\nexport interface FilterInputProps\n extends SuggestionConsumer,\n HTMLAttributes<HTMLDivElement> {\n existingFilter?: Filter;\n namedFilters?: Map<string, string>;\n onSubmitFilter?: filterSubmissionHandler;\n}\n\nexport const FilterInput = ({\n existingFilter,\n namedFilters,\n onSubmitFilter,\n suggestionProvider,\n ...props\n}: FilterInputProps) => {\n const { editorRef, clearInput } = useCodeMirrorEditor({\n existingFilter,\n onSubmitFilter,\n suggestionProvider,\n });\n\n return (\n <div {...props} className={classBase}>\n <Button className={`${classBase}-FilterButton`} data-icon=\"filter\" />\n <div className={`${classBase}-Editor`} ref={editorRef} />\n <Button\n className={`${classBase}-ClearButton`}\n data-icon=\"close-circle\"\n onClick={clearInput}\n />\n </div>\n );\n};\n", "import {\n autocompletion,\n Completion,\n defaultKeymap,\n EditorState,\n EditorView,\n ensureSyntaxTree,\n keymap,\n minimalSetup,\n startCompletion,\n VuuCompletion,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport cx from \"classnames\";\nimport { MutableRefObject, useEffect, useMemo, useRef } from \"react\";\nimport { filterLanguageSupport } from \"./filter-language-parser\";\nimport { walkTree } from \"./filter-language-parser/FilterTreeWalker\";\nimport { vuuHighlighting } from \"./highlighting\";\nimport { vuuTheme } from \"./theme\";\nimport {\n ApplyCompletion,\n FilterSubmissionMode,\n useAutoComplete,\n} from \"./useFilterAutoComplete\";\nimport { FilterSaveOptions } from \"./useFilterSuggestionProvider\";\n\nexport type SuggestionType =\n | \"column\"\n | \"columnValue\"\n | \"operator\"\n | \"save\"\n | \"name\";\n\nexport interface FilterSuggestionOptions {\n quoted?: boolean;\n columnName?: string;\n existingFilter?: Filter;\n filterName?: string;\n onSubmit?: () => void;\n operator?: string;\n startsWith?: string;\n selection?: string[];\n}\n\nexport type getFilterSuggestionsType = (\n suggestionType: SuggestionType,\n options?: FilterSuggestionOptions\n) => Promise<Completion[]>;\n\nexport interface IFilterSuggestionProvider {\n getSuggestions: getFilterSuggestionsType;\n isPartialMatch: (\n valueType: SuggestionType,\n columnName?: string,\n text?: string | undefined\n ) => Promise<boolean>;\n}\n\nexport interface SuggestionConsumer {\n suggestionProvider: IFilterSuggestionProvider;\n}\n\nconst getView = (ref: MutableRefObject<EditorView | undefined>): EditorView => {\n if (ref.current == undefined) {\n throw Error(\"EditorView not defined\");\n }\n return ref.current;\n};\n\nconst getOptionClass = (completion: VuuCompletion) => {\n return cx(\"vuuSuggestion\", {\n vuuIllustration: completion.isIllustration,\n });\n};\n\nconst stripName = (filterQuery: string) => {\n const pos = filterQuery.lastIndexOf(\" as \");\n if (pos !== -1) {\n return filterQuery.slice(0, pos);\n } else {\n return filterQuery;\n }\n};\n\nconst noop = () => console.log(\"noooop\");\n\nexport type filterSubmissionHandler = (\n filter: Filter | undefined,\n filterQuery: string,\n mode?: FilterSubmissionMode,\n filterName?: string\n) => void;\n\nexport interface CodeMirrorEditorProps {\n existingFilter?: Filter;\n onSubmitFilter?: filterSubmissionHandler;\n saveOptions?: FilterSaveOptions;\n suggestionProvider: IFilterSuggestionProvider;\n}\n\nexport const useCodeMirrorEditor = ({\n existingFilter,\n onSubmitFilter,\n suggestionProvider,\n}: CodeMirrorEditorProps) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const onSubmit = useRef<ApplyCompletion>(noop);\n const viewRef = useRef<EditorView>();\n const completionFn = useAutoComplete(\n suggestionProvider,\n onSubmit,\n existingFilter\n );\n\n const [createState, clearInput] = useMemo(() => {\n const parseFilter = ():\n | [Filter, string, string | undefined]\n | [undefined, \"\", undefined] => {\n const view = getView(viewRef);\n const source = view.state.doc.toString();\n const tree = ensureSyntaxTree(view.state, view.state.doc.length, 5000);\n if (tree) {\n const filter = walkTree(tree, source) as Filter;\n return [filter, stripName(source), filter.name];\n } else {\n return [undefined, \"\", undefined];\n }\n };\n\n const clearInput = () => {\n getView(viewRef).setState(createState());\n };\n\n const submitFilterAndClearInput = (mode?: FilterSubmissionMode) => {\n const [filter, filterQuery, filterName] = parseFilter();\n onSubmitFilter?.(filter, filterQuery, mode, filterName);\n clearInput();\n };\n\n const submitFilter = (key: string) => {\n return keymap.of([\n {\n key,\n run() {\n submitFilterAndClearInput();\n return true;\n },\n },\n ]);\n };\n\n const showSuggestions = (key: string) => {\n return keymap.of([\n {\n key,\n run() {\n startCompletion(getView(viewRef));\n return true;\n },\n },\n ]);\n };\n\n const createState = (): EditorState =>\n EditorState.create({\n doc: \"\",\n extensions: [\n minimalSetup,\n autocompletion({\n override: [completionFn],\n optionClass: getOptionClass,\n }),\n filterLanguageSupport(),\n keymap.of(defaultKeymap),\n submitFilter(\"Ctrl-Enter\"),\n showSuggestions(\"ArrowDown\"),\n EditorView.updateListener.of((v) => {\n const view = getView(viewRef);\n if (v.docChanged) {\n startCompletion(view);\n }\n }),\n EditorState.transactionFilter.of((tr) =>\n tr.newDoc.lines > 1 ? [] : tr\n ),\n vuuTheme,\n vuuHighlighting,\n ],\n });\n\n onSubmit.current = (mode?: FilterSubmissionMode) => {\n submitFilterAndClearInput(mode);\n // TODO refocu sthe editor\n setTimeout(() => {\n getView(viewRef).focus();\n }, 100);\n };\n\n return [createState, clearInput];\n }, [completionFn, onSubmitFilter]);\n\n useEffect(() => {\n if (!editorRef.current) {\n throw Error(\"editor not in dom\");\n }\n\n viewRef.current = new EditorView({\n state: createState(),\n parent: editorRef.current,\n });\n\n return () => {\n viewRef.current?.destroy();\n };\n }, [completionFn, createState]);\n\n return { editorRef, clearInput };\n};\n", "import {\n LanguageSupport,\n LRLanguage,\n styleTags,\n tags as tag,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { parser } from \"./generated/filter-parser\";\n\nconst filterLanguage = LRLanguage.define({\n name: \"VuuFilterQuery\",\n parser: parser.configure({\n props: [\n styleTags({\n Identifier: tag.variableName,\n String: tag.string,\n Or: tag.emphasis,\n Operator: tag.operator,\n }),\n ],\n }),\n});\n\nexport const filterLanguageSupport = () => {\n return new LanguageSupport(filterLanguage);\n};\n", "// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@vuu-ui/vuu-codemirror\"\nexport const parser = LRParser.deserialize({\n version: 14,\n 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\",\n 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\",\n goto: \"#YvPPw}!TPPPPPPPPPPwPP!WPP!ZP!ZP!aP!g!jPPP!p!s!aP#P!aXROU[]XQOU[]RYQRibXTOU[]XVOU[]Rf^QkhRnkRWOQSOQ_UQc[Rd]QaYQhbRmj\",\n 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\",\n maxTerm: 39,\n skippedNodes: [0],\n repeatNodeCount: 1,\n 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\",\n tokenizers: [0, 1],\n topRules: {\"Filter\":[0,1]},\n tokenPrec: 0\n})\n", "import { Tree } from \"@lezer/common\";\nimport {\n Filter,\n FilterCombinatorOp,\n MultipleValueFilterClauseOp,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n isMultiClauseFilter,\n isMultiValueFilter,\n isSingleValueFilter,\n} from \"@vuu-ui/vuu-utils\";\n\nclass FilterExpression {\n public name: string | undefined;\n #filter: Partial<Filter> | undefined = undefined;\n\n setFilterCombinatorOp(op: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter) && filter.op === op) {\n return;\n } else {\n this.#filter = {\n op: op as FilterCombinatorOp,\n filters: [this.#filter as Filter],\n };\n }\n }\n\n add(filter: Partial<Filter>) {\n if (this.#filter === undefined) {\n this.#filter = filter;\n } else if (isMultiClauseFilter(this.#filter)) {\n this.#filter.filters.push(filter as Filter);\n } else {\n throw Error(`Invalid filter passed to FilterExpression`);\n }\n }\n\n setColumn(column: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setColumn(column, target);\n }\n } else if (filter) {\n filter.column = column;\n }\n }\n setOp(value: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setOp(value, target);\n }\n } else if (filter) {\n filter.op = value as\n | SingleValueFilterClauseOp\n | MultipleValueFilterClauseOp;\n }\n }\n setValue(value: string | number | boolean, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setValue(value, target);\n }\n } else if (isMultiValueFilter(filter)) {\n filter.values ??= [];\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filter.values.push(value);\n } else if (isSingleValueFilter(filter)) {\n filter.value = value;\n }\n }\n\n toJSON(filter = this.#filter) {\n if (this.name) {\n return {\n ...filter,\n name: this.name,\n };\n } else {\n return filter;\n }\n }\n}\n\nexport const walkTree = (tree: Tree, source: string) => {\n const filterExpression = new FilterExpression();\n const cursor = tree.cursor();\n do {\n const { name, from, to } = cursor;\n switch (name) {\n case \"ColumnValueExpression\":\n filterExpression.add({});\n break;\n case \"ColumnSetExpression\":\n filterExpression.add({ op: \"in\" });\n break;\n\n case \"Or\":\n case \"And\":\n filterExpression.setFilterCombinatorOp(source.substring(from, to));\n break;\n\n case \"Column\":\n filterExpression.setColumn(source.substring(from, to));\n break;\n\n case \"Operator\":\n filterExpression.setOp(source.substring(from, to));\n break;\n\n case \"String\":\n filterExpression.setValue(source.substring(from + 1, to - 1));\n break;\n\n case \"Number\":\n filterExpression.setValue(parseFloat(source.substring(from, to)));\n break;\n\n case \"True\":\n filterExpression.setValue(true);\n break;\n\n case \"False\":\n filterExpression.setValue(false);\n break;\n\n case \"FilterName\":\n filterExpression.name = source.substring(from, to);\n break;\n\n default:\n }\n } while (cursor.next());\n\n return filterExpression.toJSON();\n};\n", "import { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { parser } from \"./generated/filter-parser\";\nimport { walkTree } from \"./FilterTreeWalker\";\n\nconst strictParser = parser.configure({ strict: true });\n\nexport const parseFilter = (filterQuery: string): Filter => {\n const parseTree = strictParser.parse(filterQuery);\n const filter = walkTree(parseTree, filterQuery) as Filter;\n return filter;\n};\n", "import {\n HighlightStyle,\n syntaxHighlighting,\n tags,\n} from \"@vuu-ui/vuu-codemirror\";\n\nconst myHighlightStyle = HighlightStyle.define([\n { tag: tags.variableName, color: \"var(--vuuFilterEditor-variableColor)\" },\n { tag: tags.comment, color: \"green\", fontStyle: \"italic\" },\n]);\n\nexport const vuuHighlighting = syntaxHighlighting(myHighlightStyle);\n", "import { EditorView } from \"@vuu-ui/vuu-codemirror\";\n\nexport const vuuTheme = EditorView.theme(\n {\n \"&\": {\n color: \"var(--vuuFilterEditor-color)\",\n backgroundColor: \"var(--vuuFilterEditor-background)\",\n fontSize: \"var(--vuuFilterEditor-fontSize)\",\n },\n \".cm-content\": {\n caretColor: \"var(--vuuFilterEditor-cursorColor)\",\n padding: 0,\n },\n \".cm-line\": {\n lineHeight: \"var(--vuuFilterEditor-lineHeight)\",\n },\n \"&.cm-focused .cm-cursor\": {\n borderLeftColor: \"var(--vuuFilterEditor-cursorColor)\",\n },\n \"&.cm-focused .cm-selectionBackground, ::selection\": {\n backgroundColor: \"var(--vuuFilterEditor-selectionBackground)\",\n },\n \".cm-selectionBackground, ::selection\": {\n backgroundColor: \"var(--vuuFilterEditor-selectionBackground)\",\n },\n \".cm-scroller\": {\n fontFamily: \"var(--vuuFilterEditor-fontFamily)\",\n },\n \".cm-tooltip\": {\n background: \"var(--vuuFilterEditor-tooltipBackground)\",\n border: \"var(--vuuFilterEditor-tooltipBorder)\",\n boxShadow: \"var(--vuuFilterEditor-tooltipElevation)\",\n \"&.cm-tooltip-autocomplete > ul\": {\n fontFamily: \"var(--vuuFilterEditor-fontFamily)\",\n fontSize: \"var(--vuuFilterEditor-fontSize)\",\n maxHeight: \"240px\",\n },\n \"&.cm-tooltip-autocomplete > ul > li\": {\n alignItems: \"center\",\n display: \"flex\",\n height: \"var(--vuuFilterEditor-suggestion-height)\",\n padding: \"0 3px\",\n lineHeight: \"var(--vuuFilterEditor-suggestion-height)\",\n },\n \"&.cm-tooltip-autocomplete li[aria-selected]\": {\n background: \"var(--vuuFilterEditor-suggestion-selectedBackground)\",\n color: \"var(--vuuFilterEditor-suggestion-selectedColor)\",\n },\n },\n \".cm-completionIcon\": {\n height: \"18px\",\n flex: \"0 0 16px\",\n },\n \".cm-completionLabel\": {\n flex: \"1 1 auto\",\n },\n \".cm-completionIcon-filter\": {\n position: \"relative\",\n \"&:after\": {\n background: \"var(--salt-text-secondary-foreground)\",\n content: \"''\",\n \"-webkit-mask\": \"var(--svg-filter) center center/13px 13px\",\n \"-webkit-mask-repeat\": \"no-repeat\",\n position: \"absolute\",\n height: \"18px\",\n left: \"0px\",\n top: \"0px\",\n width: \"16px\",\n },\n },\n },\n { dark: false }\n);\n", "import {\n CompletionContext,\n CompletionSource,\n EditorState,\n getNodeByName,\n getValue,\n syntaxTree,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { SyntaxNode } from \"@lezer/common\";\nimport { MutableRefObject, useCallback } from \"react\";\nimport {\n IFilterSuggestionProvider,\n SuggestionType,\n} from \"./useCodeMirrorEditor\";\n\nexport type FilterSubmissionMode = \"and\" | \"or\" | \"replace\" | \"tab\";\n\nexport type ApplyCompletion = (mode?: FilterSubmissionMode) => void;\n\nconst getOperator = (node: SyntaxNode, state: EditorState) => {\n let maybeColumnNode = node.prevSibling || node.parent;\n while (\n maybeColumnNode &&\n ![\"Column\", \"Operator\", \"In\"].includes(maybeColumnNode.name)\n ) {\n maybeColumnNode = maybeColumnNode.prevSibling || maybeColumnNode.parent;\n }\n if (maybeColumnNode?.name === \"In\" || maybeColumnNode?.name === \"Operator\") {\n return getValue(maybeColumnNode, state);\n } else {\n return undefined;\n }\n};\n\n// Operators that are more than a single character in length may incur partial matches\n// TODO need to check that previous token is a column\nconst getPartialOperator = (\n maybeOperatorNode: SyntaxNode,\n state: EditorState,\n columnName?: string\n) => {\n const value = getValue(maybeOperatorNode, state);\n if (columnName === undefined || value === columnName) {\n return;\n }\n if (\n [\"contains\", \"ends\", \"starts\"].some((val) =>\n val.startsWith(value.toLowerCase())\n )\n ) {\n return value;\n } else {\n return undefined;\n }\n};\n\nconst getClauseOperator = (node: SyntaxNode, state: EditorState) => {\n let maybeTargetNode = node.prevSibling || node.parent || node.lastChild;\n while (maybeTargetNode && maybeTargetNode.name === \"\u26A0\")\n maybeTargetNode = maybeTargetNode.prevSibling;\n if (maybeTargetNode && [\"As\", \"Or\", \"And\"].includes(maybeTargetNode.name)) {\n return getValue(maybeTargetNode, state);\n } else {\n return undefined;\n }\n};\n\nconst getFilterName = (node: SyntaxNode, state: EditorState) => {\n if (node.name === \"FilterName\") {\n return getValue(node, state);\n } else {\n let maybeTargetNode = node.prevSibling || node.parent || node.lastChild;\n while (maybeTargetNode && maybeTargetNode.name !== \"FilterName\")\n maybeTargetNode = maybeTargetNode.prevSibling;\n if (maybeTargetNode && maybeTargetNode.name === \"FilterName\") {\n return getValue(node, state);\n }\n }\n};\n\nconst getColumnName = (\n node: SyntaxNode,\n state: EditorState\n): string | undefined => {\n const prevNode = node.prevSibling;\n if (prevNode?.name === \"Column\") {\n return getValue(prevNode, state);\n } else if (prevNode?.name === \"Operator\") {\n return getColumnName(prevNode, state);\n }\n};\n\nconst getSetValues = (node: SyntaxNode, state: EditorState): string[] => {\n let maybeTargetNode = node.lastChild;\n const values: string[] = [];\n while (maybeTargetNode && maybeTargetNode.name !== \"In\") {\n const value = getValue(maybeTargetNode, state);\n if (value) {\n values.push(value);\n } else {\n break;\n }\n maybeTargetNode = maybeTargetNode.prevSibling;\n }\n return values;\n};\nexport const FilterlNamedTerms: readonly string[] = [\n \"Filter\",\n \"ParenthesizedExpression\",\n \"AndExpression\",\n \"OrExpression\",\n \"ColumnValueExpression\",\n \"ColumnSetExpression\",\n \"FilterName\",\n \"Column\",\n \"Operator\",\n \"Values\",\n \"Number\",\n \"String\",\n];\nexport const lastNamedChild = (node: SyntaxNode): SyntaxNode | null => {\n let { lastChild } = node;\n while (lastChild && !FilterlNamedTerms.includes(lastChild.name)) {\n lastChild = lastChild.prevSibling;\n console.log(lastChild?.name);\n }\n return lastChild;\n};\n\nexport const useAutoComplete = (\n suggestionProvider: IFilterSuggestionProvider,\n onSubmit: MutableRefObject<ApplyCompletion>,\n existingFilter?: Filter\n) => {\n const makeSuggestions = useCallback(\n async (\n context: CompletionContext,\n suggestionType: SuggestionType,\n optionalArgs: {\n columnName?: string;\n existingFilter?: Filter;\n filterName?: string;\n operator?: string;\n quoted?: boolean;\n onSubmit?: () => void;\n selection?: string[];\n startsWith?: string;\n } = {}\n ) => {\n const { startsWith = \"\" } = optionalArgs;\n const options = await suggestionProvider.getSuggestions(\n suggestionType,\n optionalArgs\n );\n return { from: context.pos - startsWith.length, options };\n },\n [suggestionProvider]\n );\n\n return useCallback(\n async (context: CompletionContext) => {\n const { state, pos } = context;\n const word = context.matchBefore(/\\w*/) ?? {\n from: 0,\n to: 0,\n text: undefined,\n };\n\n const tree = syntaxTree(state);\n const nodeBefore = tree.resolveInner(pos, -1);\n console.log({ nodeBeforeName: nodeBefore.name });\n\n switch (nodeBefore.name) {\n case \"Filter\":\n if (context.pos === 0) {\n return makeSuggestions(context, \"column\");\n } else {\n const clauseOperator = getClauseOperator(nodeBefore, state);\n if (clauseOperator === \"as\") {\n return makeSuggestions(context, \"name\");\n } else {\n const filterName = getFilterName(nodeBefore, state);\n return makeSuggestions(context, \"save\", {\n onSubmit: onSubmit.current,\n existingFilter,\n filterName,\n });\n }\n }\n\n case \"String\":\n {\n // we only encounter a string as the right hand operand of a conditional expression\n const operator = getOperator(nodeBefore, state);\n const columnName = getColumnName(nodeBefore, state);\n // are we inside the string or immediately after it\n const { from, to } = nodeBefore;\n if (to - from === 2 && context.pos === from + 1) {\n // We are in an empty string, i.e between two quotes\n if (columnName && operator) {\n return makeSuggestions(context, \"columnValue\", {\n columnName,\n operator,\n quoted: true,\n startsWith: word.text,\n });\n }\n } else {\n console.log(\n `we have a string, column is ${columnName} ${from} ${to}`\n );\n }\n }\n break;\n\n case \"As\":\n return makeSuggestions(context, \"name\");\n\n case \"FilterName\":\n return makeSuggestions(context, \"save\", {\n onSubmit: onSubmit.current,\n existingFilter,\n filterName: getFilterName(nodeBefore, state),\n });\n\n case \"Column\": {\n const columnName = getValue(nodeBefore, state);\n const isPartialMatch = await suggestionProvider.isPartialMatch(\n \"column\",\n undefined,\n columnName\n );\n if (isPartialMatch) {\n return makeSuggestions(context, \"column\", {\n startsWith: columnName,\n });\n } else {\n return makeSuggestions(context, \"operator\", { columnName });\n }\n }\n\n case \"\u26A0\": {\n const columnName = getNodeByName(nodeBefore, state);\n const operator = getOperator(nodeBefore, state);\n // TODO check if we're mnatching a partial jojn operator\n const partialOperator = operator\n ? undefined\n : getPartialOperator(nodeBefore, state, columnName);\n\n if (partialOperator) {\n return makeSuggestions(context, \"operator\", {\n columnName,\n startsWith: partialOperator,\n });\n } else {\n return makeSuggestions(context, \"columnValue\", {\n columnName,\n operator,\n startsWith: word.text,\n });\n }\n }\n\n case \"Identifier\":\n {\n const clauseOperator = getClauseOperator(nodeBefore, state);\n if (clauseOperator === \"as\") {\n return {\n from: context.pos,\n options: [\n {\n label: \"press ENTER to apply filter and save\",\n apply: () => onSubmit.current(),\n boost: 5,\n },\n ],\n };\n }\n }\n break;\n case \"ColumnSetExpression\":\n case \"Values\": {\n const columnName = getNodeByName(nodeBefore, state);\n const selection = getSetValues(nodeBefore, state);\n return makeSuggestions(context, \"columnValue\", {\n columnName,\n selection,\n });\n }\n case \"Comma\":\n case \"LBrack\": {\n const columnName = getNodeByName(nodeBefore, state) as string;\n return makeSuggestions(context, \"columnValue\", { columnName });\n }\n\n case \"ColumnValueExpression\":\n {\n const lastToken = nodeBefore.lastChild?.prevSibling;\n if (lastToken?.name === \"Column\") {\n return makeSuggestions(context, \"operator\", {\n columnName: getNodeByName(nodeBefore, state),\n });\n } else if (lastToken?.name === \"Operator\") {\n return makeSuggestions(context, \"columnValue\", {\n columnName: getNodeByName(lastToken, state),\n operator: getValue(lastToken, state),\n });\n }\n }\n break;\n\n case \"In\": {\n return {\n from: context.pos,\n options: [{ label: \"[\", apply: \" [\", type: \"text\" }],\n };\n }\n\n case \"Eq\": {\n return makeSuggestions(context, \"columnValue\", {\n columnName: getNodeByName(nodeBefore, state),\n });\n }\n\n case \"AndExpression\":\n case \"OrExpression\": {\n return makeSuggestions(context, \"column\");\n }\n\n default:\n }\n },\n [existingFilter, makeSuggestions, onSubmit, suggestionProvider]\n ) as CompletionSource;\n};\n", "import {\n asNameSuggestion,\n booleanJoinSuggestions,\n Completion,\n getNamePrompt,\n numericOperators,\n stringOperators,\n toSuggestions,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { getTypeaheadParams, useTypeaheadSuggestions } from \"@vuu-ui/vuu-data\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { IFilterSuggestionProvider, SuggestionType } from \"@vuu-ui/vuu-filters\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useRef } from \"react\";\nimport { filterInfo } from \"./filterInfo\";\nimport { ApplyCompletion } from \"./useFilterAutoComplete\";\n\nconst NO_NAMED_FILTERS = [] as Completion[];\nconst NONE = {};\n\nconst saveAsTab = (onSubmit: ApplyCompletion) => [\n {\n label: \"Press ENTER to create TAB\",\n apply: () => onSubmit(\"tab\"),\n boost: 6,\n },\n];\n\nconst makeSaveOrExtendSuggestions = (\n onSubmit: ApplyCompletion,\n existingFilter?: Filter,\n withJoinSuggestions = true\n) => {\n const result = existingFilter\n ? ([\n {\n label: \"REPLACE existing filter\",\n apply: () => onSubmit(\"replace\"),\n boost: 8,\n },\n {\n label: \"AND existing filter\",\n apply: () => onSubmit(\"and\"),\n boost: 7,\n },\n {\n label: \"OR existing filter\",\n apply: () => onSubmit(\"or\"),\n boost: 7,\n },\n ] as Completion[])\n : ([\n {\n label: \"Press ENTER to submit\",\n apply: () => onSubmit(),\n boost: 6,\n },\n ] as Completion[]);\n\n return withJoinSuggestions\n ? result.concat(booleanJoinSuggestions).concat(asNameSuggestion)\n : result;\n};\n\nconst promptToSaveOrExtend = (\n onSubmit: ApplyCompletion,\n existingFilter?: Filter\n) => makeSaveOrExtendSuggestions(onSubmit, existingFilter, true);\n\nconst promptToSave = (onSubmit: ApplyCompletion) =>\n makeSaveOrExtendSuggestions(onSubmit, undefined);\n\nconst getSaveSuggestions = ({\n existingFilter,\n filterName,\n onSubmit,\n saveOptions,\n}: {\n existingFilter?: Filter;\n filterName?: string;\n onSubmit: () => void;\n saveOptions: FilterSaveOptions;\n}) => {\n const includeTabSuggestion = filterName && saveOptions.allowSaveAsTab;\n const result = existingFilter\n ? promptToSaveOrExtend(onSubmit, existingFilter)\n : promptToSave(onSubmit);\n\n if (includeTabSuggestion) {\n return result.concat(saveAsTab(onSubmit));\n } else {\n return result;\n }\n};\n\nconst suggestColumns = (columns: ColumnDescriptor[]) =>\n columns.map((column) => ({\n boost: 5,\n label: column.name,\n }));\n\nconst suggestNamedFilters = (namedFilters?: Map<string, string>) =>\n namedFilters\n ? (Array.from(namedFilters.entries()).map(([filterName, filterQuery]) => ({\n info: () => filterInfo(filterName, filterQuery),\n label: filterName,\n type: \"filter\",\n })) as Completion[])\n : NO_NAMED_FILTERS;\n\nconst doneCommand: Completion = {\n label: \"Done\",\n apply: \"] \",\n type: \"keyword\",\n boost: 10,\n};\n\nconst withApplySpace = (\n suggestions: Completion[],\n startsWith = \"\"\n): Completion[] =>\n suggestions\n .filter((sugg) => startsWith === \"\" || sugg.label.startsWith(startsWith))\n .map((suggestion) => ({\n ...suggestion,\n apply: suggestion.label + \" \",\n }));\n\nexport type FilterSaveOptions = {\n allowSaveAsTab?: boolean;\n allowReplace?: boolean;\n};\nexport interface SuggestionProviderHookProps {\n columns: ColumnDescriptor[];\n namedFilters?: Map<string, string>;\n saveOptions?: FilterSaveOptions;\n table: VuuTable;\n}\n\nconst defaultSaveOptions = {\n allowReplace: true,\n};\n\nexport const useFilterSuggestionProvider = ({\n columns,\n namedFilters,\n saveOptions = defaultSaveOptions,\n table,\n}: SuggestionProviderHookProps): IFilterSuggestionProvider => {\n const latestSuggestionsRef = useRef<Completion[]>();\n const getTypeaheadSuggestions = useTypeaheadSuggestions();\n\n const getSuggestions: IFilterSuggestionProvider[\"getSuggestions\"] =\n useCallback(\n async (suggestionType, options = NONE): Promise<Completion[]> => {\n const {\n columnName,\n existingFilter,\n filterName,\n operator,\n quoted: autoQuoted,\n onSubmit,\n startsWith,\n selection,\n } = options;\n\n switch (suggestionType) {\n case \"operator\":\n {\n const column = columns.find((col) => col.name === columnName);\n if (column) {\n switch (column.serverDataType) {\n case \"string\":\n case \"char\":\n return withApplySpace(stringOperators, startsWith);\n case \"int\":\n case \"long\":\n case \"double\":\n return withApplySpace(numericOperators);\n }\n } else {\n console.warn(`'${columnName}' does not match any column name`);\n }\n }\n break;\n case \"column\": {\n const columnSuggestions = await suggestColumns(columns);\n const filterSuggestions = await suggestNamedFilters(namedFilters);\n return (latestSuggestionsRef.current =\n withApplySpace(columnSuggestions)).concat(\n withApplySpace(filterSuggestions)\n );\n }\n case \"columnValue\":\n {\n if (columnName) {\n const column = columns.find((col) => col.name === columnName);\n const prefix = Array.isArray(selection)\n ? selection.length === 0\n ? \"[\"\n : \",\"\n : \"\";\n const params = getTypeaheadParams(\n table,\n columnName,\n startsWith\n );\n const suggestions = await getTypeaheadSuggestions(params);\n // prob don't want to save the prefix\n const isIllustration = operator === \"starts\";\n latestSuggestionsRef.current = toSuggestions(suggestions, {\n moveCursorToEnd: autoQuoted,\n quoted: column?.serverDataType === \"string\" && !autoQuoted,\n suffix: autoQuoted ? \"\" : \" \",\n prefix: isIllustration ? startsWith : prefix,\n isIllustration,\n });\n if (Array.isArray(selection) && selection?.length > 1) {\n return [doneCommand, ...latestSuggestionsRef.current];\n }\n return latestSuggestionsRef.current;\n }\n }\n break;\n case \"save\": {\n if (typeof onSubmit !== \"function\") {\n throw Error(\n \"useFilterSuggestionProvider, onSubmit must be supplied for 'save' suggestions\"\n );\n }\n return await getSaveSuggestions({\n existingFilter,\n filterName,\n onSubmit,\n saveOptions,\n });\n }\n case \"name\":\n return await getNamePrompt(\"filter\");\n default:\n }\n\n return [];\n },\n [columns, getTypeaheadSuggestions, namedFilters, saveOptions, table]\n );\n\n const isPartialMatch = useCallback(\n async (\n valueType: SuggestionType,\n columnName?: string,\n pattern?: string\n ) => {\n // const { current: latestSuggestions } = latestSuggestionsRef;\n const suggestions =\n // latestSuggestions && latestSuggestions.length > 0\n // ? latestSuggestions\n await getSuggestions(valueType, { columnName });\n\n if (pattern && suggestions) {\n for (const option of suggestions) {\n if (option.label === pattern) {\n return false;\n } else if (option.label.startsWith(pattern)) {\n return true;\n }\n }\n }\n return false;\n },\n [getSuggestions]\n );\n\n return {\n getSuggestions,\n isPartialMatch,\n };\n};\n", "import { createEl } from \"@vuu-ui/vuu-utils\";\n\nexport const filterInfo = (\n filterName: string,\n filterQuery: string\n // filter: Filter\n) => {\n const rootElement = createEl(\"div\", \"vuuFunctionDoc\");\n const headingElement = createEl(\"div\", \"function-heading\");\n\n const nameElement = createEl(\"span\", \"function-name\", filterName);\n // const paramElement = createEl(\"span\", \"param-list\", params.description);\n // const typeElement = createEl(\"span\", \"function-type\", type);\n\n headingElement.appendChild(nameElement);\n // headingElement.appendChild(paramElement);\n // headingElement.appendChild(typeElement);\n\n const child2 = createEl(\"p\", undefined, filterQuery);\n\n rootElement.appendChild(headingElement);\n rootElement.appendChild(child2);\n\n return rootElement;\n};\n", "import { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { Toolbar, ToolbarProps } from \"@heswell/salt-lab\";\nimport cx from \"classnames\";\nimport { SuggestionConsumer } from \"../filter-input\";\nimport { useFilterToolbar } from \"./useFilterToolbar\";\n\nimport \"./FilterToolbar.css\";\n\nexport interface FilterToolbarProps extends SuggestionConsumer, ToolbarProps {\n filter?: Filter;\n}\n\nexport const FilterToolbar = ({\n className,\n filter,\n suggestionProvider,\n ...props\n}: FilterToolbarProps) => {\n console.log(`FilterToolbar ${JSON.stringify(filter, null, 2)}`);\n const toolbarItems = useFilterToolbar({ filter, suggestionProvider });\n return (\n <Toolbar className={cx(\"vuuFilterToolbar\", className)} {...props}>\n {toolbarItems}\n </Toolbar>\n );\n};\n", "import { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport {\n isMultiValueFilter,\n isNamedFilter,\n isSingleValueFilter,\n IFilterSuggestionProvider,\n SuggestionConsumer,\n} from \"@vuu-ui/vuu-filters\";\nimport { ToggleButton, ToolbarField } from \"@heswell/salt-lab\";\nimport { ReactElement } from \"react\";\nimport { FilterDropdown } from \"./FilterDropdown\";\nimport { FilterDropdownMultiSelect } from \"./FilterDropdownMultiSelect\";\n\nconst filterToControl = (\n filter: Filter,\n suggestionProvider: IFilterSuggestionProvider\n): ReactElement | ReactElement[] => {\n if (isNamedFilter(filter)) {\n return (\n <ToggleButton\n className=\"vuuToggleButton\"\n toggled={true}\n variant=\"secondary\"\n >\n {filter.name}\n </ToggleButton>\n );\n }\n if (isSingleValueFilter(filter)) {\n const { column, value } = filter;\n return (\n <ToolbarField\n className=\"vuuFilterDropdown\"\n key={column}\n label={column}\n labelPlacement=\"top\"\n >\n <FilterDropdown\n column={column}\n selected={value.toString()}\n selectionStrategy=\"default\"\n source={[value.toString()]}\n suggestionProvider={suggestionProvider}\n style={{ width: 100 }}\n />\n </ToolbarField>\n );\n }\n if (isMultiValueFilter(filter)) {\n const values = filter.values.map((v) => v.toString());\n return (\n <ToolbarField\n className=\"vuuFilterDropdown\"\n label={filter.column}\n key={filter.column}\n labelPlacement=\"top\"\n >\n <FilterDropdownMultiSelect\n column={filter.column}\n selected={values}\n source={values}\n suggestionProvider={suggestionProvider}\n style={{ width: 100 }}\n />\n </ToolbarField>\n );\n }\n return filter.filters.map((filter) =>\n filterToControl(filter, suggestionProvider)\n ) as ReactElement[];\n};\n\nexport interface FilterToolbarProps extends SuggestionConsumer {\n filter?: Filter;\n}\n\nexport const useFilterToolbar = ({\n filter,\n suggestionProvider,\n}: FilterToolbarProps) => {\n if (filter) {\n return filterToControl(filter, suggestionProvider);\n }\n return [];\n};\n", "import { Dropdown, DropdownProps } from \"@heswell/salt-lab\";\nimport { useCallback, useState } from \"react\";\nimport { IFilterSuggestionProvider } from \"../filter-input\";\n\nconst isString = (s: string | string[]): s is string => typeof s === \"string\";\n\nconst stripQuotes = <T extends string | string[]>(selected: T): T => {\n if (isString(selected)) {\n if (selected.startsWith('\"') && selected.endsWith('\"')) {\n return selected.slice(1, -1) as T;\n } else {\n return selected;\n }\n } else {\n return selected.map(stripQuotes) as T;\n }\n};\n\nexport interface FilterDropdownProps extends DropdownProps {\n column: string;\n suggestionProvider: IFilterSuggestionProvider;\n}\n\nexport const FilterDropdown = ({\n column,\n selected: selectedProp,\n suggestionProvider,\n ...props\n}: FilterDropdownProps) => {\n const selected = selectedProp != null ? stripQuotes(selectedProp) : undefined;\n const initialValues = Array.isArray(selected)\n ? selected\n : selected != null\n ? [selected]\n : [];\n const [values, setValues] = useState<string[]>(initialValues);\n console.log({ initialValues });\n const handleOpenChange = useCallback(\n async (isOpen) => {\n if (isOpen) {\n const values = await suggestionProvider.getSuggestions(\"columnValue\", {\n columnName: column,\n });\n console.log({ values });\n setValues(values.map((suggestion) => suggestion.label));\n }\n },\n [column, suggestionProvider]\n );\n\n return (\n <Dropdown\n {...props}\n onOpenChange={handleOpenChange}\n selected={selected}\n source={values}\n />\n );\n};\n", "import { Dropdown, DropdownProps } from \"@heswell/salt-lab\";\nimport { useCallback, useState } from \"react\";\nimport { IFilterSuggestionProvider } from \"../filter-input\";\n\nconst isString = (s?: string | string[]): s is string => typeof s === \"string\";\n\nconst stripQuotes = <T extends string | string[]>(\n selected?: T\n): T | undefined => {\n if (selected === undefined) {\n return undefined;\n } else if (isString(selected)) {\n if (selected.startsWith('\"') && selected.endsWith('\"')) {\n return selected.slice(1, -1) as T;\n } else {\n return selected;\n }\n } else {\n return selected.map(stripQuotes) as T;\n }\n};\n\nexport interface FilterDropdownProps extends DropdownProps<string, \"multiple\"> {\n column: string;\n suggestionProvider: IFilterSuggestionProvider;\n}\n\nexport const FilterDropdownMultiSelect = ({\n column,\n selected: selectedProp,\n suggestionProvider,\n ...props\n}: FilterDropdownProps) => {\n const selected = stripQuotes(selectedProp);\n const initialValues = Array.isArray(selected)\n ? selected\n : selected != null\n ? [selected]\n : [];\n const [values, setValues] = useState<string[]>(initialValues);\n const handleOpenChange = useCallback(\n async (isOpen) => {\n if (isOpen) {\n const values = await suggestionProvider.getSuggestions(\"columnValue\", {\n columnName: column,\n });\n console.log({ values });\n setValues(values.map((suggestion) => suggestion.label));\n }\n },\n [column, suggestionProvider]\n );\n\n return (\n <Dropdown<string, \"multiple\">\n {...props}\n onOpenChange={handleOpenChange}\n selected={selected}\n selectionStrategy=\"multiple\"\n source={values}\n />\n );\n};\n", "import { DataSourceRow } from \"@vuu-ui/vuu-data\";\nimport {\n AndFilter,\n Filter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport { parseFilter } from \"./filter-input/filter-language-parser/FilterParser\";\n\nconst filterPredicateMap = new Map<string, FilterPredicate>();\nconst filterReject = () => false;\n\nexport const getFilterPredicate = (\n columnMap: ColumnMap,\n filterQuery: string\n): FilterPredicate => {\n let predicate = filterPredicateMap.get(filterQuery);\n if (predicate) {\n return predicate;\n }\n // TODO we need to clear cache if columns change. How do we identify this :\n try {\n const filter = parseFilter(filterQuery);\n predicate = filterPredicate(columnMap, filter);\n filterPredicateMap.set(filterQuery, predicate);\n return predicate;\n } catch (err) {\n console.warn(\n `filter-evaluation-utils, failed to parse filter \"${filterQuery}\"`\n );\n return filterReject;\n }\n};\n\nexport function filterPredicate(\n columnMap: ColumnMap,\n filter: Filter\n): FilterPredicate {\n //TODO convert filter to include colIdx ratherthan colName, so we don't have to pass cols\n switch (filter.op) {\n case \"in\":\n return testInclude(columnMap, filter);\n case \"=\":\n return testEQ(columnMap, filter);\n case \">\":\n return testGT(columnMap, filter);\n case \">=\":\n return testGE(columnMap, filter);\n case \"<\":\n return testLT(columnMap, filter);\n case \"<=\":\n return testLE(columnMap, filter);\n case \"starts\":\n return testSW(columnMap, filter);\n case \"and\":\n return testAND(columnMap, filter as AndFilter);\n case \"or\":\n return testOR(columnMap, filter as OrFilter);\n default:\n console.log(`unrecognized filter type ${filter.op}`);\n return () => true;\n }\n}\n\nexport type FilterPredicate = (row: DataSourceRow) => boolean;\n\nconst testInclude = (\n columnMap: ColumnMap,\n filter: MultiValueFilterClause\n): FilterPredicate => {\n return (row) =>\n (filter.values as unknown[]).indexOf(row[columnMap[filter.column]]) !== -1;\n};\n\nconst testEQ = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] === filter.value;\n};\n\nconst testGT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] > filter.value;\n};\nconst testGE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] >= filter.value;\n};\n\nconst testLT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] < filter.value;\n};\nconst testLE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] <= filter.value;\n};\n\nconst testSW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());\n };\n};\n\nconst testAND = (columnMap: ColumnMap, filter: AndFilter): FilterPredicate => {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.every((fn) => fn(row));\n};\n\nfunction testOR(columnMap: ColumnMap, filter: OrFilter): FilterPredicate {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.some((fn) => fn(row));\n}\n", "import { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { KeyedColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { extractFilterForColumn, partition } from \"@vuu-ui/vuu-utils\";\nimport {\n isAndFilter,\n isInFilter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isOrFilter,\n isSingleValueFilter,\n} from \"./filterTypes\";\nimport {\n AndFilter,\n Filter,\n FilterClause,\n FilterCombinatorOp,\n} from \"@vuu-ui/vuu-filter-types\";\n\nexport const AND = \"and\";\nexport const EQUALS = \"=\";\nexport const GREATER_THAN = \">\";\nexport const LESS_THAN = \"<\";\nexport const OR = \"or\";\nexport const STARTS_WITH = \"starts\";\nexport const ENDS_WITH = \"ends\";\nexport const IN = \"in\";\n\nexport type FilterType =\n | \"and\"\n | \"=\"\n | \">\"\n | \">=\"\n | \"in\"\n | \"<=\"\n | \"<\"\n | \"NOT_IN\"\n | \"NOT_SW\"\n | \"or\"\n | \"SW\";\n\nexport const filterClauses = (\n filter: Filter | null,\n clauses: FilterClause[] = []\n) => {\n if (filter) {\n if (isMultiClauseFilter(filter)) {\n filter.filters.forEach((f) => clauses.push(...filterClauses(f)));\n } else {\n clauses.push(filter);\n }\n }\n return clauses;\n};\n\ntype AddFilterOptions = {\n combineWith: FilterCombinatorOp;\n};\n\nconst DEFAULT_ADD_FILTER_OPTS: AddFilterOptions = {\n combineWith: \"and\",\n};\n\nexport const addFilter = (\n existingFilter: Filter | undefined,\n filter: Filter,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS\n): Filter | undefined => {\n if (includesNoValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the no-values filter\n } else {\n existingFilter = removeFilterForColumn(existingFilter, {\n name: filter.column,\n });\n }\n } else if (includesAllValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the all-values filter\n }\n return removeFilterForColumn(existingFilter, { name: filter.column ?? \"\" });\n }\n\n if (!existingFilter) {\n return filter;\n }\n if (!filter) {\n return existingFilter;\n }\n if (existingFilter.op === AND && filter.op === AND) {\n return {\n op: AND,\n filters: combine(existingFilter.filters, filter.filters),\n };\n }\n if (existingFilter.op === AND) {\n const filters = replaceOrInsert(existingFilter.filters, filter);\n return filters.length > 1 ? { op: AND, filters } : filters[0];\n }\n if (filter.op === AND) {\n return { op: AND, filters: filter.filters.concat(existingFilter) };\n }\n\n if (filterEquals(existingFilter, filter, true)) {\n return filter;\n }\n\n if (canMerge(existingFilter, filter)) {\n return merge(existingFilter, filter);\n }\n\n return { op: combineWith, filters: [existingFilter, filter] };\n};\n\nconst includesNoValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (isInFilter(filter) && filter.values.length === 0) {\n return true;\n }\n return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));\n};\n\nconst filterValue = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nexport const filterAsQuery = (f: Filter): string => {\n if (isMultiClauseFilter(f)) {\n return f.filters.map((filter) => filterAsQuery(filter)).join(` ${f.op} `);\n } else if (isMultiValueFilter(f)) {\n return `${f.column} ${f.op} [${f.values.join(\",\")}]`;\n } else {\n return `${f.column} ${f.op} ${filterValue(f.value)}`;\n }\n};\n\ninterface CommonFilter {\n colName?: string;\n otherColFilters?: Filter[];\n mode?: any;\n value?: any;\n values?: any;\n op?: \"or\" | \"and\";\n column?: string;\n filters?: Filter[];\n}\n\nexport interface OtherFilter extends CommonFilter {\n type: FilterType;\n values?: any[];\n}\n\nconst includesAllValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (filter.op === STARTS_WITH && filter.value === \"\") {\n return true;\n }\n return filter.op === STARTS_WITH && filter.value === \"\";\n};\n\nconst replaceOrInsert = (filters: Filter[], filter: Filter) => {\n return filters.concat(filter);\n};\n\nconst merge = (f1: Filter, f2: Filter): Filter | undefined => {\n if (includesNoValues(f2)) {\n return f2;\n }\n if (isInFilter(f1) && isInFilter(f2)) {\n return {\n ...f1,\n values: [\n ...f1.values,\n ...(f2.values as any[]).filter(\n (v: string | number) => !(f1.values as any[]).includes(v)\n ),\n ],\n };\n } else if (isInFilter(f1) && f2.op === EQUALS) {\n return {\n ...f1,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: f1.values.concat([f2.value]),\n };\n } else if (f1.op === EQUALS && f2.op === EQUALS) {\n return {\n column: f1.column,\n op: IN,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: [f1.value, f2.value],\n };\n }\n return f2;\n};\n\nconst combine = (existingFilters: Filter[], replacementFilters: Filter[]) => {\n const equivalentType = ({ op: t1 }: Filter, { op: t2 }: Filter) => {\n return t1 === t2 || t1[0] === t2[0];\n };\n const replaces = (existingFilter: Filter, replacementFilter: Filter) => {\n return (\n existingFilter.column === replacementFilter.column &&\n equivalentType(existingFilter, replacementFilter)\n );\n };\n const stillApplicable = (existingFilter: Filter) =>\n replacementFilters.some((replacementFilter) =>\n replaces(existingFilter, replacementFilter)\n ) === false;\n return existingFilters.filter(stillApplicable).concat(replacementFilters);\n};\n\nexport const removeColumnFromFilter = (\n column: KeyedColumnDescriptor,\n filter: Filter\n): [Filter | undefined, string] => {\n if (isMultiClauseFilter(filter)) {\n const [clause1, clause2] = filter.filters;\n if (clause1.column === column.name) {\n return [clause2, filterAsQuery(clause2)];\n }\n if (clause2.column === column.name) {\n return [clause1, filterAsQuery(clause1)];\n }\n }\n return [undefined, \"\"];\n};\n\nexport const removeFilter = (sourceFilter: Filter, filterToRemove: Filter) => {\n if (filterEquals(sourceFilter, filterToRemove, true)) {\n return null;\n }\n if (sourceFilter.op !== AND) {\n throw Error(\n `removeFilter cannot remove ${JSON.stringify(\n filterToRemove\n )} from ${JSON.stringify(sourceFilter)}`\n );\n }\n const filters = sourceFilter.filters.filter(\n (f) => !filterEquals(f, filterToRemove)\n );\n return filters.length > 0 ? { type: AND, filters } : null;\n};\n\nexport const splitFilterOnColumn = (\n filter: Filter | null,\n columnName: string\n): [Filter | null, Filter | null] => {\n if (!filter) {\n return [null, null];\n }\n if (filter.column === columnName) {\n return [filter, null];\n }\n if (filter.op !== AND) {\n return [null, filter];\n }\n const [[columnFilter = null], filters] = partition(\n (filter as AndFilter).filters,\n (f) => f.column === columnName\n );\n return filters.length === 1\n ? [columnFilter, filters[0]]\n : [columnFilter, { op: AND, filters }];\n};\n\nexport const overrideColName = (filter: Filter, column: string): Filter => {\n if (isMultiClauseFilter(filter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => overrideColName(f, column)),\n };\n }\n return { ...filter, column };\n};\n\nexport const filterIncludesColumn = (\n filter: Filter,\n column: KeyedColumnDescriptor\n): boolean => {\n if (!filter) {\n return false;\n }\n const { op, column: filterColName } = filter;\n switch (op) {\n case AND:\n case OR:\n return (\n filter.filters != null &&\n filter.filters.some((f) => filterIncludesColumn(f, column))\n );\n default:\n return filterColName === column.name;\n }\n};\n\nconst removeFilterForColumn = (\n sourceFilter: Filter | undefined,\n column: ColumnDescriptor\n): Filter | undefined => {\n const colName = column.name;\n if (!sourceFilter) {\n return undefined;\n }\n if (sourceFilter.column === colName) {\n return undefined;\n }\n if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {\n const { op } = sourceFilter;\n const filters = sourceFilter.filters;\n const otherColFilters = filters.filter((f) => f.column !== colName);\n switch (otherColFilters.length) {\n case 0:\n return undefined;\n case 1:\n return otherColFilters[0];\n default:\n return { op, filters: otherColFilters };\n }\n }\n return sourceFilter;\n};\n\nconst canMerge = (f1: Filter, f2: Filter) =>\n f1.column === f2.column &&\n (f1.op === \"=\" || f1.op === \"in\") &&\n (f2.op === \"=\" || f2.op === \"in\");\n\nconst sameValues = <T>(arr1: T[], arr2: T[]) => {\n if (arr1 === arr2) {\n return true;\n }\n if (arr1.length === arr2.length) {\n const a = arr1.slice().sort();\n const b = arr2.slice().sort();\n return a.join(\"|\") === b.join(\"|\");\n }\n return false;\n};\n\nexport const filterEquals = (f1?: Filter, f2?: Filter, strict = false) => {\n if (!strict) {\n return true;\n }\n if (f1 && f2 && canMerge(f1, f2)) {\n return (\n f1.op === f2.op &&\n ((isSingleValueFilter(f1) &&\n isSingleValueFilter(f2) &&\n f1.value === f2.value) ||\n (isMultiValueFilter(f1) &&\n isMultiValueFilter(f2) &&\n sameValues(f1.values as any[], f2.values)))\n );\n }\n return false;\n};\n\nexport const updateFilter = (\n filter: Filter | undefined,\n newFilter: Filter | undefined,\n mode: \"add\" | \"replace\"\n): Filter | undefined => {\n if (filter && newFilter) {\n if (mode === \"replace\") {\n return newFilter;\n }\n if (filter.op === \"and\") {\n return {\n ...filter,\n filters: filter.filters.concat(newFilter),\n };\n }\n const { column: columnName } = newFilter;\n if (columnName) {\n const existingClause = newFilter.column\n ? extractFilterForColumn(filter, columnName)\n : undefined;\n if (existingClause && columnName) {\n // The filter already contains a clause for this column, replace\n // with the new clause\n const result = removeFilterForColumn(filter, { name: columnName });\n return updateFilter(result, newFilter, \"add\");\n }\n }\n return {\n op: \"and\",\n filters: [filter, newFilter],\n };\n }\n if (newFilter) {\n return newFilter;\n }\n return filter;\n};\n", "//TODO these are duplicated in vuu-utils, that shoudl probably be the righful source\nimport {\n AndFilter,\n Filter,\n MultiClauseFilter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\n\nconst singleValueFilterOps = new Set<SingleValueFilterClauseOp>([\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"starts\",\n \"ends\",\n]);\n\n// convenience methods to check filter type\nexport const isNamedFilter = (f?: Filter) =>\n f !== undefined && f.name !== undefined;\n\n// ... with type constraints\nexport const isSingleValueFilter = (f?: Filter): f is SingleValueFilterClause =>\n f !== undefined &&\n singleValueFilterOps.has(f.op as SingleValueFilterClauseOp);\n\nexport const isFilterClause = (\n f?: Filter\n): f is SingleValueFilterClause | MultiValueFilterClause =>\n f !== undefined && (isSingleValueFilter(f) || isMultiValueFilter(f));\n\nexport const isMultiValueFilter = (f?: Filter): f is MultiValueFilterClause =>\n f !== undefined && f.op === \"in\";\n\nexport const isInFilter = (f: Filter): f is MultiValueFilterClause =>\n f.op === \"in\";\nexport const isAndFilter = (f: Filter): f is AndFilter => f.op === \"and\";\nexport const isOrFilter = (f: Filter): f is OrFilter => f.op === \"or\";\n\nexport function isMultiClauseFilter(f?: Filter): f is MultiClauseFilter {\n return f !== undefined && (f.op === \"and\" || f.op === \"or\");\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["module", "isMultiClauseFilter", "isMultiValueFilter", "isSingleValueFilter", "import_vuu_codemirror", "import_react", "import_vuu_codemirror", "tag", "import_vuu_codemirror", "import_vuu_codemirror", "import_vuu_codemirror", "cx", "parseFilter", "clearInput", "createState", "import_vuu_codemirror", "import_react", "import_vuu_utils", "import_salt_lab", "import_classnames", "import_salt_lab", "import_react", "import_jsx_runtime", "values", "import_salt_lab", "import_react", "import_jsx_runtime", "isString", "stripQuotes", "values", "import_jsx_runtime", "isSingleValueFilter", "isMultiValueFilter", "filter", "import_jsx_runtime", "cx", "filterValue", "import_vuu_utils", "isSingleValueFilter", "isMultiValueFilter", "isMultiClauseFilter", "isMultiClauseFilter", "isMultiValueFilter", "isSingleValueFilter"]
|
|
7
7
|
}
|