@vuu-ui/vuu-table-extras 0.8.35 → 0.8.36

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.
Files changed (167) hide show
  1. package/README.md +0 -0
  2. package/cjs/cell-edit-validators/CaseValidator.js +24 -0
  3. package/cjs/cell-edit-validators/CaseValidator.js.map +1 -0
  4. package/cjs/cell-edit-validators/PatternValidator.js +26 -0
  5. package/cjs/cell-edit-validators/PatternValidator.js.map +1 -0
  6. package/cjs/cell-renderers/background-cell/BackgroundCell.css +105 -0
  7. package/cjs/cell-renderers/background-cell/BackgroundCell.js +64 -0
  8. package/cjs/cell-renderers/background-cell/BackgroundCell.js.map +1 -0
  9. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css +4 -0
  10. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js +58 -0
  11. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js.map +1 -0
  12. package/cjs/cell-renderers/background-cell/BackgroundKeyframes.css +169 -0
  13. package/cjs/cell-renderers/background-cell/useDirection.js +20 -0
  14. package/cjs/cell-renderers/background-cell/useDirection.js.map +1 -0
  15. package/cjs/cell-renderers/dropdown-cell/DropdownCell.css +18 -0
  16. package/cjs/cell-renderers/dropdown-cell/DropdownCell.js +56 -0
  17. package/cjs/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -0
  18. package/cjs/cell-renderers/lookup-cell/LookupCell.js +26 -0
  19. package/cjs/cell-renderers/lookup-cell/LookupCell.js.map +1 -0
  20. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.css +30 -0
  21. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.js +53 -0
  22. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.js.map +1 -0
  23. package/cjs/cell-renderers/progress-cell/ProgressCell.css +39 -0
  24. package/cjs/cell-renderers/progress-cell/ProgressCell.js +60 -0
  25. package/cjs/cell-renderers/progress-cell/ProgressCell.js.map +1 -0
  26. package/cjs/column-expression-input/ColumnExpressionInput.css +92 -0
  27. package/cjs/column-expression-input/ColumnExpressionInput.js +30 -0
  28. package/cjs/column-expression-input/ColumnExpressionInput.js.map +1 -0
  29. package/cjs/column-expression-input/column-function-descriptors.js +307 -0
  30. package/cjs/column-expression-input/column-function-descriptors.js.map +1 -0
  31. package/cjs/column-expression-input/column-language-parser/ColumnExpressionLanguage.js +29 -0
  32. package/cjs/column-expression-input/column-language-parser/ColumnExpressionLanguage.js.map +1 -0
  33. package/cjs/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js +469 -0
  34. package/cjs/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js.map +1 -0
  35. package/cjs/column-expression-input/column-language-parser/column-expression-parse-utils.js +61 -0
  36. package/cjs/column-expression-input/column-language-parser/column-expression-parse-utils.js.map +1 -0
  37. package/cjs/column-expression-input/column-language-parser/generated/column-parser.js +21 -0
  38. package/cjs/column-expression-input/column-language-parser/generated/column-parser.js.map +1 -0
  39. package/cjs/column-expression-input/functionDocInfo.js +39 -0
  40. package/cjs/column-expression-input/functionDocInfo.js.map +1 -0
  41. package/cjs/column-expression-input/highlighting.js +16 -0
  42. package/cjs/column-expression-input/highlighting.js.map +1 -0
  43. package/cjs/column-expression-input/theme.js +63 -0
  44. package/cjs/column-expression-input/theme.js.map +1 -0
  45. package/cjs/column-expression-input/useColumnAutoComplete.js +358 -0
  46. package/cjs/column-expression-input/useColumnAutoComplete.js.map +1 -0
  47. package/cjs/column-expression-input/useColumnExpressionEditor.js +131 -0
  48. package/cjs/column-expression-input/useColumnExpressionEditor.js.map +1 -0
  49. package/cjs/column-expression-input/useColumnExpressionSuggestionProvider.js +212 -0
  50. package/cjs/column-expression-input/useColumnExpressionSuggestionProvider.js.map +1 -0
  51. package/cjs/column-expression-panel/ColumnExpressionPanel.js +87 -0
  52. package/cjs/column-expression-panel/ColumnExpressionPanel.js.map +1 -0
  53. package/cjs/column-expression-panel/useColumnExpression.js +69 -0
  54. package/cjs/column-expression-panel/useColumnExpression.js.map +1 -0
  55. package/cjs/column-formatting-settings/BaseNumericFormattingSettings.js +97 -0
  56. package/cjs/column-formatting-settings/BaseNumericFormattingSettings.js.map +1 -0
  57. package/cjs/column-formatting-settings/ColumnFormattingPanel.js +107 -0
  58. package/cjs/column-formatting-settings/ColumnFormattingPanel.js.map +1 -0
  59. package/cjs/column-formatting-settings/DateTimeFormattingSettings.js +90 -0
  60. package/cjs/column-formatting-settings/DateTimeFormattingSettings.js.map +1 -0
  61. package/cjs/column-formatting-settings/LongTypeFormattingSettings.css +6 -0
  62. package/cjs/column-formatting-settings/LongTypeFormattingSettings.js +40 -0
  63. package/cjs/column-formatting-settings/LongTypeFormattingSettings.js.map +1 -0
  64. package/cjs/column-list/ColumnList.css +60 -0
  65. package/cjs/column-list/ColumnList.js +106 -0
  66. package/cjs/column-list/ColumnList.js.map +1 -0
  67. package/cjs/column-settings/ColumnNameLabel.css +13 -0
  68. package/cjs/column-settings/ColumnNameLabel.js +36 -0
  69. package/cjs/column-settings/ColumnNameLabel.js.map +1 -0
  70. package/cjs/column-settings/ColumnSettingsPanel.css +77 -0
  71. package/cjs/column-settings/ColumnSettingsPanel.js +186 -0
  72. package/cjs/column-settings/ColumnSettingsPanel.js.map +1 -0
  73. package/cjs/column-settings/useColumnSettings.js +235 -0
  74. package/cjs/column-settings/useColumnSettings.js.map +1 -0
  75. package/cjs/datasource-stats/DatasourceStats.css +11 -0
  76. package/cjs/datasource-stats/DatasourceStats.js +39 -0
  77. package/cjs/datasource-stats/DatasourceStats.js.map +1 -0
  78. package/cjs/index.js.map +1 -0
  79. package/cjs/table-settings/TableSettingsPanel.css +64 -0
  80. package/cjs/table-settings/TableSettingsPanel.js +114 -0
  81. package/cjs/table-settings/TableSettingsPanel.js.map +1 -0
  82. package/cjs/table-settings/useTableSettings.js +182 -0
  83. package/cjs/table-settings/useTableSettings.js.map +1 -0
  84. package/esm/cell-edit-validators/CaseValidator.js +22 -0
  85. package/esm/cell-edit-validators/CaseValidator.js.map +1 -0
  86. package/esm/cell-edit-validators/PatternValidator.js +24 -0
  87. package/esm/cell-edit-validators/PatternValidator.js.map +1 -0
  88. package/esm/cell-renderers/background-cell/BackgroundCell.css +105 -0
  89. package/esm/cell-renderers/background-cell/BackgroundCell.js +62 -0
  90. package/esm/cell-renderers/background-cell/BackgroundCell.js.map +1 -0
  91. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css +4 -0
  92. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js +56 -0
  93. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js.map +1 -0
  94. package/esm/cell-renderers/background-cell/BackgroundKeyframes.css +169 -0
  95. package/esm/cell-renderers/background-cell/useDirection.js +18 -0
  96. package/esm/cell-renderers/background-cell/useDirection.js.map +1 -0
  97. package/esm/cell-renderers/dropdown-cell/DropdownCell.css +18 -0
  98. package/esm/cell-renderers/dropdown-cell/DropdownCell.js +54 -0
  99. package/esm/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -0
  100. package/esm/cell-renderers/lookup-cell/LookupCell.js +24 -0
  101. package/esm/cell-renderers/lookup-cell/LookupCell.js.map +1 -0
  102. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.css +30 -0
  103. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.js +51 -0
  104. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.js.map +1 -0
  105. package/esm/cell-renderers/progress-cell/ProgressCell.css +39 -0
  106. package/esm/cell-renderers/progress-cell/ProgressCell.js +58 -0
  107. package/esm/cell-renderers/progress-cell/ProgressCell.js.map +1 -0
  108. package/esm/column-expression-input/ColumnExpressionInput.css +92 -0
  109. package/esm/column-expression-input/ColumnExpressionInput.js +28 -0
  110. package/esm/column-expression-input/ColumnExpressionInput.js.map +1 -0
  111. package/esm/column-expression-input/column-function-descriptors.js +305 -0
  112. package/esm/column-expression-input/column-function-descriptors.js.map +1 -0
  113. package/esm/column-expression-input/column-language-parser/ColumnExpressionLanguage.js +27 -0
  114. package/esm/column-expression-input/column-language-parser/ColumnExpressionLanguage.js.map +1 -0
  115. package/esm/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js +467 -0
  116. package/esm/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js.map +1 -0
  117. package/esm/column-expression-input/column-language-parser/column-expression-parse-utils.js +56 -0
  118. package/esm/column-expression-input/column-language-parser/column-expression-parse-utils.js.map +1 -0
  119. package/esm/column-expression-input/column-language-parser/generated/column-parser.js +19 -0
  120. package/esm/column-expression-input/column-language-parser/generated/column-parser.js.map +1 -0
  121. package/esm/column-expression-input/functionDocInfo.js +37 -0
  122. package/esm/column-expression-input/functionDocInfo.js.map +1 -0
  123. package/esm/column-expression-input/highlighting.js +14 -0
  124. package/esm/column-expression-input/highlighting.js.map +1 -0
  125. package/esm/column-expression-input/theme.js +61 -0
  126. package/esm/column-expression-input/theme.js.map +1 -0
  127. package/esm/column-expression-input/useColumnAutoComplete.js +356 -0
  128. package/esm/column-expression-input/useColumnAutoComplete.js.map +1 -0
  129. package/esm/column-expression-input/useColumnExpressionEditor.js +129 -0
  130. package/esm/column-expression-input/useColumnExpressionEditor.js.map +1 -0
  131. package/esm/column-expression-input/useColumnExpressionSuggestionProvider.js +210 -0
  132. package/esm/column-expression-input/useColumnExpressionSuggestionProvider.js.map +1 -0
  133. package/esm/column-expression-panel/ColumnExpressionPanel.js +85 -0
  134. package/esm/column-expression-panel/ColumnExpressionPanel.js.map +1 -0
  135. package/esm/column-expression-panel/useColumnExpression.js +67 -0
  136. package/esm/column-expression-panel/useColumnExpression.js.map +1 -0
  137. package/esm/column-formatting-settings/BaseNumericFormattingSettings.js +95 -0
  138. package/esm/column-formatting-settings/BaseNumericFormattingSettings.js.map +1 -0
  139. package/esm/column-formatting-settings/ColumnFormattingPanel.js +105 -0
  140. package/esm/column-formatting-settings/ColumnFormattingPanel.js.map +1 -0
  141. package/esm/column-formatting-settings/DateTimeFormattingSettings.js +88 -0
  142. package/esm/column-formatting-settings/DateTimeFormattingSettings.js.map +1 -0
  143. package/esm/column-formatting-settings/LongTypeFormattingSettings.css +6 -0
  144. package/esm/column-formatting-settings/LongTypeFormattingSettings.js +38 -0
  145. package/esm/column-formatting-settings/LongTypeFormattingSettings.js.map +1 -0
  146. package/esm/column-list/ColumnList.css +60 -0
  147. package/esm/column-list/ColumnList.js +104 -0
  148. package/esm/column-list/ColumnList.js.map +1 -0
  149. package/esm/column-settings/ColumnNameLabel.css +13 -0
  150. package/esm/column-settings/ColumnNameLabel.js +34 -0
  151. package/esm/column-settings/ColumnNameLabel.js.map +1 -0
  152. package/esm/column-settings/ColumnSettingsPanel.css +77 -0
  153. package/esm/column-settings/ColumnSettingsPanel.js +184 -0
  154. package/esm/column-settings/ColumnSettingsPanel.js.map +1 -0
  155. package/esm/column-settings/useColumnSettings.js +233 -0
  156. package/esm/column-settings/useColumnSettings.js.map +1 -0
  157. package/esm/datasource-stats/DatasourceStats.css +11 -0
  158. package/esm/datasource-stats/DatasourceStats.js +37 -0
  159. package/esm/datasource-stats/DatasourceStats.js.map +1 -0
  160. package/esm/index.js +24 -0
  161. package/esm/index.js.map +1 -0
  162. package/esm/table-settings/TableSettingsPanel.css +64 -0
  163. package/esm/table-settings/TableSettingsPanel.js +112 -0
  164. package/esm/table-settings/TableSettingsPanel.js.map +1 -0
  165. package/esm/table-settings/useTableSettings.js +180 -0
  166. package/esm/table-settings/useTableSettings.js.map +1 -0
  167. package/package.json +14 -12
