@vuu-ui/vuu-table-extras 0.13.9 → 0.13.10

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 (217) hide show
  1. package/cjs/cell-edit-validators/CaseValidator.js +25 -0
  2. package/cjs/cell-edit-validators/CaseValidator.js.map +1 -0
  3. package/cjs/cell-edit-validators/PatternValidator.js +31 -0
  4. package/cjs/cell-edit-validators/PatternValidator.js.map +1 -0
  5. package/cjs/cell-renderers/background-cell/BackgroundCell.css.js +6 -0
  6. package/cjs/cell-renderers/background-cell/BackgroundCell.css.js.map +1 -0
  7. package/cjs/cell-renderers/background-cell/BackgroundCell.js +76 -0
  8. package/cjs/cell-renderers/background-cell/BackgroundCell.js.map +1 -0
  9. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css.js +6 -0
  10. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css.js.map +1 -0
  11. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js +67 -0
  12. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js.map +1 -0
  13. package/cjs/cell-renderers/background-cell/BackgroundKeyframes.css.js +6 -0
  14. package/cjs/cell-renderers/background-cell/BackgroundKeyframes.css.js.map +1 -0
  15. package/cjs/cell-renderers/background-cell/useDirection.js +20 -0
  16. package/cjs/cell-renderers/background-cell/useDirection.js.map +1 -0
  17. package/cjs/cell-renderers/dropdown-cell/DropdownCell.css.js +6 -0
  18. package/cjs/cell-renderers/dropdown-cell/DropdownCell.css.js.map +1 -0
  19. package/cjs/cell-renderers/dropdown-cell/DropdownCell.js +94 -0
  20. package/cjs/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -0
  21. package/cjs/cell-renderers/lookup-cell/LookupCell.js +23 -0
  22. package/cjs/cell-renderers/lookup-cell/LookupCell.js.map +1 -0
  23. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.css.js +6 -0
  24. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.css.js.map +1 -0
  25. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.js +62 -0
  26. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.js.map +1 -0
  27. package/cjs/cell-renderers/progress-cell/ProgressCell.css.js +6 -0
  28. package/cjs/cell-renderers/progress-cell/ProgressCell.css.js.map +1 -0
  29. package/cjs/cell-renderers/progress-cell/ProgressCell.js +69 -0
  30. package/cjs/cell-renderers/progress-cell/ProgressCell.js.map +1 -0
  31. package/cjs/column-expression-input/ColumnExpressionInput.css.js +6 -0
  32. package/cjs/column-expression-input/ColumnExpressionInput.css.js.map +1 -0
  33. package/cjs/column-expression-input/ColumnExpressionInput.js +39 -0
  34. package/cjs/column-expression-input/ColumnExpressionInput.js.map +1 -0
  35. package/cjs/column-expression-input/column-function-descriptors.js +307 -0
  36. package/cjs/column-expression-input/column-function-descriptors.js.map +1 -0
  37. package/cjs/column-expression-input/column-language-parser/ColumnExpressionLanguage.js +28 -0
  38. package/cjs/column-expression-input/column-language-parser/ColumnExpressionLanguage.js.map +1 -0
  39. package/cjs/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js +465 -0
  40. package/cjs/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js.map +1 -0
  41. package/cjs/column-expression-input/column-language-parser/column-expression-parse-utils.js +61 -0
  42. package/cjs/column-expression-input/column-language-parser/column-expression-parse-utils.js.map +1 -0
  43. package/cjs/column-expression-input/column-language-parser/generated/column-parser.js +21 -0
  44. package/cjs/column-expression-input/column-language-parser/generated/column-parser.js.map +1 -0
  45. package/cjs/column-expression-input/functionDocInfo.js +39 -0
  46. package/cjs/column-expression-input/functionDocInfo.js.map +1 -0
  47. package/cjs/column-expression-input/highlighting.js +16 -0
  48. package/cjs/column-expression-input/highlighting.js.map +1 -0
  49. package/cjs/column-expression-input/theme.js +63 -0
  50. package/cjs/column-expression-input/theme.js.map +1 -0
  51. package/cjs/column-expression-input/useColumnAutoComplete.js +358 -0
  52. package/cjs/column-expression-input/useColumnAutoComplete.js.map +1 -0
  53. package/cjs/column-expression-input/useColumnExpressionEditor.js +131 -0
  54. package/cjs/column-expression-input/useColumnExpressionEditor.js.map +1 -0
  55. package/cjs/column-expression-input/useColumnExpressionSuggestionProvider.js +213 -0
  56. package/cjs/column-expression-input/useColumnExpressionSuggestionProvider.js.map +1 -0
  57. package/cjs/column-expression-panel/ColumnExpressionPanel.js +85 -0
  58. package/cjs/column-expression-panel/ColumnExpressionPanel.js.map +1 -0
  59. package/cjs/column-expression-panel/useColumnExpression.js +69 -0
  60. package/cjs/column-expression-panel/useColumnExpression.js.map +1 -0
  61. package/cjs/column-formatting-settings/BaseNumericFormattingSettings.js +97 -0
  62. package/cjs/column-formatting-settings/BaseNumericFormattingSettings.js.map +1 -0
  63. package/cjs/column-formatting-settings/ColumnFormattingPanel.js +104 -0
  64. package/cjs/column-formatting-settings/ColumnFormattingPanel.js.map +1 -0
  65. package/cjs/column-formatting-settings/DateTimeFormattingSettings.js +99 -0
  66. package/cjs/column-formatting-settings/DateTimeFormattingSettings.js.map +1 -0
  67. package/cjs/column-formatting-settings/LongTypeFormattingSettings.css.js +6 -0
  68. package/cjs/column-formatting-settings/LongTypeFormattingSettings.css.js.map +1 -0
  69. package/cjs/column-formatting-settings/LongTypeFormattingSettings.js +49 -0
  70. package/cjs/column-formatting-settings/LongTypeFormattingSettings.js.map +1 -0
  71. package/cjs/column-list/ColumnList.css.js +6 -0
  72. package/cjs/column-list/ColumnList.css.js.map +1 -0
  73. package/cjs/column-list/ColumnList.js +172 -0
  74. package/cjs/column-list/ColumnList.js.map +1 -0
  75. package/cjs/column-menu/ColumnMenu.css.js +6 -0
  76. package/cjs/column-menu/ColumnMenu.css.js.map +1 -0
  77. package/cjs/column-menu/ColumnMenu.js +116 -0
  78. package/cjs/column-menu/ColumnMenu.js.map +1 -0
  79. package/cjs/column-menu/column-menu-utils.js +489 -0
  80. package/cjs/column-menu/column-menu-utils.js.map +1 -0
  81. package/cjs/column-menu/useColumnActions.js +75 -0
  82. package/cjs/column-menu/useColumnActions.js.map +1 -0
  83. package/cjs/datasource-stats/DatasourceStats.css.js +6 -0
  84. package/cjs/datasource-stats/DatasourceStats.css.js.map +1 -0
  85. package/cjs/datasource-stats/DatasourceStats.js +52 -0
  86. package/cjs/datasource-stats/DatasourceStats.js.map +1 -0
  87. package/cjs/index.js +65 -4254
  88. package/cjs/index.js.map +1 -1
  89. package/cjs/table-column-settings/ColumnNameLabel.css.js +6 -0
  90. package/cjs/table-column-settings/ColumnNameLabel.css.js.map +1 -0
  91. package/cjs/table-column-settings/ColumnNameLabel.js +45 -0
  92. package/cjs/table-column-settings/ColumnNameLabel.js.map +1 -0
  93. package/cjs/table-column-settings/ColumnSettingsPanel.css.js +6 -0
  94. package/cjs/table-column-settings/ColumnSettingsPanel.css.js.map +1 -0
  95. package/cjs/table-column-settings/ColumnSettingsPanel.js +202 -0
  96. package/cjs/table-column-settings/ColumnSettingsPanel.js.map +1 -0
  97. package/cjs/table-column-settings/TableSettingsPanel.css.js +6 -0
  98. package/cjs/table-column-settings/TableSettingsPanel.css.js.map +1 -0
  99. package/cjs/table-column-settings/TableSettingsPanel.js +139 -0
  100. package/cjs/table-column-settings/TableSettingsPanel.js.map +1 -0
  101. package/cjs/table-column-settings/useColumnSettings.js +224 -0
  102. package/cjs/table-column-settings/useColumnSettings.js.map +1 -0
  103. package/cjs/table-column-settings/useTableAndColumnSettings.js +126 -0
  104. package/cjs/table-column-settings/useTableAndColumnSettings.js.map +1 -0
  105. package/cjs/table-column-settings/useTableSettings.js +172 -0
  106. package/cjs/table-column-settings/useTableSettings.js.map +1 -0
  107. package/cjs/table-provider/TableProvider.js +48 -0
  108. package/cjs/table-provider/TableProvider.js.map +1 -0
  109. package/esm/cell-edit-validators/CaseValidator.js +23 -0
  110. package/esm/cell-edit-validators/CaseValidator.js.map +1 -0
  111. package/esm/cell-edit-validators/PatternValidator.js +29 -0
  112. package/esm/cell-edit-validators/PatternValidator.js.map +1 -0
  113. package/esm/cell-renderers/background-cell/BackgroundCell.css.js +4 -0
  114. package/esm/cell-renderers/background-cell/BackgroundCell.css.js.map +1 -0
  115. package/esm/cell-renderers/background-cell/BackgroundCell.js +74 -0
  116. package/esm/cell-renderers/background-cell/BackgroundCell.js.map +1 -0
  117. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css.js +4 -0
  118. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css.js.map +1 -0
  119. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js +65 -0
  120. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js.map +1 -0
  121. package/esm/cell-renderers/background-cell/BackgroundKeyframes.css.js +4 -0
  122. package/esm/cell-renderers/background-cell/BackgroundKeyframes.css.js.map +1 -0
  123. package/esm/cell-renderers/background-cell/useDirection.js +18 -0
  124. package/esm/cell-renderers/background-cell/useDirection.js.map +1 -0
  125. package/esm/cell-renderers/dropdown-cell/DropdownCell.css.js +4 -0
  126. package/esm/cell-renderers/dropdown-cell/DropdownCell.css.js.map +1 -0
  127. package/esm/cell-renderers/dropdown-cell/DropdownCell.js +92 -0
  128. package/esm/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -0
  129. package/esm/cell-renderers/lookup-cell/LookupCell.js +21 -0
  130. package/esm/cell-renderers/lookup-cell/LookupCell.js.map +1 -0
  131. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.css.js +4 -0
  132. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.css.js.map +1 -0
  133. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.js +60 -0
  134. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.js.map +1 -0
  135. package/esm/cell-renderers/progress-cell/ProgressCell.css.js +4 -0
  136. package/esm/cell-renderers/progress-cell/ProgressCell.css.js.map +1 -0
  137. package/esm/cell-renderers/progress-cell/ProgressCell.js +67 -0
  138. package/esm/cell-renderers/progress-cell/ProgressCell.js.map +1 -0
  139. package/esm/column-expression-input/ColumnExpressionInput.css.js +4 -0
  140. package/esm/column-expression-input/ColumnExpressionInput.css.js.map +1 -0
  141. package/esm/column-expression-input/ColumnExpressionInput.js +37 -0
  142. package/esm/column-expression-input/ColumnExpressionInput.js.map +1 -0
  143. package/esm/column-expression-input/column-function-descriptors.js +305 -0
  144. package/esm/column-expression-input/column-function-descriptors.js.map +1 -0
  145. package/esm/column-expression-input/column-language-parser/ColumnExpressionLanguage.js +26 -0
  146. package/esm/column-expression-input/column-language-parser/ColumnExpressionLanguage.js.map +1 -0
  147. package/esm/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js +463 -0
  148. package/esm/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js.map +1 -0
  149. package/esm/column-expression-input/column-language-parser/column-expression-parse-utils.js +56 -0
  150. package/esm/column-expression-input/column-language-parser/column-expression-parse-utils.js.map +1 -0
  151. package/esm/column-expression-input/column-language-parser/generated/column-parser.js +19 -0
  152. package/esm/column-expression-input/column-language-parser/generated/column-parser.js.map +1 -0
  153. package/esm/column-expression-input/functionDocInfo.js +37 -0
  154. package/esm/column-expression-input/functionDocInfo.js.map +1 -0
  155. package/esm/column-expression-input/highlighting.js +14 -0
  156. package/esm/column-expression-input/highlighting.js.map +1 -0
  157. package/esm/column-expression-input/theme.js +61 -0
  158. package/esm/column-expression-input/theme.js.map +1 -0
  159. package/esm/column-expression-input/useColumnAutoComplete.js +356 -0
  160. package/esm/column-expression-input/useColumnAutoComplete.js.map +1 -0
  161. package/esm/column-expression-input/useColumnExpressionEditor.js +129 -0
  162. package/esm/column-expression-input/useColumnExpressionEditor.js.map +1 -0
  163. package/esm/column-expression-input/useColumnExpressionSuggestionProvider.js +211 -0
  164. package/esm/column-expression-input/useColumnExpressionSuggestionProvider.js.map +1 -0
  165. package/esm/column-expression-panel/ColumnExpressionPanel.js +83 -0
  166. package/esm/column-expression-panel/ColumnExpressionPanel.js.map +1 -0
  167. package/esm/column-expression-panel/useColumnExpression.js +67 -0
  168. package/esm/column-expression-panel/useColumnExpression.js.map +1 -0
  169. package/esm/column-formatting-settings/BaseNumericFormattingSettings.js +95 -0
  170. package/esm/column-formatting-settings/BaseNumericFormattingSettings.js.map +1 -0
  171. package/esm/column-formatting-settings/ColumnFormattingPanel.js +102 -0
  172. package/esm/column-formatting-settings/ColumnFormattingPanel.js.map +1 -0
  173. package/esm/column-formatting-settings/DateTimeFormattingSettings.js +97 -0
  174. package/esm/column-formatting-settings/DateTimeFormattingSettings.js.map +1 -0
  175. package/esm/column-formatting-settings/LongTypeFormattingSettings.css.js +4 -0
  176. package/esm/column-formatting-settings/LongTypeFormattingSettings.css.js.map +1 -0
  177. package/esm/column-formatting-settings/LongTypeFormattingSettings.js +47 -0
  178. package/esm/column-formatting-settings/LongTypeFormattingSettings.js.map +1 -0
  179. package/esm/column-list/ColumnList.css.js +4 -0
  180. package/esm/column-list/ColumnList.css.js.map +1 -0
  181. package/esm/column-list/ColumnList.js +170 -0
  182. package/esm/column-list/ColumnList.js.map +1 -0
  183. package/esm/column-menu/ColumnMenu.css.js +4 -0
  184. package/esm/column-menu/ColumnMenu.css.js.map +1 -0
  185. package/esm/column-menu/ColumnMenu.js +114 -0
  186. package/esm/column-menu/ColumnMenu.js.map +1 -0
  187. package/esm/column-menu/column-menu-utils.js +480 -0
  188. package/esm/column-menu/column-menu-utils.js.map +1 -0
  189. package/esm/column-menu/useColumnActions.js +73 -0
  190. package/esm/column-menu/useColumnActions.js.map +1 -0
  191. package/esm/datasource-stats/DatasourceStats.css.js +4 -0
  192. package/esm/datasource-stats/DatasourceStats.css.js.map +1 -0
  193. package/esm/datasource-stats/DatasourceStats.js +50 -0
  194. package/esm/datasource-stats/DatasourceStats.js.map +1 -0
  195. package/esm/index.js +28 -4221
  196. package/esm/index.js.map +1 -1
  197. package/esm/table-column-settings/ColumnNameLabel.css.js +4 -0
  198. package/esm/table-column-settings/ColumnNameLabel.css.js.map +1 -0
  199. package/esm/table-column-settings/ColumnNameLabel.js +43 -0
  200. package/esm/table-column-settings/ColumnNameLabel.js.map +1 -0
  201. package/esm/table-column-settings/ColumnSettingsPanel.css.js +4 -0
  202. package/esm/table-column-settings/ColumnSettingsPanel.css.js.map +1 -0
  203. package/esm/table-column-settings/ColumnSettingsPanel.js +200 -0
  204. package/esm/table-column-settings/ColumnSettingsPanel.js.map +1 -0
  205. package/esm/table-column-settings/TableSettingsPanel.css.js +4 -0
  206. package/esm/table-column-settings/TableSettingsPanel.css.js.map +1 -0
  207. package/esm/table-column-settings/TableSettingsPanel.js +136 -0
  208. package/esm/table-column-settings/TableSettingsPanel.js.map +1 -0
  209. package/esm/table-column-settings/useColumnSettings.js +222 -0
  210. package/esm/table-column-settings/useColumnSettings.js.map +1 -0
  211. package/esm/table-column-settings/useTableAndColumnSettings.js +122 -0
  212. package/esm/table-column-settings/useTableAndColumnSettings.js.map +1 -0
  213. package/esm/table-column-settings/useTableSettings.js +170 -0
  214. package/esm/table-column-settings/useTableSettings.js.map +1 -0
  215. package/esm/table-provider/TableProvider.js +44 -0
  216. package/esm/table-provider/TableProvider.js.map +1 -0
  217. package/package.json +11 -11
