@vuu-ui/vuu-table-extras 0.0.26

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 (247) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +0 -0
  3. package/cjs/cell-edit-validators/CaseValidator.js +24 -0
  4. package/cjs/cell-edit-validators/CaseValidator.js.map +1 -0
  5. package/cjs/cell-edit-validators/PatternValidator.js +26 -0
  6. package/cjs/cell-edit-validators/PatternValidator.js.map +1 -0
  7. package/cjs/cell-renderers/background-cell/BackgroundCell.css.js +6 -0
  8. package/cjs/cell-renderers/background-cell/BackgroundCell.css.js.map +1 -0
  9. package/cjs/cell-renderers/background-cell/BackgroundCell.js +79 -0
  10. package/cjs/cell-renderers/background-cell/BackgroundCell.js.map +1 -0
  11. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css.js +6 -0
  12. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css.js.map +1 -0
  13. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js +67 -0
  14. package/cjs/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js.map +1 -0
  15. package/cjs/cell-renderers/background-cell/BackgroundKeyframes.css.js +6 -0
  16. package/cjs/cell-renderers/background-cell/BackgroundKeyframes.css.js.map +1 -0
  17. package/cjs/cell-renderers/background-cell/useDirection.js +20 -0
  18. package/cjs/cell-renderers/background-cell/useDirection.js.map +1 -0
  19. package/cjs/cell-renderers/dropdown-cell/DropdownCell.css.js +6 -0
  20. package/cjs/cell-renderers/dropdown-cell/DropdownCell.css.js.map +1 -0
  21. package/cjs/cell-renderers/dropdown-cell/DropdownCell.js +65 -0
  22. package/cjs/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -0
  23. package/cjs/cell-renderers/lookup-cell/LookupCell.js +26 -0
  24. package/cjs/cell-renderers/lookup-cell/LookupCell.js.map +1 -0
  25. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.css.js +6 -0
  26. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.css.js.map +1 -0
  27. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.js +62 -0
  28. package/cjs/cell-renderers/pct-progress-cell/PctProgressCell.js.map +1 -0
  29. package/cjs/cell-renderers/progress-cell/ProgressCell.css.js +6 -0
  30. package/cjs/cell-renderers/progress-cell/ProgressCell.css.js.map +1 -0
  31. package/cjs/cell-renderers/progress-cell/ProgressCell.js +69 -0
  32. package/cjs/cell-renderers/progress-cell/ProgressCell.js.map +1 -0
  33. package/cjs/column-expression-input/ColumnExpressionInput.css.js +6 -0
  34. package/cjs/column-expression-input/ColumnExpressionInput.css.js.map +1 -0
  35. package/cjs/column-expression-input/ColumnExpressionInput.js +39 -0
  36. package/cjs/column-expression-input/ColumnExpressionInput.js.map +1 -0
  37. package/cjs/column-expression-input/column-function-descriptors.js +307 -0
  38. package/cjs/column-expression-input/column-function-descriptors.js.map +1 -0
  39. package/cjs/column-expression-input/column-language-parser/ColumnExpressionLanguage.js +29 -0
  40. package/cjs/column-expression-input/column-language-parser/ColumnExpressionLanguage.js.map +1 -0
  41. package/cjs/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js +469 -0
  42. package/cjs/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js.map +1 -0
  43. package/cjs/column-expression-input/column-language-parser/column-expression-parse-utils.js +61 -0
  44. package/cjs/column-expression-input/column-language-parser/column-expression-parse-utils.js.map +1 -0
  45. package/cjs/column-expression-input/column-language-parser/generated/column-parser.js +21 -0
  46. package/cjs/column-expression-input/column-language-parser/generated/column-parser.js.map +1 -0
  47. package/cjs/column-expression-input/functionDocInfo.js +39 -0
  48. package/cjs/column-expression-input/functionDocInfo.js.map +1 -0
  49. package/cjs/column-expression-input/highlighting.js +16 -0
  50. package/cjs/column-expression-input/highlighting.js.map +1 -0
  51. package/cjs/column-expression-input/theme.js +63 -0
  52. package/cjs/column-expression-input/theme.js.map +1 -0
  53. package/cjs/column-expression-input/useColumnAutoComplete.js +358 -0
  54. package/cjs/column-expression-input/useColumnAutoComplete.js.map +1 -0
  55. package/cjs/column-expression-input/useColumnExpressionEditor.js +131 -0
  56. package/cjs/column-expression-input/useColumnExpressionEditor.js.map +1 -0
  57. package/cjs/column-expression-input/useColumnExpressionSuggestionProvider.js +212 -0
  58. package/cjs/column-expression-input/useColumnExpressionSuggestionProvider.js.map +1 -0
  59. package/cjs/column-expression-panel/ColumnExpressionPanel.js +87 -0
  60. package/cjs/column-expression-panel/ColumnExpressionPanel.js.map +1 -0
  61. package/cjs/column-expression-panel/useColumnExpression.js +69 -0
  62. package/cjs/column-expression-panel/useColumnExpression.js.map +1 -0
  63. package/cjs/column-formatting-settings/BaseNumericFormattingSettings.js +97 -0
  64. package/cjs/column-formatting-settings/BaseNumericFormattingSettings.js.map +1 -0
  65. package/cjs/column-formatting-settings/ColumnFormattingPanel.js +107 -0
  66. package/cjs/column-formatting-settings/ColumnFormattingPanel.js.map +1 -0
  67. package/cjs/column-formatting-settings/DateTimeFormattingSettings.js +90 -0
  68. package/cjs/column-formatting-settings/DateTimeFormattingSettings.js.map +1 -0
  69. package/cjs/column-formatting-settings/LongTypeFormattingSettings.css.js +6 -0
  70. package/cjs/column-formatting-settings/LongTypeFormattingSettings.css.js.map +1 -0
  71. package/cjs/column-formatting-settings/LongTypeFormattingSettings.js +49 -0
  72. package/cjs/column-formatting-settings/LongTypeFormattingSettings.js.map +1 -0
  73. package/cjs/column-list/ColumnList.css.js +6 -0
  74. package/cjs/column-list/ColumnList.css.js.map +1 -0
  75. package/cjs/column-list/ColumnList.js +115 -0
  76. package/cjs/column-list/ColumnList.js.map +1 -0
  77. package/cjs/column-settings/ColumnNameLabel.css.js +6 -0
  78. package/cjs/column-settings/ColumnNameLabel.css.js.map +1 -0
  79. package/cjs/column-settings/ColumnNameLabel.js +45 -0
  80. package/cjs/column-settings/ColumnNameLabel.js.map +1 -0
  81. package/cjs/column-settings/ColumnSettingsPanel.css.js +6 -0
  82. package/cjs/column-settings/ColumnSettingsPanel.css.js.map +1 -0
  83. package/cjs/column-settings/ColumnSettingsPanel.js +195 -0
  84. package/cjs/column-settings/ColumnSettingsPanel.js.map +1 -0
  85. package/cjs/column-settings/useColumnSettings.js +235 -0
  86. package/cjs/column-settings/useColumnSettings.js.map +1 -0
  87. package/cjs/datasource-stats/DatasourceStats.css.js +6 -0
  88. package/cjs/datasource-stats/DatasourceStats.css.js.map +1 -0
  89. package/cjs/datasource-stats/DatasourceStats.js +48 -0
  90. package/cjs/datasource-stats/DatasourceStats.js.map +1 -0
  91. package/cjs/index.js +54 -0
  92. package/cjs/index.js.map +1 -0
  93. package/cjs/table-settings/TableSettingsPanel.css.js +6 -0
  94. package/cjs/table-settings/TableSettingsPanel.css.js.map +1 -0
  95. package/cjs/table-settings/TableSettingsPanel.js +123 -0
  96. package/cjs/table-settings/TableSettingsPanel.js.map +1 -0
  97. package/cjs/table-settings/useTableSettings.js +182 -0
  98. package/cjs/table-settings/useTableSettings.js.map +1 -0
  99. package/esm/cell-edit-validators/CaseValidator.js +22 -0
  100. package/esm/cell-edit-validators/CaseValidator.js.map +1 -0
  101. package/esm/cell-edit-validators/PatternValidator.js +24 -0
  102. package/esm/cell-edit-validators/PatternValidator.js.map +1 -0
  103. package/esm/cell-renderers/background-cell/BackgroundCell.css.js +4 -0
  104. package/esm/cell-renderers/background-cell/BackgroundCell.css.js.map +1 -0
  105. package/esm/cell-renderers/background-cell/BackgroundCell.js +77 -0
  106. package/esm/cell-renderers/background-cell/BackgroundCell.js.map +1 -0
  107. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css.js +4 -0
  108. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.css.js.map +1 -0
  109. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js +65 -0
  110. package/esm/cell-renderers/background-cell/BackgroundCellConfigurationEditor.js.map +1 -0
  111. package/esm/cell-renderers/background-cell/BackgroundKeyframes.css.js +4 -0
  112. package/esm/cell-renderers/background-cell/BackgroundKeyframes.css.js.map +1 -0
  113. package/esm/cell-renderers/background-cell/useDirection.js +18 -0
  114. package/esm/cell-renderers/background-cell/useDirection.js.map +1 -0
  115. package/esm/cell-renderers/dropdown-cell/DropdownCell.css.js +4 -0
  116. package/esm/cell-renderers/dropdown-cell/DropdownCell.css.js.map +1 -0
  117. package/esm/cell-renderers/dropdown-cell/DropdownCell.js +63 -0
  118. package/esm/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -0
  119. package/esm/cell-renderers/lookup-cell/LookupCell.js +24 -0
  120. package/esm/cell-renderers/lookup-cell/LookupCell.js.map +1 -0
  121. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.css.js +4 -0
  122. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.css.js.map +1 -0
  123. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.js +60 -0
  124. package/esm/cell-renderers/pct-progress-cell/PctProgressCell.js.map +1 -0
  125. package/esm/cell-renderers/progress-cell/ProgressCell.css.js +4 -0
  126. package/esm/cell-renderers/progress-cell/ProgressCell.css.js.map +1 -0
  127. package/esm/cell-renderers/progress-cell/ProgressCell.js +67 -0
  128. package/esm/cell-renderers/progress-cell/ProgressCell.js.map +1 -0
  129. package/esm/column-expression-input/ColumnExpressionInput.css.js +4 -0
  130. package/esm/column-expression-input/ColumnExpressionInput.css.js.map +1 -0
  131. package/esm/column-expression-input/ColumnExpressionInput.js +37 -0
  132. package/esm/column-expression-input/ColumnExpressionInput.js.map +1 -0
  133. package/esm/column-expression-input/column-function-descriptors.js +305 -0
  134. package/esm/column-expression-input/column-function-descriptors.js.map +1 -0
  135. package/esm/column-expression-input/column-language-parser/ColumnExpressionLanguage.js +27 -0
  136. package/esm/column-expression-input/column-language-parser/ColumnExpressionLanguage.js.map +1 -0
  137. package/esm/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js +467 -0
  138. package/esm/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js.map +1 -0
  139. package/esm/column-expression-input/column-language-parser/column-expression-parse-utils.js +56 -0
  140. package/esm/column-expression-input/column-language-parser/column-expression-parse-utils.js.map +1 -0
  141. package/esm/column-expression-input/column-language-parser/generated/column-parser.js +19 -0
  142. package/esm/column-expression-input/column-language-parser/generated/column-parser.js.map +1 -0
  143. package/esm/column-expression-input/functionDocInfo.js +37 -0
  144. package/esm/column-expression-input/functionDocInfo.js.map +1 -0
  145. package/esm/column-expression-input/highlighting.js +14 -0
  146. package/esm/column-expression-input/highlighting.js.map +1 -0
  147. package/esm/column-expression-input/theme.js +61 -0
  148. package/esm/column-expression-input/theme.js.map +1 -0
  149. package/esm/column-expression-input/useColumnAutoComplete.js +356 -0
  150. package/esm/column-expression-input/useColumnAutoComplete.js.map +1 -0
  151. package/esm/column-expression-input/useColumnExpressionEditor.js +129 -0
  152. package/esm/column-expression-input/useColumnExpressionEditor.js.map +1 -0
  153. package/esm/column-expression-input/useColumnExpressionSuggestionProvider.js +210 -0
  154. package/esm/column-expression-input/useColumnExpressionSuggestionProvider.js.map +1 -0
  155. package/esm/column-expression-panel/ColumnExpressionPanel.js +85 -0
  156. package/esm/column-expression-panel/ColumnExpressionPanel.js.map +1 -0
  157. package/esm/column-expression-panel/useColumnExpression.js +67 -0
  158. package/esm/column-expression-panel/useColumnExpression.js.map +1 -0
  159. package/esm/column-formatting-settings/BaseNumericFormattingSettings.js +95 -0
  160. package/esm/column-formatting-settings/BaseNumericFormattingSettings.js.map +1 -0
  161. package/esm/column-formatting-settings/ColumnFormattingPanel.js +105 -0
  162. package/esm/column-formatting-settings/ColumnFormattingPanel.js.map +1 -0
  163. package/esm/column-formatting-settings/DateTimeFormattingSettings.js +88 -0
  164. package/esm/column-formatting-settings/DateTimeFormattingSettings.js.map +1 -0
  165. package/esm/column-formatting-settings/LongTypeFormattingSettings.css.js +4 -0
  166. package/esm/column-formatting-settings/LongTypeFormattingSettings.css.js.map +1 -0
  167. package/esm/column-formatting-settings/LongTypeFormattingSettings.js +47 -0
  168. package/esm/column-formatting-settings/LongTypeFormattingSettings.js.map +1 -0
  169. package/esm/column-list/ColumnList.css.js +4 -0
  170. package/esm/column-list/ColumnList.css.js.map +1 -0
  171. package/esm/column-list/ColumnList.js +113 -0
  172. package/esm/column-list/ColumnList.js.map +1 -0
  173. package/esm/column-settings/ColumnNameLabel.css.js +4 -0
  174. package/esm/column-settings/ColumnNameLabel.css.js.map +1 -0
  175. package/esm/column-settings/ColumnNameLabel.js +43 -0
  176. package/esm/column-settings/ColumnNameLabel.js.map +1 -0
  177. package/esm/column-settings/ColumnSettingsPanel.css.js +4 -0
  178. package/esm/column-settings/ColumnSettingsPanel.css.js.map +1 -0
  179. package/esm/column-settings/ColumnSettingsPanel.js +193 -0
  180. package/esm/column-settings/ColumnSettingsPanel.js.map +1 -0
  181. package/esm/column-settings/useColumnSettings.js +233 -0
  182. package/esm/column-settings/useColumnSettings.js.map +1 -0
  183. package/esm/datasource-stats/DatasourceStats.css.js +4 -0
  184. package/esm/datasource-stats/DatasourceStats.css.js.map +1 -0
  185. package/esm/datasource-stats/DatasourceStats.js +46 -0
  186. package/esm/datasource-stats/DatasourceStats.js.map +1 -0
  187. package/esm/index.js +24 -0
  188. package/esm/index.js.map +1 -0
  189. package/esm/table-settings/TableSettingsPanel.css.js +4 -0
  190. package/esm/table-settings/TableSettingsPanel.css.js.map +1 -0
  191. package/esm/table-settings/TableSettingsPanel.js +121 -0
  192. package/esm/table-settings/TableSettingsPanel.js.map +1 -0
  193. package/esm/table-settings/useTableSettings.js +180 -0
  194. package/esm/table-settings/useTableSettings.js.map +1 -0
  195. package/package.json +47 -0
  196. package/types/cell-edit-validators/CaseValidator.d.ts +2 -0
  197. package/types/cell-edit-validators/PatternValidator.d.ts +2 -0
  198. package/types/cell-edit-validators/index.d.ts +2 -0
  199. package/types/cell-renderers/background-cell/BackgroundCell.d.ts +3 -0
  200. package/types/cell-renderers/background-cell/BackgroundCellConfigurationEditor.d.ts +3 -0
  201. package/types/cell-renderers/background-cell/index.d.ts +2 -0
  202. package/types/cell-renderers/background-cell/useDirection.d.ts +3 -0
  203. package/types/cell-renderers/dropdown-cell/DropdownCell.d.ts +3 -0
  204. package/types/cell-renderers/dropdown-cell/index.d.ts +1 -0
  205. package/types/cell-renderers/index.d.ts +5 -0
  206. package/types/cell-renderers/lookup-cell/LookupCell.d.ts +3 -0
  207. package/types/cell-renderers/lookup-cell/index.d.ts +1 -0
  208. package/types/cell-renderers/pct-progress-cell/PctProgressCell.d.ts +3 -0
  209. package/types/cell-renderers/pct-progress-cell/index.d.ts +1 -0
  210. package/types/cell-renderers/progress-cell/ProgressCell.d.ts +1 -0
  211. package/types/cell-renderers/progress-cell/index.d.ts +1 -0
  212. package/types/column-expression-input/ColumnExpressionInput.d.ts +10 -0
  213. package/types/column-expression-input/column-function-descriptors.d.ts +15 -0
  214. package/types/column-expression-input/column-language-parser/ColumnExpressionLanguage.d.ts +2 -0
  215. package/types/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.d.ts +58 -0
  216. package/types/column-expression-input/column-language-parser/column-expression-parse-utils.d.ts +5 -0
  217. package/types/column-expression-input/column-language-parser/generated/column-parser.d.ts +2 -0
  218. package/types/column-expression-input/column-language-parser/generated/column-parser.terms.d.ts +24 -0
  219. package/types/column-expression-input/column-language-parser/index.d.ts +3 -0
  220. package/types/column-expression-input/column-language-parser/test.d.mts +1 -0
  221. package/types/column-expression-input/functionDocInfo.d.ts +2 -0
  222. package/types/column-expression-input/highlighting.d.ts +1 -0
  223. package/types/column-expression-input/index.d.ts +4 -0
  224. package/types/column-expression-input/theme.d.ts +1 -0
  225. package/types/column-expression-input/useColumnAutoComplete.d.ts +6 -0
  226. package/types/column-expression-input/useColumnExpressionEditor.d.ts +25 -0
  227. package/types/column-expression-input/useColumnExpressionSuggestionProvider.d.ts +8 -0
  228. package/types/column-expression-panel/ColumnExpressionPanel.d.ts +13 -0
  229. package/types/column-expression-panel/index.d.ts +1 -0
  230. package/types/column-expression-panel/useColumnExpression.d.ts +10 -0
  231. package/types/column-formatting-settings/BaseNumericFormattingSettings.d.ts +3 -0
  232. package/types/column-formatting-settings/ColumnFormattingPanel.d.ts +9 -0
  233. package/types/column-formatting-settings/DateTimeFormattingSettings.d.ts +3 -0
  234. package/types/column-formatting-settings/LongTypeFormattingSettings.d.ts +3 -0
  235. package/types/column-formatting-settings/index.d.ts +3 -0
  236. package/types/column-list/ColumnList.d.ts +12 -0
  237. package/types/column-list/index.d.ts +1 -0
  238. package/types/column-settings/ColumnNameLabel.d.ts +7 -0
  239. package/types/column-settings/ColumnSettingsPanel.d.ts +3 -0
  240. package/types/column-settings/index.d.ts +1 -0
  241. package/types/column-settings/useColumnSettings.d.ts +22 -0
  242. package/types/datasource-stats/DatasourceStats.d.ts +7 -0
  243. package/types/datasource-stats/index.d.ts +1 -0
  244. package/types/index.d.ts +9 -0
  245. package/types/table-settings/TableSettingsPanel.d.ts +8 -0
  246. package/types/table-settings/index.d.ts +2 -0
  247. package/types/table-settings/useTableSettings.d.ts +18 -0
