@finos/legend-data-cube 0.1.16 → 0.1.18
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/__lib__/DataCubeEvent.d.ts +16 -1
- package/lib/__lib__/DataCubeEvent.d.ts.map +1 -1
- package/lib/__lib__/DataCubeEvent.js +15 -0
- package/lib/__lib__/DataCubeEvent.js.map +1 -1
- package/lib/components/DataCube.d.ts.map +1 -1
- package/lib/components/DataCube.js +23 -7
- package/lib/components/DataCube.js.map +1 -1
- package/lib/components/DataCubeStatusBar.d.ts.map +1 -1
- package/lib/components/DataCubeStatusBar.js +19 -1
- package/lib/components/DataCubeStatusBar.js.map +1 -1
- package/lib/components/view/editor/DataCubeEditor.d.ts.map +1 -1
- package/lib/components/view/editor/DataCubeEditor.js +6 -0
- package/lib/components/view/editor/DataCubeEditor.js.map +1 -1
- package/lib/components/view/extend/DataCubeColumnEditor.d.ts.map +1 -1
- package/lib/components/view/extend/DataCubeColumnEditor.js +5 -0
- package/lib/components/view/extend/DataCubeColumnEditor.js.map +1 -1
- package/lib/components/view/filter/DataCubeFilterEditor.d.ts.map +1 -1
- package/lib/components/view/filter/DataCubeFilterEditor.js +9 -1
- package/lib/components/view/filter/DataCubeFilterEditor.js.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/core/DataCubeEngine.d.ts +3 -1
- package/lib/stores/core/DataCubeEngine.d.ts.map +1 -1
- package/lib/stores/core/DataCubeEngine.js.map +1 -1
- package/lib/stores/core/DataCubeQueryEngine.d.ts +15 -0
- package/lib/stores/core/DataCubeQueryEngine.d.ts.map +1 -1
- package/lib/stores/core/DataCubeQueryEngine.js +17 -0
- package/lib/stores/core/DataCubeQueryEngine.js.map +1 -1
- package/lib/stores/core/model/DataCubeConfiguration.d.ts +1 -0
- package/lib/stores/core/model/DataCubeConfiguration.d.ts.map +1 -1
- package/lib/stores/core/model/DataCubeConfiguration.js +31 -1
- package/lib/stores/core/model/DataCubeConfiguration.js.map +1 -1
- package/lib/stores/view/DataCubeViewState.d.ts.map +1 -1
- package/lib/stores/view/DataCubeViewState.js +12 -1
- package/lib/stores/view/DataCubeViewState.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridClientEngine.js +9 -0
- package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridMenuBuilder.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridMenuBuilder.js +168 -46
- package/lib/stores/view/grid/DataCubeGridMenuBuilder.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridState.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridState.js +15 -1
- package/lib/stores/view/grid/DataCubeGridState.js.map +1 -1
- package/package.json +4 -4
- package/src/__lib__/DataCubeEvent.ts +15 -0
- package/src/components/DataCube.tsx +30 -7
- package/src/components/DataCubeStatusBar.tsx +27 -1
- package/src/components/view/editor/DataCubeEditor.tsx +10 -0
- package/src/components/view/extend/DataCubeColumnEditor.tsx +9 -0
- package/src/components/view/filter/DataCubeFilterEditor.tsx +16 -1
- package/src/index.tsx +1 -1
- package/src/stores/core/DataCubeEngine.tsx +9 -0
- package/src/stores/core/DataCubeQueryEngine.ts +17 -0
- package/src/stores/core/model/DataCubeConfiguration.ts +32 -1
- package/src/stores/view/DataCubeViewState.ts +16 -1
- package/src/stores/view/grid/DataCubeGridClientEngine.ts +13 -0
- package/src/stores/view/grid/DataCubeGridMenuBuilder.tsx +170 -41
- package/src/stores/view/grid/DataCubeGridState.ts +21 -1
- package/tsconfig.json +0 -1
- package/lib/__lib__/DataCubeTelemetryHelper.d.ts +0 -57
- package/lib/__lib__/DataCubeTelemetryHelper.d.ts.map +0 -1
- package/lib/__lib__/DataCubeTelemetryHelper.js +0 -33
- package/lib/__lib__/DataCubeTelemetryHelper.js.map +0 -1
- package/src/__lib__/DataCubeTelemetryHelper.ts +0 -96
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@finos/legend-data-cube",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.18",
|
|
4
4
|
"description": "Legend DataCube",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"legend",
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"test:watch": "jest --watch"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@finos/legend-art": "7.1.
|
|
46
|
-
"@finos/legend-code-editor": "2.0.
|
|
47
|
-
"@finos/legend-graph": "32.1.
|
|
45
|
+
"@finos/legend-art": "7.1.89",
|
|
46
|
+
"@finos/legend-code-editor": "2.0.55",
|
|
47
|
+
"@finos/legend-graph": "32.1.13",
|
|
48
48
|
"@finos/legend-shared": "11.0.9",
|
|
49
49
|
"@types/react": "19.0.10",
|
|
50
50
|
"ag-grid-community": "33.1.1",
|
|
@@ -18,4 +18,19 @@ export enum DataCubeEvent {
|
|
|
18
18
|
SETTINGS__FAILURE__FOUND_UNREGISTERED_SETTING = 'data-cube.settings.failure.found-unregistered-setting',
|
|
19
19
|
SETTINGS__FAILURE__ASSIGN_INCOMPATIBLE_VALUE = 'data-cube.settings.failure.assign-incompatible-value',
|
|
20
20
|
SETTINGS__FAILURE__RETRIEVE_INCOMPATIBLE_VALUE = 'data-cube.settings.failure.retrieve-incompatible-value',
|
|
21
|
+
EMAIL_DATACUBE = 'data-cube.email-data-cube',
|
|
22
|
+
EXPORT_DATACUBE = 'data-cube.export-data-cube',
|
|
23
|
+
CACHING_ENABLE__SUCCESS = 'data-cube.enable-caching.success',
|
|
24
|
+
CACHING_DISABLE__SUCCESS = 'data-cube.disable-caching.success',
|
|
25
|
+
SELECT_ACTION_CACHE_LOAD_ALERT = 'data-cube.select-action-caching-load-alert',
|
|
26
|
+
PAGINATION_ENABLE__SUCCESS = 'data-cube.enable-pagination.success',
|
|
27
|
+
PAGINATION_DISABLE__SUCCESS = 'data-cube.disable-pagination.success',
|
|
28
|
+
SELECT_ACTION_PAGINATION_ALERT = 'data-cube.select-action-pagination-alert',
|
|
29
|
+
APPLY_CHANGES_PROPERTIES = 'data-cube.apply-changes-properties',
|
|
30
|
+
APPLY_CHANGES_FILTER = 'data-cube.apply-changes-filter',
|
|
31
|
+
SELECT_ITEM_TITLE_BAR = 'data-cube.select-item-title-bar',
|
|
32
|
+
SELECT_ITEM_GRIDMENU = 'data-cube.select-item-gridMenu',
|
|
33
|
+
OPEN_EDITOR_FILTER = 'data-cube.open-editor-filter',
|
|
34
|
+
OPEN_EDITOR_PROPERTIES = 'data-cube.open-editor-properties',
|
|
35
|
+
ADD_NEW_COLUMN = 'data-cube.add-new-column',
|
|
21
36
|
}
|
|
@@ -25,16 +25,30 @@ import { type DataCubeOptions } from '../stores/DataCubeOptions.js';
|
|
|
25
25
|
import { DataCubeContextProvider, useDataCube } from './DataCubeProvider.js';
|
|
26
26
|
import type { DataCubeSpecification } from '../stores/core/model/DataCubeSpecification.js';
|
|
27
27
|
import { DataCubeTitleBar } from './DataCubeTitleBar.js';
|
|
28
|
-
import {
|
|
28
|
+
import {
|
|
29
|
+
DataCubeTitleBarMenuItems,
|
|
30
|
+
DEFAULT_REPORT_NAME,
|
|
31
|
+
} from '../stores/core/DataCubeQueryEngine.js';
|
|
29
32
|
import {
|
|
30
33
|
DataCubePlaceholderErrorDisplay,
|
|
31
34
|
DataCubePlaceholder,
|
|
32
35
|
} from './DataCubePlaceholder.js';
|
|
36
|
+
import { DataCubeEvent } from '../__lib__/DataCubeEvent.js';
|
|
33
37
|
|
|
34
38
|
const DataCubeRoot = observer(() => {
|
|
35
39
|
const dataCube = useDataCube();
|
|
36
40
|
const view = dataCube.view;
|
|
37
41
|
|
|
42
|
+
const logMenuItem = (menuName: string) => {
|
|
43
|
+
view.dataCube.telemetryService.sendTelemetry(
|
|
44
|
+
DataCubeEvent.SELECT_ITEM_TITLE_BAR,
|
|
45
|
+
{
|
|
46
|
+
...view.engine.getDataFromSource(view.getInitialSource()),
|
|
47
|
+
menuName: menuName,
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
};
|
|
51
|
+
|
|
38
52
|
useEffect(() => {
|
|
39
53
|
dataCube.view
|
|
40
54
|
.initialize(dataCube.specification)
|
|
@@ -47,18 +61,27 @@ const DataCubeRoot = observer(() => {
|
|
|
47
61
|
title={view.info.name}
|
|
48
62
|
menuItems={[
|
|
49
63
|
{
|
|
50
|
-
label:
|
|
51
|
-
action: () =>
|
|
64
|
+
label: DataCubeTitleBarMenuItems.UNDO,
|
|
65
|
+
action: () => {
|
|
66
|
+
dataCube.view.snapshotService.undo();
|
|
67
|
+
logMenuItem(DataCubeTitleBarMenuItems.UNDO);
|
|
68
|
+
},
|
|
52
69
|
disabled: !dataCube.view.snapshotService.canUndo,
|
|
53
70
|
},
|
|
54
71
|
{
|
|
55
|
-
label:
|
|
56
|
-
action: () =>
|
|
72
|
+
label: DataCubeTitleBarMenuItems.REDO,
|
|
73
|
+
action: () => {
|
|
74
|
+
dataCube.view.snapshotService.redo();
|
|
75
|
+
logMenuItem(DataCubeTitleBarMenuItems.REDO);
|
|
76
|
+
},
|
|
57
77
|
disabled: !dataCube.view.snapshotService.canRedo,
|
|
58
78
|
},
|
|
59
79
|
{
|
|
60
|
-
label:
|
|
61
|
-
action: () =>
|
|
80
|
+
label: DataCubeTitleBarMenuItems.SETTINGS,
|
|
81
|
+
action: () => {
|
|
82
|
+
dataCube.settingService.display.open();
|
|
83
|
+
logMenuItem(DataCubeTitleBarMenuItems.SETTINGS);
|
|
84
|
+
},
|
|
62
85
|
},
|
|
63
86
|
]}
|
|
64
87
|
getMenuItems={dataCube.options?.getHeaderMenuItems}
|
|
@@ -19,6 +19,8 @@ import { observer } from 'mobx-react-lite';
|
|
|
19
19
|
import type { DataCubeViewState } from '../stores/view/DataCubeViewState.js';
|
|
20
20
|
import type { TaskManager } from '../stores/services/DataCubeTaskService.js';
|
|
21
21
|
import { at } from '@finos/legend-shared';
|
|
22
|
+
import { DataCubeEvent } from '../__lib__/DataCubeEvent.js';
|
|
23
|
+
import { DataCubeOpenEditorSource } from '../stores/core/DataCubeQueryEngine.js';
|
|
22
24
|
|
|
23
25
|
export const DataCubeStatusBar = observer(
|
|
24
26
|
(props: {
|
|
@@ -28,12 +30,35 @@ export const DataCubeStatusBar = observer(
|
|
|
28
30
|
const { view, taskManager } = props;
|
|
29
31
|
const tasks = view?.taskService.tasks ?? taskManager?.tasks;
|
|
30
32
|
|
|
33
|
+
const logOpeningPropertiesEditor = () => {
|
|
34
|
+
view?.dataCube.telemetryService.sendTelemetry(
|
|
35
|
+
DataCubeEvent.OPEN_EDITOR_PROPERTIES,
|
|
36
|
+
{
|
|
37
|
+
...view.engine.getDataFromSource(view.getInitialSource()),
|
|
38
|
+
openedFrom: DataCubeOpenEditorSource.STATUS_BAR,
|
|
39
|
+
},
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const logOpeningFilterEditor = () => {
|
|
44
|
+
view?.dataCube.telemetryService.sendTelemetry(
|
|
45
|
+
DataCubeEvent.OPEN_EDITOR_FILTER,
|
|
46
|
+
{
|
|
47
|
+
...view.engine.getDataFromSource(view.getInitialSource()),
|
|
48
|
+
openedFrom: DataCubeOpenEditorSource.STATUS_BAR,
|
|
49
|
+
},
|
|
50
|
+
);
|
|
51
|
+
};
|
|
52
|
+
|
|
31
53
|
return (
|
|
32
54
|
<div className="flex h-5 w-full justify-between bg-neutral-100">
|
|
33
55
|
<div className="flex">
|
|
34
56
|
<button
|
|
35
57
|
className="flex items-center px-2 text-sky-600 hover:text-sky-700 disabled:text-neutral-400"
|
|
36
|
-
onClick={() =>
|
|
58
|
+
onClick={() => {
|
|
59
|
+
view?.editor.display.open();
|
|
60
|
+
logOpeningPropertiesEditor();
|
|
61
|
+
}}
|
|
37
62
|
disabled={!view}
|
|
38
63
|
>
|
|
39
64
|
<DataCubeIcon.Settings className="text-xl" />
|
|
@@ -44,6 +69,7 @@ export const DataCubeStatusBar = observer(
|
|
|
44
69
|
className="flex items-center text-sky-600 hover:text-sky-700 disabled:text-neutral-400"
|
|
45
70
|
onClick={() => {
|
|
46
71
|
view?.filter.display.open();
|
|
72
|
+
logOpeningFilterEditor();
|
|
47
73
|
}}
|
|
48
74
|
disabled={!view}
|
|
49
75
|
>
|
|
@@ -27,6 +27,7 @@ import type { DataCubeViewState } from '../../../stores/view/DataCubeViewState.j
|
|
|
27
27
|
import { FormButton } from '../../core/DataCubeFormUtils.js';
|
|
28
28
|
import { useDataCube } from '../../DataCubeProvider.js';
|
|
29
29
|
import { DataCubeEditorDimensionsPanel } from './DataCubeEditorDimensionsPanel.js';
|
|
30
|
+
import { DataCubeEvent } from '../../../__lib__/DataCubeEvent.js';
|
|
30
31
|
|
|
31
32
|
export const DataCubeEditor = observer((props: { view: DataCubeViewState }) => {
|
|
32
33
|
const dataCube = useDataCube();
|
|
@@ -45,6 +46,13 @@ export const DataCubeEditor = observer((props: { view: DataCubeViewState }) => {
|
|
|
45
46
|
DataCubeEditorTab.COLUMN_PROPERTIES,
|
|
46
47
|
];
|
|
47
48
|
|
|
49
|
+
const logApplyChangesFromPropertiesEditor = (): void => {
|
|
50
|
+
view.dataCube.telemetryService.sendTelemetry(
|
|
51
|
+
DataCubeEvent.APPLY_CHANGES_PROPERTIES,
|
|
52
|
+
view.engine.getDataFromSource(view.getInitialSource()),
|
|
53
|
+
);
|
|
54
|
+
};
|
|
55
|
+
|
|
48
56
|
return (
|
|
49
57
|
<>
|
|
50
58
|
<div className="relative h-[calc(100%_-_40px)] w-full px-2 pt-8">
|
|
@@ -94,6 +102,7 @@ export const DataCubeEditor = observer((props: { view: DataCubeViewState }) => {
|
|
|
94
102
|
className="ml-2"
|
|
95
103
|
disabled={editor.finalizationState.isInProgress}
|
|
96
104
|
onClick={() => {
|
|
105
|
+
logApplyChangesFromPropertiesEditor();
|
|
97
106
|
editor
|
|
98
107
|
.applyChanges()
|
|
99
108
|
.catch((error) => alertService.alertUnhandledError(error));
|
|
@@ -105,6 +114,7 @@ export const DataCubeEditor = observer((props: { view: DataCubeViewState }) => {
|
|
|
105
114
|
className="ml-2"
|
|
106
115
|
disabled={editor.finalizationState.isInProgress}
|
|
107
116
|
onClick={() => {
|
|
117
|
+
logApplyChangesFromPropertiesEditor();
|
|
108
118
|
editor
|
|
109
119
|
.applyChanges({ closeAfterApply: true })
|
|
110
120
|
.catch((error) => alertService.alertUnhandledError(error));
|
|
@@ -37,6 +37,7 @@ import { useDataCube } from '../../DataCubeProvider.js';
|
|
|
37
37
|
import { useMemo, useRef } from 'react';
|
|
38
38
|
import { debounce } from '@finos/legend-shared';
|
|
39
39
|
import { DataCubeCodeEditor } from './DataCubeCodeEditor.js';
|
|
40
|
+
import { DataCubeEvent } from '../../../__lib__/DataCubeEvent.js';
|
|
40
41
|
|
|
41
42
|
enum DataCubeExtendedColumnKind {
|
|
42
43
|
LEAF_LEVEL_MEASURE = 'Leaf Level Measure',
|
|
@@ -70,6 +71,13 @@ export const DataCubeColumnCreator = observer(
|
|
|
70
71
|
typeDropPropsOpen,
|
|
71
72
|
] = useDropdownMenu();
|
|
72
73
|
|
|
74
|
+
const logAddingNewColumn = (): void => {
|
|
75
|
+
view.dataCube.telemetryService.sendTelemetry(
|
|
76
|
+
DataCubeEvent.ADD_NEW_COLUMN,
|
|
77
|
+
view.engine.getDataFromSource(view.getInitialSource()),
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
|
|
73
81
|
const debouncedCheckReturnType = useMemo(
|
|
74
82
|
() =>
|
|
75
83
|
debounce((): void => {
|
|
@@ -262,6 +270,7 @@ export const DataCubeColumnCreator = observer(
|
|
|
262
270
|
.catch((error) =>
|
|
263
271
|
dataCube.alertService.alertUnhandledError(error),
|
|
264
272
|
);
|
|
273
|
+
logAddingNewColumn();
|
|
265
274
|
}}
|
|
266
275
|
>
|
|
267
276
|
OK
|
|
@@ -49,6 +49,7 @@ import { formatDate, guaranteeIsNumber, parseISO } from '@finos/legend-shared';
|
|
|
49
49
|
import { evaluate } from 'mathjs';
|
|
50
50
|
import { useDataCube } from '../../DataCubeProvider.js';
|
|
51
51
|
import { _findCol } from '../../../stores/core/model/DataCubeColumn.js';
|
|
52
|
+
import { DataCubeEvent } from '../../../__lib__/DataCubeEvent.js';
|
|
52
53
|
|
|
53
54
|
const FILTER_TREE_OFFSET = 10;
|
|
54
55
|
const FILTER_TREE_INDENTATION_SPACE = 36;
|
|
@@ -818,6 +819,13 @@ export const DataCubeFilterEditor = observer(
|
|
|
818
819
|
const { view } = props;
|
|
819
820
|
const editor = view.filter;
|
|
820
821
|
|
|
822
|
+
const logApplyChangesFromFilterEditor = (): void => {
|
|
823
|
+
view.dataCube.telemetryService.sendTelemetry(
|
|
824
|
+
DataCubeEvent.APPLY_CHANGES_FILTER,
|
|
825
|
+
view.engine.getDataFromSource(view.getInitialSource()),
|
|
826
|
+
);
|
|
827
|
+
};
|
|
828
|
+
|
|
821
829
|
useEffect(() => {
|
|
822
830
|
editor.setSelectedNode(undefined);
|
|
823
831
|
}, [editor]);
|
|
@@ -872,7 +880,13 @@ export const DataCubeFilterEditor = observer(
|
|
|
872
880
|
</div>
|
|
873
881
|
<div className="flex h-10 items-center justify-end px-2">
|
|
874
882
|
<FormButton onClick={() => editor.display.close()}>Cancel</FormButton>
|
|
875
|
-
<FormButton
|
|
883
|
+
<FormButton
|
|
884
|
+
className="ml-2"
|
|
885
|
+
onClick={() => {
|
|
886
|
+
editor.applyChanges();
|
|
887
|
+
logApplyChangesFromFilterEditor();
|
|
888
|
+
}}
|
|
889
|
+
>
|
|
876
890
|
Apply
|
|
877
891
|
</FormButton>
|
|
878
892
|
<FormButton
|
|
@@ -880,6 +894,7 @@ export const DataCubeFilterEditor = observer(
|
|
|
880
894
|
onClick={() => {
|
|
881
895
|
editor.applyChanges();
|
|
882
896
|
editor.display.close();
|
|
897
|
+
logApplyChangesFromFilterEditor();
|
|
883
898
|
}}
|
|
884
899
|
>
|
|
885
900
|
OK
|
package/src/index.tsx
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
export { LEGEND_DATACUBE_TEST_ID } from './__lib__/DataCubeTesting.js';
|
|
18
18
|
|
|
19
|
-
export * from './__lib__/
|
|
19
|
+
export * from './__lib__/DataCubeEvent.js';
|
|
20
20
|
export * from './stores/core/model/DataCubeSpecification.js';
|
|
21
21
|
export * from './stores/core/model/DataCubeSource.js';
|
|
22
22
|
export { type DataCubeColumn } from './stores/core/model/DataCubeColumn.js';
|
|
@@ -83,6 +83,8 @@ import {
|
|
|
83
83
|
type DocumentationEntry,
|
|
84
84
|
type LogEvent,
|
|
85
85
|
type PlainObject,
|
|
86
|
+
type TimingsRecord,
|
|
87
|
+
type StopWatch,
|
|
86
88
|
} from '@finos/legend-shared';
|
|
87
89
|
import type { CachedDataCubeSource } from './model/CachedDataCubeSource.js';
|
|
88
90
|
import { DataCubeSpecification } from './model/DataCubeSpecification.js';
|
|
@@ -242,6 +244,13 @@ export abstract class DataCubeEngine {
|
|
|
242
244
|
|
|
243
245
|
abstract processSource(sourceData: PlainObject): Promise<DataCubeSource>;
|
|
244
246
|
|
|
247
|
+
abstract getDataFromSource(source?: DataCubeSource): PlainObject;
|
|
248
|
+
|
|
249
|
+
abstract finalizeTimingRecord(
|
|
250
|
+
stopWatch: StopWatch,
|
|
251
|
+
timings?: TimingsRecord,
|
|
252
|
+
): TimingsRecord | undefined;
|
|
253
|
+
|
|
245
254
|
abstract parseValueSpecification(
|
|
246
255
|
code: string,
|
|
247
256
|
returnSourceInformation?: boolean | undefined,
|
|
@@ -273,6 +273,23 @@ export enum DataCubeGridMode {
|
|
|
273
273
|
MULTIDIMENSIONAL = 'Multidimensional',
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
+
export enum DataCubeTitleBarMenuItems {
|
|
277
|
+
VIEW_SOURCE = 'View Source',
|
|
278
|
+
RESET_TO_LATEST_SAVE = 'Reset to Latest Save',
|
|
279
|
+
UPDATE_INFO = 'Update Info...',
|
|
280
|
+
DELETE_DATACUBE = 'Delete DataCube...',
|
|
281
|
+
SEE_DOCUMENTATION = 'See Documentation',
|
|
282
|
+
ABOUT = 'About',
|
|
283
|
+
UNDO = 'Undo',
|
|
284
|
+
REDO = 'Redo',
|
|
285
|
+
SETTINGS = 'Settings...',
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export enum DataCubeOpenEditorSource {
|
|
289
|
+
STATUS_BAR = 'Status Bar',
|
|
290
|
+
GRID_MENU = 'Grid Menu',
|
|
291
|
+
}
|
|
292
|
+
|
|
276
293
|
export const PIVOT_COLUMN_NAME_VALUE_SEPARATOR = '__|__';
|
|
277
294
|
|
|
278
295
|
export const TREE_COLUMN_VALUE_SEPARATOR = '__/__';
|
|
@@ -51,6 +51,7 @@ import {
|
|
|
51
51
|
} from '@finos/legend-shared';
|
|
52
52
|
import { createModelSchema, list, optional, primitive, raw } from 'serializr';
|
|
53
53
|
import { _findCol } from './DataCubeColumn.js';
|
|
54
|
+
import { PRECISE_PRIMITIVE_TYPE, PRIMITIVE_TYPE } from '@finos/legend-graph';
|
|
54
55
|
|
|
55
56
|
export type DataCubeConfigurationColorKey =
|
|
56
57
|
| 'normal'
|
|
@@ -122,7 +123,37 @@ export class DataCubeColumnConfiguration {
|
|
|
122
123
|
|
|
123
124
|
constructor(name: string, type: string) {
|
|
124
125
|
this.name = name;
|
|
125
|
-
this.type = type;
|
|
126
|
+
this.type = this._convertPreciseToPrimitiveType(type);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
_convertPreciseToPrimitiveType(type: string) {
|
|
130
|
+
switch (type) {
|
|
131
|
+
case PRECISE_PRIMITIVE_TYPE.STRING:
|
|
132
|
+
return PRIMITIVE_TYPE.STRING;
|
|
133
|
+
case PRECISE_PRIMITIVE_TYPE.SMALL_INT:
|
|
134
|
+
case PRECISE_PRIMITIVE_TYPE.TINY_INT:
|
|
135
|
+
case PRECISE_PRIMITIVE_TYPE.U_SMALL_INT:
|
|
136
|
+
case PRECISE_PRIMITIVE_TYPE.U_TINY_INT:
|
|
137
|
+
case PRECISE_PRIMITIVE_TYPE.INT:
|
|
138
|
+
case PRECISE_PRIMITIVE_TYPE.U_INT:
|
|
139
|
+
return PRIMITIVE_TYPE.INTEGER;
|
|
140
|
+
case PRECISE_PRIMITIVE_TYPE.DOUBLE:
|
|
141
|
+
case PRECISE_PRIMITIVE_TYPE.BIG_INT:
|
|
142
|
+
case PRECISE_PRIMITIVE_TYPE.U_BIG_INT:
|
|
143
|
+
return PRIMITIVE_TYPE.NUMBER;
|
|
144
|
+
case PRECISE_PRIMITIVE_TYPE.FLOAT:
|
|
145
|
+
return PRIMITIVE_TYPE.FLOAT;
|
|
146
|
+
case PRECISE_PRIMITIVE_TYPE.DECIMAL:
|
|
147
|
+
return PRIMITIVE_TYPE.DECIMAL;
|
|
148
|
+
case PRECISE_PRIMITIVE_TYPE.STRICTDATE:
|
|
149
|
+
return PRIMITIVE_TYPE.STRICTDATE;
|
|
150
|
+
case PRECISE_PRIMITIVE_TYPE.DATETIME:
|
|
151
|
+
return PRIMITIVE_TYPE.DATETIME;
|
|
152
|
+
case PRECISE_PRIMITIVE_TYPE.STRICTTIME:
|
|
153
|
+
return PRIMITIVE_TYPE.STRICTTIME;
|
|
154
|
+
default:
|
|
155
|
+
return type;
|
|
156
|
+
}
|
|
126
157
|
}
|
|
127
158
|
|
|
128
159
|
static readonly serialization = new SerializationFactory(
|
|
@@ -46,6 +46,7 @@ import type { DataCubeSettingService } from '../services/DataCubeSettingService.
|
|
|
46
46
|
import { CachedDataCubeSource } from '../core/model/CachedDataCubeSource.js';
|
|
47
47
|
import { DataCubeSettingKey } from '../../__lib__/DataCubeSetting.js';
|
|
48
48
|
import { PureClientVersion } from '@finos/legend-graph';
|
|
49
|
+
import { DataCubeEvent } from '../../__lib__/DataCubeEvent.js';
|
|
49
50
|
|
|
50
51
|
export class DataCubeViewState {
|
|
51
52
|
readonly dataCube: DataCubeState;
|
|
@@ -253,6 +254,16 @@ export class DataCubeViewState {
|
|
|
253
254
|
this.engine,
|
|
254
255
|
);
|
|
255
256
|
|
|
257
|
+
const logAlertAction = (cachingEnabled: boolean) => {
|
|
258
|
+
this.dataCube.telemetryService.sendTelemetry(
|
|
259
|
+
DataCubeEvent.SELECT_ACTION_CACHE_LOAD_ALERT,
|
|
260
|
+
{
|
|
261
|
+
...this.engine.getDataFromSource(this._initialSource),
|
|
262
|
+
keepCachingEnabled: cachingEnabled,
|
|
263
|
+
},
|
|
264
|
+
);
|
|
265
|
+
};
|
|
266
|
+
|
|
256
267
|
// auto-enable cache if specified before broadcasting the first snapshot
|
|
257
268
|
// so first data-fetches will be against cache
|
|
258
269
|
if (specification.options?.autoEnableCache) {
|
|
@@ -273,11 +284,14 @@ export class DataCubeViewState {
|
|
|
273
284
|
actions: [
|
|
274
285
|
{
|
|
275
286
|
label: 'OK',
|
|
276
|
-
handler: () => {
|
|
287
|
+
handler: () => {
|
|
288
|
+
logAlertAction(true);
|
|
289
|
+
},
|
|
277
290
|
},
|
|
278
291
|
{
|
|
279
292
|
label: 'Disable Caching',
|
|
280
293
|
handler: () => {
|
|
294
|
+
logAlertAction(false);
|
|
281
295
|
this.grid
|
|
282
296
|
.setCachingEnabled(false, {
|
|
283
297
|
suppressWarning: true,
|
|
@@ -290,6 +304,7 @@ export class DataCubeViewState {
|
|
|
290
304
|
{
|
|
291
305
|
label: 'Dismiss Warning',
|
|
292
306
|
handler: () => {
|
|
307
|
+
logAlertAction(true);
|
|
293
308
|
this.settingService.updateValue(
|
|
294
309
|
this.dataCube.api,
|
|
295
310
|
DataCubeSettingKey.GRID_CLIENT__SHOW_AUTO_ENABLE_CACHE_PERFORMANCE_WARNING,
|
|
@@ -56,6 +56,7 @@ import {
|
|
|
56
56
|
} from '../../core/DataCubeEngine.js';
|
|
57
57
|
import { _lambda } from '../../core/DataCubeQueryBuilderUtils.js';
|
|
58
58
|
import { sum } from 'mathjs';
|
|
59
|
+
import { DataCubeEvent } from '../../../__lib__/DataCubeEvent.js';
|
|
59
60
|
|
|
60
61
|
type DataCubeGridClientCellValue = string | number | boolean | null | undefined;
|
|
61
62
|
type DataCubeGridClientRowData = {
|
|
@@ -418,6 +419,16 @@ export class DataCubeGridClientServerSideDataSource
|
|
|
418
419
|
let result: DataCubeExecutionResult;
|
|
419
420
|
let rowData: DataCubeGridClientRowData[];
|
|
420
421
|
|
|
422
|
+
const logAlertAction = (paginationDisabled: boolean) => {
|
|
423
|
+
this._view.dataCube.telemetryService.sendTelemetry(
|
|
424
|
+
DataCubeEvent.SELECT_ACTION_PAGINATION_ALERT,
|
|
425
|
+
{
|
|
426
|
+
...this._view.engine.getDataFromSource(this._view.getInitialSource()),
|
|
427
|
+
keepPaginationDisabled: paginationDisabled,
|
|
428
|
+
},
|
|
429
|
+
);
|
|
430
|
+
};
|
|
431
|
+
|
|
421
432
|
try {
|
|
422
433
|
result = await this._view.engine.executeQuery(
|
|
423
434
|
_lambda([], [executableQuery]),
|
|
@@ -514,6 +525,7 @@ export class DataCubeGridClientServerSideDataSource
|
|
|
514
525
|
label: 'Enable Pagination',
|
|
515
526
|
handler: () => {
|
|
516
527
|
this._grid.setPaginationEnabled(true);
|
|
528
|
+
logAlertAction(false);
|
|
517
529
|
},
|
|
518
530
|
},
|
|
519
531
|
{
|
|
@@ -524,6 +536,7 @@ export class DataCubeGridClientServerSideDataSource
|
|
|
524
536
|
DataCubeSettingKey.GRID_CLIENT__SUPPRESS_LARGE_DATASET_WARNING,
|
|
525
537
|
true,
|
|
526
538
|
);
|
|
539
|
+
logAlertAction(true);
|
|
527
540
|
},
|
|
528
541
|
},
|
|
529
542
|
],
|