@@ -0,0 +1,131 @@
1
+ 'use strict';
2
+
3
+ var vuuCodemirror = require('@vuu-ui/vuu-codemirror');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var react = require('react');
6
+ var ColumnExpressionLanguage = require('./column-language-parser/ColumnExpressionLanguage.js');
7
+ var ColumnExpressionTreeWalker = require('./column-language-parser/ColumnExpressionTreeWalker.js');
8
+ require('./column-language-parser/column-expression-parse-utils.js');
9
+ var highlighting = require('./highlighting.js');
10
+ var theme = require('./theme.js');
11
+ var useColumnAutoComplete = require('./useColumnAutoComplete.js');
12
+
13
+ const getView = (ref) => {
14
+ if (ref.current == void 0) {
15
+ throw Error("EditorView not defined");
16
+ }
17
+ return ref.current;
18
+ };
19
+ const getOptionClass = () => {
20
+ return "vuuSuggestion";
21
+ };
22
+ const noop = () => console.log("noooop");
23
+ const hasExpressionType = (completion) => "expressionType" in completion;
24
+ const injectOptionContent = (completion) => {
25
+ if (hasExpressionType(completion)) {
26
+ const div = vuuUtils.createEl("div", "expression-type-container");
27
+ const span = vuuUtils.createEl("span", "expression-type", completion.expressionType);
28
+ div.appendChild(span);
29
+ return div;
30
+ } else {
31
+ return null;
32
+ }
33
+ };
34
+ const useColumnExpressionEditor = ({
35
+ onChange,
36
+ onSubmitExpression,
37
+ source,
38
+ suggestionProvider
39
+ }) => {
40
+ const editorRef = react.useRef(null);
41
+ const onSubmitRef = react.useRef(noop);
42
+ const viewRef = react.useRef(void 0);
43
+ const completionFn = useColumnAutoComplete.useColumnAutoComplete(suggestionProvider, onSubmitRef);
44
+ const [createState, clearInput, submit] = react.useMemo(() => {
45
+ const parseExpression = () => {
46
+ const view = getView(viewRef);
47
+ const source2 = view.state.doc.toString();
48
+ const tree = vuuCodemirror.ensureSyntaxTree(view.state, view.state.doc.length, 5e3);
49
+ if (tree) {
50
+ const expression = ColumnExpressionTreeWalker.walkTree(tree, source2);
51
+ return [source2, expression];
52
+ } else {
53
+ return ["", void 0];
54
+ }
55
+ };
56
+ const clearInput2 = () => {
57
+ getView(viewRef).setState(createState2());
58
+ };
59
+ const submitExpression = () => {
60
+ const [source2, expression] = parseExpression();
61
+ onSubmitExpression?.(source2, expression);
62
+ };
63
+ const showSuggestions = (key) => {
64
+ return vuuCodemirror.keymap.of([
65
+ {
66
+ key,
67
+ run() {
68
+ vuuCodemirror.startCompletion(getView(viewRef));
69
+ return true;
70
+ }
71
+ }
72
+ ]);
73
+ };
74
+ const createState2 = () => vuuCodemirror.EditorState.create({
75
+ doc: source,
76
+ extensions: [
77
+ vuuCodemirror.minimalSetup,
78
+ vuuCodemirror.autocompletion({
79
+ addToOptions: [
80
+ {
81
+ render: injectOptionContent,
82
+ position: 70
83
+ }
84
+ ],
85
+ override: [completionFn],
86
+ optionClass: getOptionClass
87
+ }),
88
+ ColumnExpressionLanguage.columnExpressionLanguageSupport(),
89
+ vuuCodemirror.keymap.of(vuuCodemirror.defaultKeymap),
90
+ showSuggestions("ArrowDown"),
91
+ vuuCodemirror.EditorView.updateListener.of((v) => {
92
+ const view = getView(viewRef);
93
+ if (v.docChanged) {
94
+ vuuCodemirror.startCompletion(view);
95
+ const source2 = view.state.doc.toString();
96
+ onChange?.(source2);
97
+ }
98
+ }),
99
+ // Enforces single line view
100
+ vuuCodemirror.EditorState.transactionFilter.of(
101
+ (tr) => tr.newDoc.lines > 1 ? [] : tr
102
+ ),
103
+ theme.vuuTheme,
104
+ highlighting.vuuHighlighting
105
+ ]
106
+ });
107
+ onSubmitRef.current = () => {
108
+ submitExpression();
109
+ };
110
+ return [createState2, clearInput2, submitExpression];
111
+ }, [completionFn, onChange, onSubmitExpression, source]);
112
+ react.useEffect(() => {
113
+ if (!editorRef.current) {
114
+ throw Error("editor not in dom");
115
+ }
116
+ viewRef.current = new vuuCodemirror.EditorView({
117
+ state: createState(),
118
+ parent: editorRef.current
119
+ });
120
+ return () => {
121
+ viewRef.current?.destroy();
122
+ };
123
+ }, [completionFn, createState]);
124
+ const handleBlur = react.useCallback(() => {
125
+ submit();
126
+ }, [submit]);
127
+ return { editorRef, clearInput, onBlur: handleBlur };
128
+ };
129
+
130
+ exports.useColumnExpressionEditor = useColumnExpressionEditor;
131
+ //# 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>(undefined);\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":["createEl","useRef","useColumnAutoComplete","useMemo","source","ensureSyntaxTree","walkTree","clearInput","createState","keymap","startCompletion","EditorState","minimalSetup","autocompletion","columnExpressionLanguageSupport","defaultKeymap","EditorView","vuuTheme","vuuHighlighting","useEffect","useCallback"],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ 'use strict';
2
+
3
+ var vuuCodemirror = require('@vuu-ui/vuu-codemirror');
4
+ var vuuDataReact = require('@vuu-ui/vuu-data-react');
5
+ var vuuUtils = require('@vuu-ui/vuu-utils');
6
+ var react = require('react');
7
+ var columnFunctionDescriptors = require('./column-function-descriptors.js');
8
+ var functionDocInfo = require('./functionDocInfo.js');
9
+
10
+ const NO_OPERATORS = [];
11
+ const withApplySpace = (suggestions) => suggestions.map((suggestion) => ({
12
+ ...suggestion,
13
+ apply: (suggestion.apply ?? suggestion.label) + " "
14
+ }));
15
+ const getValidColumns = (columns, { functionName, operator }) => {
16
+ if (operator) {
17
+ return columns.filter(vuuUtils.isNumericColumn);
18
+ } else if (functionName) {
19
+ const fn = columnFunctionDescriptors.columnFunctionDescriptors.find((f) => f.name === functionName);
20
+ if (fn) {
21
+ switch (fn.accepts) {
22
+ case "string":
23
+ return columns.filter(vuuUtils.isTextColumn);
24
+ case "number":
25
+ return columns.filter(vuuUtils.isNumericColumn);
26
+ default:
27
+ return columns;
28
+ }
29
+ }
30
+ }
31
+ return columns;
32
+ };
33
+ const getColumns = (columns, options) => {
34
+ const validColumns = getValidColumns(columns, options);
35
+ return validColumns.map((column) => {
36
+ const label = column.label ?? column.name;
37
+ return {
38
+ apply: options.prefix ? `${options.prefix}${column.name}` : column.name,
39
+ label,
40
+ boost: 5,
41
+ type: "column",
42
+ expressionType: column.serverDataType
43
+ };
44
+ });
45
+ };
46
+ const arithmeticOperators = [
47
+ { apply: "* ", boost: 2, label: "*", type: "operator" },
48
+ { apply: "/ ", boost: 2, label: "/", type: "operator" },
49
+ { apply: "+ ", boost: 2, label: "+", type: "operator" },
50
+ { apply: "- ", boost: 2, label: "-", type: "operator" }
51
+ ];
52
+ const getOperators = (column) => {
53
+ if (column === void 0 || vuuUtils.isNumericColumn(column)) {
54
+ return arithmeticOperators;
55
+ } else {
56
+ return NO_OPERATORS;
57
+ }
58
+ };
59
+ const getConditionOperators = (column) => {
60
+ switch (column.serverDataType) {
61
+ case "string":
62
+ case "char":
63
+ return withApplySpace(
64
+ vuuCodemirror.stringOperators
65
+ /*, startsWith*/
66
+ );
67
+ case "int":
68
+ case "long":
69
+ case "double":
70
+ return withApplySpace(vuuCodemirror.numericOperators);
71
+ }
72
+ };
73
+ const toFunctionCompletion = (functionDescriptor) => ({
74
+ apply: `${functionDescriptor.name}( `,
75
+ boost: 2,
76
+ expressionType: functionDescriptor.type,
77
+ info: () => functionDocInfo.functionDocInfo(functionDescriptor),
78
+ label: functionDescriptor.name,
79
+ type: "function"
80
+ });
81
+ const getAcceptedTypes = (fn) => {
82
+ if (fn) {
83
+ if (typeof fn.accepts === "string") {
84
+ return fn.accepts;
85
+ } else if (Array.isArray(fn.accepts)) {
86
+ if (fn.accepts.every((s) => s === "string")) {
87
+ return "string";
88
+ } else {
89
+ return "any";
90
+ }
91
+ }
92
+ }
93
+ return "any";
94
+ };
95
+ const functions = columnFunctionDescriptors.columnFunctionDescriptors.map(toFunctionCompletion);
96
+ const getFunctions = ({ functionName }) => {
97
+ if (functionName) {
98
+ const fn = columnFunctionDescriptors.columnFunctionDescriptors.find((f) => f.name === functionName);
99
+ const acceptedTypes = getAcceptedTypes(fn);
100
+ if (fn) {
101
+ switch (acceptedTypes) {
102
+ case "string":
103
+ return columnFunctionDescriptors.columnFunctionDescriptors.filter((f) => f.type === "string" || f.type === "variable").map(toFunctionCompletion);
104
+ case "number":
105
+ return columnFunctionDescriptors.columnFunctionDescriptors.filter((f) => f.type === "number" || f.type === "variable").map(toFunctionCompletion);
106
+ }
107
+ }
108
+ }
109
+ return functions;
110
+ };
111
+ const NONE = {};
112
+ const useColumnExpressionSuggestionProvider = ({
113
+ columns,
114
+ table
115
+ }) => {
116
+ const findColumn = react.useCallback(
117
+ (name) => name ? columns.find((col) => col.name === name) : void 0,
118
+ [columns]
119
+ );
120
+ const latestSuggestionsRef = react.useRef(void 0);
121
+ const getTypeaheadSuggestions = vuuDataReact.useTypeaheadSuggestions();
122
+ const getSuggestions = react.useCallback(
123
+ async (suggestionType, options = NONE) => {
124
+ const { columnName, functionName, operator, prefix } = options;
125
+ switch (suggestionType) {
126
+ case "expression": {
127
+ const suggestions = await withApplySpace(
128
+ getColumns(columns, { functionName, prefix })
129
+ ).concat(getFunctions(options));
130
+ return latestSuggestionsRef.current = suggestions;
131
+ }
132
+ case "column": {
133
+ const suggestions = await getColumns(columns, options);
134
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
135
+ }
136
+ case "operator": {
137
+ const suggestions = await getOperators(findColumn(columnName));
138
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
139
+ }
140
+ case "relational-operator": {
141
+ const suggestions = await vuuCodemirror.getRelationalOperators(
142
+ findColumn(columnName)
143
+ );
144
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
145
+ }
146
+ case "condition-operator":
147
+ {
148
+ const column = findColumn(columnName);
149
+ if (column) {
150
+ const suggestions = await getConditionOperators(column);
151
+ if (suggestions) {
152
+ return latestSuggestionsRef.current = withApplySpace(suggestions);
153
+ }
154
+ }
155
+ }
156
+ break;
157
+ case "columnValue":
158
+ if (columnName && operator) {
159
+ const params = vuuDataReact.getTypeaheadParams(
160
+ table,
161
+ columnName
162
+ );
163
+ const suggestions = await getTypeaheadSuggestions(params);
164
+ if (suggestions) {
165
+ latestSuggestionsRef.current = vuuCodemirror.toSuggestions(suggestions, {
166
+ suffix: ""
167
+ });
168
+ latestSuggestionsRef.current.forEach((suggestion) => {
169
+ suggestion.apply = (view, completion, from) => {
170
+ const annotation = new vuuCodemirror.AnnotationType();
171
+ const cursorPos = from + completion.label.length + 1;
172
+ view.dispatch({
173
+ changes: { from, insert: completion.label },
174
+ selection: { anchor: cursorPos, head: cursorPos },
175
+ annotations: annotation.of(completion)
176
+ });
177
+ };
178
+ });
179
+ }
180
+ return latestSuggestionsRef.current || [];
181
+ }
182
+ break;
183
+ }
184
+ return [];
185
+ },
186
+ [columns, findColumn, getTypeaheadSuggestions, table]
187
+ );
188
+ const isPartialMatch = react.useCallback(
189
+ async (valueType, columnName, pattern) => {
190
+ const { current: latestSuggestions } = latestSuggestionsRef;
191
+ let maybe = false;
192
+ const suggestions = latestSuggestions || await getSuggestions(valueType, { columnName });
193
+ if (pattern && suggestions) {
194
+ for (const option of suggestions) {
195
+ if (option.label === pattern) {
196
+ return false;
197
+ } else if (option.label.startsWith(pattern)) {
198
+ maybe = true;
199
+ }
200
+ }
201
+ }
202
+ return maybe;
203
+ },
204
+ [getSuggestions]
205
+ );
206
+ return {
207
+ getSuggestions,
208
+ isPartialMatch
209
+ };
210
+ };
211
+
212
+ exports.useColumnExpressionSuggestionProvider = useColumnExpressionSuggestionProvider;
213
+ //# 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[]>(undefined);\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 if (suggestions) {\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 }\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":["isNumericColumn","columnFunctionDescriptors","isTextColumn","stringOperators","numericOperators","functionDocInfo","useCallback","useRef","useTypeaheadSuggestions","getRelationalOperators","getTypeaheadParams","toSuggestions","AnnotationType"],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var core = require('@salt-ds/core');
6
+ var react = require('react');
7
+ var ColumnExpressionInput = require('../column-expression-input/ColumnExpressionInput.js');
8
+ require('../column-expression-input/column-language-parser/ColumnExpressionLanguage.js');
9
+ require('../column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js');
10
+ require('../column-expression-input/column-language-parser/column-expression-parse-utils.js');
11
+ require('@vuu-ui/vuu-codemirror');
12
+ require('../column-expression-input/highlighting.js');
13
+ require('../column-expression-input/theme.js');
14
+ var useColumnExpressionSuggestionProvider = require('../column-expression-input/useColumnExpressionSuggestionProvider.js');
15
+ var useColumnExpression = require('./useColumnExpression.js');
16
+
17
+ const classBase = "vuuColumnExpressionPanel";
18
+ const ColumnExpressionPanel = ({
19
+ column: columnProp,
20
+ onChangeName: onChangeNameProp,
21
+ onChangeServerDataType: onChangeServerDataTypeProp,
22
+ tableConfig,
23
+ vuuTable
24
+ }) => {
25
+ const typeRef = react.useRef(null);
26
+ const { column, onChangeExpression, onChangeName, onChangeServerDataType } = useColumnExpression.useColumnExpression({
27
+ column: columnProp,
28
+ onChangeName: onChangeNameProp,
29
+ onChangeServerDataType: onChangeServerDataTypeProp
30
+ });
31
+ const initialExpressionRef = react.useRef(
32
+ vuuUtils.getCalculatedColumnDetails(column).expression ?? ""
33
+ );
34
+ const suggestionProvider = useColumnExpressionSuggestionProvider.useColumnExpressionSuggestionProvider({
35
+ columns: tableConfig.columns,
36
+ table: vuuTable
37
+ });
38
+ const handleSubmitExpression = react.useCallback(() => {
39
+ if (typeRef.current) {
40
+ typeRef.current?.querySelector("button")?.focus();
41
+ }
42
+ }, []);
43
+ const { name, serverDataType } = vuuUtils.getCalculatedColumnDetails(column);
44
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: classBase, children: [
45
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "vuuColumnSettingsPanel-header", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Calculation" }) }),
46
+ /* @__PURE__ */ jsxRuntime.jsxs(core.FormField, { "data-field": "column-name", children: [
47
+ /* @__PURE__ */ jsxRuntime.jsx(core.FormFieldLabel, { children: "Column Name" }),
48
+ /* @__PURE__ */ jsxRuntime.jsx(core.Input, { className: "vuuInput", onChange: onChangeName, value: name })
49
+ ] }),
50
+ /* @__PURE__ */ jsxRuntime.jsxs(core.FormField, { "data-field": "column-expression", children: [
51
+ /* @__PURE__ */ jsxRuntime.jsx(core.FormFieldLabel, { children: "Expression" }),
52
+ /* @__PURE__ */ jsxRuntime.jsx(
53
+ ColumnExpressionInput.ColumnExpressionInput,
54
+ {
55
+ onChange: onChangeExpression,
56
+ onSubmitExpression: handleSubmitExpression,
57
+ source: initialExpressionRef.current,
58
+ suggestionProvider
59
+ }
60
+ )
61
+ ] }),
62
+ /* @__PURE__ */ jsxRuntime.jsxs(core.FormField, { "data-field": "type", children: [
63
+ /* @__PURE__ */ jsxRuntime.jsx(core.FormFieldLabel, { children: "Column type" }),
64
+ /* @__PURE__ */ jsxRuntime.jsxs(
65
+ core.Dropdown,
66
+ {
67
+ className: `${classBase}-type`,
68
+ onSelectionChange: onChangeServerDataType,
69
+ ref: typeRef,
70
+ selected: serverDataType ? [serverDataType] : [],
71
+ value: serverDataType,
72
+ children: [
73
+ /* @__PURE__ */ jsxRuntime.jsx(core.Option, { value: "boolean", children: "Boolean" }),
74
+ /* @__PURE__ */ jsxRuntime.jsx(core.Option, { value: "double", children: "Double" }),
75
+ /* @__PURE__ */ jsxRuntime.jsx(core.Option, { value: "long", children: "Long" }),
76
+ /* @__PURE__ */ jsxRuntime.jsx(core.Option, { value: "string", children: "String" })
77
+ ]
78
+ }
79
+ )
80
+ ] })
81
+ ] });
82
+ };
83
+
84
+ exports.ColumnExpressionPanel = ColumnExpressionPanel;
85
+ //# sourceMappingURL=ColumnExpressionPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnExpressionPanel.js","sources":["../../src/column-expression-panel/ColumnExpressionPanel.tsx"],"sourcesContent":["import { VuuColumnDataType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnDescriptor, ColumnSettingsProps } from \"@vuu-ui/vuu-table-types\";\nimport { getCalculatedColumnDetails } from \"@vuu-ui/vuu-utils\";\nimport {\n Dropdown,\n FormField,\n FormFieldLabel,\n Input,\n Option,\n} from \"@salt-ds/core\";\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<HTMLButtonElement>(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 getCalculatedColumnDetails(column).expression ?? \"\",\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 const { name, serverDataType } = getCalculatedColumnDetails(column);\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 className=\"vuuInput\" onChange={onChangeName} value={name} />\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={serverDataType ? [serverDataType] : []}\n value={serverDataType}\n >\n <Option value=\"boolean\">Boolean</Option>\n <Option value=\"double\">Double</Option>\n <Option value=\"long\">Long</Option>\n <Option value=\"string\">String</Option>\n </Dropdown>\n </FormField>\n </div>\n );\n};\n"],"names":["useRef","useColumnExpression","getCalculatedColumnDetails","useColumnExpressionSuggestionProvider","useCallback","jsxs","jsx","FormField","FormFieldLabel","Input","ColumnExpressionInput","Dropdown","Option"],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+ var react = require('react');
5
+
6
+ const applyDefaults = (column) => {
7
+ const { name, expression, serverDataType } = vuuUtils.getCalculatedColumnDetails(column);
8
+ if (serverDataType === void 0) {
9
+ return {
10
+ ...column,
11
+ name: `${name}:string:${expression}`
12
+ };
13
+ } else {
14
+ return column;
15
+ }
16
+ };
17
+ const useColumnExpression = ({
18
+ column: columnProp,
19
+ onChangeName: onChangeNameProp,
20
+ onChangeServerDataType: onChangeServerDataTypeProp
21
+ }) => {
22
+ const [column, _setColumn] = react.useState(
23
+ applyDefaults(columnProp)
24
+ );
25
+ const columnRef = react.useRef(columnProp);
26
+ const setColumn = react.useCallback((column2) => {
27
+ columnRef.current = column2;
28
+ _setColumn(column2);
29
+ }, []);
30
+ const onChangeName = react.useCallback(
31
+ (evt) => {
32
+ const { value } = evt.target;
33
+ const newColumn = vuuUtils.setCalculatedColumnName(column, value);
34
+ setColumn(newColumn);
35
+ onChangeNameProp?.(newColumn.name);
36
+ },
37
+ [column, onChangeNameProp, setColumn]
38
+ );
39
+ const onChangeExpression = react.useCallback(
40
+ (value) => {
41
+ const expression = value.trim();
42
+ const { current: column2 } = columnRef;
43
+ const newColumn = vuuUtils.setCalculatedColumnExpression(column2, expression);
44
+ setColumn(newColumn);
45
+ onChangeNameProp?.(newColumn.name);
46
+ },
47
+ [onChangeNameProp, setColumn]
48
+ );
49
+ const onChangeServerDataType = react.useCallback(
50
+ (_e, [serverDataType]) => {
51
+ if (vuuUtils.isVuuColumnDataType(serverDataType)) {
52
+ const newColumn = vuuUtils.setCalculatedColumnType(column, serverDataType);
53
+ setColumn(newColumn);
54
+ onChangeNameProp?.(newColumn.name);
55
+ onChangeServerDataTypeProp?.(serverDataType);
56
+ }
57
+ },
58
+ [column, onChangeNameProp, onChangeServerDataTypeProp, setColumn]
59
+ );
60
+ return {
61
+ column,
62
+ onChangeExpression,
63
+ onChangeName,
64
+ onChangeServerDataType
65
+ };
66
+ };
67
+
68
+ exports.useColumnExpression = useColumnExpression;
69
+ //# 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 {\n FormEventHandler,\n SyntheticEvent,\n useCallback,\n useRef,\n useState,\n} 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, serverDataType } =\n getCalculatedColumnDetails(column);\n if (serverDataType === undefined) {\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 (_e: SyntheticEvent, [serverDataType]: string[]) => {\n if (isVuuColumnDataType(serverDataType)) {\n const newColumn = setCalculatedColumnType(column, serverDataType);\n setColumn(newColumn);\n onChangeNameProp?.(newColumn.name);\n onChangeServerDataTypeProp?.(serverDataType);\n }\n },\n [column, onChangeNameProp, onChangeServerDataTypeProp, setColumn],\n );\n\n return {\n column,\n onChangeExpression,\n onChangeName,\n onChangeServerDataType,\n };\n};\n"],"names":["getCalculatedColumnDetails","useState","useRef","useCallback","column","setCalculatedColumnName","setCalculatedColumnExpression","isVuuColumnDataType","setCalculatedColumnType"],"mappings":";;;;;AAsBA,MAAM,aAAA,GAAgB,CAAC,MAA6B,KAAA;AAClD,EAAA,MAAM,EAAE,IAAM,EAAA,UAAA,EAAY,cAAe,EAAA,GACvCA,oCAA2B,MAAM,CAAA;AACnC,EAAA,IAAI,mBAAmB,KAAW,CAAA,EAAA;AAChC,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,IAAM,EAAA,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,UAAU,CAAA;AAAA,KACpC;AAAA,GACK,MAAA;AACL,IAAO,OAAA,MAAA;AAAA;AAEX,CAAA;AAEO,MAAM,sBAAsB,CAAC;AAAA,EAClC,MAAQ,EAAA,UAAA;AAAA,EACR,YAAc,EAAA,gBAAA;AAAA,EACd,sBAAwB,EAAA;AAC1B,CAAiC,KAAA;AAC/B,EAAM,MAAA,CAAC,MAAQ,EAAA,UAAU,CAAI,GAAAC,cAAA;AAAA,IAC3B,cAAc,UAAU;AAAA,GAC1B;AACA,EAAM,MAAA,SAAA,GAAYC,aAAyB,UAAU,CAAA;AACrD,EAAM,MAAA,SAAA,GAAYC,iBAAY,CAAA,CAACC,OAA6B,KAAA;AAC1D,IAAA,SAAA,CAAU,OAAUA,GAAAA,OAAAA;AACpB,IAAA,UAAA,CAAWA,OAAM,CAAA;AAAA,GACnB,EAAG,EAAE,CAAA;AASL,EAAA,MAAM,YAAe,GAAAD,iBAAA;AAAA,IACnB,CAAC,GAAQ,KAAA;AACP,MAAM,MAAA,EAAE,KAAM,EAAA,GAAI,GAAI,CAAA,MAAA;AACtB,MAAM,MAAA,SAAA,GAAYE,gCAAwB,CAAA,MAAA,EAAQ,KAAK,CAAA;AAEvD,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,gBAAA,GAAmB,UAAU,IAAI,CAAA;AAAA,KACnC;AAAA,IACA,CAAC,MAAQ,EAAA,gBAAA,EAAkB,SAAS;AAAA,GACtC;AAEA,EAAA,MAAM,kBAAqB,GAAAF,iBAAA;AAAA,IACzB,CAAC,KAAkB,KAAA;AAGjB,MAAM,MAAA,UAAA,GAAa,MAAM,IAAK,EAAA;AAK9B,MAAM,MAAA,EAAE,OAASC,EAAAA,OAAAA,EAAW,GAAA,SAAA;AAC5B,MAAM,MAAA,SAAA,GAAYE,sCAA8BF,CAAAA,OAAAA,EAAQ,UAAU,CAAA;AAClE,MAAA,SAAA,CAAU,SAAS,CAAA;AAEnB,MAAA,gBAAA,GAAmB,UAAU,IAAI,CAAA;AAAA,KAGnC;AAAA,IACA,CAAC,kBAAkB,SAAS;AAAA,GAC9B;AAEA,EAAA,MAAM,sBAAyB,GAAAD,iBAAA;AAAA,IAC7B,CAAC,EAAA,EAAoB,CAAC,cAAc,CAAgB,KAAA;AAClD,MAAI,IAAAI,4BAAA,CAAoB,cAAc,CAAG,EAAA;AACvC,QAAM,MAAA,SAAA,GAAYC,gCAAwB,CAAA,MAAA,EAAQ,cAAc,CAAA;AAChE,QAAA,SAAA,CAAU,SAAS,CAAA;AACnB,QAAA,gBAAA,GAAmB,UAAU,IAAI,CAAA;AACjC,QAAA,0BAAA,GAA6B,cAAc,CAAA;AAAA;AAC7C,KACF;AAAA,IACA,CAAC,MAAA,EAAQ,gBAAkB,EAAA,0BAAA,EAA4B,SAAS;AAAA,GAClE;AAEA,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}