@@ -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();
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>();\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,212 @@
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();
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
+ /*, startsWith*/
163
+ );
164
+ const suggestions = await getTypeaheadSuggestions(params);
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
+ return latestSuggestionsRef.current;
180
+ }
181
+ break;
182
+ }
183
+ return [];
184
+ },
185
+ [columns, findColumn, getTypeaheadSuggestions, table]
186
+ );
187
+ const isPartialMatch = react.useCallback(
188
+ async (valueType, columnName, pattern) => {
189
+ const { current: latestSuggestions } = latestSuggestionsRef;
190
+ let maybe = false;
191
+ const suggestions = latestSuggestions || await getSuggestions(valueType, { columnName });
192
+ if (pattern && suggestions) {
193
+ for (const option of suggestions) {
194
+ if (option.label === pattern) {
195
+ return false;
196
+ } else if (option.label.startsWith(pattern)) {
197
+ maybe = true;
198
+ }
199
+ }
200
+ }
201
+ return maybe;
202
+ },
203
+ [getSuggestions]
204
+ );
205
+ return {
206
+ getSuggestions,
207
+ isPartialMatch
208
+ };
209
+ };
210
+
211
+ exports.useColumnExpressionSuggestionProvider = useColumnExpressionSuggestionProvider;
212
+ //# 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":["isNumericColumn","columnFunctionDescriptors","isTextColumn","stringOperators","numericOperators","functionDocInfo","useCallback","useRef","useTypeaheadSuggestions","getRelationalOperators","getTypeaheadParams","toSuggestions","AnnotationType"],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
5
+ var vuuUtils = require('@vuu-ui/vuu-utils');
6
+ var core = require('@salt-ds/core');
7
+ var react = require('react');
8
+ var ColumnExpressionInput = require('../column-expression-input/ColumnExpressionInput.js');
9
+ require('../column-expression-input/column-language-parser/ColumnExpressionLanguage.js');
10
+ require('../column-expression-input/column-language-parser/ColumnExpressionTreeWalker.js');
11
+ require('../column-expression-input/column-language-parser/column-expression-parse-utils.js');
12
+ require('@vuu-ui/vuu-codemirror');
13
+ require('../column-expression-input/highlighting.js');
14
+ require('../column-expression-input/theme.js');
15
+ var useColumnExpressionSuggestionProvider = require('../column-expression-input/useColumnExpressionSuggestionProvider.js');
16
+ var useColumnExpression = require('./useColumnExpression.js');
17
+
18
+ const classBase = "vuuColumnExpressionPanel";
19
+ const ColumnExpressionPanel = ({
20
+ column: columnProp,
21
+ onChangeName: onChangeNameProp,
22
+ onChangeServerDataType: onChangeServerDataTypeProp,
23
+ tableConfig,
24
+ vuuTable
25
+ }) => {
26
+ const typeRef = react.useRef(null);
27
+ const { column, onChangeExpression, onChangeName, onChangeServerDataType } = useColumnExpression.useColumnExpression({
28
+ column: columnProp,
29
+ onChangeName: onChangeNameProp,
30
+ onChangeServerDataType: onChangeServerDataTypeProp
31
+ });
32
+ const initialExpressionRef = react.useRef(
33
+ vuuUtils.getCalculatedColumnExpression(column)
34
+ );
35
+ const suggestionProvider = useColumnExpressionSuggestionProvider.useColumnExpressionSuggestionProvider({
36
+ columns: tableConfig.columns,
37
+ table: vuuTable
38
+ });
39
+ const handleSubmitExpression = react.useCallback(() => {
40
+ if (typeRef.current) {
41
+ typeRef.current?.querySelector("button")?.focus();
42
+ }
43
+ }, []);
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(
49
+ core.Input,
50
+ {
51
+ className: "vuuInput",
52
+ onChange: onChangeName,
53
+ value: vuuUtils.getCalculatedColumnName(column)
54
+ }
55
+ )
56
+ ] }),
57
+ /* @__PURE__ */ jsxRuntime.jsxs(core.FormField, { "data-field": "column-expression", children: [
58
+ /* @__PURE__ */ jsxRuntime.jsx(core.FormFieldLabel, { children: "Expression" }),
59
+ /* @__PURE__ */ jsxRuntime.jsx(
60
+ ColumnExpressionInput.ColumnExpressionInput,
61
+ {
62
+ onChange: onChangeExpression,
63
+ onSubmitExpression: handleSubmitExpression,
64
+ source: initialExpressionRef.current,
65
+ suggestionProvider
66
+ }
67
+ )
68
+ ] }),
69
+ /* @__PURE__ */ jsxRuntime.jsxs(core.FormField, { "data-field": "type", children: [
70
+ /* @__PURE__ */ jsxRuntime.jsx(core.FormFieldLabel, { children: "Column type" }),
71
+ /* @__PURE__ */ jsxRuntime.jsx(
72
+ vuuUiControls.Dropdown,
73
+ {
74
+ className: `${classBase}-type`,
75
+ onSelectionChange: onChangeServerDataType,
76
+ ref: typeRef,
77
+ selected: vuuUtils.getCalculatedColumnType(column) || null,
78
+ source: ["double", "long", "string", "boolean"],
79
+ width: "100%"
80
+ }
81
+ )
82
+ ] })
83
+ ] });
84
+ };
85
+
86
+ exports.ColumnExpressionPanel = ColumnExpressionPanel;
87
+ //# 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":["useRef","useColumnExpression","getCalculatedColumnExpression","useColumnExpressionSuggestionProvider","useCallback","jsxs","jsx","FormField","FormFieldLabel","Input","getCalculatedColumnName","ColumnExpressionInput","Dropdown","getCalculatedColumnType"],"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, type] = vuuUtils.getCalculatedColumnDetails(column);
8
+ if (type === "") {
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
+ (evt, value) => {
51
+ if (vuuUtils.isVuuColumnDataType(value)) {
52
+ const newColumn = vuuUtils.setCalculatedColumnType(column, value);
53
+ setColumn(newColumn);
54
+ onChangeNameProp?.(newColumn.name);
55
+ onChangeServerDataTypeProp?.(value);
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 { 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":["getCalculatedColumnDetails","useState","useRef","useCallback","column","setCalculatedColumnName","setCalculatedColumnExpression","isVuuColumnDataType","setCalculatedColumnType"],"mappings":";;;;;AAgBA,MAAM,aAAA,GAAgB,CAAC,MAA6B,KAAA;AAClD,EAAA,MAAM,CAAC,IAAM,EAAA,UAAA,EAAY,IAAI,CAAA,GAAIA,oCAA2B,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,GAAAC,cAAA;AAAA,IAC3B,cAAc,UAAU,CAAA;AAAA,GAC1B,CAAA;AACA,EAAM,MAAA,SAAA,GAAYC,aAAyB,UAAU,CAAA,CAAA;AACrD,EAAM,MAAA,SAAA,GAAYC,iBAAY,CAAA,CAACC,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,GAAAD,iBAAA;AAAA,IACnB,CAAC,GAAQ,KAAA;AACP,MAAM,MAAA,EAAE,KAAM,EAAA,GAAI,GAAI,CAAA,MAAA,CAAA;AACtB,MAAM,MAAA,SAAA,GAAYE,gCAAwB,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,GAAAF,iBAAA;AAAA,IACzB,CAAC,KAAkB,KAAA;AAGjB,MAAM,MAAA,UAAA,GAAa,MAAM,IAAK,EAAA,CAAA;AAK9B,MAAM,MAAA,EAAE,OAASC,EAAAA,OAAAA,EAAW,GAAA,SAAA,CAAA;AAC5B,MAAM,MAAA,SAAA,GAAYE,sCAA8BF,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,GAAAD,iBAAA;AAAA,IAC7B,CAAC,KAAK,KAAyB,KAAA;AAC7B,MAAI,IAAAI,4BAAA,CAAoB,KAAK,CAAG,EAAA;AAC9B,QAAM,MAAA,SAAA,GAAYC,gCAAwB,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;;;;"}