@finos/legend-application-repl 0.0.30 → 0.0.32

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 (229) hide show
  1. package/lib/components/LegendREPLFrameworkProvider.js +1 -1
  2. package/lib/components/LegendREPLFrameworkProvider.js.map +1 -1
  3. package/lib/components/REPLStoreProvider.d.ts +1 -1
  4. package/lib/components/REPLStoreProvider.d.ts.map +1 -1
  5. package/lib/components/REPLStoreProvider.js +1 -1
  6. package/lib/components/REPLStoreProvider.js.map +1 -1
  7. package/lib/components/REPLWindow.d.ts +33 -0
  8. package/lib/components/REPLWindow.d.ts.map +1 -0
  9. package/lib/components/REPLWindow.js +117 -0
  10. package/lib/components/REPLWindow.js.map +1 -0
  11. package/lib/components/dataCube/DataCube.d.ts.map +1 -1
  12. package/lib/components/dataCube/DataCube.js +13 -9
  13. package/lib/components/dataCube/DataCube.js.map +1 -1
  14. package/lib/components/dataCube/editor/DataCubeEditor.d.ts.map +1 -1
  15. package/lib/components/dataCube/editor/DataCubeEditor.js +13 -90
  16. package/lib/components/dataCube/editor/DataCubeEditor.js.map +1 -1
  17. package/lib/components/dataCube/editor/DataCubeEditorCodePanel.d.ts.map +1 -1
  18. package/lib/components/dataCube/editor/DataCubeEditorCodePanel.js +3 -2
  19. package/lib/components/dataCube/editor/DataCubeEditorCodePanel.js.map +1 -1
  20. package/lib/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.d.ts.map +1 -1
  21. package/lib/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.js +237 -6
  22. package/lib/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.js.map +1 -1
  23. package/lib/components/dataCube/editor/DataCubeEditorColumnsPanel.js +2 -2
  24. package/lib/components/dataCube/editor/DataCubeEditorColumnsPanel.js.map +1 -1
  25. package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.d.ts +5 -0
  26. package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.d.ts.map +1 -1
  27. package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.js +130 -48
  28. package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.js.map +1 -1
  29. package/lib/{stores/dataCube/DataCubeDefaultConfig.d.ts → components/dataCube/editor/DataCubeEditorDeveloperPanel.d.ts} +4 -2
  30. package/lib/components/dataCube/editor/DataCubeEditorDeveloperPanel.d.ts.map +1 -0
  31. package/lib/components/dataCube/editor/DataCubeEditorDeveloperPanel.js +28 -0
  32. package/lib/components/dataCube/editor/DataCubeEditorDeveloperPanel.js.map +1 -0
  33. package/lib/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.d.ts.map +1 -1
  34. package/lib/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.js +3 -2
  35. package/lib/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.js.map +1 -1
  36. package/lib/components/dataCube/editor/DataCubeEditorFilterPanel.d.ts.map +1 -1
  37. package/lib/components/dataCube/editor/DataCubeEditorFilterPanel.js +3 -2
  38. package/lib/components/dataCube/editor/DataCubeEditorFilterPanel.js.map +1 -1
  39. package/lib/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.d.ts.map +1 -1
  40. package/lib/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.js +145 -5
  41. package/lib/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.js.map +1 -1
  42. package/lib/components/dataCube/editor/DataCubeEditorHPivotsPanel.d.ts.map +1 -1
  43. package/lib/components/dataCube/editor/DataCubeEditorHPivotsPanel.js +3 -2
  44. package/lib/components/dataCube/editor/DataCubeEditorHPivotsPanel.js.map +1 -1
  45. package/lib/components/dataCube/editor/DataCubeEditorShared.d.ts +47 -0
  46. package/lib/components/dataCube/editor/DataCubeEditorShared.d.ts.map +1 -0
  47. package/lib/components/dataCube/editor/DataCubeEditorShared.js +188 -0
  48. package/lib/components/dataCube/editor/DataCubeEditorShared.js.map +1 -0
  49. package/lib/components/dataCube/editor/DataCubeEditorSortsPanel.d.ts.map +1 -1
  50. package/lib/components/dataCube/editor/DataCubeEditorSortsPanel.js +36 -3
  51. package/lib/components/dataCube/editor/DataCubeEditorSortsPanel.js.map +1 -1
  52. package/lib/components/dataCube/editor/DataCubeEditorVPivotsPanel.d.ts.map +1 -1
  53. package/lib/components/dataCube/editor/DataCubeEditorVPivotsPanel.js +3 -2
  54. package/lib/components/dataCube/editor/DataCubeEditorVPivotsPanel.js.map +1 -1
  55. package/lib/components/dataCube/grid/DataCubeGrid.d.ts +3 -0
  56. package/lib/components/dataCube/grid/DataCubeGrid.d.ts.map +1 -1
  57. package/lib/components/dataCube/grid/DataCubeGrid.js +190 -63
  58. package/lib/components/dataCube/grid/DataCubeGrid.js.map +1 -1
  59. package/lib/{stores/dataCube/DataCubeDefaultConfig.js → components/dataCube/grid/DataCubeGridShared.d.ts} +3 -2
  60. package/lib/components/dataCube/grid/DataCubeGridShared.d.ts.map +1 -0
  61. package/lib/components/dataCube/grid/DataCubeGridShared.js +25 -0
  62. package/lib/components/dataCube/grid/DataCubeGridShared.js.map +1 -0
  63. package/lib/components/dataCube/grid/menu/DataCubeGridMenu.d.ts +23 -0
  64. package/lib/components/dataCube/grid/menu/DataCubeGridMenu.d.ts.map +1 -0
  65. package/lib/components/dataCube/grid/menu/DataCubeGridMenu.js +413 -0
  66. package/lib/components/dataCube/grid/menu/DataCubeGridMenu.js.map +1 -0
  67. package/{src/stores/dataCube/DataCubeDefaultConfig.ts → lib/components/dataCube/grid/menu/DataCubeGridSortsMenu.d.ts} +4 -2
  68. package/lib/components/dataCube/grid/menu/DataCubeGridSortsMenu.d.ts.map +1 -0
  69. package/lib/components/dataCube/grid/menu/DataCubeGridSortsMenu.js +83 -0
  70. package/lib/components/dataCube/grid/menu/DataCubeGridSortsMenu.js.map +1 -0
  71. package/lib/index.css +2 -2
  72. package/lib/index.css.map +1 -1
  73. package/lib/package.json +14 -12
  74. package/lib/server/models/DataCubeQuery.d.ts +3 -5
  75. package/lib/server/models/DataCubeQuery.d.ts.map +1 -1
  76. package/lib/server/models/DataCubeQuery.js +0 -2
  77. package/lib/server/models/DataCubeQuery.js.map +1 -1
  78. package/lib/stores/{dataCube/REPLStore.d.ts → REPLStore.d.ts} +6 -4
  79. package/lib/stores/REPLStore.d.ts.map +1 -0
  80. package/lib/stores/{dataCube/REPLStore.js → REPLStore.js} +8 -5
  81. package/lib/stores/REPLStore.js.map +1 -0
  82. package/lib/stores/dataCube/{core/DataCubeEngine.d.ts → DataCubeInfrastructure.d.ts} +20 -4
  83. package/lib/stores/dataCube/DataCubeInfrastructure.d.ts.map +1 -0
  84. package/lib/stores/dataCube/{core/DataCubeEngine.js → DataCubeInfrastructure.js} +31 -3
  85. package/lib/stores/dataCube/DataCubeInfrastructure.js.map +1 -0
  86. package/lib/stores/dataCube/DataCubeState.d.ts +14 -5
  87. package/lib/stores/dataCube/DataCubeState.d.ts.map +1 -1
  88. package/lib/stores/dataCube/DataCubeState.js +37 -9
  89. package/lib/stores/dataCube/DataCubeState.js.map +1 -1
  90. package/lib/stores/dataCube/core/DataCubeConfiguration.d.ts +93 -0
  91. package/lib/stores/dataCube/core/DataCubeConfiguration.d.ts.map +1 -0
  92. package/lib/stores/dataCube/core/DataCubeConfiguration.js +167 -0
  93. package/lib/stores/dataCube/core/DataCubeConfiguration.js.map +1 -0
  94. package/lib/stores/dataCube/core/DataCubeConfigurationBuilder.d.ts +25 -0
  95. package/lib/stores/dataCube/core/DataCubeConfigurationBuilder.d.ts.map +1 -0
  96. package/lib/stores/dataCube/core/DataCubeConfigurationBuilder.js +45 -0
  97. package/lib/stores/dataCube/core/DataCubeConfigurationBuilder.js.map +1 -0
  98. package/lib/stores/dataCube/core/DataCubeCoreState.d.ts +1 -1
  99. package/lib/stores/dataCube/core/DataCubeCoreState.d.ts.map +1 -1
  100. package/lib/stores/dataCube/core/DataCubeCoreState.js +4 -4
  101. package/lib/stores/dataCube/core/DataCubeCoreState.js.map +1 -1
  102. package/lib/stores/dataCube/core/DataCubeQueryBuilder.js +12 -12
  103. package/lib/stores/dataCube/core/DataCubeQueryBuilder.js.map +1 -1
  104. package/lib/stores/dataCube/core/DataCubeQueryEngine.d.ts +99 -4
  105. package/lib/stores/dataCube/core/DataCubeQueryEngine.d.ts.map +1 -1
  106. package/lib/stores/dataCube/core/DataCubeQueryEngine.js +149 -3
  107. package/lib/stores/dataCube/core/DataCubeQueryEngine.js.map +1 -1
  108. package/lib/stores/dataCube/core/DataCubeQuerySnapshot.d.ts +19 -5
  109. package/lib/stores/dataCube/core/DataCubeQuerySnapshot.d.ts.map +1 -1
  110. package/lib/stores/dataCube/core/DataCubeQuerySnapshot.js +36 -6
  111. package/lib/stores/dataCube/core/DataCubeQuerySnapshot.js.map +1 -1
  112. package/lib/stores/dataCube/core/DataCubeQuerySnapshotBuilder.d.ts.map +1 -1
  113. package/lib/stores/dataCube/core/DataCubeQuerySnapshotBuilder.js +42 -23
  114. package/lib/stores/dataCube/core/DataCubeQuerySnapshotBuilder.js.map +1 -1
  115. package/lib/stores/dataCube/core/DataCubeQuerySnapshotManager.d.ts.map +1 -1
  116. package/lib/stores/dataCube/core/DataCubeQuerySnapshotManager.js +6 -2
  117. package/lib/stores/dataCube/core/DataCubeQuerySnapshotManager.js.map +1 -1
  118. package/lib/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.d.ts +1 -3
  119. package/lib/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.d.ts.map +1 -1
  120. package/lib/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.js +2 -3
  121. package/lib/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.js.map +1 -1
  122. package/lib/stores/dataCube/editor/DataCubeEditorCodePanelState.d.ts +3 -1
  123. package/lib/stores/dataCube/editor/DataCubeEditorCodePanelState.d.ts.map +1 -1
  124. package/lib/stores/dataCube/editor/DataCubeEditorCodePanelState.js +4 -2
  125. package/lib/stores/dataCube/editor/DataCubeEditorCodePanelState.js.map +1 -1
  126. package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.d.ts +36 -0
  127. package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.d.ts.map +1 -0
  128. package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.js +66 -0
  129. package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.js.map +1 -0
  130. package/lib/stores/dataCube/editor/DataCubeEditorColumnsSelectorState.d.ts +3 -0
  131. package/lib/stores/dataCube/editor/DataCubeEditorColumnsSelectorState.d.ts.map +1 -1
  132. package/lib/stores/dataCube/editor/DataCubeEditorColumnsSelectorState.js +10 -0
  133. package/lib/stores/dataCube/editor/DataCubeEditorColumnsSelectorState.js.map +1 -1
  134. package/lib/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.d.ts +8 -3
  135. package/lib/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.d.ts.map +1 -1
  136. package/lib/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.js +20 -24
  137. package/lib/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.js.map +1 -1
  138. package/lib/stores/dataCube/editor/DataCubeEditorHPivotPanelState.d.ts +27 -0
  139. package/lib/stores/dataCube/editor/DataCubeEditorHPivotPanelState.d.ts.map +1 -0
  140. package/lib/stores/dataCube/editor/DataCubeEditorHPivotPanelState.js +30 -0
  141. package/lib/stores/dataCube/editor/DataCubeEditorHPivotPanelState.js.map +1 -0
  142. package/lib/stores/dataCube/editor/DataCubeEditorPanelState.d.ts +1 -1
  143. package/lib/stores/dataCube/editor/DataCubeEditorPanelState.d.ts.map +1 -1
  144. package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.d.ts +13 -6
  145. package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.d.ts.map +1 -1
  146. package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.js +64 -19
  147. package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.js.map +1 -1
  148. package/lib/stores/dataCube/editor/DataCubeEditorState.d.ts +8 -4
  149. package/lib/stores/dataCube/editor/DataCubeEditorState.d.ts.map +1 -1
  150. package/lib/stores/dataCube/editor/DataCubeEditorState.js +26 -17
  151. package/lib/stores/dataCube/editor/DataCubeEditorState.js.map +1 -1
  152. package/lib/stores/dataCube/editor/DataCubeMutableConfiguration.d.ts +100 -0
  153. package/lib/stores/dataCube/editor/DataCubeMutableConfiguration.d.ts.map +1 -0
  154. package/lib/stores/dataCube/editor/DataCubeMutableConfiguration.js +450 -0
  155. package/lib/stores/dataCube/editor/DataCubeMutableConfiguration.js.map +1 -0
  156. package/lib/stores/dataCube/grid/DataCubeGridClientEngine.d.ts +39 -2
  157. package/lib/stores/dataCube/grid/DataCubeGridClientEngine.d.ts.map +1 -1
  158. package/lib/stores/dataCube/grid/DataCubeGridClientEngine.js +63 -3
  159. package/lib/stores/dataCube/grid/DataCubeGridClientEngine.js.map +1 -1
  160. package/lib/stores/dataCube/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
  161. package/lib/stores/dataCube/grid/DataCubeGridQueryBuilder.js +0 -9
  162. package/lib/stores/dataCube/grid/DataCubeGridQueryBuilder.js.map +1 -1
  163. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.d.ts +4 -1
  164. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.d.ts.map +1 -1
  165. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.js +330 -38
  166. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.js.map +1 -1
  167. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.d.ts.map +1 -1
  168. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.js +16 -28
  169. package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.js.map +1 -1
  170. package/lib/stores/dataCube/grid/DataCubeGridState.d.ts +16 -2
  171. package/lib/stores/dataCube/grid/DataCubeGridState.d.ts.map +1 -1
  172. package/lib/stores/dataCube/grid/DataCubeGridState.js +51 -21
  173. package/lib/stores/dataCube/grid/DataCubeGridState.js.map +1 -1
  174. package/package.json +20 -18
  175. package/src/components/LegendREPLFrameworkProvider.tsx +1 -1
  176. package/src/components/REPLStoreProvider.tsx +1 -1
  177. package/src/components/REPLWindow.tsx +179 -0
  178. package/src/components/dataCube/DataCube.tsx +44 -23
  179. package/src/components/dataCube/editor/DataCubeEditor.tsx +80 -186
  180. package/src/components/dataCube/editor/DataCubeEditorCodePanel.tsx +4 -2
  181. package/src/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.tsx +1044 -13
  182. package/src/components/dataCube/editor/DataCubeEditorColumnsPanel.tsx +2 -2
  183. package/src/components/dataCube/editor/DataCubeEditorColumnsSelector.tsx +264 -51
  184. package/src/components/dataCube/editor/DataCubeEditorDeveloperPanel.tsx +43 -0
  185. package/src/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.tsx +4 -2
  186. package/src/components/dataCube/editor/DataCubeEditorFilterPanel.tsx +4 -2
  187. package/src/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.tsx +743 -13
  188. package/src/components/dataCube/editor/DataCubeEditorHPivotsPanel.tsx +4 -2
  189. package/src/components/dataCube/editor/DataCubeEditorShared.tsx +484 -0
  190. package/src/components/dataCube/editor/DataCubeEditorSortsPanel.tsx +103 -4
  191. package/src/components/dataCube/editor/DataCubeEditorVPivotsPanel.tsx +4 -2
  192. package/src/components/dataCube/grid/DataCubeGrid.tsx +314 -120
  193. package/src/components/dataCube/grid/DataCubeGridShared.tsx +45 -0
  194. package/src/components/dataCube/grid/menu/DataCubeGridMenu.tsx +441 -0
  195. package/src/components/dataCube/grid/menu/DataCubeGridSortsMenu.tsx +119 -0
  196. package/src/server/models/DataCubeQuery.ts +2 -6
  197. package/src/stores/{dataCube/REPLStore.ts → REPLStore.ts} +9 -6
  198. package/src/stores/dataCube/{core/DataCubeEngine.ts → DataCubeInfrastructure.ts} +40 -3
  199. package/src/stores/dataCube/DataCubeState.ts +44 -10
  200. package/src/stores/dataCube/core/DataCubeConfiguration.ts +220 -0
  201. package/src/stores/dataCube/core/DataCubeConfigurationBuilder.ts +60 -0
  202. package/src/stores/dataCube/core/DataCubeCoreState.ts +7 -4
  203. package/src/stores/dataCube/core/DataCubeQueryBuilder.ts +18 -18
  204. package/src/stores/dataCube/core/DataCubeQueryEngine.ts +157 -4
  205. package/src/stores/dataCube/core/DataCubeQuerySnapshot.ts +43 -6
  206. package/src/stores/dataCube/core/DataCubeQuerySnapshotBuilder.ts +49 -29
  207. package/src/stores/dataCube/core/DataCubeQuerySnapshotManager.ts +9 -2
  208. package/src/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.ts +6 -5
  209. package/src/stores/dataCube/editor/DataCubeEditorCodePanelState.ts +5 -2
  210. package/src/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.ts +96 -0
  211. package/src/stores/dataCube/editor/DataCubeEditorColumnsSelectorState.ts +12 -0
  212. package/src/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.ts +31 -28
  213. package/src/stores/dataCube/editor/DataCubeEditorHPivotPanelState.ts +43 -0
  214. package/src/stores/dataCube/editor/DataCubeEditorPanelState.ts +1 -1
  215. package/src/stores/dataCube/editor/DataCubeEditorSortsPanelState.ts +92 -25
  216. package/src/stores/dataCube/editor/DataCubeEditorState.ts +32 -18
  217. package/src/stores/dataCube/editor/DataCubeMutableConfiguration.ts +641 -0
  218. package/src/stores/dataCube/grid/DataCubeGridClientEngine.ts +88 -3
  219. package/src/stores/dataCube/grid/DataCubeGridQueryBuilder.ts +0 -10
  220. package/src/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.tsx +494 -45
  221. package/src/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.ts +16 -36
  222. package/src/stores/dataCube/grid/DataCubeGridState.ts +73 -20
  223. package/tsconfig.json +13 -3
  224. package/lib/stores/dataCube/DataCubeDefaultConfig.d.ts.map +0 -1
  225. package/lib/stores/dataCube/DataCubeDefaultConfig.js.map +0 -1
  226. package/lib/stores/dataCube/REPLStore.d.ts.map +0 -1
  227. package/lib/stores/dataCube/REPLStore.js.map +0 -1
  228. package/lib/stores/dataCube/core/DataCubeEngine.d.ts.map +0 -1
  229. package/lib/stores/dataCube/core/DataCubeEngine.js.map +0 -1
