@finos/legend-data-cube 0.1.11 → 0.1.13

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 (175) hide show
  1. package/lib/components/DataCubePlaceholder.d.ts.map +1 -1
  2. package/lib/components/DataCubePlaceholder.js +2 -1
  3. package/lib/components/DataCubePlaceholder.js.map +1 -1
  4. package/lib/components/core/DataCubePureCodeEditorUtils.d.ts +2 -1
  5. package/lib/components/core/DataCubePureCodeEditorUtils.d.ts.map +1 -1
  6. package/lib/components/core/DataCubePureCodeEditorUtils.js.map +1 -1
  7. package/lib/components/view/editor/DataCubeEditor.d.ts.map +1 -1
  8. package/lib/components/view/editor/DataCubeEditor.js +4 -2
  9. package/lib/components/view/editor/DataCubeEditor.js.map +1 -1
  10. package/lib/components/view/editor/DataCubeEditorColumnsPanel.d.ts.map +1 -1
  11. package/lib/components/view/editor/DataCubeEditorColumnsPanel.js +3 -3
  12. package/lib/components/view/editor/DataCubeEditorColumnsPanel.js.map +1 -1
  13. package/lib/components/view/editor/DataCubeEditorColumnsSelector.d.ts +47 -0
  14. package/lib/components/view/editor/DataCubeEditorColumnsSelector.d.ts.map +1 -0
  15. package/lib/components/view/editor/{DataCubeEditorColumnSelector.js → DataCubeEditorColumnsSelector.js} +70 -55
  16. package/lib/components/view/editor/DataCubeEditorColumnsSelector.js.map +1 -0
  17. package/lib/components/view/editor/DataCubeEditorDimensionsPanel.d.ts +3 -13
  18. package/lib/components/view/editor/DataCubeEditorDimensionsPanel.d.ts.map +1 -1
  19. package/lib/components/view/editor/DataCubeEditorDimensionsPanel.js +707 -264
  20. package/lib/components/view/editor/DataCubeEditorDimensionsPanel.js.map +1 -1
  21. package/lib/components/view/editor/DataCubeEditorHorizontalPivotsPanel.js +2 -2
  22. package/lib/components/view/editor/DataCubeEditorHorizontalPivotsPanel.js.map +1 -1
  23. package/lib/components/view/editor/DataCubeEditorSortsPanel.js +2 -2
  24. package/lib/components/view/editor/DataCubeEditorSortsPanel.js.map +1 -1
  25. package/lib/components/view/editor/DataCubeEditorVerticalPivotsPanel.js +2 -2
  26. package/lib/components/view/editor/DataCubeEditorVerticalPivotsPanel.js.map +1 -1
  27. package/lib/components/view/{grid/DataCubeGridShared.d.ts → extend/DataCubeCodeEditor.d.ts} +7 -3
  28. package/lib/components/view/extend/DataCubeCodeEditor.d.ts.map +1 -0
  29. package/lib/components/view/extend/DataCubeCodeEditor.js +114 -0
  30. package/lib/components/view/extend/DataCubeCodeEditor.js.map +1 -0
  31. package/lib/components/view/extend/DataCubeCodeEditorState.d.ts +43 -0
  32. package/lib/components/view/extend/DataCubeCodeEditorState.d.ts.map +1 -0
  33. package/lib/components/view/extend/DataCubeCodeEditorState.js +37 -0
  34. package/lib/components/view/extend/DataCubeCodeEditorState.js.map +1 -0
  35. package/lib/components/view/extend/DataCubeColumnEditor.d.ts.map +1 -1
  36. package/lib/components/view/extend/DataCubeColumnEditor.js +5 -84
  37. package/lib/components/view/extend/DataCubeColumnEditor.js.map +1 -1
  38. package/lib/components/view/grid/DataCubeGrid.d.ts +2 -1
  39. package/lib/components/view/grid/DataCubeGrid.d.ts.map +1 -1
  40. package/lib/components/view/grid/DataCubeGrid.js +29 -19
  41. package/lib/components/view/grid/DataCubeGrid.js.map +1 -1
  42. package/lib/components/view/grid/DataCubeMultidimensionalGrid.d.ts +1 -1
  43. package/lib/components/view/grid/DataCubeMultidimensionalGrid.d.ts.map +1 -1
  44. package/lib/components/view/grid/DataCubeMultidimensionalGrid.js +2 -1
  45. package/lib/components/view/grid/DataCubeMultidimensionalGrid.js.map +1 -1
  46. package/lib/index.css +2 -2
  47. package/lib/index.css.map +1 -1
  48. package/lib/index.d.ts +3 -0
  49. package/lib/index.d.ts.map +1 -1
  50. package/lib/index.js +3 -0
  51. package/lib/index.js.map +1 -1
  52. package/lib/package.json +1 -1
  53. package/lib/stores/DataCubeAPI.d.ts.map +1 -1
  54. package/lib/stores/DataCubeAPI.js +3 -1
  55. package/lib/stores/DataCubeAPI.js.map +1 -1
  56. package/lib/stores/core/DataCubeEngine.d.ts +1 -1
  57. package/lib/stores/core/DataCubeEngine.d.ts.map +1 -1
  58. package/lib/stores/core/DataCubeQueryEngine.d.ts +5 -0
  59. package/lib/stores/core/DataCubeQueryEngine.d.ts.map +1 -1
  60. package/lib/stores/core/DataCubeQueryEngine.js +6 -0
  61. package/lib/stores/core/DataCubeQueryEngine.js.map +1 -1
  62. package/lib/stores/core/DataCubeSnapshot.d.ts +1 -1
  63. package/lib/stores/core/DataCubeSnapshot.d.ts.map +1 -1
  64. package/lib/stores/core/model/AdhocQueryDataCubeSource.d.ts +2 -0
  65. package/lib/stores/core/model/AdhocQueryDataCubeSource.d.ts.map +1 -1
  66. package/lib/stores/core/model/AdhocQueryDataCubeSource.js +3 -0
  67. package/lib/stores/core/model/AdhocQueryDataCubeSource.js.map +1 -1
  68. package/lib/stores/core/model/DataCubeConfiguration.d.ts +11 -0
  69. package/lib/stores/core/model/DataCubeConfiguration.d.ts.map +1 -1
  70. package/lib/stores/core/model/DataCubeConfiguration.js +19 -1
  71. package/lib/stores/core/model/DataCubeConfiguration.js.map +1 -1
  72. package/lib/stores/services/DataCubeSettingService.d.ts.map +1 -1
  73. package/lib/stores/services/DataCubeSettingService.js +10 -6
  74. package/lib/stores/services/DataCubeSettingService.js.map +1 -1
  75. package/lib/stores/view/DataCubeInfoState.d.ts +2 -0
  76. package/lib/stores/view/DataCubeInfoState.d.ts.map +1 -1
  77. package/lib/stores/view/DataCubeInfoState.js +3 -0
  78. package/lib/stores/view/DataCubeInfoState.js.map +1 -1
  79. package/lib/stores/view/editor/DataCubeEditorColumnsPanelState.d.ts +8 -8
  80. package/lib/stores/view/editor/DataCubeEditorColumnsPanelState.d.ts.map +1 -1
  81. package/lib/stores/view/editor/DataCubeEditorColumnsPanelState.js +6 -6
  82. package/lib/stores/view/editor/DataCubeEditorColumnsPanelState.js.map +1 -1
  83. package/lib/stores/view/editor/{DataCubeEditorColumnSelectorState.d.ts → DataCubeEditorColumnsSelectorState.d.ts} +6 -6
  84. package/lib/stores/view/editor/DataCubeEditorColumnsSelectorState.d.ts.map +1 -0
  85. package/lib/stores/view/editor/{DataCubeEditorColumnSelectorState.js → DataCubeEditorColumnsSelectorState.js} +4 -4
  86. package/lib/stores/view/editor/DataCubeEditorColumnsSelectorState.js.map +1 -0
  87. package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.d.ts +29 -6
  88. package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.d.ts.map +1 -1
  89. package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.js +102 -39
  90. package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.js.map +1 -1
  91. package/lib/stores/view/editor/DataCubeEditorHorizontalPivotsPanelState.d.ts +5 -5
  92. package/lib/stores/view/editor/DataCubeEditorHorizontalPivotsPanelState.d.ts.map +1 -1
  93. package/lib/stores/view/editor/DataCubeEditorHorizontalPivotsPanelState.js +7 -6
  94. package/lib/stores/view/editor/DataCubeEditorHorizontalPivotsPanelState.js.map +1 -1
  95. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.d.ts +2 -1
  96. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.d.ts.map +1 -1
  97. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.js +5 -0
  98. package/lib/stores/view/editor/DataCubeEditorMutableConfiguration.js.map +1 -1
  99. package/lib/stores/view/editor/DataCubeEditorSortsPanelState.d.ts +5 -5
  100. package/lib/stores/view/editor/DataCubeEditorSortsPanelState.d.ts.map +1 -1
  101. package/lib/stores/view/editor/DataCubeEditorSortsPanelState.js +6 -6
  102. package/lib/stores/view/editor/DataCubeEditorSortsPanelState.js.map +1 -1
  103. package/lib/stores/view/editor/DataCubeEditorState.d.ts +3 -0
  104. package/lib/stores/view/editor/DataCubeEditorState.d.ts.map +1 -1
  105. package/lib/stores/view/editor/DataCubeEditorState.js +6 -0
  106. package/lib/stores/view/editor/DataCubeEditorState.js.map +1 -1
  107. package/lib/stores/view/editor/DataCubeEditorVerticalPivotsPanelState.d.ts +5 -5
  108. package/lib/stores/view/editor/DataCubeEditorVerticalPivotsPanelState.d.ts.map +1 -1
  109. package/lib/stores/view/editor/DataCubeEditorVerticalPivotsPanelState.js +6 -6
  110. package/lib/stores/view/editor/DataCubeEditorVerticalPivotsPanelState.js.map +1 -1
  111. package/lib/stores/view/extend/DataCubeColumnEditorState.d.ts +7 -14
  112. package/lib/stores/view/extend/DataCubeColumnEditorState.d.ts.map +1 -1
  113. package/lib/stores/view/extend/DataCubeColumnEditorState.js +14 -22
  114. package/lib/stores/view/extend/DataCubeColumnEditorState.js.map +1 -1
  115. package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts +2 -1
  116. package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts.map +1 -1
  117. package/lib/stores/view/grid/DataCubeGridClientEngine.js +7 -0
  118. package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
  119. package/lib/stores/view/grid/DataCubeGridClientExportEngine.js +1 -1
  120. package/lib/stores/view/grid/DataCubeGridClientExportEngine.js.map +1 -1
  121. package/lib/stores/view/grid/DataCubeGridMenuBuilder.d.ts +2 -0
  122. package/lib/stores/view/grid/DataCubeGridMenuBuilder.d.ts.map +1 -1
  123. package/lib/stores/view/grid/DataCubeGridMenuBuilder.js +9 -16
  124. package/lib/stores/view/grid/DataCubeGridMenuBuilder.js.map +1 -1
  125. package/lib/stores/view/grid/DataCubeGridState.d.ts +2 -2
  126. package/lib/stores/view/grid/DataCubeGridState.d.ts.map +1 -1
  127. package/lib/stores/view/grid/DataCubeGridState.js +19 -6
  128. package/lib/stores/view/grid/DataCubeGridState.js.map +1 -1
  129. package/package.json +5 -5
  130. package/src/components/DataCubePlaceholder.tsx +2 -0
  131. package/src/components/core/DataCubePureCodeEditorUtils.tsx +2 -1
  132. package/src/components/view/editor/DataCubeEditor.tsx +8 -3
  133. package/src/components/view/editor/DataCubeEditorColumnsPanel.tsx +6 -8
  134. package/src/components/view/editor/{DataCubeEditorColumnSelector.tsx → DataCubeEditorColumnsSelector.tsx} +108 -83
  135. package/src/components/view/editor/DataCubeEditorDimensionsPanel.tsx +1259 -503
  136. package/src/components/view/editor/DataCubeEditorHorizontalPivotsPanel.tsx +5 -5
  137. package/src/components/view/editor/DataCubeEditorSortsPanel.tsx +10 -10
  138. package/src/components/view/editor/DataCubeEditorVerticalPivotsPanel.tsx +2 -2
  139. package/src/components/view/extend/DataCubeCodeEditor.tsx +175 -0
  140. package/src/components/view/extend/DataCubeCodeEditorState.tsx +72 -0
  141. package/src/components/view/extend/DataCubeColumnEditor.tsx +5 -133
  142. package/src/components/view/grid/DataCubeGrid.tsx +70 -53
  143. package/src/components/view/grid/DataCubeMultidimensionalGrid.tsx +3 -1
  144. package/src/index.tsx +3 -0
  145. package/src/stores/DataCubeAPI.ts +3 -1
  146. package/src/stores/core/DataCubeEngine.tsx +1 -1
  147. package/src/stores/core/DataCubeQueryEngine.ts +6 -0
  148. package/src/stores/core/DataCubeSnapshot.ts +1 -1
  149. package/src/stores/core/model/AdhocQueryDataCubeSource.ts +3 -0
  150. package/src/stores/core/model/DataCubeConfiguration.ts +31 -0
  151. package/src/stores/services/DataCubeSettingService.tsx +10 -6
  152. package/src/stores/view/DataCubeInfoState.ts +4 -0
  153. package/src/stores/view/editor/DataCubeEditorColumnsPanelState.ts +13 -13
  154. package/src/stores/view/editor/{DataCubeEditorColumnSelectorState.ts → DataCubeEditorColumnsSelectorState.ts} +6 -6
  155. package/src/stores/view/editor/DataCubeEditorDimensionsPanelState.ts +162 -58
  156. package/src/stores/view/editor/DataCubeEditorHorizontalPivotsPanelState.ts +12 -11
  157. package/src/stores/view/editor/DataCubeEditorMutableConfiguration.ts +8 -0
  158. package/src/stores/view/editor/DataCubeEditorSortsPanelState.ts +10 -10
  159. package/src/stores/view/editor/DataCubeEditorState.tsx +6 -0
  160. package/src/stores/view/editor/DataCubeEditorVerticalPivotsPanelState.ts +11 -11
  161. package/src/stores/view/extend/DataCubeColumnEditorState.tsx +16 -26
  162. package/src/stores/view/grid/DataCubeGridClientEngine.ts +8 -0
  163. package/src/stores/view/grid/DataCubeGridClientExportEngine.ts +1 -1
  164. package/src/stores/view/grid/DataCubeGridMenuBuilder.tsx +26 -1
  165. package/src/stores/view/grid/DataCubeGridState.ts +23 -6
  166. package/tsconfig.json +4 -3
  167. package/lib/components/view/editor/DataCubeEditorColumnSelector.d.ts +0 -38
  168. package/lib/components/view/editor/DataCubeEditorColumnSelector.d.ts.map +0 -1
  169. package/lib/components/view/editor/DataCubeEditorColumnSelector.js.map +0 -1
  170. package/lib/components/view/grid/DataCubeGridShared.d.ts.map +0 -1
  171. package/lib/components/view/grid/DataCubeGridShared.js +0 -25
  172. package/lib/components/view/grid/DataCubeGridShared.js.map +0 -1
  173. package/lib/stores/view/editor/DataCubeEditorColumnSelectorState.d.ts.map +0 -1
  174. package/lib/stores/view/editor/DataCubeEditorColumnSelectorState.js.map +0 -1
  175. package/src/components/view/grid/DataCubeGridShared.tsx +0 -42