@@ -0,0 +1,129 @@
1
+ import { EditorView, EditorState, minimalSetup, autocompletion, keymap, defaultKeymap, startCompletion, ensureSyntaxTree } from '@vuu-ui/vuu-codemirror';
2
+ import { createEl } from '@vuu-ui/vuu-utils';
3
+ import { useRef, useMemo, useEffect, useCallback } from 'react';
4
+ import { columnExpressionLanguageSupport } from './column-language-parser/ColumnExpressionLanguage.js';
5
+ import { walkTree } from './column-language-parser/ColumnExpressionTreeWalker.js';
6
+ import './column-language-parser/column-expression-parse-utils.js';
7
+ import { vuuHighlighting } from './highlighting.js';
8
+ import { vuuTheme } from './theme.js';
9
+ import { useColumnAutoComplete } from './useColumnAutoComplete.js';
10
+
11
+ const getView = (ref) => {
12
+ if (ref.current == void 0) {
13
+ throw Error("EditorView not defined");
14
+ }
15
+ return ref.current;
16
+ };
17
+ const getOptionClass = () => {
18
+ return "vuuSuggestion";
19
+ };
20
+ const noop = () => console.log("noooop");
21
+ const hasExpressionType = (completion) => "expressionType" in completion;
22
+ const injectOptionContent = (completion) => {
23
+ if (hasExpressionType(completion)) {
24
+ const div = createEl("div", "expression-type-container");
25
+ const span = createEl("span", "expression-type", completion.expressionType);
26
+ div.appendChild(span);
27
+ return div;
28
+ } else {
29
+ return null;
30
+ }
31
+ };
32
+ const useColumnExpressionEditor = ({
33
+ onChange,
34
+ onSubmitExpression,
35
+ source,
36
+ suggestionProvider
37
+ }) => {
38
+ const editorRef = useRef(null);
39
+ const onSubmitRef = useRef(noop);
40
+ const viewRef = useRef();
41
+ const completionFn = useColumnAutoComplete(suggestionProvider, onSubmitRef);
42
+ const [createState, clearInput, submit] = useMemo(() => {
43
+ const parseExpression = () => {
44
+ const view = getView(viewRef);
45
+ const source2 = view.state.doc.toString();
46
+ const tree = ensureSyntaxTree(view.state, view.state.doc.length, 5e3);
47
+ if (tree) {
48
+ const expression = walkTree(tree, source2);
49
+ return [source2, expression];
50
+ } else {
51
+ return ["", void 0];
52
+ }
53
+ };
54
+ const clearInput2 = () => {
55
+ getView(viewRef).setState(createState2());
56
+ };
57
+ const submitExpression = () => {
58
+ const [source2, expression] = parseExpression();
59
+ onSubmitExpression?.(source2, expression);
60
+ };
61
+ const showSuggestions = (key) => {
62
+ return keymap.of([
63
+ {
64
+ key,
65
+ run() {
66
+ startCompletion(getView(viewRef));
67
+ return true;
68
+ }
69
+ }
70
+ ]);
71
+ };
72
+ const createState2 = () => EditorState.create({
73
+ doc: source,
74
+ extensions: [
75
+ minimalSetup,
76
+ autocompletion({
77
+ addToOptions: [
78
+ {
79
+ render: injectOptionContent,
80
+ position: 70
81
+ }
82
+ ],
83
+ override: [completionFn],
84
+ optionClass: getOptionClass
85
+ }),
86
+ columnExpressionLanguageSupport(),
87
+ keymap.of(defaultKeymap),
88
+ showSuggestions("ArrowDown"),
89
+ EditorView.updateListener.of((v) => {
90
+ const view = getView(viewRef);
91
+ if (v.docChanged) {
92
+ startCompletion(view);
93
+ const source2 = view.state.doc.toString();
94
+ onChange?.(source2);
95
+ }
96
+ }),
97
+ // Enforces single line view
98
+ EditorState.transactionFilter.of(
99
+ (tr) => tr.newDoc.lines > 1 ? [] : tr
100
+ ),
101
+ vuuTheme,
102
+ vuuHighlighting
103
+ ]
104
+ });
105
+ onSubmitRef.current = () => {
106
+ submitExpression();
107
+ };
108
+ return [createState2, clearInput2, submitExpression];
109
+ }, [completionFn, onChange, onSubmitExpression, source]);
110
+ useEffect(() => {
111
+ if (!editorRef.current) {
112
+ throw Error("editor not in dom");
113
+ }
114
+ viewRef.current = new EditorView({
115
+ state: createState(),
116
+ parent: editorRef.current
117
+ });
118
+ return () => {
119
+ viewRef.current?.destroy();
120
+ };
121
+ }, [completionFn, createState]);
122
+ const handleBlur = useCallback(() => {
123
+ submit();
124
+ }, [submit]);
125
+ return { editorRef, clearInput, onBlur: handleBlur };
126
+ };
127
+
128
+ export { useColumnExpressionEditor };
129
+ //# sourceMappingURL=useColumnExpressionEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColumnExpressionEditor.js","sources":["../../src/column-expression-input/useColumnExpressionEditor.ts"],"sourcesContent":["import {\n autocompletion,\n Completion,\n defaultKeymap,\n EditorState,\n EditorView,\n ensureSyntaxTree,\n keymap,\n minimalSetup,\n startCompletion,\n} from \"@vuu-ui/vuu-codemirror\";\nimport { createEl } from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEventHandler,\n MutableRefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { columnExpressionLanguageSupport } from \"./column-language-parser\";\nimport {\n ColumnDefinitionExpression,\n walkTree,\n} from \"./column-language-parser/ColumnExpressionTreeWalker\";\nimport { ColumnExpressionInputProps } from \"./ColumnExpressionInput\";\nimport { vuuHighlighting } from \"./highlighting\";\nimport { vuuTheme } from \"./theme\";\nimport {\n ApplyCompletion,\n useColumnAutoComplete,\n} from \"./useColumnAutoComplete\";\n\nexport type ColumnExpressionOperator = \"Times\" | \"Divide\" | \"Minus\" | \"Plus\";\n\nexport type ColumnExpressionSuggestionType =\n | \"column\"\n | \"columnValue\"\n | \"expression\"\n | \"condition-operator\"\n | \"operator\"\n | \"relational-operator\";\n\nexport type ColumnExpressionSuggestionOptions = {\n columnName?: string;\n functionName?: string;\n operator?: ColumnExpressionOperator;\n prefix?: string;\n startsWith?: string;\n selection?: string[];\n};\n\n// TODO move this somewhere neutral\nexport interface IExpressionSuggestionProvider {\n getSuggestions: (\n valueType: ColumnExpressionSuggestionType,\n options?: ColumnExpressionSuggestionOptions\n ) => Promise<Completion[]>;\n isPartialMatch: (\n valueType: ColumnExpressionSuggestionType,\n columnName?: string,\n text?: string | undefined\n ) => Promise<boolean>;\n}\n\nexport interface ExpressionSuggestionConsumer {\n suggestionProvider: IExpressionSuggestionProvider;\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: Completion*/) => {\n return \"vuuSuggestion\";\n};\n\nconst noop = () => console.log(\"noooop\");\n\nconst hasExpressionType = (\n completion: Completion\n): completion is Completion & { expressionType: string } =>\n \"expressionType\" in completion;\n\nconst injectOptionContent = (\n completion: Completion /*, state: EditorState*/\n) => {\n if (hasExpressionType(completion)) {\n const div = createEl(\"div\", \"expression-type-container\");\n const span = createEl(\"span\", \"expression-type\", completion.expressionType);\n div.appendChild(span);\n return div;\n } else {\n return null;\n }\n};\n\nexport const useColumnExpressionEditor = ({\n onChange,\n onSubmitExpression,\n source,\n suggestionProvider,\n}: ColumnExpressionInputProps) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const onSubmitRef = useRef<ApplyCompletion>(noop);\n const viewRef = useRef<EditorView>();\n const completionFn = useColumnAutoComplete(suggestionProvider, onSubmitRef);\n\n const [createState, clearInput, submit] = useMemo(() => {\n const parseExpression = ():\n | [string, ColumnDefinitionExpression]\n | [\"\", 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 expression = walkTree(tree, source);\n return [source, expression];\n } else {\n return [\"\", undefined];\n }\n };\n\n const clearInput = () => {\n getView(viewRef).setState(createState());\n };\n\n const submitExpression = () => {\n const [source, expression] = parseExpression();\n onSubmitExpression?.(source, expression);\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: source,\n extensions: [\n minimalSetup,\n autocompletion({\n addToOptions: [\n {\n render: injectOptionContent,\n position: 70,\n },\n ],\n override: [completionFn],\n optionClass: getOptionClass,\n }),\n columnExpressionLanguageSupport(),\n keymap.of(defaultKeymap),\n showSuggestions(\"ArrowDown\"),\n EditorView.updateListener.of((v) => {\n const view = getView(viewRef);\n if (v.docChanged) {\n startCompletion(view);\n const source = view.state.doc.toString();\n onChange?.(source);\n }\n }),\n // Enforces single line view\n EditorState.transactionFilter.of((tr) =>\n tr.newDoc.lines > 1 ? [] : tr\n ),\n vuuTheme,\n vuuHighlighting,\n ],\n });\n\n onSubmitRef.current = () => {\n submitExpression();\n };\n\n return [createState, clearInput, submitExpression];\n }, [completionFn, onChange, onSubmitExpression, source]);\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 const handleBlur = useCallback<FocusEventHandler>(() => {\n submit();\n }, [submit]);\n\n return { editorRef, clearInput, onBlur: handleBlur };\n};\n"],"names":["source","clearInput","createState"],"mappings":"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"}
@@ -0,0 +1,210 @@
1
+ import { toSuggestions, AnnotationType, getRelationalOperators, numericOperators, stringOperators } from '@vuu-ui/vuu-codemirror';
2
+ import { useTypeaheadSuggestions, getTypeaheadParams } from '@vuu-ui/vuu-data-react';
3
+ import { isNumericColumn, isTextColumn } from '@vuu-ui/vuu-utils';
4
+ import { useCallback, useRef } from 'react';
5
+ import { columnFunctionDescriptors } from './column-function-descriptors.js';
6
+ import { functionDocInfo } from './functionDocInfo.js';
7
+
8
+ const NO_OPERATORS = [];
9
+ const withApplySpace = (suggestions) => suggestions.map((suggestion) => ({
10
+ ...suggestion,
11
+ apply: (suggestion.apply ?? suggestion.label) + " "
12
+ }));
13
+ const getValidColumns = (columns, { functionName, operator }) => {
14
+ if (operator) {
15
+ return columns.filter(isNumericColumn);
16
+ } else if (functionName) {
17
+ const fn = columnFunctionDescriptors.find((f) => f.name === functionName);
18
+ if (fn) {
19
+ switch (fn.accepts) {
20
+ case "string":
21
+ return columns.filter(isTextColumn);
22
+ case "number":
23
+ return columns.filter(isNumericColumn);
24
+ default:
25
+ return columns;
26
+ }
27
+ }
28
+ }
29
+ return columns;
30
+ };
31
+ const getColumns = (columns, options) => {
32
+ const validColumns = getValidColumns(columns, options);
33
+ return validColumns.map((column) => {
34
+ const label = column.label ?? column.name;
35
+ return {
36
+ apply: options.prefix ? `${options.prefix}${column.name}` : column.name,
37
+ label,
38
+ boost: 5,
39
+ type: "column",
40
+ expressionType: column.serverDataType
41
+ };
42
+ });
43
+ };
44
+ const arithmeticOperators = [
45
+ { apply: "* ", boost: 2, label: "*", type: "operator" },
46
+ { apply: "/ ", boost: 2, label: "/", type: "operator" },
47
+ { apply: "+ ", boost: 2, label: "+", type: "operator" },
48
+ { apply: "- ", boost: 2, label: "-", type: "operator" }
49
+ ];
50
+ const getOperators = (column) => {
51
+ if (column === void 0 || isNumericColumn(column)) {
52
+ return arithmeticOperators;
53
+ } else {
54
+ return NO_OPERATORS;
55
+ }
56
+ };
57
+ const getConditionOperators = (column) => {
58
+ switch (column.serverDataType) {
59
+ case "string":
60
+ case "char":
61
+ return withApplySpace(
62
+ stringOperators
63
+ /*, startsWith*/
64
+ );
65
+ case "int":
66
+ case "long":
67
+ case "double":
68
+ return withApplySpace(numericOperators);
69
+ }
70
+ };
71
+ const toFunctionCompletion = (functionDescriptor) => ({
72
+ apply: `${functionDescriptor.name}( `,
73
+ boost: 2,
74
+ expressionType: functionDescriptor.type,
75
+ info: () => functionDocInfo(functionDescriptor),
76
+ label: functionDescriptor.name,
77
+ type: "function"
78
+ });
79
+ const getAcceptedTypes = (fn) => {
80
+ if (fn) {
81
+ if (typeof fn.accepts === "string") {
82
+ return fn.accepts;
83
+ } else if (Array.isArray(fn.accepts)) {
84
+ if (fn.accepts.every((s) => s === "string")) {
85
+ return "string";
86
+ } else {
87
+ return "any";
88
+ }
89
+ }
90
+ }
91
+ return "any";
92
+ };
93
+ const functions = columnFunctionDescriptors.map(toFunctionCompletion);
94
+ const getFunctions = ({ functionName }) => {
95
+ if (functionName) {
96
+ const fn = columnFunctionDescriptors.find((f) => f.name === functionName);
97
+ const acceptedTypes = getAcceptedTypes(fn);
98
+ if (fn) {
99
+ switch (acceptedTypes) {
100
+ case "string":
101
+ return columnFunctionDescriptors.filter((f) => f.type === "string" || f.type === "variable").map(toFunctionCompletion);
102
+ case "number":
103
+ return columnFunctionDescriptors.filter((f) => f.type === "number" || f.type === "variable").map(toFunctionCompletion);
104
+ }
105
+ }
106
+ }
107
+ return functions;
108
+ };
109
+ const NONE = {};
110
+ const useColumnExpressionSuggestionProvider = ({
111
+ columns,
112
+ table
113
+ }) => {
114
+ const findColumn = useCallback(
115
+ (name) => name ? columns.find((col) => col.name === name) : void 0,
116
+ [columns]
117
+ );
118
+ const latestSuggestionsRef = useRef();
119
+ const getTypeaheadSuggestions = useTypeaheadSuggestions();
120
+ const getSuggestions = useCallback(
121
+ async (suggestionType, options = NONE) => {
122
+ const { columnName, functionName, operator, prefix } = options;
123
+ switch (suggestionType) {
124
+ case "expression": {
125
+ const suggestions = await withApplySpace(
126
+ getColumns(columns, { functionName, prefix })
127
+ ).concat(getFunctions(options));
128
+ return latestSuggestionsRef.current = suggestions;
129
+ }
130
+ case "column": {
131
+ const suggestions = await getColumns(columns, options);
132
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
133
+ }
134
+ case "operator": {
135
+ const suggestions = await getOperators(findColumn(columnName));
136
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
137
+ }
138
+ case "relational-operator": {
139
+ const suggestions = await getRelationalOperators(
140
+ findColumn(columnName)
141
+ );
142
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
143
+ }
144
+ case "condition-operator":
145
+ {
146
+ const column = findColumn(columnName);
147
+ if (column) {
148
+ const suggestions = await getConditionOperators(column);
149
+ if (suggestions) {
150
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
151
+ }
152
+ }
153
+ }
154
+ break;
155
+ case "columnValue":
156
+ if (columnName && operator) {
157
+ const params = getTypeaheadParams(
158
+ table,
159
+ columnName
160
+ /*, startsWith*/
161
+ );
162
+ const suggestions = await getTypeaheadSuggestions(params);
163
+ latestSuggestionsRef.current = toSuggestions(suggestions, {
164
+ suffix: ""
165
+ });
166
+ latestSuggestionsRef.current.forEach((suggestion) => {
167
+ suggestion.apply = (view, completion, from) => {
168
+ const annotation = new AnnotationType();
169
+ const cursorPos = from + completion.label.length + 1;
170
+ view.dispatch({
171
+ changes: { from, insert: completion.label },
172
+ selection: { anchor: cursorPos, head: cursorPos },
173
+ annotations: annotation.of(completion)
174
+ });
175
+ };
176
+ });
177
+ return latestSuggestionsRef.current;
178
+ }
179
+ break;
180
+ }
181
+ return [];
182
+ },
183
+ [columns, findColumn, getTypeaheadSuggestions, table]
184
+ );
185
+ const isPartialMatch = useCallback(
186
+ async (valueType, columnName, pattern) => {
187
+ const { current: latestSuggestions } = latestSuggestionsRef;
188
+ let maybe = false;
189
+ const suggestions = latestSuggestions || await getSuggestions(valueType, { columnName });
190
+ if (pattern && suggestions) {
191
+ for (const option of suggestions) {
192
+ if (option.label === pattern) {
193
+ return false;
194
+ } else if (option.label.startsWith(pattern)) {
195
+ maybe = true;
196
+ }
197
+ }
198
+ }
199
+ return maybe;
200
+ },
201
+ [getSuggestions]
202
+ );
203
+ return {
204
+ getSuggestions,
205
+ isPartialMatch
206
+ };
207
+ };
208
+
209
+ export { useColumnExpressionSuggestionProvider };
210
+ //# sourceMappingURL=useColumnExpressionSuggestionProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColumnExpressionSuggestionProvider.js","sources":["../../src/column-expression-input/useColumnExpressionSuggestionProvider.ts"],"sourcesContent":["import {\n AnnotationType,\n Completion,\n EditorView,\n getRelationalOperators,\n numericOperators,\n stringOperators,\n toSuggestions,\n} from \"@vuu-ui/vuu-codemirror\";\nimport {\n getTypeaheadParams,\n useTypeaheadSuggestions,\n} from \"@vuu-ui/vuu-data-react\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { isNumericColumn, isTextColumn } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef } from \"react\";\nimport {\n ColumnFunctionDescriptor,\n columnFunctionDescriptors,\n} from \"./column-function-descriptors\";\nimport { functionDocInfo } from \"./functionDocInfo\";\nimport {\n ColumnExpressionOperator,\n ColumnExpressionSuggestionType,\n IExpressionSuggestionProvider,\n} from \"./useColumnExpressionEditor\";\n\nconst NO_OPERATORS = [] as Completion[];\n\nconst withApplySpace = (suggestions: Completion[]): Completion[] =>\n suggestions.map((suggestion) => ({\n ...suggestion,\n apply: (suggestion.apply ?? suggestion.label) + \" \",\n }));\n\ntype ColumnOptions = {\n functionName?: string;\n operator?: ColumnExpressionOperator;\n prefix?: string;\n};\n\nconst getValidColumns = (\n columns: ColumnDescriptor[],\n { functionName, operator }: ColumnOptions\n) => {\n if (operator) {\n return columns.filter(isNumericColumn);\n } else if (functionName) {\n const fn = columnFunctionDescriptors.find((f) => f.name === functionName);\n if (fn) {\n switch (fn.accepts) {\n case \"string\":\n return columns.filter(isTextColumn);\n case \"number\":\n return columns.filter(isNumericColumn);\n default:\n return columns;\n }\n }\n }\n return columns;\n};\n\nconst getColumns = (columns: ColumnDescriptor[], options: ColumnOptions) => {\n const validColumns = getValidColumns(columns, options);\n return validColumns.map((column) => {\n const label = column.label ?? column.name;\n return {\n apply: options.prefix ? `${options.prefix}${column.name}` : column.name,\n label,\n boost: 5,\n type: \"column\",\n expressionType: column.serverDataType,\n };\n });\n};\n\n// prettier-ignore\nconst arithmeticOperators = [\n { apply: \"* \", boost: 2, label: \"*\", type: \"operator\" },\n { apply: \"/ \", boost: 2, label: \"/\", type: \"operator\" },\n { apply: \"+ \", boost: 2, label: \"+\", type: \"operator\" },\n { apply: \"- \", boost: 2, label: \"-\", type: \"operator\" },\n];\n\nconst getOperators = (column?: ColumnDescriptor) => {\n if (column === undefined || isNumericColumn(column)) {\n return arithmeticOperators;\n } else {\n return NO_OPERATORS;\n }\n};\n\nconst getConditionOperators = (column: ColumnDescriptor) => {\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};\n\nconst toFunctionCompletion = (\n functionDescriptor: ColumnFunctionDescriptor\n) => ({\n apply: `${functionDescriptor.name}( `,\n boost: 2,\n expressionType: functionDescriptor.type,\n info: () => functionDocInfo(functionDescriptor),\n label: functionDescriptor.name,\n type: \"function\",\n});\n\nconst getAcceptedTypes = (fn?: ColumnFunctionDescriptor) => {\n if (fn) {\n if (typeof fn.accepts === \"string\") {\n return fn.accepts;\n } else if (Array.isArray(fn.accepts)) {\n if (fn.accepts.every((s) => s === \"string\")) {\n return \"string\";\n } else {\n return \"any\";\n }\n }\n }\n return \"any\";\n};\n\nconst functions: Completion[] =\n columnFunctionDescriptors.map(toFunctionCompletion);\n\nconst getFunctions = ({ functionName }: ColumnOptions) => {\n if (functionName) {\n const fn = columnFunctionDescriptors.find((f) => f.name === functionName);\n const acceptedTypes = getAcceptedTypes(fn);\n if (fn) {\n switch (acceptedTypes) {\n case \"string\":\n return columnFunctionDescriptors\n .filter((f) => f.type === \"string\" || f.type === \"variable\")\n .map(toFunctionCompletion);\n case \"number\":\n return columnFunctionDescriptors\n .filter((f) => f.type === \"number\" || f.type === \"variable\")\n .map(toFunctionCompletion);\n default:\n }\n }\n }\n return functions;\n};\n\nexport interface SuggestionProviderHookProps {\n columns: ColumnDescriptor[];\n table: VuuTable;\n}\n\nconst NONE = {};\n\nexport const useColumnExpressionSuggestionProvider = ({\n columns,\n table,\n}: SuggestionProviderHookProps): IExpressionSuggestionProvider => {\n const findColumn = useCallback(\n (name?: string) =>\n name ? columns.find((col) => col.name === name) : undefined,\n [columns]\n );\n\n const latestSuggestionsRef = useRef<Completion[]>();\n const getTypeaheadSuggestions = useTypeaheadSuggestions();\n\n const getSuggestions: IExpressionSuggestionProvider[\"getSuggestions\"] =\n useCallback(\n async (suggestionType, options = NONE): Promise<Completion[]> => {\n const { columnName, functionName, operator, prefix } = options;\n\n switch (suggestionType) {\n case \"expression\": {\n const suggestions = await withApplySpace(\n getColumns(columns, { functionName, prefix })\n ).concat(getFunctions(options));\n return (latestSuggestionsRef.current = suggestions);\n }\n case \"column\": {\n const suggestions = await getColumns(columns, options);\n return (latestSuggestionsRef.current = withApplySpace(suggestions));\n }\n case \"operator\": {\n const suggestions = await getOperators(findColumn(columnName));\n return (latestSuggestionsRef.current = withApplySpace(suggestions));\n }\n case \"relational-operator\": {\n const suggestions = await getRelationalOperators(\n findColumn(columnName)\n );\n return (latestSuggestionsRef.current = withApplySpace(suggestions));\n }\n case \"condition-operator\":\n {\n const column = findColumn(columnName);\n if (column) {\n const suggestions = await getConditionOperators(column);\n if (suggestions) {\n return (latestSuggestionsRef.current =\n withApplySpace(suggestions));\n }\n }\n }\n break;\n case \"columnValue\":\n if (columnName && operator) {\n // const column = findColumn(columnName);\n const params = getTypeaheadParams(\n table,\n columnName /*, startsWith*/\n );\n const suggestions = await getTypeaheadSuggestions(params);\n latestSuggestionsRef.current = toSuggestions(suggestions, {\n suffix: \"\",\n });\n\n latestSuggestionsRef.current.forEach((suggestion) => {\n suggestion.apply = (\n view: EditorView,\n completion: Completion,\n from: number\n ) => {\n const annotation = new AnnotationType<Completion>();\n const cursorPos = from + completion.label.length + 1;\n view.dispatch({\n changes: { from, insert: completion.label },\n selection: { anchor: cursorPos, head: cursorPos },\n annotations: annotation.of(completion),\n });\n };\n });\n return latestSuggestionsRef.current;\n }\n break;\n }\n\n return [];\n },\n [columns, findColumn, getTypeaheadSuggestions, table]\n );\n\n const isPartialMatch = useCallback(\n async (\n valueType: ColumnExpressionSuggestionType,\n columnName?: string,\n pattern?: string\n ) => {\n const { current: latestSuggestions } = latestSuggestionsRef;\n let maybe = false;\n const suggestions =\n latestSuggestions || (await getSuggestions(valueType, { columnName }));\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 maybe = true;\n }\n }\n }\n return maybe;\n },\n [getSuggestions]\n );\n\n return {\n getSuggestions,\n isPartialMatch,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Dropdown } from '@vuu-ui/vuu-ui-controls';
3
+ import { getCalculatedColumnExpression, getCalculatedColumnName, getCalculatedColumnType } from '@vuu-ui/vuu-utils';
4
+ import { FormField, FormFieldLabel, Input } from '@salt-ds/core';
5
+ import { useRef, useCallback } from 'react';
6
+ import { ColumnExpressionInput } from '../column-expression-input/ColumnExpressionInput.js';
7
+ import '../column-expression-input/column-language-parser/ColumnExpressionLanguage.js';
8
+ import '../column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js';
9
+ import '../column-expression-input/column-language-parser/column-expression-parse-utils.js';
10
+ import '@vuu-ui/vuu-codemirror';
11
+ import '../column-expression-input/highlighting.js';
12
+ import '../column-expression-input/theme.js';
13
+ import { useColumnExpressionSuggestionProvider } from '../column-expression-input/useColumnExpressionSuggestionProvider.js';
14
+ import { useColumnExpression } from './useColumnExpression.js';
15
+
16
+ const classBase = "vuuColumnExpressionPanel";
17
+ const ColumnExpressionPanel = ({
18
+ column: columnProp,
19
+ onChangeName: onChangeNameProp,
20
+ onChangeServerDataType: onChangeServerDataTypeProp,
21
+ tableConfig,
22
+ vuuTable
23
+ }) => {
24
+ const typeRef = useRef(null);
25
+ const { column, onChangeExpression, onChangeName, onChangeServerDataType } = useColumnExpression({
26
+ column: columnProp,
27
+ onChangeName: onChangeNameProp,
28
+ onChangeServerDataType: onChangeServerDataTypeProp
29
+ });
30
+ const initialExpressionRef = useRef(
31
+ getCalculatedColumnExpression(column)
32
+ );
33
+ const suggestionProvider = useColumnExpressionSuggestionProvider({
34
+ columns: tableConfig.columns,
35
+ table: vuuTable
36
+ });
37
+ const handleSubmitExpression = useCallback(() => {
38
+ if (typeRef.current) {
39
+ typeRef.current?.querySelector("button")?.focus();
40
+ }
41
+ }, []);
42
+ return /* @__PURE__ */ jsxs("div", { className: classBase, children: [
43
+ /* @__PURE__ */ jsx("div", { className: "vuuColumnSettingsPanel-header", children: /* @__PURE__ */ jsx("span", { children: "Calculation" }) }),
44
+ /* @__PURE__ */ jsxs(FormField, { "data-field": "column-name", children: [
45
+ /* @__PURE__ */ jsx(FormFieldLabel, { children: "Column Name" }),
46
+ /* @__PURE__ */ jsx(
47
+ Input,
48
+ {
49
+ className: "vuuInput",
50
+ onChange: onChangeName,
51
+ value: getCalculatedColumnName(column)
52
+ }
53
+ )
54
+ ] }),
55
+ /* @__PURE__ */ jsxs(FormField, { "data-field": "column-expression", children: [
56
+ /* @__PURE__ */ jsx(FormFieldLabel, { children: "Expression" }),
57
+ /* @__PURE__ */ jsx(
58
+ ColumnExpressionInput,
59
+ {
60
+ onChange: onChangeExpression,
61
+ onSubmitExpression: handleSubmitExpression,
62
+ source: initialExpressionRef.current,
63
+ suggestionProvider
64
+ }
65
+ )
66
+ ] }),
67
+ /* @__PURE__ */ jsxs(FormField, { "data-field": "type", children: [
68
+ /* @__PURE__ */ jsx(FormFieldLabel, { children: "Column type" }),
69
+ /* @__PURE__ */ jsx(
70
+ Dropdown,
71
+ {
72
+ className: `${classBase}-type`,
73
+ onSelectionChange: onChangeServerDataType,
74
+ ref: typeRef,
75
+ selected: getCalculatedColumnType(column) || null,
76
+ source: ["double", "long", "string", "boolean"],
77
+ width: "100%"
78
+ }
79
+ )
80
+ ] })
81
+ ] });
82
+ };
83
+
84
+ export { ColumnExpressionPanel };
85
+ //# sourceMappingURL=ColumnExpressionPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnExpressionPanel.js","sources":["../../src/column-expression-panel/ColumnExpressionPanel.tsx"],"sourcesContent":["import { ColumnDescriptor, ColumnSettingsProps } from \"@vuu-ui/vuu-table-types\";\nimport { Dropdown } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n getCalculatedColumnExpression,\n getCalculatedColumnName,\n getCalculatedColumnType,\n} from \"@vuu-ui/vuu-utils\";\nimport { FormField, FormFieldLabel, Input } from \"@salt-ds/core\";\nimport { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport { HTMLAttributes, useCallback, useRef } from \"react\";\nimport {\n ColumnExpressionInput,\n ColumnExpressionSubmitHandler,\n useColumnExpressionSuggestionProvider,\n} from \"../column-expression-input\";\nimport { useColumnExpression } from \"./useColumnExpression\";\n\nconst classBase = \"vuuColumnExpressionPanel\";\n\nexport interface ColumnExpressionPanelProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<ColumnSettingsProps, \"tableConfig\" | \"vuuTable\"> {\n column: ColumnDescriptor;\n /**\n * Callback prop, invoked on every change to calculated column definition\n * @param calculatedColumnName the full calculated column name\n */\n onChangeName?: (name: string) => void;\n onChangeServerDataType?: (name: VuuColumnDataType) => void;\n}\n\nexport const ColumnExpressionPanel = ({\n column: columnProp,\n onChangeName: onChangeNameProp,\n onChangeServerDataType: onChangeServerDataTypeProp,\n tableConfig,\n vuuTable,\n}: ColumnExpressionPanelProps) => {\n const typeRef = useRef<HTMLDivElement>(null);\n const { column, onChangeExpression, onChangeName, onChangeServerDataType } =\n useColumnExpression({\n column: columnProp,\n onChangeName: onChangeNameProp,\n onChangeServerDataType: onChangeServerDataTypeProp,\n });\n // The initial value to pass into the Expression Input. That is a\n // CodeMirror editor and will manage its own state once initialised.\n const initialExpressionRef = useRef<string>(\n getCalculatedColumnExpression(column)\n );\n\n const suggestionProvider = useColumnExpressionSuggestionProvider({\n columns: tableConfig.columns,\n table: vuuTable,\n });\n\n const handleSubmitExpression =\n useCallback<ColumnExpressionSubmitHandler>(() => {\n if (typeRef.current) {\n (\n typeRef.current?.querySelector(\"button\") as HTMLButtonElement\n )?.focus();\n }\n }, []);\n\n return (\n <div className={classBase}>\n <div className=\"vuuColumnSettingsPanel-header\">\n <span>Calculation</span>\n </div>\n\n <FormField data-field=\"column-name\">\n <FormFieldLabel>Column Name</FormFieldLabel>\n <Input\n className=\"vuuInput\"\n onChange={onChangeName}\n value={getCalculatedColumnName(column)}\n />\n </FormField>\n\n <FormField data-field=\"column-expression\">\n <FormFieldLabel>Expression</FormFieldLabel>\n <ColumnExpressionInput\n onChange={onChangeExpression}\n onSubmitExpression={handleSubmitExpression}\n source={initialExpressionRef.current}\n suggestionProvider={suggestionProvider}\n />\n </FormField>\n <FormField data-field=\"type\">\n <FormFieldLabel>Column type</FormFieldLabel>\n <Dropdown\n className={`${classBase}-type`}\n onSelectionChange={onChangeServerDataType}\n ref={typeRef}\n selected={getCalculatedColumnType(column) || null}\n source={[\"double\", \"long\", \"string\", \"boolean\"]}\n width=\"100%\"\n />\n </FormField>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { setCalculatedColumnName, setCalculatedColumnExpression, isVuuColumnDataType, setCalculatedColumnType, getCalculatedColumnDetails } from '@vuu-ui/vuu-utils';
2
+ import { useState, useRef, useCallback } from 'react';
3
+
4
+ const applyDefaults = (column) => {
5
+ const [name, expression, type] = getCalculatedColumnDetails(column);
6
+ if (type === "") {
7
+ return {
8
+ ...column,
9
+ name: `${name}:string:${expression}`
10
+ };
11
+ } else {
12
+ return column;
13
+ }
14
+ };
15
+ const useColumnExpression = ({
16
+ column: columnProp,
17
+ onChangeName: onChangeNameProp,
18
+ onChangeServerDataType: onChangeServerDataTypeProp
19
+ }) => {
20
+ const [column, _setColumn] = useState(
21
+ applyDefaults(columnProp)
22
+ );
23
+ const columnRef = useRef(columnProp);
24
+ const setColumn = useCallback((column2) => {
25
+ columnRef.current = column2;
26
+ _setColumn(column2);
27
+ }, []);
28
+ const onChangeName = useCallback(
29
+ (evt) => {
30
+ const { value } = evt.target;
31
+ const newColumn = setCalculatedColumnName(column, value);
32
+ setColumn(newColumn);
33
+ onChangeNameProp?.(newColumn.name);
34
+ },
35
+ [column, onChangeNameProp, setColumn]
36
+ );
37
+ const onChangeExpression = useCallback(
38
+ (value) => {
39
+ const expression = value.trim();
40
+ const { current: column2 } = columnRef;
41
+ const newColumn = setCalculatedColumnExpression(column2, expression);
42
+ setColumn(newColumn);
43
+ onChangeNameProp?.(newColumn.name);
44
+ },
45
+ [onChangeNameProp, setColumn]
46
+ );
47
+ const onChangeServerDataType = useCallback(
48
+ (evt, value) => {
49
+ if (isVuuColumnDataType(value)) {
50
+ const newColumn = setCalculatedColumnType(column, value);
51
+ setColumn(newColumn);
52
+ onChangeNameProp?.(newColumn.name);
53
+ onChangeServerDataTypeProp?.(value);
54
+ }
55
+ },
56
+ [column, onChangeNameProp, onChangeServerDataTypeProp, setColumn]
57
+ );
58
+ return {
59
+ column,
60
+ onChangeExpression,
61
+ onChangeName,
62
+ onChangeServerDataType
63
+ };
64
+ };
65
+
66
+ export { useColumnExpression };
67
+ //# sourceMappingURL=useColumnExpression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColumnExpression.js","sources":["../../src/column-expression-panel/useColumnExpression.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n getCalculatedColumnDetails,\n isVuuColumnDataType,\n setCalculatedColumnExpression,\n setCalculatedColumnName,\n setCalculatedColumnType,\n} from \"@vuu-ui/vuu-utils\";\nimport { FormEventHandler, useCallback, useRef, useState } from \"react\";\nimport { ColumnExpressionPanelProps } from \"./ColumnExpressionPanel\";\n\nexport type ColumnExpressionHookProps = Pick<\n ColumnExpressionPanelProps,\n \"column\" | \"onChangeName\" | \"onChangeServerDataType\"\n>;\n\nconst applyDefaults = (column: ColumnDescriptor) => {\n const [name, expression, type] = getCalculatedColumnDetails(column);\n if (type === \"\") {\n return {\n ...column,\n name: `${name}:string:${expression}`,\n };\n } else {\n return column;\n }\n};\n\nexport const useColumnExpression = ({\n column: columnProp,\n onChangeName: onChangeNameProp,\n onChangeServerDataType: onChangeServerDataTypeProp,\n}: ColumnExpressionHookProps) => {\n const [column, _setColumn] = useState<ColumnDescriptor>(\n applyDefaults(columnProp)\n );\n const columnRef = useRef<ColumnDescriptor>(columnProp);\n const setColumn = useCallback((column: ColumnDescriptor) => {\n columnRef.current = column;\n _setColumn(column);\n }, []);\n\n // We need to track column name in a ref because ColunExpressionInput\n // is not a pure React component, it hosts a CodeMirror editor. We\n // do not want to cause it to render mid-edit. Therefore it uses memo\n // and only renders on initial load. onChangeExpression must be stable.\n // const columnNameRef = useRef<string>(column.name);\n // const expressionRef = useRef(getCalculatedColumnDetails(column)[1]);\n\n const onChangeName = useCallback<FormEventHandler>(\n (evt) => {\n const { value } = evt.target as HTMLInputElement;\n const newColumn = setCalculatedColumnName(column, value);\n // columnNameRef.current = newColumn.name;\n setColumn(newColumn);\n onChangeNameProp?.(newColumn.name);\n },\n [column, onChangeNameProp, setColumn]\n );\n\n const onChangeExpression = useCallback(\n (value: string) => {\n // we do not set state when this changes as the codemirror editor\n // manages state of the expression for us until complete\n const expression = value.trim();\n // expressionRef.current = expression;\n // const [name, , type] = column.name.split(\":\");\n // columnNameRef.current = `${name}:${expression}:${type}`;\n\n const { current: column } = columnRef;\n const newColumn = setCalculatedColumnExpression(column, expression);\n setColumn(newColumn);\n\n onChangeNameProp?.(newColumn.name);\n\n // console.log(`calculatedColumnName ${columnNameRef.current}`);\n },\n [onChangeNameProp, setColumn]\n );\n\n const onChangeServerDataType = useCallback(\n (evt, value: string | null) => {\n if (isVuuColumnDataType(value)) {\n const newColumn = setCalculatedColumnType(column, value);\n setColumn(newColumn);\n onChangeNameProp?.(newColumn.name);\n onChangeServerDataTypeProp?.(value);\n }\n },\n [column, onChangeNameProp, onChangeServerDataTypeProp, setColumn]\n );\n\n return {\n column,\n onChangeExpression,\n onChangeName,\n onChangeServerDataType,\n };\n};\n"],"names":["column"],"mappings":";;;AAgBA,MAAM,aAAA,GAAgB,CAAC,MAA6B,KAAA;AAClD,EAAA,MAAM,CAAC,IAAM,EAAA,UAAA,EAAY,IAAI,CAAA,GAAI,2BAA2B,MAAM,CAAA,CAAA;AAClE,EAAA,IAAI,SAAS,EAAI,EAAA;AACf,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,IAAM,EAAA,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,UAAU,CAAA,CAAA;AAAA,KACpC,CAAA;AAAA,GACK,MAAA;AACL,IAAO,OAAA,MAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEO,MAAM,sBAAsB,CAAC;AAAA,EAClC,MAAQ,EAAA,UAAA;AAAA,EACR,YAAc,EAAA,gBAAA;AAAA,EACd,sBAAwB,EAAA,0BAAA;AAC1B,CAAiC,KAAA;AAC/B,EAAM,MAAA,CAAC,MAAQ,EAAA,UAAU,CAAI,GAAA,QAAA;AAAA,IAC3B,cAAc,UAAU,CAAA;AAAA,GAC1B,CAAA;AACA,EAAM,MAAA,SAAA,GAAY,OAAyB,UAAU,CAAA,CAAA;AACrD,EAAM,MAAA,SAAA,GAAY,WAAY,CAAA,CAACA,OAA6B,KAAA;AAC1D,IAAA,SAAA,CAAU,OAAUA,GAAAA,OAAAA,CAAAA;AACpB,IAAA,UAAA,CAAWA,OAAM,CAAA,CAAA;AAAA,GACnB,EAAG,EAAE,CAAA,CAAA;AASL,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,GAAQ,KAAA;AACP,MAAM,MAAA,EAAE,KAAM,EAAA,GAAI,GAAI,CAAA,MAAA,CAAA;AACtB,MAAM,MAAA,SAAA,GAAY,uBAAwB,CAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAEvD,MAAA,SAAA,CAAU,SAAS,CAAA,CAAA;AACnB,MAAA,gBAAA,GAAmB,UAAU,IAAI,CAAA,CAAA;AAAA,KACnC;AAAA,IACA,CAAC,MAAQ,EAAA,gBAAA,EAAkB,SAAS,CAAA;AAAA,GACtC,CAAA;AAEA,EAAA,MAAM,kBAAqB,GAAA,WAAA;AAAA,IACzB,CAAC,KAAkB,KAAA;AAGjB,MAAM,MAAA,UAAA,GAAa,MAAM,IAAK,EAAA,CAAA;AAK9B,MAAM,MAAA,EAAE,OAASA,EAAAA,OAAAA,EAAW,GAAA,SAAA,CAAA;AAC5B,MAAM,MAAA,SAAA,GAAY,6BAA8BA,CAAAA,OAAAA,EAAQ,UAAU,CAAA,CAAA;AAClE,MAAA,SAAA,CAAU,SAAS,CAAA,CAAA;AAEnB,MAAA,gBAAA,GAAmB,UAAU,IAAI,CAAA,CAAA;AAAA,KAGnC;AAAA,IACA,CAAC,kBAAkB,SAAS,CAAA;AAAA,GAC9B,CAAA;AAEA,EAAA,MAAM,sBAAyB,GAAA,WAAA;AAAA,IAC7B,CAAC,KAAK,KAAyB,KAAA;AAC7B,MAAI,IAAA,mBAAA,CAAoB,KAAK,CAAG,EAAA;AAC9B,QAAM,MAAA,SAAA,GAAY,uBAAwB,CAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AACvD,QAAA,SAAA,CAAU,SAAS,CAAA,CAAA;AACnB,QAAA,gBAAA,GAAmB,UAAU,IAAI,CAAA,CAAA;AACjC,QAAA,0BAAA,GAA6B,KAAK,CAAA,CAAA;AAAA,OACpC;AAAA,KACF;AAAA,IACA,CAAC,MAAA,EAAQ,gBAAkB,EAAA,0BAAA,EAA4B,SAAS,CAAA;AAAA,GAClE,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,sBAAA;AAAA,GACF,CAAA;AACF;;;;"}