@@ -18,21 +18,23 @@ import { DataCubeIcon } from '@finos/legend-art';
18
18
  import { observer } from 'mobx-react-lite';
19
19
  import { useREPLStore } from '../../REPLStoreProvider.js';
20
20
  import { useEffect } from 'react';
21
+ import { WIP_Badge } from './DataCubeEditorShared.js';
21
22
 
22
23
  export const DataCubeEditorHPivotsPanel = observer(() => {
23
24
  const replStore = useREPLStore();
24
- const panel = replStore.dataCubeState.editor.sortsPanel;
25
+ const panel = replStore.dataCube.editor.sorts;
25
26
 
26
27
  useEffect(() => {}, [panel]); // TODO: @akphi - remove this dummy useEffect
27
28
 
28
29
  return (
29
- <div className="data-cube-column-selector h-full w-full p-2">
30
+ <div className="h-full w-full select-none p-2">
30
31
  <div className="flex h-6">
31
32
  <div className="flex h-6 items-center text-xl font-medium">
32
33
  <DataCubeIcon.TablePivot />
33
34
  </div>
34
35
  <div className="ml-1 flex h-6 items-center text-xl font-medium">
35
36
  Horizontal Pivots
37
+ <WIP_Badge />
36
38
  </div>
37
39
  </div>
38
40
  <div className="flex h-[calc(100%_-_24px)] w-full"></div>
@@ -0,0 +1,484 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ BasePopover,
19
+ Checkbox,
20
+ cn,
21
+ DataCubeIcon,
22
+ DropdownMenu,
23
+ DropdownMenuItem,
24
+ HexAlphaColorPicker,
25
+ HexColorInput,
26
+ parseColor,
27
+ TailwindCSSPalette,
28
+ type CheckboxProps,
29
+ type DropdownMenuItemProps,
30
+ type DropdownMenuProps,
31
+ type TailwindCSSColorScale,
32
+ type TailwindCSSColorScaleKey,
33
+ } from '@finos/legend-art';
34
+ import { toNumber } from '@finos/legend-shared';
35
+ import React, { forwardRef, useEffect, useState } from 'react';
36
+
37
+ export function WIP_Badge() {
38
+ return (
39
+ <div
40
+ className="text-2xs ml-1 select-none rounded-md bg-sky-500 px-1 py-0.5 font-semibold text-white"
41
+ title="Work In Progress"
42
+ >
43
+ WIP
44
+ </div>
45
+ );
46
+ }
47
+
48
+ export function Advanced_Badge() {
49
+ return (
50
+ <div
51
+ className="text-2xs ml-1 select-none rounded-md bg-amber-500 px-1 py-0.5 font-semibold text-white"
52
+ title="Advanced: Becareful when using this feature!"
53
+ >
54
+ ADV
55
+ </div>
56
+ );
57
+ }
58
+
59
+ export const DataCubeEditorNumberInput = forwardRef(
60
+ function DataCubeEditorBaseNumberInput(
61
+ props: React.InputHTMLAttributes<HTMLInputElement> & {
62
+ min?: number | undefined;
63
+ max?: number | undefined;
64
+ step?: number | undefined;
65
+ isValid?: (value: number | undefined) => boolean;
66
+ isDecimal?: boolean | undefined;
67
+ defaultValue?: number | undefined;
68
+ value: number | undefined;
69
+ setValue: (value?: number | undefined) => void;
70
+ className?: string | undefined;
71
+ },
72
+ ref: React.Ref<HTMLInputElement>,
73
+ ) {
74
+ const {
75
+ min,
76
+ max,
77
+ step,
78
+ value,
79
+ setValue,
80
+ isValid,
81
+ isDecimal,
82
+ defaultValue,
83
+ disabled,
84
+ className,
85
+ } = props;
86
+ const [inputValue, setInputValue] = useState<string | number>(value ?? '');
87
+
88
+ useEffect(() => {
89
+ setInputValue(value ?? '');
90
+ }, [value]);
91
+
92
+ return (
93
+ <input
94
+ className={cn(
95
+ 'h-5 flex-shrink-0 border border-neutral-400 px-1.5 text-sm disabled:border-neutral-300 disabled:bg-neutral-50 disabled:text-neutral-300',
96
+ className,
97
+ )}
98
+ ref={ref}
99
+ inputMode="numeric"
100
+ type="number"
101
+ min={min}
102
+ max={max}
103
+ step={step}
104
+ value={inputValue}
105
+ disabled={Boolean(disabled)}
106
+ onChange={(event) => {
107
+ const newInputValue = event.target.value;
108
+ setInputValue(newInputValue);
109
+ const numericValue = isDecimal
110
+ ? toNumber(newInputValue)
111
+ : parseInt(newInputValue, 10);
112
+ if (
113
+ isNaN(numericValue) ||
114
+ // NOTE: `toNumber` parses empty string as `0`, which is not what we want, so we want to do the explicit check here
115
+ !newInputValue ||
116
+ (isValid !== undefined
117
+ ? !isValid(numericValue)
118
+ : (min !== undefined && numericValue < min) ||
119
+ (max !== undefined && numericValue > max))
120
+ ) {
121
+ return;
122
+ }
123
+ setValue(numericValue);
124
+ }}
125
+ onBlur={() => {
126
+ const numericValue = isDecimal
127
+ ? toNumber(inputValue)
128
+ : parseInt(inputValue.toString(), 10);
129
+ if (
130
+ isNaN(numericValue) ||
131
+ // NOTE: `toNumber` parses empty string as `0`, which is not what we want, so we want to do the explicit check here
132
+ !inputValue ||
133
+ (isValid !== undefined
134
+ ? !isValid(numericValue)
135
+ : (min !== undefined && numericValue < min) ||
136
+ (max !== undefined && numericValue > max))
137
+ ) {
138
+ setValue(defaultValue);
139
+ setInputValue(defaultValue ?? '');
140
+ } else {
141
+ setInputValue(value ?? '');
142
+ }
143
+ }}
144
+ />
145
+ );
146
+ },
147
+ );
148
+
149
+ export function DataCubeEditorTextInput(
150
+ props: React.InputHTMLAttributes<HTMLInputElement>,
151
+ ) {
152
+ const { className, ...otherProps } = props;
153
+ return (
154
+ <input
155
+ className={cn(
156
+ 'h-5 flex-shrink-0 border border-neutral-400 px-1.5 text-sm disabled:border-neutral-300 disabled:bg-neutral-50 disabled:text-neutral-300',
157
+ className,
158
+ )}
159
+ {...otherProps}
160
+ />
161
+ );
162
+ }
163
+
164
+ export function DataCubeEditorCheckbox(
165
+ props: CheckboxProps & {
166
+ label?: React.ReactNode;
167
+ onChange: () => void;
168
+ },
169
+ ) {
170
+ const { label, className, onChange, disabled, ...otherProps } = props;
171
+ return (
172
+ <>
173
+ <Checkbox
174
+ icon={<DataCubeIcon.Checkbox />}
175
+ checkedIcon={<DataCubeIcon.CheckboxSelected />}
176
+ disableRipple={true}
177
+ classes={{
178
+ root: cn(
179
+ // Make sure the icons used have consistent stroke width with other components' borders
180
+ // and that the left side is offseted to align well with other components
181
+ 'p-0 text-neutral-600 [&_*]:stroke-[1.5px] -ml-[1px]',
182
+ className,
183
+ ),
184
+ checked: 'data-cube-editor-checkbox--checked',
185
+ disabled: 'data-cube-editor-checkbox--disabled',
186
+ }}
187
+ onChange={onChange}
188
+ disabled={disabled}
189
+ {...otherProps}
190
+ />
191
+ {Boolean(label) && (
192
+ <button
193
+ className="flex-shrink-0 pl-1 text-sm disabled:text-neutral-300"
194
+ onClick={onChange}
195
+ disabled={disabled}
196
+ tabIndex={-1}
197
+ >
198
+ {label}
199
+ </button>
200
+ )}
201
+ </>
202
+ );
203
+ }
204
+
205
+ export function DataCubeEditorDropdownMenuTrigger(
206
+ props: React.ButtonHTMLAttributes<HTMLButtonElement>,
207
+ ) {
208
+ const { children, className, ...otherProps } = props;
209
+ return (
210
+ <button
211
+ className={cn(
212
+ 'group flex h-5 flex-shrink-0 items-center justify-between border border-neutral-400 pl-1.5 text-sm disabled:select-none disabled:border-neutral-300 disabled:bg-neutral-50 disabled:text-neutral-300',
213
+ className,
214
+ )}
215
+ {...otherProps}
216
+ >
217
+ <div className="w-[calc(100%_-_12px)] overflow-hidden overflow-ellipsis whitespace-nowrap text-left">
218
+ {props.children}
219
+ </div>
220
+ <div className="flex h-full w-3 items-center justify-center text-neutral-500 group-disabled:text-neutral-400">
221
+ <DataCubeIcon.CaretDown />
222
+ </div>
223
+ </button>
224
+ );
225
+ }
226
+
227
+ export function DataCubeEditorDropdownMenu(props: DropdownMenuProps) {
228
+ const { className, ...otherProps } = props;
229
+ return (
230
+ <DropdownMenu
231
+ {...otherProps}
232
+ menuProps={{
233
+ classes: {
234
+ paper: 'rounded-none mt-[1px]',
235
+ list: cn(
236
+ 'p-0 rounded-none border border-neutral-400 bg-white max-h-40 overflow-y-auto',
237
+ className,
238
+ ),
239
+ },
240
+ }}
241
+ />
242
+ );
243
+ }
244
+
245
+ export function DataCubeEditorDropdownMenuItem(props: DropdownMenuItemProps) {
246
+ const { className, ...otherProps } = props;
247
+ return (
248
+ <DropdownMenuItem
249
+ className={cn(
250
+ 'flex h-5 w-full items-center px-1.5 text-sm hover:bg-neutral-100 focus-visible:bg-neutral-100',
251
+ className,
252
+ )}
253
+ {...otherProps}
254
+ />
255
+ );
256
+ }
257
+
258
+ export function DataCubeEditorDropdownMenuItemSeparator() {
259
+ return <div className="my-0.5 h-[1px] w-full bg-neutral-200" />;
260
+ }
261
+
262
+ function DataCubeEditorColorPicker(props: {
263
+ color: string;
264
+ onChange: (value: string) => void;
265
+ onClose: () => void;
266
+ defaultColor?: string | undefined;
267
+ }) {
268
+ const { onChange, onClose, defaultColor } = props;
269
+ const [color, setColor] = useState(props.color);
270
+ const submit = () => {
271
+ onChange(
272
+ // if color is completely transparent, set it to #00000000
273
+ parseColor(color).alpha === 0 ? TailwindCSSPalette.transparent : color,
274
+ );
275
+ onClose();
276
+ };
277
+
278
+ return (
279
+ <div className="data-cube-color-picker rounded-none border border-neutral-400 bg-white">
280
+ <div className="p-2">
281
+ <HexAlphaColorPicker color={color} onChange={setColor} />
282
+ </div>
283
+ <div className="flex justify-center px-2">
284
+ {(
285
+ [
286
+ 'slate',
287
+ 'neutral',
288
+ 'red',
289
+ 'orange',
290
+ 'amber',
291
+ 'yellow',
292
+ 'lime',
293
+ 'green',
294
+ 'emerald',
295
+ 'teal',
296
+ 'sky',
297
+ 'blue',
298
+ 'indigo',
299
+ 'violet',
300
+ 'purple',
301
+ 'fuchsia',
302
+ 'pink',
303
+ 'rose',
304
+ ] as TailwindCSSColorScaleKey[]
305
+ ).map((scale) => (
306
+ <div
307
+ key={scale}
308
+ className="mr-0.5 flex flex-col border-[0.5px] border-neutral-300 last:mr-0"
309
+ >
310
+ {(
311
+ [
312
+ 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950,
313
+ ] as (keyof TailwindCSSColorScale)[]
314
+ ).map((level) => (
315
+ <button
316
+ key={`${scale}-${level}`}
317
+ className="h-3 w-3 flex-shrink-0"
318
+ style={{
319
+ background: TailwindCSSPalette[scale][level],
320
+ }}
321
+ onClick={() => {
322
+ setColor(TailwindCSSPalette[scale][level]);
323
+ }}
324
+ onDoubleClick={() => {
325
+ setColor(TailwindCSSPalette[scale][level]);
326
+ submit();
327
+ }}
328
+ />
329
+ ))}
330
+ </div>
331
+ ))}
332
+ </div>
333
+ <div className="flex justify-center px-2 pb-1 pt-0.5">
334
+ <div className="flex">
335
+ {[
336
+ // Colors from Better Colors - https://clrs.cc/
337
+ TailwindCSSPalette.transparent,
338
+ '#000000',
339
+ '#aaaaaa',
340
+ '#dddddd',
341
+ '#ffffff',
342
+ '#ff4136',
343
+ '#ff851b',
344
+ '#ffdc00',
345
+ '#01ff70',
346
+ '#2ecc40',
347
+ '#3d9970',
348
+ '#39cccc',
349
+ '#7fdbff',
350
+ '#0074d9',
351
+ '#001f3f',
352
+ '#b10dc9',
353
+ '#f012be',
354
+ '#85144b',
355
+ ].map((_color) => (
356
+ <div
357
+ key={_color}
358
+ className={cn(
359
+ 'mr-0.5 border-[0.5px] border-neutral-300 last:mr-0',
360
+ {
361
+ 'data-cube-color-picker--transparent border-neutral-400':
362
+ _color === TailwindCSSPalette.transparent,
363
+ },
364
+ )}
365
+ >
366
+ <button
367
+ className="flex h-3 w-3 flex-shrink-0"
368
+ style={{
369
+ background: _color,
370
+ }}
371
+ onClick={() => {
372
+ setColor(_color);
373
+ }}
374
+ onDoubleClick={() => {
375
+ setColor(_color);
376
+ submit();
377
+ }}
378
+ />
379
+ </div>
380
+ ))}
381
+ </div>
382
+ </div>
383
+ <div className="h-[1px] w-full bg-neutral-200" />
384
+ <div className="flex h-6 items-center justify-between p-1">
385
+ <div className="flex">
386
+ <div
387
+ className="h-4 w-4 flex-shrink-0 rounded-sm border-[0.5px] border-neutral-300"
388
+ style={{ background: color }}
389
+ />
390
+ <HexColorInput
391
+ className="ml-0.5 h-4 w-14 border border-neutral-400 px-1 text-sm"
392
+ color={color}
393
+ autoFocus={true}
394
+ tabIndex={0}
395
+ onChange={setColor}
396
+ prefix="#"
397
+ alpha={true}
398
+ />
399
+ </div>
400
+ <div className="flex">
401
+ {defaultColor !== undefined && (
402
+ <button
403
+ className="ml-1 h-4 w-9 border border-neutral-400 bg-neutral-300 px-1 text-xs hover:brightness-95"
404
+ onClick={() => {
405
+ setColor(defaultColor);
406
+ }}
407
+ >
408
+ Reset
409
+ </button>
410
+ )}
411
+ <button
412
+ className="ml-1 h-4 w-9 border border-neutral-400 bg-neutral-300 px-1 text-xs hover:brightness-95"
413
+ onClick={() => {
414
+ onClose();
415
+ }}
416
+ >
417
+ Cancel
418
+ </button>
419
+ <button
420
+ className="ml-1 h-4 w-9 border border-neutral-400 bg-neutral-300 px-1 text-xs hover:brightness-95"
421
+ onClick={() => {
422
+ submit();
423
+ }}
424
+ >
425
+ OK
426
+ </button>
427
+ </div>
428
+ </div>
429
+ </div>
430
+ );
431
+ }
432
+
433
+ export function DataCubeEditorColorPickerButton(props: {
434
+ color: string;
435
+ onChange: (value: string) => void;
436
+ className?: string | undefined;
437
+ disabled?: boolean | undefined;
438
+ defaultColor?: string | undefined;
439
+ }) {
440
+ const { color, onChange, className, disabled, defaultColor } = props;
441
+ const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
442
+ return (
443
+ <>
444
+ <button
445
+ className={cn(
446
+ 'group h-5 w-10 border border-neutral-300 p-[1px] disabled:border-neutral-200',
447
+ {
448
+ 'data-cube-color-picker--disabled': Boolean(disabled),
449
+ 'data-cube-color-picker--transparent':
450
+ !disabled && color === TailwindCSSPalette.transparent,
451
+ },
452
+ className,
453
+ )}
454
+ onClick={(event) => {
455
+ setAnchorEl(event.currentTarget);
456
+ }}
457
+ disabled={disabled}
458
+ >
459
+ <div
460
+ className="h-full w-full group-disabled:hidden"
461
+ style={{
462
+ background: color,
463
+ }}
464
+ />
465
+ </button>
466
+ {Boolean(anchorEl) && (
467
+ <BasePopover
468
+ open={Boolean(anchorEl)}
469
+ anchorEl={anchorEl}
470
+ anchorOrigin={{ vertical: 'center', horizontal: 'right' }}
471
+ transformOrigin={{ vertical: 'center', horizontal: 'left' }}
472
+ onClose={() => setAnchorEl(null)}
473
+ >
474
+ <DataCubeEditorColorPicker
475
+ color={color}
476
+ onChange={onChange}
477
+ onClose={() => setAnchorEl(null)}
478
+ defaultColor={defaultColor}
479
+ />
480
+ </BasePopover>
481
+ )}
482
+ </>
483
+ );
484
+ }
@@ -15,16 +15,112 @@
15
15
  */
16
16
 
17
17
  import { observer } from 'mobx-react-lite';
18
- import { DataCubeIcon } from '@finos/legend-art';
18
+ import {
19
+ DataCubeIcon,
20
+ useDropdownMenu,
21
+ DropdownMenuItem,
22
+ DropdownMenu,
23
+ } from '@finos/legend-art';
19
24
  import { useREPLStore } from '../../REPLStoreProvider.js';
20
25
  import { DataCubeEditorColumnsSelector } from './DataCubeEditorColumnsSelector.js';
26
+ import type { DataCubeEditorColumnsSelectorState } from '../../../stores/dataCube/editor/DataCubeEditorColumnsSelectorState.js';
27
+ import type { DataCubeEditorSortColumnState } from '../../../stores/dataCube/editor/DataCubeEditorSortsPanelState.js';
28
+ import { DataCubeQuerySnapshotSortOperation } from '../../../stores/dataCube/core/DataCubeQuerySnapshot.js';
29
+ import { IllegalStateError } from '@finos/legend-shared';
30
+ import { WIP_Badge } from './DataCubeEditorShared.js';
31
+
32
+ function getSortDirectionLabel(operation: DataCubeQuerySnapshotSortOperation) {
33
+ switch (operation) {
34
+ case DataCubeQuerySnapshotSortOperation.ASCENDING:
35
+ return 'Ascending';
36
+ case DataCubeQuerySnapshotSortOperation.DESCENDING:
37
+ return 'Descending';
38
+ default:
39
+ throw new IllegalStateError(`Unsupported sort operation '${operation}'`);
40
+ }
41
+ }
42
+
43
+ const SortDirectionDropdown = observer(
44
+ (props: {
45
+ selector: DataCubeEditorColumnsSelectorState<DataCubeEditorSortColumnState>;
46
+ column: DataCubeEditorSortColumnState;
47
+ }) => {
48
+ const { column } = props;
49
+ const [openMenu, closeMenu, menuProps] = useDropdownMenu();
50
+
51
+ return (
52
+ <div className="group relative flex h-full items-center">
53
+ <div className="flex h-[18px] w-32 items-center border border-transparent px-2 text-sm text-neutral-500 group-hover:invisible">
54
+ {getSortDirectionLabel(column.operation)}
55
+ </div>
56
+ <button
57
+ className="invisible absolute right-0 z-10 flex h-[18px] w-32 items-center justify-between border border-neutral-500 pl-2 pr-0.5 text-sm text-neutral-700 group-hover:visible"
58
+ /**
59
+ * ag-grid row select event listener is at a deeper layer than this dropdown trigger
60
+ * so in order to prevent selecting the row while opening the dropdown, we need to stop
61
+ * the propagation as event capturing is happening, not when it's bubbling.
62
+ */
63
+ onClickCapture={(event) => {
64
+ event.stopPropagation();
65
+ openMenu(event);
66
+ }}
67
+ onClick={(event) => event.stopPropagation()}
68
+ >
69
+ <div>{getSortDirectionLabel(column.operation)}</div>
70
+ <div>
71
+ <DataCubeIcon.CaretDown />
72
+ </div>
73
+ </button>
74
+ <DropdownMenu
75
+ className="w-32 select-none border border-neutral-300 bg-white"
76
+ {...menuProps}
77
+ >
78
+ <DropdownMenuItem
79
+ className="flex h-5 items-center px-2 text-sm hover:bg-neutral-100"
80
+ onClick={() => {
81
+ column.setOperation(DataCubeQuerySnapshotSortOperation.ASCENDING);
82
+ closeMenu();
83
+ }}
84
+ >
85
+ Ascending
86
+ </DropdownMenuItem>
87
+ <DropdownMenuItem
88
+ className="flex h-5 items-center px-2 text-sm text-neutral-400"
89
+ disabled={true}
90
+ >
91
+ {`Ascending (abs)`}
92
+ <WIP_Badge />
93
+ </DropdownMenuItem>
94
+ <DropdownMenuItem
95
+ className="flex h-5 items-center px-2 text-sm hover:bg-neutral-100"
96
+ onClick={() => {
97
+ column.setOperation(
98
+ DataCubeQuerySnapshotSortOperation.DESCENDING,
99
+ );
100
+ closeMenu();
101
+ }}
102
+ >
103
+ Descending
104
+ </DropdownMenuItem>
105
+ <DropdownMenuItem
106
+ className="flex h-5 items-center px-2 text-sm text-neutral-400"
107
+ disabled={true}
108
+ >
109
+ {`Descending (abs)`}
110
+ <WIP_Badge />
111
+ </DropdownMenuItem>
112
+ </DropdownMenu>
113
+ </div>
114
+ );
115
+ },
116
+ );
21
117
 
22
118
  export const DataCubeEditorSortsPanel = observer(() => {
23
119
  const replStore = useREPLStore();
24
- const panel = replStore.dataCubeState.editor.sortsPanel;
120
+ const panel = replStore.dataCube.editor.sorts;
25
121
 
26
122
  return (
27
- <div className="data-cube-column-selector h-full w-full p-2">
123
+ <div className="h-full w-full select-none p-2">
28
124
  <div className="flex h-6">
29
125
  <div className="flex h-6 items-center text-xl font-medium">
30
126
  <DataCubeIcon.TableSort />
@@ -34,7 +130,10 @@ export const DataCubeEditorSortsPanel = observer(() => {
34
130
  </div>
35
131
  </div>
36
132
  <div className="flex h-[calc(100%_-_24px)] w-full">
37
- <DataCubeEditorColumnsSelector selector={panel.columnsSelector} />
133
+ <DataCubeEditorColumnsSelector
134
+ selector={panel.columnsSelector}
135
+ extraColumnComponent={(props) => <SortDirectionDropdown {...props} />}
136
+ />
38
137
  </div>
39
138
  </div>
40
139
  );
@@ -18,21 +18,23 @@ import { DataCubeIcon } from '@finos/legend-art';
18
18
  import { observer } from 'mobx-react-lite';
19
19
  import { useREPLStore } from '../../REPLStoreProvider.js';
20
20
  import { useEffect } from 'react';
21
+ import { WIP_Badge } from './DataCubeEditorShared.js';
21
22
 
22
23
  export const DataCubeEditorVPivotsPanel = observer(() => {
23
24
  const replStore = useREPLStore();
24
- const panel = replStore.dataCubeState.editor.sortsPanel;
25
+ const panel = replStore.dataCube.editor.sorts;
25
26
 
26
27
  useEffect(() => {}, [panel]); // TODO: @akphi - remove this dummy useEffect
27
28
 
28
29
  return (
29
- <div className="data-cube-column-selector h-full w-full p-2">
30
+ <div className="h-full w-full select-none p-2">
30
31
  <div className="flex h-6">
31
32
  <div className="flex h-6 items-center text-xl font-medium">
32
33
  <DataCubeIcon.TableGroupBy />
33
34
  </div>
34
35
  <div className="ml-1 flex h-6 items-center text-xl font-medium">
35
36
  Vertical Pivots
37
+ <WIP_Badge />
36
38
  </div>
37
39
  </div>
38
40
  <div className="flex h-[calc(100%_-_24px)] w-full"></div>