@@ -14,48 +14,62 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import type { DataCubeConfiguration } from '../../core/model/DataCubeConfiguration.js';
18
- import { DataCubeColumnKind } from '../../core/DataCubeQueryEngine.js';
19
- import { type DataCubeSnapshot } from '../../core/DataCubeSnapshot.js';
20
- import { _findCol } from '../../core/model/DataCubeColumn.js';
21
17
  import {
22
- DataCubeEditorColumnSelectorColumnState,
23
- DataCubeEditorColumnSelectorState,
24
- } from './DataCubeEditorColumnSelectorState.js';
18
+ DataCubeDimensionsConfiguration,
19
+ type DataCubeConfiguration,
20
+ } from '../../core/model/DataCubeConfiguration.js';
21
+ import {
22
+ DataCubeColumnKind,
23
+ DataCubeGridMode,
24
+ } from '../../core/DataCubeQueryEngine.js';
25
+ import { type DataCubeSnapshot } from '../../core/DataCubeSnapshot.js';
26
+ import { _findCol, _sortByColName } from '../../core/model/DataCubeColumn.js';
27
+ import { DataCubeEditorColumnsSelectorColumnState } from './DataCubeEditorColumnsSelectorState.js';
25
28
  import type { DataCubeQueryEditorPanelState } from './DataCubeEditorPanelState.js';
