@finos/legend-data-cube 0.0.35 → 0.0.37

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 (138) hide show
  1. package/README.md +1 -1
  2. package/lib/__lib__/DataCubeEvent.d.ts +21 -0
  3. package/lib/__lib__/DataCubeEvent.d.ts.map +1 -0
  4. package/lib/__lib__/DataCubeEvent.js +22 -0
  5. package/lib/__lib__/DataCubeEvent.js.map +1 -0
  6. package/lib/components/DataCube.d.ts +3 -1
  7. package/lib/components/DataCube.d.ts.map +1 -1
  8. package/lib/components/DataCube.js +10 -9
  9. package/lib/components/DataCube.js.map +1 -1
  10. package/lib/components/DataCubeProvider.js +1 -1
  11. package/lib/components/DataCubeProvider.js.map +1 -1
  12. package/lib/components/core/DataCubeAlert.d.ts +3 -2
  13. package/lib/components/core/DataCubeAlert.d.ts.map +1 -1
  14. package/lib/components/core/DataCubeAlert.js +4 -2
  15. package/lib/components/core/DataCubeAlert.js.map +1 -1
  16. package/lib/components/core/DataCubeFormUtils.d.ts +26 -0
  17. package/lib/components/core/DataCubeFormUtils.d.ts.map +1 -1
  18. package/lib/components/core/DataCubeFormUtils.js +127 -4
  19. package/lib/components/core/DataCubeFormUtils.js.map +1 -1
  20. package/lib/components/core/DataCubeLayoutManager.js +1 -1
  21. package/lib/components/core/DataCubeLayoutManager.js.map +1 -1
  22. package/lib/components/core/DataCubeSettingsPanel.d.ts.map +1 -1
  23. package/lib/components/core/DataCubeSettingsPanel.js +53 -27
  24. package/lib/components/core/DataCubeSettingsPanel.js.map +1 -1
  25. package/lib/components/view/editor/DataCubeEditor.d.ts.map +1 -1
  26. package/lib/components/view/editor/DataCubeEditor.js +6 -5
  27. package/lib/components/view/editor/DataCubeEditor.js.map +1 -1
  28. package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.d.ts.map +1 -1
  29. package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.js +4 -4
  30. package/lib/components/view/editor/DataCubeEditorColumnPropertiesPanel.js.map +1 -1
  31. package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.d.ts.map +1 -1
  32. package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.js +2 -2
  33. package/lib/components/view/editor/DataCubeEditorGeneralPropertiesPanel.js.map +1 -1
  34. package/lib/components/view/extend/DataCubeColumnEditor.d.ts.map +1 -1
  35. package/lib/components/view/extend/DataCubeColumnEditor.js +12 -12
  36. package/lib/components/view/extend/DataCubeColumnEditor.js.map +1 -1
  37. package/lib/components/view/filter/DataCubeFilterEditor.d.ts.map +1 -1
  38. package/lib/components/view/filter/DataCubeFilterEditor.js +4 -4
  39. package/lib/components/view/filter/DataCubeFilterEditor.js.map +1 -1
  40. package/lib/components/view/grid/DataCubeGrid.d.ts.map +1 -1
  41. package/lib/components/view/grid/DataCubeGrid.js +7 -7
  42. package/lib/components/view/grid/DataCubeGrid.js.map +1 -1
  43. package/lib/index.css +1 -1
  44. package/lib/index.d.ts +7 -2
  45. package/lib/index.d.ts.map +1 -1
  46. package/lib/index.js +7 -2
  47. package/lib/index.js.map +1 -1
  48. package/lib/package.json +2 -2
  49. package/lib/stores/DataCubeOptions.d.ts +6 -5
  50. package/lib/stores/DataCubeOptions.d.ts.map +1 -1
  51. package/lib/stores/DataCubeSettings.d.ts +25 -22
  52. package/lib/stores/DataCubeSettings.d.ts.map +1 -1
  53. package/lib/stores/DataCubeSettings.js +250 -62
  54. package/lib/stores/DataCubeSettings.js.map +1 -1
  55. package/lib/stores/DataCubeState.d.ts +8 -5
  56. package/lib/stores/DataCubeState.d.ts.map +1 -1
  57. package/lib/stores/DataCubeState.js +27 -42
  58. package/lib/stores/DataCubeState.js.map +1 -1
  59. package/lib/stores/core/DataCubeEngine.d.ts +15 -18
  60. package/lib/stores/core/DataCubeEngine.d.ts.map +1 -1
  61. package/lib/stores/core/DataCubeEngine.js +5 -16
  62. package/lib/stores/core/DataCubeEngine.js.map +1 -1
  63. package/lib/stores/core/DataCubeQueryBuilder.d.ts +1 -0
  64. package/lib/stores/core/DataCubeQueryBuilder.d.ts.map +1 -1
  65. package/lib/stores/core/DataCubeQueryBuilder.js.map +1 -1
  66. package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts +3 -0
  67. package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts.map +1 -1
  68. package/lib/stores/core/DataCubeQueryBuilderUtils.js +12 -1
  69. package/lib/stores/core/DataCubeQueryBuilderUtils.js.map +1 -1
  70. package/lib/stores/core/DataCubeQuerySnapshotBuilder.d.ts.map +1 -1
  71. package/lib/stores/core/DataCubeQuerySnapshotBuilder.js +46 -30
  72. package/lib/stores/core/DataCubeQuerySnapshotBuilder.js.map +1 -1
  73. package/lib/stores/core/DataCubeSetting.d.ts +51 -0
  74. package/lib/stores/core/DataCubeSetting.d.ts.map +1 -0
  75. package/lib/stores/core/DataCubeSetting.js +36 -0
  76. package/lib/stores/core/DataCubeSetting.js.map +1 -0
  77. package/lib/stores/core/models/AdhocQueryDataCubeSource.d.ts +29 -0
  78. package/lib/stores/core/models/AdhocQueryDataCubeSource.d.ts.map +1 -0
  79. package/lib/stores/core/models/AdhocQueryDataCubeSource.js +35 -0
  80. package/lib/stores/core/models/AdhocQueryDataCubeSource.js.map +1 -0
  81. package/lib/stores/core/models/DataCubeSource.d.ts +1 -1
  82. package/lib/stores/core/models/DataCubeSource.d.ts.map +1 -1
  83. package/lib/stores/core/models/DataCubeSource.js +1 -1
  84. package/lib/stores/core/models/DataCubeSource.js.map +1 -1
  85. package/lib/stores/view/DataCubeQuerySnapshotManager.d.ts.map +1 -1
  86. package/lib/stores/view/DataCubeQuerySnapshotManager.js +9 -2
  87. package/lib/stores/view/DataCubeQuerySnapshotManager.js.map +1 -1
  88. package/lib/stores/view/DataCubeViewState.d.ts +1 -1
  89. package/lib/stores/view/DataCubeViewState.d.ts.map +1 -1
  90. package/lib/stores/view/DataCubeViewState.js +5 -14
  91. package/lib/stores/view/DataCubeViewState.js.map +1 -1
  92. package/lib/stores/view/extend/DataCubeColumnEditorState.d.ts.map +1 -1
  93. package/lib/stores/view/extend/DataCubeColumnEditorState.js +5 -5
  94. package/lib/stores/view/extend/DataCubeColumnEditorState.js.map +1 -1
  95. package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts +1 -1
  96. package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts.map +1 -1
  97. package/lib/stores/view/grid/DataCubeGridClientEngine.js +11 -7
  98. package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
  99. package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
  100. package/lib/stores/view/grid/DataCubeGridQueryBuilder.js +2 -2
  101. package/lib/stores/view/grid/DataCubeGridQueryBuilder.js.map +1 -1
  102. package/lib/stores/view/grid/DataCubeGridState.d.ts +1 -0
  103. package/lib/stores/view/grid/DataCubeGridState.d.ts.map +1 -1
  104. package/lib/stores/view/grid/DataCubeGridState.js +8 -3
  105. package/lib/stores/view/grid/DataCubeGridState.js.map +1 -1
  106. package/package.json +6 -6
  107. package/src/__lib__/DataCubeEvent.ts +21 -0
  108. package/src/components/DataCube.tsx +14 -8
  109. package/src/components/DataCubeProvider.tsx +1 -1
  110. package/src/components/core/DataCubeAlert.tsx +12 -7
  111. package/src/components/core/DataCubeFormUtils.tsx +245 -16
  112. package/src/components/core/DataCubeLayoutManager.tsx +1 -1
  113. package/src/components/core/DataCubeSettingsPanel.tsx +166 -134
  114. package/src/components/view/editor/DataCubeEditor.tsx +12 -16
  115. package/src/components/view/editor/DataCubeEditorColumnPropertiesPanel.tsx +6 -5
  116. package/src/components/view/editor/DataCubeEditorGeneralPropertiesPanel.tsx +4 -3
  117. package/src/components/view/extend/DataCubeColumnEditor.tsx +24 -28
  118. package/src/components/view/filter/DataCubeFilterEditor.tsx +10 -18
  119. package/src/components/view/grid/DataCubeGrid.tsx +8 -7
  120. package/src/index.tsx +13 -2
  121. package/src/stores/DataCubeOptions.ts +14 -10
  122. package/src/stores/DataCubeSettings.tsx +421 -0
  123. package/src/stores/DataCubeState.tsx +38 -51
  124. package/src/stores/core/DataCubeEngine.tsx +45 -62
  125. package/src/stores/core/DataCubeQueryBuilder.ts +1 -0
  126. package/src/stores/core/DataCubeQueryBuilderUtils.ts +17 -0
  127. package/src/stores/core/DataCubeQuerySnapshotBuilder.ts +59 -30
  128. package/src/stores/core/DataCubeSetting.ts +63 -0
  129. package/src/stores/core/models/AdhocQueryDataCubeSource.ts +45 -0
  130. package/src/stores/core/models/DataCubeSource.ts +1 -1
  131. package/src/stores/view/DataCubeQuerySnapshotManager.ts +16 -4
  132. package/src/stores/view/DataCubeViewState.ts +8 -17
  133. package/src/stores/view/extend/DataCubeColumnEditorState.tsx +8 -6
  134. package/src/stores/view/grid/DataCubeGridClientEngine.ts +22 -11
  135. package/src/stores/view/grid/DataCubeGridQueryBuilder.ts +7 -1
  136. package/src/stores/view/grid/DataCubeGridState.ts +17 -3
  137. package/tsconfig.json +4 -1
  138. package/src/stores/DataCubeSettings.ts +0 -107
