@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.
- package/lib/components/LegendREPLFrameworkProvider.js +1 -1
- package/lib/components/LegendREPLFrameworkProvider.js.map +1 -1
- package/lib/components/REPLStoreProvider.d.ts +1 -1
- package/lib/components/REPLStoreProvider.d.ts.map +1 -1
- package/lib/components/REPLStoreProvider.js +1 -1
- package/lib/components/REPLStoreProvider.js.map +1 -1
- package/lib/components/REPLWindow.d.ts +33 -0
- package/lib/components/REPLWindow.d.ts.map +1 -0
- package/lib/components/REPLWindow.js +117 -0
- package/lib/components/REPLWindow.js.map +1 -0
- package/lib/components/dataCube/DataCube.d.ts.map +1 -1
- package/lib/components/dataCube/DataCube.js +13 -9
- package/lib/components/dataCube/DataCube.js.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditor.d.ts.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditor.js +13 -90
- package/lib/components/dataCube/editor/DataCubeEditor.js.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorCodePanel.d.ts.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorCodePanel.js +3 -2
- package/lib/components/dataCube/editor/DataCubeEditorCodePanel.js.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.d.ts.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.js +237 -6
- package/lib/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.js.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorColumnsPanel.js +2 -2
- package/lib/components/dataCube/editor/DataCubeEditorColumnsPanel.js.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.d.ts +5 -0
- package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.d.ts.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.js +130 -48
- package/lib/components/dataCube/editor/DataCubeEditorColumnsSelector.js.map +1 -1
- package/lib/{stores/dataCube/DataCubeDefaultConfig.d.ts → components/dataCube/editor/DataCubeEditorDeveloperPanel.d.ts} +4 -2
- package/lib/components/dataCube/editor/DataCubeEditorDeveloperPanel.d.ts.map +1 -0
- package/lib/components/dataCube/editor/DataCubeEditorDeveloperPanel.js +28 -0
- package/lib/components/dataCube/editor/DataCubeEditorDeveloperPanel.js.map +1 -0
- package/lib/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.d.ts.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.js +3 -2
- package/lib/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.js.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorFilterPanel.d.ts.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorFilterPanel.js +3 -2
- package/lib/components/dataCube/editor/DataCubeEditorFilterPanel.js.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.d.ts.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.js +145 -5
- package/lib/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.js.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorHPivotsPanel.d.ts.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorHPivotsPanel.js +3 -2
- package/lib/components/dataCube/editor/DataCubeEditorHPivotsPanel.js.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorShared.d.ts +47 -0
- package/lib/components/dataCube/editor/DataCubeEditorShared.d.ts.map +1 -0
- package/lib/components/dataCube/editor/DataCubeEditorShared.js +188 -0
- package/lib/components/dataCube/editor/DataCubeEditorShared.js.map +1 -0
- package/lib/components/dataCube/editor/DataCubeEditorSortsPanel.d.ts.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorSortsPanel.js +36 -3
- package/lib/components/dataCube/editor/DataCubeEditorSortsPanel.js.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorVPivotsPanel.d.ts.map +1 -1
- package/lib/components/dataCube/editor/DataCubeEditorVPivotsPanel.js +3 -2
- package/lib/components/dataCube/editor/DataCubeEditorVPivotsPanel.js.map +1 -1
- package/lib/components/dataCube/grid/DataCubeGrid.d.ts +3 -0
- package/lib/components/dataCube/grid/DataCubeGrid.d.ts.map +1 -1
- package/lib/components/dataCube/grid/DataCubeGrid.js +190 -63
- package/lib/components/dataCube/grid/DataCubeGrid.js.map +1 -1
- package/lib/{stores/dataCube/DataCubeDefaultConfig.js → components/dataCube/grid/DataCubeGridShared.d.ts} +3 -2
- package/lib/components/dataCube/grid/DataCubeGridShared.d.ts.map +1 -0
- package/lib/components/dataCube/grid/DataCubeGridShared.js +25 -0
- package/lib/components/dataCube/grid/DataCubeGridShared.js.map +1 -0
- package/lib/components/dataCube/grid/menu/DataCubeGridMenu.d.ts +23 -0
- package/lib/components/dataCube/grid/menu/DataCubeGridMenu.d.ts.map +1 -0
- package/lib/components/dataCube/grid/menu/DataCubeGridMenu.js +413 -0
- package/lib/components/dataCube/grid/menu/DataCubeGridMenu.js.map +1 -0
- package/{src/stores/dataCube/DataCubeDefaultConfig.ts → lib/components/dataCube/grid/menu/DataCubeGridSortsMenu.d.ts} +4 -2
- package/lib/components/dataCube/grid/menu/DataCubeGridSortsMenu.d.ts.map +1 -0
- package/lib/components/dataCube/grid/menu/DataCubeGridSortsMenu.js +83 -0
- package/lib/components/dataCube/grid/menu/DataCubeGridSortsMenu.js.map +1 -0
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +14 -12
- package/lib/server/models/DataCubeQuery.d.ts +3 -5
- package/lib/server/models/DataCubeQuery.d.ts.map +1 -1
- package/lib/server/models/DataCubeQuery.js +0 -2
- package/lib/server/models/DataCubeQuery.js.map +1 -1
- package/lib/stores/{dataCube/REPLStore.d.ts → REPLStore.d.ts} +6 -4
- package/lib/stores/REPLStore.d.ts.map +1 -0
- package/lib/stores/{dataCube/REPLStore.js → REPLStore.js} +8 -5
- package/lib/stores/REPLStore.js.map +1 -0
- package/lib/stores/dataCube/{core/DataCubeEngine.d.ts → DataCubeInfrastructure.d.ts} +20 -4
- package/lib/stores/dataCube/DataCubeInfrastructure.d.ts.map +1 -0
- package/lib/stores/dataCube/{core/DataCubeEngine.js → DataCubeInfrastructure.js} +31 -3
- package/lib/stores/dataCube/DataCubeInfrastructure.js.map +1 -0
- package/lib/stores/dataCube/DataCubeState.d.ts +14 -5
- package/lib/stores/dataCube/DataCubeState.d.ts.map +1 -1
- package/lib/stores/dataCube/DataCubeState.js +37 -9
- package/lib/stores/dataCube/DataCubeState.js.map +1 -1
- package/lib/stores/dataCube/core/DataCubeConfiguration.d.ts +93 -0
- package/lib/stores/dataCube/core/DataCubeConfiguration.d.ts.map +1 -0
- package/lib/stores/dataCube/core/DataCubeConfiguration.js +167 -0
- package/lib/stores/dataCube/core/DataCubeConfiguration.js.map +1 -0
- package/lib/stores/dataCube/core/DataCubeConfigurationBuilder.d.ts +25 -0
- package/lib/stores/dataCube/core/DataCubeConfigurationBuilder.d.ts.map +1 -0
- package/lib/stores/dataCube/core/DataCubeConfigurationBuilder.js +45 -0
- package/lib/stores/dataCube/core/DataCubeConfigurationBuilder.js.map +1 -0
- package/lib/stores/dataCube/core/DataCubeCoreState.d.ts +1 -1
- package/lib/stores/dataCube/core/DataCubeCoreState.d.ts.map +1 -1
- package/lib/stores/dataCube/core/DataCubeCoreState.js +4 -4
- package/lib/stores/dataCube/core/DataCubeCoreState.js.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQueryBuilder.js +12 -12
- package/lib/stores/dataCube/core/DataCubeQueryBuilder.js.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQueryEngine.d.ts +99 -4
- package/lib/stores/dataCube/core/DataCubeQueryEngine.d.ts.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQueryEngine.js +149 -3
- package/lib/stores/dataCube/core/DataCubeQueryEngine.js.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQuerySnapshot.d.ts +19 -5
- package/lib/stores/dataCube/core/DataCubeQuerySnapshot.d.ts.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQuerySnapshot.js +36 -6
- package/lib/stores/dataCube/core/DataCubeQuerySnapshot.js.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQuerySnapshotBuilder.d.ts.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQuerySnapshotBuilder.js +42 -23
- package/lib/stores/dataCube/core/DataCubeQuerySnapshotBuilder.js.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQuerySnapshotManager.d.ts.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQuerySnapshotManager.js +6 -2
- package/lib/stores/dataCube/core/DataCubeQuerySnapshotManager.js.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.d.ts +1 -3
- package/lib/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.d.ts.map +1 -1
- package/lib/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.js +2 -3
- package/lib/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.js.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorCodePanelState.d.ts +3 -1
- package/lib/stores/dataCube/editor/DataCubeEditorCodePanelState.d.ts.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorCodePanelState.js +4 -2
- package/lib/stores/dataCube/editor/DataCubeEditorCodePanelState.js.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.d.ts +36 -0
- package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.d.ts.map +1 -0
- package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.js +66 -0
- package/lib/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.js.map +1 -0
- package/lib/stores/dataCube/editor/DataCubeEditorColumnsSelectorState.d.ts +3 -0
- package/lib/stores/dataCube/editor/DataCubeEditorColumnsSelectorState.d.ts.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorColumnsSelectorState.js +10 -0
- package/lib/stores/dataCube/editor/DataCubeEditorColumnsSelectorState.js.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.d.ts +8 -3
- package/lib/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.d.ts.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.js +20 -24
- package/lib/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.js.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorHPivotPanelState.d.ts +27 -0
- package/lib/stores/dataCube/editor/DataCubeEditorHPivotPanelState.d.ts.map +1 -0
- package/lib/stores/dataCube/editor/DataCubeEditorHPivotPanelState.js +30 -0
- package/lib/stores/dataCube/editor/DataCubeEditorHPivotPanelState.js.map +1 -0
- package/lib/stores/dataCube/editor/DataCubeEditorPanelState.d.ts +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorPanelState.d.ts.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.d.ts +13 -6
- package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.d.ts.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.js +64 -19
- package/lib/stores/dataCube/editor/DataCubeEditorSortsPanelState.js.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorState.d.ts +8 -4
- package/lib/stores/dataCube/editor/DataCubeEditorState.d.ts.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeEditorState.js +26 -17
- package/lib/stores/dataCube/editor/DataCubeEditorState.js.map +1 -1
- package/lib/stores/dataCube/editor/DataCubeMutableConfiguration.d.ts +100 -0
- package/lib/stores/dataCube/editor/DataCubeMutableConfiguration.d.ts.map +1 -0
- package/lib/stores/dataCube/editor/DataCubeMutableConfiguration.js +450 -0
- package/lib/stores/dataCube/editor/DataCubeMutableConfiguration.js.map +1 -0
- package/lib/stores/dataCube/grid/DataCubeGridClientEngine.d.ts +39 -2
- package/lib/stores/dataCube/grid/DataCubeGridClientEngine.d.ts.map +1 -1
- package/lib/stores/dataCube/grid/DataCubeGridClientEngine.js +63 -3
- package/lib/stores/dataCube/grid/DataCubeGridClientEngine.js.map +1 -1
- package/lib/stores/dataCube/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
- package/lib/stores/dataCube/grid/DataCubeGridQueryBuilder.js +0 -9
- package/lib/stores/dataCube/grid/DataCubeGridQueryBuilder.js.map +1 -1
- package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.d.ts +4 -1
- package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.d.ts.map +1 -1
- package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.js +330 -38
- package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.js.map +1 -1
- package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.d.ts.map +1 -1
- package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.js +16 -28
- package/lib/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.js.map +1 -1
- package/lib/stores/dataCube/grid/DataCubeGridState.d.ts +16 -2
- package/lib/stores/dataCube/grid/DataCubeGridState.d.ts.map +1 -1
- package/lib/stores/dataCube/grid/DataCubeGridState.js +51 -21
- package/lib/stores/dataCube/grid/DataCubeGridState.js.map +1 -1
- package/package.json +20 -18
- package/src/components/LegendREPLFrameworkProvider.tsx +1 -1
- package/src/components/REPLStoreProvider.tsx +1 -1
- package/src/components/REPLWindow.tsx +179 -0
- package/src/components/dataCube/DataCube.tsx +44 -23
- package/src/components/dataCube/editor/DataCubeEditor.tsx +80 -186
- package/src/components/dataCube/editor/DataCubeEditorCodePanel.tsx +4 -2
- package/src/components/dataCube/editor/DataCubeEditorColumnPropertiesPanel.tsx +1044 -13
- package/src/components/dataCube/editor/DataCubeEditorColumnsPanel.tsx +2 -2
- package/src/components/dataCube/editor/DataCubeEditorColumnsSelector.tsx +264 -51
- package/src/components/dataCube/editor/DataCubeEditorDeveloperPanel.tsx +43 -0
- package/src/components/dataCube/editor/DataCubeEditorExtendedColumnsPanel.tsx +4 -2
- package/src/components/dataCube/editor/DataCubeEditorFilterPanel.tsx +4 -2
- package/src/components/dataCube/editor/DataCubeEditorGeneralPropertiesPanel.tsx +743 -13
- package/src/components/dataCube/editor/DataCubeEditorHPivotsPanel.tsx +4 -2
- package/src/components/dataCube/editor/DataCubeEditorShared.tsx +484 -0
- package/src/components/dataCube/editor/DataCubeEditorSortsPanel.tsx +103 -4
- package/src/components/dataCube/editor/DataCubeEditorVPivotsPanel.tsx +4 -2
- package/src/components/dataCube/grid/DataCubeGrid.tsx +314 -120
- package/src/components/dataCube/grid/DataCubeGridShared.tsx +45 -0
- package/src/components/dataCube/grid/menu/DataCubeGridMenu.tsx +441 -0
- package/src/components/dataCube/grid/menu/DataCubeGridSortsMenu.tsx +119 -0
- package/src/server/models/DataCubeQuery.ts +2 -6
- package/src/stores/{dataCube/REPLStore.ts → REPLStore.ts} +9 -6
- package/src/stores/dataCube/{core/DataCubeEngine.ts → DataCubeInfrastructure.ts} +40 -3
- package/src/stores/dataCube/DataCubeState.ts +44 -10
- package/src/stores/dataCube/core/DataCubeConfiguration.ts +220 -0
- package/src/stores/dataCube/core/DataCubeConfigurationBuilder.ts +60 -0
- package/src/stores/dataCube/core/DataCubeCoreState.ts +7 -4
- package/src/stores/dataCube/core/DataCubeQueryBuilder.ts +18 -18
- package/src/stores/dataCube/core/DataCubeQueryEngine.ts +157 -4
- package/src/stores/dataCube/core/DataCubeQuerySnapshot.ts +43 -6
- package/src/stores/dataCube/core/DataCubeQuerySnapshotBuilder.ts +49 -29
- package/src/stores/dataCube/core/DataCubeQuerySnapshotManager.ts +9 -2
- package/src/stores/dataCube/core/DataCubeQuerySnapshotSubscriber.ts +6 -5
- package/src/stores/dataCube/editor/DataCubeEditorCodePanelState.ts +5 -2
- package/src/stores/dataCube/editor/DataCubeEditorColumnPropertiesPanelState.ts +96 -0
- package/src/stores/dataCube/editor/DataCubeEditorColumnsSelectorState.ts +12 -0
- package/src/stores/dataCube/editor/DataCubeEditorGeneralPropertiesPanelState.ts +31 -28
- package/src/stores/dataCube/editor/DataCubeEditorHPivotPanelState.ts +43 -0
- package/src/stores/dataCube/editor/DataCubeEditorPanelState.ts +1 -1
- package/src/stores/dataCube/editor/DataCubeEditorSortsPanelState.ts +92 -25
- package/src/stores/dataCube/editor/DataCubeEditorState.ts +32 -18
- package/src/stores/dataCube/editor/DataCubeMutableConfiguration.ts +641 -0
- package/src/stores/dataCube/grid/DataCubeGridClientEngine.ts +88 -3
- package/src/stores/dataCube/grid/DataCubeGridQueryBuilder.ts +0 -10
- package/src/stores/dataCube/grid/DataCubeGridQuerySnapshotAnalyzer.tsx +494 -45
- package/src/stores/dataCube/grid/DataCubeGridQuerySnapshotBuilder.ts +16 -36
- package/src/stores/dataCube/grid/DataCubeGridState.ts +73 -20
- package/tsconfig.json +13 -3
- package/lib/stores/dataCube/DataCubeDefaultConfig.d.ts.map +0 -1
- package/lib/stores/dataCube/DataCubeDefaultConfig.js.map +0 -1
- package/lib/stores/dataCube/REPLStore.d.ts.map +0 -1
- package/lib/stores/dataCube/REPLStore.js.map +0 -1
- package/lib/stores/dataCube/core/DataCubeEngine.d.ts.map +0 -1
- 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.
|
|
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="
|
|
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 {
|
|
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.
|
|
120
|
+
const panel = replStore.dataCube.editor.sorts;
|
|
25
121
|
|
|
26
122
|
return (
|
|
27
|
-
<div className="
|
|
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
|
|
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.
|
|
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="
|
|
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>
|