26
29
  import type { DataCubeEditorState } from './DataCubeEditorState.js';
27
30
  import { action, computed, makeObservable, observable } from 'mobx';
31
+ import {
32
+ generateEnumerableNameFromToken,
33
+ guaranteeNonNullable,
34
+ } from '@finos/legend-shared';
28
35
 
29
- export class DataCubeEditorVerticalPivotColumnSelectorState extends DataCubeEditorColumnSelectorState<DataCubeEditorColumnSelectorColumnState> {
30
- override cloneColumn(
31
- column: DataCubeEditorColumnSelectorColumnState,
32
- ): DataCubeEditorColumnSelectorColumnState {
33
- return new DataCubeEditorColumnSelectorColumnState(
34
- column.name,
35
- column.type,
36
- );
36
+ export type DataCubeEditorDimensionsTreeNode = {
37
+ name: string;
38
+ data: DataCubeEditorDimensionState | DataCubeEditorColumnsSelectorColumnState;
39
+ children?: DataCubeEditorDimensionsTreeNode[] | undefined;
40
+ };
41
+
42
+ export class DataCubeEditorDimensionState {
43
+ name: string;
44
+ isRenaming = false;
45
+ columns: DataCubeEditorColumnsSelectorColumnState[] = [];
46
+
47
+ constructor(name: string) {
48
+ makeObservable(this, {
49
+ name: observable,
50
+ setName: action,
51
+
52
+ isRenaming: observable,
53
+ setIsRenaming: action,
54
+
55
+ columns: observable,
56
+ setColumns: action,
57
+ });
58
+
59
+ this.name = name;
37
60
  }
38
61
 
39
- override get availableColumns() {
40
- return this._editor.columnProperties.columns
41
- .filter(
42
- (column) =>
43
- column.kind === DataCubeColumnKind.DIMENSION &&
44
- // exclude group-level extended columns
45
- !_findCol(this._editor.groupExtendColumns, column.name) &&
46
- // exclude pivot columns
47
- !_findCol(
48
- this._editor.horizontalPivots.selector.selectedColumns,
49
- column.name,
50
- ),
51
- )
52
- .map(
53
- (col) =>
54
- new DataCubeEditorColumnSelectorColumnState(col.name, col.type),
55
- );
62
+ setName(name: string) {
63
+ this.name = name;
64
+ }
65
+
66
+ setIsRenaming(val: boolean) {
67
+ this.isRenaming = val;
56
68
  }
57
69
 
58
- //
70
+ setColumns(columns: DataCubeEditorColumnsSelectorColumnState[]) {
71
+ this.columns = columns;
72
+ }
59
73
  }
60
74
 
61
75
  export class DataCubeEditorDimensionsPanelState
@@ -64,14 +78,32 @@ export class DataCubeEditorDimensionsPanelState
64
78
  readonly _editor!: DataCubeEditorState;
65
79
 
66
80
  availableColumnsSearchText = '';
67
- // readonly selector!: DataCubeEditorVerticalPivotColumnSelectorState;
81
+ dimensions: DataCubeEditorDimensionState[] = [];
82
+ dimensionsTreeData: {
83
+ nodes: DataCubeEditorDimensionsTreeNode[];
84
+ } = { nodes: [] };
85
+ dimensionsTreeSearchText = '';
68
86
 
69
87
  constructor(editor: DataCubeEditorState) {
70
88
  makeObservable(this, {
89
+ availableColumns: computed,
90
+ availableColumnsForDisplay: computed,
91
+
71
92
  availableColumnsSearchText: observable,
72
93
  setAvailableColumnsSearchText: action,
73
94
 
74
- availableColumns: computed,
95
+ selectedColumns: computed,
96
+ deselectColumns: action,
97
+
98
+ dimensions: observable,
99
+ setDimensions: action,
100
+ newDimension: action,
101
+
102
+ dimensionsTreeData: observable.ref,
103
+ refreshDimensionsTreeData: action,
104
+
105
+ dimensionsTreeSearchText: observable,
106
+ setDimensionsTreeSearchText: action,
75
107
  });
76
108
 
77
109
  this._editor = editor;
@@ -92,43 +124,115 @@ export class DataCubeEditorDimensionsPanelState
92
124
  )
93
125
  .map(
94
126
  (col) =>
95
- new DataCubeEditorColumnSelectorColumnState(col.name, col.type),
127
+ new DataCubeEditorColumnsSelectorColumnState(col.name, col.type),
96
128
  );
97
129
  }
98
130
 
131
+ get availableColumnsForDisplay() {
132
+ return this.availableColumns
133
+ .filter((column) => !_findCol(this.selectedColumns, column.name))
134
+ .sort(_sortByColName);
135
+ }
136
+
99
137
  setAvailableColumnsSearchText(val: string) {
100
138
  this.availableColumnsSearchText = val;
101
139
  }
102
140
 
103
- // adaptPropagatedChanges(): void {
104
- // this.selector.setSelectedColumns(
105
- // this.selector.selectedColumns.filter((column) =>
106
- // _findCol(this.selector.availableColumns, column.name),
107
- // ),
108
- // );
109
- // }
141
+ get selectedColumns() {
142
+ return this.dimensions.flatMap((dimension) => dimension.columns);
143
+ }
144
+
145
+ deselectColumns(columns: DataCubeEditorColumnsSelectorColumnState[]) {
146
+ this.dimensions.forEach((dimension) => {
147
+ dimension.setColumns(
148
+ dimension.columns.filter((column) => !_findCol(columns, column.name)),
149
+ );
150
+ });
151
+ }
152
+
153
+ setDimensions(dimensions: DataCubeEditorDimensionState[]) {
154
+ this.dimensions = dimensions;
155
+ }
156
+
157
+ newDimension() {
158
+ const newDimension = new DataCubeEditorDimensionState(
159
+ generateEnumerableNameFromToken(
160
+ this.dimensions.map((dimension) => dimension.name),
161
+ 'Dimension',
162
+ 'whitespace',
163
+ ),
164
+ );
165
+ this.dimensions.push(newDimension);
166
+ return newDimension;
167
+ }
168
+
169
+ refreshDimensionsTreeData() {
170
+ this.dimensionsTreeData = {
171
+ nodes: this.dimensions.map((dimension) => ({
172
+ name: dimension.name,
173
+ data: dimension,
174
+ children: dimension.columns.map((column) => ({
175
+ name: column.name,
176
+ data: column,
177
+ })),
178
+ })),
179
+ };
180
+ }
181
+
182
+ setDimensionsTreeSearchText(val: string) {
183
+ this.dimensionsTreeSearchText = val;
184
+ }
185
+
186
+ adaptPropagatedChanges(): void {
187
+ this.deselectColumns(
188
+ this.selectedColumns.filter(
189
+ (column) => !_findCol(this.availableColumns, column.name),
190
+ ),
191
+ );
192
+ this.refreshDimensionsTreeData();
193
+ }
110
194
 
111
195
  applySnaphot(
112
196
  snapshot: DataCubeSnapshot,
113
197
  configuration: DataCubeConfiguration,
114
198
  ) {
115
- // this.selector.setSelectedColumns(
116
- // (snapshot.data.groupBy?.columns ?? []).map(
117
- // (col) =>
118
- // new DataCubeEditorColumnSelectorColumnState(col.name, col.type),
119
- // ),
120
- // );
199
+ this.setDimensions(
200
+ configuration.dimensions.dimensions.map((dimension) => {
201
+ const _dimension = new DataCubeEditorDimensionState(dimension.name);
202
+ _dimension.setColumns(
203
+ dimension.columns.map((colName) => {
204
+ const column = guaranteeNonNullable(
205
+ _findCol(configuration.columns, colName),
206
+ );
207
+ return new DataCubeEditorColumnsSelectorColumnState(
208
+ column.name,
209
+ column.type,
210
+ );
211
+ }),
212
+ );
213
+ return _dimension;
214
+ }),
215
+ );
121
216
  }
122
217
 
123
218
  buildSnapshot(newSnapshot: DataCubeSnapshot, baseSnapshot: DataCubeSnapshot) {
124
- // newSnapshot.data.groupBy = this.selector.selectedColumns.length
125
- // ? {
126
- // columns: this.selector.selectedColumns.map(_toCol),
127
- // }
128
- // : undefined;
129
- // newSnapshot.data.selectColumns = uniqBy(
130
- // [...newSnapshot.data.selectColumns, ...this.selector.selectedColumns],
131
- // (col) => col.name,
132
- // ).map(_toCol);
219
+ const dimensionsConfiguration = new DataCubeDimensionsConfiguration();
220
+
221
+ if (
222
+ this._editor.generalProperties.configuration.gridMode ===
223
+ DataCubeGridMode.MULTIDIMENSIONAL
224
+ ) {
225
+ dimensionsConfiguration.dimensions = this.dimensions.map((dimension) => ({
226
+ name: dimension.name,
227
+ columns: dimension.columns.map((column) => column.name),
228
+ }));
229
+ }
230
+
231
+ newSnapshot.data.configuration = {
232
+ ...newSnapshot.data.configuration,
233
+ dimensions: DataCubeDimensionsConfiguration.serialization.toJson(
234
+ dimensionsConfiguration,
235
+ ),
236
+ };
133
237
  }
134
238
  }
@@ -28,18 +28,18 @@ import {
28
28
  type DataCubeColumn,
29
29
  } from '../../core/model/DataCubeColumn.js';
30
30
  import {
31
- DataCubeEditorColumnSelectorState,
32
- DataCubeEditorSortColumnState,
33
- } from './DataCubeEditorColumnSelectorState.js';
31
+ DataCubeEditorColumnsSelectorState,
32
+ DataCubeEditorColumnsSelectorSortColumnState,
33
+ } from './DataCubeEditorColumnsSelectorState.js';
34
34
  import type { DataCubeQueryEditorPanelState } from './DataCubeEditorPanelState.js';