@@ -21,6 +21,7 @@ import { generateGridOptionsFromSnapshot } from './DataCubeGridConfigurationBuil
21
21
  import { DataCubeConfiguration } from '../../core/models/DataCubeConfiguration.js';
22
22
  import { DataCubeGridControllerState } from './DataCubeGridControllerState.js';
23
23
  import { DataCubeGridClientExportEngine } from './DataCubeGridClientExportEngine.js';
24
+ import { DataCubeSettingKey } from '../../core/DataCubeSetting.js';
24
25
  /**
25
26
  * This query editor state is responsible for syncing the internal state of ag-grid
26
27
  * server-side row model data source with the data cube query state. When new snapshot
@@ -52,7 +53,7 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
52
53
  super(view);
53
54
  makeObservable(this, {
54
55
  clientDataSource: observable,
55
- queryConfiguration: observable.ref,
56
+ queryConfiguration: observable,
56
57
  rowLimit: observable,
57
58
  isPaginationEnabled: observable,
58
59
  setPaginationEnabled: action,
@@ -83,6 +84,9 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
83
84
  setScrollHintText(val) {
84
85
  this.scrollHintText = val;
85
86
  }
87
+ get isClientConfigured() {
88
+ return Boolean(this._client);
89
+ }
86
90
  get client() {
87
91
  return guaranteeNonNullable(this._client, 'Grid client is not configured');
88
92
  }
@@ -98,7 +102,7 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
98
102
  this.queryConfiguration = configuration;
99
103
  this.rowLimit = snapshot.data.limit;
100
104
  const gridOptions = generateGridOptionsFromSnapshot(snapshot, configuration, this.view);
101
- if (this.view.dataCube.settings.enableDebugMode) {
105
+ if (this.view.dataCube.settings.getBooleanValue(DataCubeSettingKey.DEBUGGER__ENABLE_DEBUG_MODE)) {
102
106
  this.view.engine.debugProcess(`New Grid Options`, [
103
107
  'Grid Options',
104
108
  gridOptions,
@@ -106,7 +110,8 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
106
110
  }
107
111
  this.client.updateGridOptions({
108
112
  ...gridOptions,
109
- rowBuffer: this.view.dataCube.settings.gridClientRowBuffer,
113
+ rowBuffer: this.view.dataCube.settings.getNumericValue(DataCubeSettingKey.GRID_CLIENT__ROW_BUFFER),
114
+ purgeClosedRowNodes: this.view.dataCube.settings.getBooleanValue(DataCubeSettingKey.GRID_CLIENT__PURGE_CLOSED_ROW_NODES),
110
115
  // NOTE: ag-grid uses the cache block size as page size, so it's important to set this
111
116
  // in corresponding to the pagination setting, else it would cause unexpected scrolling behavior
112
117
  cacheBlockSize: this.isPaginationEnabled
@@ -1 +1 @@
1
- {"version":3,"file":"DataCubeGridState.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataCubeGridState.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@finos/legend-data-cube",
3
- "version": "0.0.35",
4
- "description": "Legend Data Cube",
3
+ "version": "0.0.37",
4
+ "description": "Legend DataCube",
5
5
  "keywords": [
6
6
  "legend",
7
7
  "legend-data-cube",
@@ -42,10 +42,10 @@
42
42
  "test:watch": "jest --watch"
43
43
  },
44
44
  "dependencies": {
45
- "@finos/legend-art": "7.1.72",
46
- "@finos/legend-code-editor": "2.0.30",
47
- "@finos/legend-graph": "31.10.64",
48
- "@finos/legend-shared": "10.0.64",
45
+ "@finos/legend-art": "7.1.73",
46
+ "@finos/legend-code-editor": "2.0.32",
47
+ "@finos/legend-graph": "32.0.0",
48
+ "@finos/legend-shared": "10.0.65",
49
49
  "@types/react": "19.0.2",
50
50
  "ag-grid-community": "33.0.3",
51
51
  "ag-grid-enterprise": "33.0.3",
@@ -0,0 +1,21 @@
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
+ export enum DataCubeEvent {
18
+ SETTINGS__FAILURE__FOUND_UNREGISTERED_SETTING = 'data-cube.settings.failure.found-unregistered-setting',
19
+ SETTINGS__FAILURE__ASSIGN_INCOMPATIBLE_VALUE = 'data-cube.settings.failure.assign-incompatible-value',
20
+ SETTINGS__FAILURE__RETRIEVE_INCOMPATIBLE_VALUE = 'data-cube.settings.failure.retrieve-incompatible-value',
21
+ }
@@ -30,6 +30,8 @@ import type { DataCubeEngine } from '../stores/core/DataCubeEngine.js';
30
30
  import { DataCubeState } from '../stores/DataCubeState.js';
31
31
  import { type DataCubeOptions } from '../stores/DataCubeOptions.js';
32
32
  import { DataCubeContextProvider, useDataCube } from './DataCubeProvider.js';
33
+ import type { DataCubeQuery } from '../stores/core/models/DataCubeQuery.js';
34
+ import { FormBadge_WIP } from './core/DataCubeFormUtils.js';
33
35
 
34
36
  const DataCubeTitleBar = observer(() => {
35
37
  const dataCube = useDataCube();
@@ -59,7 +61,7 @@ const DataCubeTitleBar = observer(() => {
59
61
  transformOrigin: { vertical: 'top', horizontal: 'left' },
60
62
  classes: {
61
63
  paper: 'rounded-none mt-[1px]',
62
- list: 'w-36 p-0 rounded-none border border-neutral-400 bg-white max-h-40 overflow-y-auto py-0.5',
64
+ list: 'w-40 p-0 rounded-none border border-neutral-400 bg-white max-h-40 overflow-y-auto py-0.5',
63
65
  },
64
66
  }}
65
67
  >
@@ -75,12 +77,13 @@ const DataCubeTitleBar = observer(() => {
75
77
  disabled={true} // TODO: enable when we set up the documentation website
76
78
  >
77
79
  See Documentation
80
+ <FormBadge_WIP />
78
81
  </DropdownMenuItem>
79
82
  <div className="my-0.5 h-[1px] w-full bg-neutral-200" />
80
83
  <DropdownMenuItem
81
84
  className="flex h-[22px] w-full items-center px-2.5 text-base hover:bg-neutral-100 focus:bg-neutral-100"
82
85
  onClick={() => {
83
- view.dataCube.settingsDisplay.open();
86
+ view.dataCube.settings.display.open();
84
87
  closeMenuDropdown();
85
88
  }}
86
89
  >
@@ -99,7 +102,7 @@ const DataCubeRoot = observer(() => {
99
102
 
100
103
  useEffect(() => {
101
104
  dataCube.view
102
- .initialize()
105
+ .initialize(dataCube.query)
103
106
  .catch((error) => dataCube.engine.logUnhandledError(error));
104
107
  }, [dataCube]);
105
108
 
@@ -118,11 +121,14 @@ const DataCubeRoot = observer(() => {
118
121
 
119
122
  export const DataCube = observer(
120
123
  (props: {
124
+ query: DataCubeQuery;
121
125
  engine: DataCubeEngine;
122
126
  options?: DataCubeOptions | undefined;
123
- }): React.ReactElement => {
124
- const { engine, options } = props;
125
- const state = useLocalObservable(() => new DataCubeState(engine, options));
127
+ }) => {
128
+ const { query, engine, options } = props;
129
+ const state = useLocalObservable(
130
+ () => new DataCubeState(query, engine, options),
131
+ );
126
132
 
127
133
  useEffect(() => {
128
134
  state
@@ -130,12 +136,12 @@ export const DataCube = observer(
130
136
  .catch((error) => state.engine.logUnhandledError(error));
131
137
  }, [state]);
132
138
 
133
- if (!state.initState.hasSucceeded) {
139
+ if (!state.initializeState.hasSucceeded) {
134
140
  return <></>;
135
141
  }
136
142
  return (
137
143
  <DataCubeContextProvider value={state}>
138
- <DataCubeRoot />
144
+ <DataCubeRoot key={state.uuid} />
139
145
  </DataCubeContextProvider>
140
146
  );
141
147
  },
@@ -26,5 +26,5 @@ export const DataCubeContextProvider = DataCubeStateContext.Provider;
26
26
  export const useDataCube = () =>
27
27
  guaranteeNonNullable(
28
28
  useContext(DataCubeStateContext),
29
- `Can't find Data Cube in context`,
29
+ `Can't find DataCube state in context`,
30
30
  );
@@ -19,11 +19,13 @@ import { noop } from '@finos/legend-shared';
19
19
  import { observer } from 'mobx-react-lite';
20
20
  import { useRef } from 'react';
21
21
  import { useDataCube } from '../DataCubeProvider.js';
22
+ import { FormButton } from './DataCubeFormUtils.js';
22
23
 
23
24
  export enum AlertType {
25
+ ERROR = 'ERROR',
24
26
  INFO = 'INFO',
27
+ SUCCESS = 'SUCCESS',
25
28
  WARNING = 'WARNING',
26
- ERROR = 'ERROR',
27
29
  }
28
30
 
29
31
  export type ActionAlertAction = { label: string; handler: () => void };
@@ -56,15 +58,18 @@ export function Alert(props: {
56
58
  })}
57
59
  >
58
60
  <div className="mr-3">
61
+ {type === AlertType.ERROR && (
62
+ <DataCubeIcon.AlertError className="flex-shrink-0 stroke-[0.5px] text-[40px] text-red-500" />
63
+ )}
59
64
  {type === AlertType.INFO && (
60
65
  <DataCubeIcon.AlertInfo className="flex-shrink-0 stroke-[0.5px] text-[40px] text-sky-500" />
61
66
  )}
67
+ {type === AlertType.SUCCESS && (
68
+ <DataCubeIcon.AlertSuccess className="flex-shrink-0 stroke-[0.5px] text-[40px] text-green-500" />
69
+ )}
62
70
  {type === AlertType.WARNING && (
63
71
  <DataCubeIcon.AlertWarning className="flex-shrink-0 stroke-[0.3px] text-[40px] text-amber-500" />
64
72
  )}
65
- {type === AlertType.ERROR && (
66
- <DataCubeIcon.AlertError className="flex-shrink-0 stroke-[0.5px] text-[40px] text-red-500" />
67
- )}
68
73
  </div>
69
74
  <div>
70
75
  <div className="whitespace-break-spaces text-lg">{message}</div>
@@ -76,8 +81,8 @@ export function Alert(props: {
76
81
  {actions.length !== 0 && (
77
82
  <div className="flex h-10 items-center justify-center border border-t-neutral-300 px-2">
78
83
  {actions.map((action, idx) => (
79
- <button
80
- className="ml-2 h-6 border border-neutral-400 bg-neutral-300 px-2 first-of-type:ml-0 hover:brightness-95"
84
+ <FormButton
85
+ className="ml-2 first-of-type:ml-0"
81
86
  // eslint-disable-next-line react/no-array-index-key
82
87
  key={idx}
83
88
  onClick={() => {
@@ -87,7 +92,7 @@ export function Alert(props: {
87
92
  autoFocus={idx === 0} // UX-wise, the first action should always be the default, i.e. auto-focus on the first button
88
93
  >
89
94
  {action.label}
90
- </button>
95
+ </FormButton>
91
96
  ))}
92
97
  </div>
93
98
  )}
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import { type IDisposable, editor as monacoEditorAPI } from 'monaco-editor';
17
18
  import {
18
19
  BasePopover,
19
20
  Checkbox,
@@ -35,6 +36,15 @@ import {
35
36
  import React, { forwardRef, useEffect, useRef, useState } from 'react';
36
37
  import { isString } from '@finos/legend-shared';
37
38
  import { useDataCube } from '../DataCubeProvider.js';
39
+ import {
40
+ clearMarkers,
41
+ CODE_EDITOR_THEME,
42
+ getBaseCodeEditorOptions,
43
+ getCodeEditorValue,
44
+ normalizeLineEnding,
45
+ resetLineNumberGutterWidth,
46
+ setErrorMarkers,
47
+ } from '@finos/legend-code-editor';
38
48
 
39
49
  export function FormBadge_WIP() {
40
50
  return (
@@ -58,6 +68,26 @@ export function FormBadge_Advanced() {
58
68
  );
59
69
  }
60
70
 
71
+ export const FormButton = forwardRef<
72
+ HTMLButtonElement,
73
+ React.ButtonHTMLAttributes<HTMLButtonElement> & {
74
+ compact?: boolean | undefined;
75
+ }
76
+ >(function FormButton(props, ref) {
77
+ const { className, compact, ...otherProps } = props;
78
+ return (
79
+ <button
80
+ ref={ref}
81
+ {...otherProps}
82
+ className={cn(
83
+ 'flex h-6 min-w-20 items-center justify-center border border-neutral-400 bg-neutral-300 px-2.5 hover:brightness-95 disabled:cursor-not-allowed disabled:border-neutral-300 disabled:text-neutral-400 disabled:hover:brightness-100',
84
+ { 'h-5 text-sm': Boolean(compact) },
85
+ className,
86
+ )}
87
+ />
88
+ );
89
+ });
90
+
61
91
  export const FormNumberInput = forwardRef(function FormNumberInput(
62
92
  props: React.InputHTMLAttributes<HTMLInputElement> & {
63
93
  min?: number | undefined;
@@ -451,32 +481,33 @@ function FormColorPicker(props: {
451
481
  />
452
482
  </div>
453
483
  <div className="flex">
454
- {defaultColor !== undefined && (
455
- <button
456
- className="ml-1 h-4 w-9 border border-neutral-400 bg-neutral-300 px-1 text-xs hover:brightness-95"
457
- onClick={() => {
458
- setColor(defaultColor);
459
- }}
460
- >
461
- Reset
462
- </button>
463
- )}
464
- <button
465
- className="ml-1 h-4 w-9 border border-neutral-400 bg-neutral-300 px-1 text-xs hover:brightness-95"
484
+ <FormButton
485
+ className="h-4 w-9"
466
486
  onClick={() => {
467
487
  onClose();
468
488
  }}
469
489
  >
470
490
  Cancel
471
- </button>
472
- <button
473
- className="ml-1 h-4 w-9 border border-neutral-400 bg-neutral-300 px-1 text-xs hover:brightness-95"
491
+ </FormButton>
492
+ <FormButton
493
+ className="ml-1 h-4 w-9 text-xs"
494
+ disabled={defaultColor === undefined}
495
+ onClick={() => {
496
+ if (defaultColor !== undefined) {
497
+ setColor(defaultColor);
498
+ }
499
+ }}
500
+ >
501
+ Reset
502
+ </FormButton>
503
+ <FormButton
504
+ className="ml-1 h-4 w-9"
474
505
  onClick={() => {
475
506
  submit();
476
507
  }}
477
508
  >
478
509
  OK
479
- </button>
510
+ </FormButton>
480
511
  </div>
481
512
  </div>
482
513
  </div>
@@ -575,3 +606,201 @@ export const FormDocumentation: React.FC<{
575
606
  </div>
576
607
  );
577
608
  };
609
+
610
+ export const FormCodeEditor: React.FC<{
611
+ value: string;
612
+ updateValue?: ((val: string) => void) | undefined;
613
+ language: string;
614
+ title?: string | undefined;
615
+ isReadOnly?: boolean | undefined;
616
+ hideMinimap?: boolean | undefined;
617
+ hideGutter?: boolean | undefined;
618
+ hidePadding?: boolean | undefined;
619
+ hideActionBar?: boolean | undefined;
620
+ lineToScroll?: number | undefined;
621
+ extraEditorOptions?:
622
+ | (monacoEditorAPI.IEditorOptions & monacoEditorAPI.IGlobalEditorOptions)
623
+ | undefined;
624
+ error?:
625
+ | {
626
+ message: string;
627
+ sourceInformation: {
628
+ startLine: number;
629
+ startColumn: number;
630
+ endLine: number;
631
+ endColumn: number;
632
+ };
633
+ }
634
+ | undefined;
635
+ }> = (props) => {
636
+ const {
637
+ value: inputValue,
638
+ updateValue,
639
+ language,
640
+ title,
641
+ isReadOnly,
642
+ hideMinimap,
643
+ hideGutter,
644
+ hidePadding,
645
+ hideActionBar,
646
+ lineToScroll,
647
+ extraEditorOptions,
648
+ error,
649
+ } = props;
650
+ const [editor, setEditor] = useState<
651
+ monacoEditorAPI.IStandaloneCodeEditor | undefined
652
+ >();
653
+ const [isWordWrap, setIsWordWrap] = useState(false);
654
+ const onDidChangeModelContentEventDisposer = useRef<IDisposable | undefined>(
655
+ undefined,
656
+ );
657
+
658
+ /**
659
+ * NOTE: we want to normalize line ending here since if the original
660
+ * input value includes CR '\r' character, it will get normalized, calling
661
+ * the updateValue method and cause a rerender. With the way we setup
662
+ * `onChange` method, React will warn about `setState` being called in
663
+ * `render` method.
664
+ * See https://github.com/finos/legend-studio/issues/608
665
+ */
666
+ const value = normalizeLineEnding(inputValue);
667
+ const ref = useRef<HTMLDivElement>(null);
668
+
669
+ const toggleWordWrap = (): void => {
670
+ const updatedWordWrap = !isWordWrap;
671
+ setIsWordWrap(updatedWordWrap);
672
+ editor?.updateOptions({
673
+ wordWrap: updatedWordWrap ? 'on' : 'off',
674
+ });
675
+ };
676
+
677
+ useEffect(() => {
678
+ if (!editor && ref.current) {
679
+ const element = ref.current;
680
+ const _editor = monacoEditorAPI.create(element, {
681
+ ...getBaseCodeEditorOptions(),
682
+ fontSize: 12,
683
+ theme: CODE_EDITOR_THEME.GITHUB_LIGHT,
684
+ // layout
685
+ glyphMargin: !hidePadding,
686
+ padding: !hidePadding ? { top: 20, bottom: 20 } : { top: 0, bottom: 0 },
687
+
688
+ formatOnType: true,
689
+ formatOnPaste: true,
690
+ });
691
+ setEditor(_editor);
692
+ }
693
+ }, [hidePadding, editor]);
694
+
695
+ useEffect(() => {
696
+ if (editor) {
697
+ resetLineNumberGutterWidth(editor);
698
+ const model = editor.getModel();
699
+ if (model) {
700
+ monacoEditorAPI.setModelLanguage(model, language);
701
+ }
702
+ }
703
+ }, [editor, language]);
704
+
705
+ useEffect(() => {
706
+ if (editor && lineToScroll !== undefined) {
707
+ editor.revealLineInCenter(lineToScroll);
708
+ }
709
+ }, [editor, lineToScroll]);
710
+
711
+ if (editor) {
712
+ // dispose the old editor content setter in case the `updateValue` handler changes
713
+ // for a more extensive note on this, see `LambdaEditor`
714
+ onDidChangeModelContentEventDisposer.current?.dispose();
715
+ onDidChangeModelContentEventDisposer.current =
716
+ editor.onDidChangeModelContent(() => {
717
+ const currentVal = getCodeEditorValue(editor);
718
+ if (currentVal !== value) {
719
+ updateValue?.(currentVal);
720
+ }
721
+ });
722
+
723
+ // Set the text value and editor options
724
+ const currentValue = getCodeEditorValue(editor);
725
+ if (currentValue !== value) {
726
+ editor.setValue(value);
727
+ }
728
+ editor.updateOptions({
729
+ readOnly: Boolean(isReadOnly),
730
+ minimap: { enabled: !hideMinimap },
731
+ // Hide the line number gutter
732
+ // See https://github.com/microsoft/vscode/issues/30795
733
+ ...(hideGutter
734
+ ? {
735
+ glyphMargin: !hidePadding,
736
+ folding: false,
737
+ lineNumbers: 'off',
738
+ lineDecorationsWidth: 0,
739
+ }
740
+ : {}),
741
+ ...(extraEditorOptions ?? {}),
742
+ });
743
+ const model = editor.getModel();
744
+ if (model) {
745
+ if (error?.sourceInformation) {
746
+ setErrorMarkers(model, [
747
+ {
748
+ message: error.message,
749
+ startLineNumber: error.sourceInformation.startLine,
750
+ startColumn: error.sourceInformation.startColumn,
751
+ endLineNumber: error.sourceInformation.endLine,
752
+ endColumn: error.sourceInformation.endColumn,
753
+ },
754
+ ]);
755
+ } else {
756
+ clearMarkers();
757
+ }
758
+ }
759
+ }
760
+
761
+ // dispose editor
762
+ useEffect(
763
+ () => () => {
764
+ if (editor) {
765
+ editor.dispose();
766
+
767
+ onDidChangeModelContentEventDisposer.current?.dispose();
768
+ }
769
+ },
770
+ [editor],
771
+ );
772
+
773
+ return (
774
+ <div className="h-full w-full border border-neutral-200">
775
+ {!hideActionBar && (
776
+ <div className="flex h-5 w-full items-center justify-between border-b border-neutral-200">
777
+ <div className="pl-1 text-sm text-neutral-500">{title ?? ''}</div>
778
+ <button
779
+ tabIndex={-1}
780
+ className={cn(
781
+ 'flex aspect-square h-5 items-center justify-center text-neutral-300 hover:text-neutral-600',
782
+ {
783
+ 'text-neutral-600': isWordWrap,
784
+ },
785
+ )}
786
+ onClick={toggleWordWrap}
787
+ title={`[${isWordWrap ? 'on' : 'off'}] Toggle word wrap`}
788
+ >
789
+ <DataCubeIcon.WordWrap />
790
+ </button>
791
+ </div>
792
+ )}
793
+ <div
794
+ className={cn('relative h-full w-full', {
795
+ 'code-editor__content--padding': !hidePadding,
796
+ 'h-[calc(100%_-_20px)]': !hideActionBar,
797
+ })}
798
+ >
799
+ <div
800
+ className="absolute left-0 top-0 h-full w-full overflow-hidden"
801
+ ref={ref}
802
+ />
803
+ </div>
804
+ </div>
805
+ );
806
+ };
@@ -163,7 +163,7 @@ export const Window = (props: {
163
163
  <DataCubeIcon.X />
164
164
  </button>
165
165
  </div>
166
- <div className="h-[calc(100%_-_24px)] w-full">
166
+ <div className="h-[calc(100%_-_24px)] w-full overflow-auto">
167
167
  {windowState.configuration.contentRenderer(windowState.configuration)}
168
168
  </div>
169
169
  </div>