35
35
  import type { DataCubeEditorState } from './DataCubeEditorState.js';
36
36
  import { uniqBy } from '@finos/legend-shared';
37
37
 
38
- export class DataCubeEditorHorizontalPivotColumnSelectorState extends DataCubeEditorColumnSelectorState<DataCubeEditorSortColumnState> {
38
+ export class DataCubeEditorHorizontalPivotColumnsSelectorState extends DataCubeEditorColumnsSelectorState<DataCubeEditorColumnsSelectorSortColumnState> {
39
39
  override cloneColumn(
40
- column: DataCubeEditorSortColumnState,
41
- ): DataCubeEditorSortColumnState {
42
- return new DataCubeEditorSortColumnState(
40
+ column: DataCubeEditorColumnsSelectorSortColumnState,
41
+ ): DataCubeEditorColumnsSelectorSortColumnState {
42
+ return new DataCubeEditorColumnsSelectorSortColumnState(
43
43
  column.name,
44
44
  column.type,
45
45
  column.direction,
@@ -57,7 +57,7 @@ export class DataCubeEditorHorizontalPivotColumnSelectorState extends DataCubeEd
57
57
  )
58
58
  .map(
59
59
  (col) =>
60
- new DataCubeEditorSortColumnState(
60
+ new DataCubeEditorColumnsSelectorSortColumnState(
61
61
  col.name,
62
62
  col.type,
63
63
  DataCubeQuerySortDirection.ASCENDING,
@@ -72,7 +72,7 @@ export class DataCubeEditorHorizontalPivotsPanelState
72
72
  {
73
73
  private readonly _editor!: DataCubeEditorState;
74
74
 
75
- readonly selector!: DataCubeEditorHorizontalPivotColumnSelectorState;
75
+ readonly selector!: DataCubeEditorHorizontalPivotColumnsSelectorState;
76
76
 
77
77
  castColumns: DataCubeColumn[] = [];
78
78
 
@@ -86,7 +86,7 @@ export class DataCubeEditorHorizontalPivotsPanelState
86
86
  });
87
87
 
88
88
  this._editor = editor;
89
- this.selector = new DataCubeEditorHorizontalPivotColumnSelectorState(
89
+ this.selector = new DataCubeEditorHorizontalPivotColumnsSelectorState(
90
90
  editor,
91
91
  {
92
92
  onChange: (selector) => {
@@ -113,6 +113,7 @@ export class DataCubeEditorHorizontalPivotsPanelState
113
113
 
114
114
  propagateChanges() {
115
115
  this._editor.verticalPivots.adaptPropagatedChanges();
116
+ this._editor.dimensions.adaptPropagatedChanges();
116
117
  this._editor.sorts.adaptPropagatedChanges();
117
118
  }
118
119
 
@@ -123,7 +124,7 @@ export class DataCubeEditorHorizontalPivotsPanelState
123
124
  this.selector.setSelectedColumns(
124
125
  (snapshot.data.pivot?.columns ?? []).map(
125
126
  (col) =>
126
- new DataCubeEditorSortColumnState(
127
+ new DataCubeEditorColumnsSelectorSortColumnState(
127
128
  col.name,
128
129
  col.type,
129
130
  _findCol(configuration.columns, col.name)?.pivotSortDirection ??
@@ -39,6 +39,7 @@ import {
39
39
  DEFAULT_ERROR_FOREGROUND_COLOR,
40
40
  DEFAULT_BACKGROUND_COLOR,
41
41
  type DataCubeColumnDataType,
42
+ type DataCubeGridMode,
42
43
  } from '../../core/DataCubeQueryEngine.js';
43
44
  import { type PlainObject, type Writable } from '@finos/legend-shared';
44
45
  import { makeObservable, observable, action, computed } from 'mobx';
@@ -434,6 +435,9 @@ export class DataCubeEditorMutableConfiguration extends DataCubeConfiguration {
434
435
  gridLineColor: observable,
435
436
  setGridLineColor: action,
436
437
 
438
+ gridMode: observable,
439
+ setGridMode: action,
440
+
437
441
  fontFamily: observable,
438
442
  setFontFamily: action,
439
443
 
@@ -583,6 +587,10 @@ export class DataCubeEditorMutableConfiguration extends DataCubeConfiguration {
583
587
  this.gridLineColor = value;
584
588
  }
585
589
 
590
+ setGridMode(value: DataCubeGridMode) {
591
+ this.gridMode = value;
592
+ }
593
+
586
594
  setFontFamily(value: DataCubeFont) {
587
595
  this.fontFamily = value;
588
596
  }
@@ -22,16 +22,16 @@ import {
22
22
  } from '../../core/DataCubeQueryEngine.js';
23
23
  import type { DataCubeQueryEditorPanelState } from './DataCubeEditorPanelState.js';
24
24
  import {
25
- DataCubeEditorColumnSelectorState,
26
- DataCubeEditorSortColumnState,
27
- } from './DataCubeEditorColumnSelectorState.js';
25
+ DataCubeEditorColumnsSelectorState,
26
+ DataCubeEditorColumnsSelectorSortColumnState,
27
+ } from './DataCubeEditorColumnsSelectorState.js';
28
28
  import type { DataCubeEditorState } from './DataCubeEditorState.js';
29
29
  import type { DataCubeConfiguration } from '../../core/model/DataCubeConfiguration.js';
30
30
  import { uniqBy } from '@finos/legend-shared';
31
31
 
32
- export class DataCubeEditorSortColumnSelectorState extends DataCubeEditorColumnSelectorState<DataCubeEditorSortColumnState> {
33
- override cloneColumn(column: DataCubeEditorSortColumnState) {
34
- return new DataCubeEditorSortColumnState(
32
+ export class DataCubeEditorSortColumnsSelectorState extends DataCubeEditorColumnsSelectorState<DataCubeEditorColumnsSelectorSortColumnState> {
33
+ override cloneColumn(column: DataCubeEditorColumnsSelectorSortColumnState) {
34
+ return new DataCubeEditorColumnsSelectorSortColumnState(
35
35
  column.name,
36
36
  column.type,
37
37
  column.direction,
@@ -69,7 +69,7 @@ export class DataCubeEditorSortColumnSelectorState extends DataCubeEditorColumnS
69
69
  (col) => col.name,
70
70
  ).map(
71
71
  (col) =>
72
- new DataCubeEditorSortColumnState(
72
+ new DataCubeEditorColumnsSelectorSortColumnState(
73
73
  col.name,
74
74
  col.type,
75
75
  DataCubeQuerySortDirection.ASCENDING,
@@ -81,10 +81,10 @@ export class DataCubeEditorSortColumnSelectorState extends DataCubeEditorColumnS
81
81
  export class DataCubeEditorSortsPanelState
82
82
  implements DataCubeQueryEditorPanelState
83
83
  {
84
- readonly selector!: DataCubeEditorColumnSelectorState<DataCubeEditorSortColumnState>;
84
+ readonly selector!: DataCubeEditorColumnsSelectorState<DataCubeEditorColumnsSelectorSortColumnState>;
85
85
 
86
86
  constructor(editor: DataCubeEditorState) {
87
- this.selector = new DataCubeEditorSortColumnSelectorState(editor);
87
+ this.selector = new DataCubeEditorSortColumnsSelectorState(editor);
88
88
  }
89
89
 
90
90
  adaptPropagatedChanges(): void {
@@ -102,7 +102,7 @@ export class DataCubeEditorSortsPanelState
102
102
  this.selector.setSelectedColumns(
103
103
  snapshot.data.sortColumns.map((col) => {
104
104
  const column = this.selector.getColumn(col.name);
105
- return new DataCubeEditorSortColumnState(
105
+ return new DataCubeEditorColumnsSelectorSortColumnState(
106
106
  column.name,
107
107
  column.type,
108
108
  col.direction,
@@ -43,12 +43,14 @@ import { DataCubeEditorHorizontalPivotsPanelState } from './DataCubeEditorHorizo
43
43
  import { DataCubeEditorPivotLayoutPanelState } from './DataCubeEditorPivotLayoutPanelState.js';
44
44
  import { _lambda } from '../../core/DataCubeQueryBuilderUtils.js';
45
45
  import { EngineError } from '@finos/legend-graph';
46
+ import { DataCubeEditorDimensionsPanelState } from './DataCubeEditorDimensionsPanelState.js';
46
47
 
47
48
  export enum DataCubeEditorTab {
48
49
  GENERAL_PROPERTIES = 'General Properties',
49
50
  COLUMN_PROPERTIES = 'Column Properties',
50
51
  COLUMNS = 'Columns',
51
52
  VERTICAL_PIVOTS = 'Vertical Pivots',
53
+ DIMENSIONS = 'Dimensions',
52
54
  HORIZONTAL_PIVOTS = 'Horizontal Pivots',
53
55
  SORTS = 'Sorts',
54
56
  }
@@ -74,6 +76,7 @@ export class DataCubeEditorState extends DataCubeSnapshotController {
74
76
  readonly columns: DataCubeEditorColumnsPanelState;
75
77
  readonly horizontalPivots: DataCubeEditorHorizontalPivotsPanelState;
76
78
  readonly verticalPivots: DataCubeEditorVerticalPivotsPanelState;
79
+ readonly dimensions: DataCubeEditorDimensionsPanelState;
77
80
  readonly sorts: DataCubeEditorSortsPanelState;
78
81
 
79
82
  currentTab = DataCubeEditorTab.GENERAL_PROPERTIES;
@@ -107,6 +110,7 @@ export class DataCubeEditorState extends DataCubeSnapshotController {
107
110
  );
108
111
  this.pivotLayout = new DataCubeEditorPivotLayoutPanelState(this);
109
112
  this.columnProperties = new DataCubeEditorColumnPropertiesPanelState(this);
113
+ this.dimensions = new DataCubeEditorDimensionsPanelState(this);
110
114
  this.columns = new DataCubeEditorColumnsPanelState(this);
111
115
  this.horizontalPivots = new DataCubeEditorHorizontalPivotsPanelState(this);
112
116
  this.verticalPivots = new DataCubeEditorVerticalPivotsPanelState(this);
@@ -131,6 +135,7 @@ export class DataCubeEditorState extends DataCubeSnapshotController {
131
135
  this.generalProperties.applySnaphot(snapshot, configuration);
132
136
  this.pivotLayout.applySnaphot(snapshot, configuration);
133
137
  this.columnProperties.applySnaphot(snapshot, configuration);
138
+ this.dimensions.applySnaphot(snapshot, configuration);
134
139
 
135
140
  this.columns.applySnaphot(snapshot, configuration);
136
141
  this.horizontalPivots.applySnaphot(snapshot, configuration);
@@ -153,6 +158,7 @@ export class DataCubeEditorState extends DataCubeSnapshotController {
153
158
  this.generalProperties.buildSnapshot(newSnapshot, baseSnapshot);
154
159
  this.pivotLayout.buildSnapshot(newSnapshot, baseSnapshot);
155
160
  this.columnProperties.buildSnapshot(newSnapshot, baseSnapshot);
161
+ this.dimensions.buildSnapshot(newSnapshot, baseSnapshot);
156
162
 
157
163
  // NOTE: column selection must be processed first since the snapshot
158
164
  // processing of other parts of the query can be affected by column selection.
@@ -20,17 +20,17 @@ import { DataCubeColumnKind } from '../../core/DataCubeQueryEngine.js';
20
20
  import { type DataCubeSnapshot } from '../../core/DataCubeSnapshot.js';
21
21
  import { _findCol, _toCol } from '../../core/model/DataCubeColumn.js';
22
22
  import {
23
- DataCubeEditorColumnSelectorColumnState,
24
- DataCubeEditorColumnSelectorState,
25
- } from './DataCubeEditorColumnSelectorState.js';
23
+ DataCubeEditorColumnsSelectorColumnState,
24
+ DataCubeEditorColumnsSelectorState,
25
+ } from './DataCubeEditorColumnsSelectorState.js';
26
26
  import type { DataCubeQueryEditorPanelState } from './DataCubeEditorPanelState.js';
27
27
  import type { DataCubeEditorState } from './DataCubeEditorState.js';
28
28
 
29
- export class DataCubeEditorVerticalPivotColumnSelectorState extends DataCubeEditorColumnSelectorState<DataCubeEditorColumnSelectorColumnState> {
29
+ export class DataCubeEditorVerticalPivotColumnsSelectorState extends DataCubeEditorColumnsSelectorState<DataCubeEditorColumnsSelectorColumnState> {
30
30
  override cloneColumn(
31
- column: DataCubeEditorColumnSelectorColumnState,
32
- ): DataCubeEditorColumnSelectorColumnState {
33
- return new DataCubeEditorColumnSelectorColumnState(
31
+ column: DataCubeEditorColumnsSelectorColumnState,
32
+ ): DataCubeEditorColumnsSelectorColumnState {
33
+ return new DataCubeEditorColumnsSelectorColumnState(
34
34
  column.name,
35
35
  column.type,
36
36
  );
@@ -51,7 +51,7 @@ export class DataCubeEditorVerticalPivotColumnSelectorState extends DataCubeEdit
51
51
  )
52
52
  .map(
53
53
  (col) =>
54
- new DataCubeEditorColumnSelectorColumnState(col.name, col.type),
54
+ new DataCubeEditorColumnsSelectorColumnState(col.name, col.type),
55
55
  );
56
56
  }
57
57
  }
@@ -59,10 +59,10 @@ export class DataCubeEditorVerticalPivotColumnSelectorState extends DataCubeEdit
59
59
  export class DataCubeEditorVerticalPivotsPanelState
60
60
  implements DataCubeQueryEditorPanelState
61
61
  {
62
- readonly selector!: DataCubeEditorVerticalPivotColumnSelectorState;
62
+ readonly selector!: DataCubeEditorVerticalPivotColumnsSelectorState;
63
63
 
64
64
  constructor(editor: DataCubeEditorState) {
65
- this.selector = new DataCubeEditorVerticalPivotColumnSelectorState(editor);
65
+ this.selector = new DataCubeEditorVerticalPivotColumnsSelectorState(editor);
66
66
  }
67
67
 
68
68
  adaptPropagatedChanges(): void {
@@ -80,7 +80,7 @@ export class DataCubeEditorVerticalPivotsPanelState
80
80
  this.selector.setSelectedColumns(
81
81
  (snapshot.data.groupBy?.columns ?? []).map(
82
82
  (col) =>
83
- new DataCubeEditorColumnSelectorColumnState(col.name, col.type),
83
+ new DataCubeEditorColumnsSelectorColumnState(col.name, col.type),
84
84
  ),
85
85
  );
86
86
  }
@@ -35,7 +35,6 @@ import {
35
35
  isPrimitiveType,
36
36
  } from '../../core/DataCubeQueryEngine.js';
37
37
  import {
38
- clearMarkers,
39
38
  CODE_EDITOR_LANGUAGE,
40
39
  setErrorMarkers,
41
40
  } from '@finos/legend-code-editor';
@@ -49,9 +48,11 @@ import type { DataCubeColumnConfiguration } from '../../core/model/DataCubeConfi
49
48
  import type { DataCubeSnapshotExtendedColumn } from '../../core/DataCubeSnapshot.js';
50
49
  import { _lambda } from '../../core/DataCubeQueryBuilderUtils.js';
51
50
  import { _findCol } from '../../core/model/DataCubeColumn.js';
51
+ import { DataCubeCodeEditorState } from '../../../components/view/extend/DataCubeCodeEditorState.js';
52
+ import type { DataCubeSource } from '../../core/model/DataCubeSource.js';
52
53
 
53
- export abstract class DataCubeColumnBaseEditorState {
54
- protected readonly uuid = uuid();
54
+ export abstract class DataCubeColumnBaseEditorState extends DataCubeCodeEditorState {
55
+ protected override readonly uuid = uuid();
55
56
  protected readonly _manager: DataCubeExtendManagerState;
56
57
  readonly view: DataCubeViewState;
57
58
 
@@ -60,22 +61,16 @@ export abstract class DataCubeColumnBaseEditorState {
60
61
  private readonly _name = `col_${this.uuid.replaceAll('-', '_')}`;
61
62
  readonly display: DisplayState;
62
63
  readonly validationState = ActionState.create();
63
- readonly finalizationState = ActionState.create();
64
64
 
65
65
  name: string;
66
66
  expectedType: string;
67
67
  isGroupLevel: boolean;
68
68
  columnKind?: DataCubeColumnKind | undefined;
69
69
 
70
- code = '';
71
- codePrefix: string;
72
70
  codeSuffix: string;
73
71
 
74
- editor?: monacoEditorAPI.IStandaloneCodeEditor | undefined;
75
- readonly editorModel: monacoEditorAPI.ITextModel;
76
- readonly editorModelUri: Uri;
77
- codeError?: EngineError | undefined;
78
- returnType?: string | undefined;
72
+ override model: DataCubeSource;
73
+ queryLambda: () => V1_Lambda;
79
74
 
80
75
  constructor(
81
76
  manager: DataCubeExtendManagerState,
@@ -84,6 +79,7 @@ export abstract class DataCubeColumnBaseEditorState {
84
79
  isGroupLevel: boolean,
85
80
  columnKind: DataCubeColumnKind | undefined,
86
81
  ) {
82
+ super(manager.view.engine);
87
83
  makeObservable(this, {
88
84
  name: observable,
89
85
  setName: action,
@@ -110,6 +106,8 @@ export abstract class DataCubeColumnBaseEditorState {
110
106
 
111
107
  this._manager = manager;
112
108
  this.view = manager.view;
109
+ this.model = manager.view.source;
110
+ this.engine = this.view.engine;
113
111
  this.display = this.newDisplay(this);
114
112
 
115
113
  this.name = name;
@@ -126,8 +124,13 @@ export abstract class DataCubeColumnBaseEditorState {
126
124
  CODE_EDITOR_LANGUAGE.PURE,
127
125
  this.editorModelUri,
128
126
  );
127
+ this.queryLambda = this.buildExtendBaseQuery;
129
128
  }
130
129
 
130
+ alertHandler = (error: Error): void => {
131
+ this.view.dataCube.alertService.alertUnhandledError(error);
132
+ };
133
+
131
134
  abstract getInitialCode(): Promise<string>;
132
135
 
133
136
  async initialize() {
@@ -166,14 +169,6 @@ export abstract class DataCubeColumnBaseEditorState {
166
169
  this.columnKind = columnKind;
167
170
  }
168
171
 
169
- setEditor(editor: monacoEditorAPI.IStandaloneCodeEditor) {
170
- this.editor = editor;
171
- }
172
-
173
- setReturnType(value: string | undefined) {
174
- this.returnType = value;
175
- }
176
-
177
172
  showError(error: EngineError) {
178
173
  this.codeError = error;
179
174
  if (error.sourceInformation) {
@@ -193,12 +188,7 @@ export abstract class DataCubeColumnBaseEditorState {
193
188
  }
194
189
  }
195
190
 
196
- clearError() {
197
- this.codeError = undefined;
198
- clearMarkers(this.uuid);
199
- }
200
-
201
- buildExtendBaseQuery() {
191
+ buildExtendBaseQuery = () => {
202
192
  const currentSnapshot = guaranteeNonNullable(
203
193
  this._manager.getLatestSnapshot(),
204
194
  );
@@ -221,7 +211,7 @@ export abstract class DataCubeColumnBaseEditorState {
221
211
  }),
222
212
  ],
223
213
  );
224
- }
214
+ };
225
215
 
226
216
  async getReturnType() {
227
217
  this.validationState.inProgress();
@@ -152,6 +152,14 @@ export enum DataCubeGridClientSortDirection {
152
152
  DESCENDING = 'desc',
153
153
  }
154
154
 
155
+ export function getAllNodes<T>(client: GridApi<T>): IRowNode<T>[] {
156
+ const rows: IRowNode<T>[] = [];
157
+ client.forEachNode((node: IRowNode<T>) => {
158
+ rows.push(node);
159
+ });
160
+ return rows;
161
+ }
162
+
155
163
  export function getDataForAllNodes<T>(client: GridApi<T>): T[] {
156
164
  const rows: T[] = [];
157
165
  client.forEachNode((node: IRowNode<T>) => {
@@ -87,7 +87,7 @@ export class DataCubeGridClientExportEngine {
87
87
  }
88
88
 
89
89
  private generateFileName() {
90
- return `${this._grid.queryConfiguration.name} - ${formatDate(new Date(), 'EEE MMM dd yyyy HH_mm_ss')}`;
90
+ return `${this._grid.configuration.name} - ${formatDate(new Date(), 'EEE MMM dd yyyy HH_mm_ss')}`;
91
91
  }
92
92
 
93
93
  exportFile(format: DataCubeGridClientExportFormat) {