@finos/legend-application-studio 28.19.74 → 28.19.76

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 (34) hide show
  1. package/lib/components/editor/__test-utils__/EditorComponentTestUtils.d.ts.map +1 -1
  2. package/lib/components/editor/__test-utils__/EditorComponentTestUtils.js +4 -0
  3. package/lib/components/editor/__test-utils__/EditorComponentTestUtils.js.map +1 -1
  4. package/lib/components/editor/panel-group/SQLPlaygroundPanel.d.ts.map +1 -1
  5. package/lib/components/editor/panel-group/SQLPlaygroundPanel.js +9 -298
  6. package/lib/components/editor/panel-group/SQLPlaygroundPanel.js.map +1 -1
  7. package/lib/components/editor/side-bar/Explorer.js +1 -1
  8. package/lib/components/editor/side-bar/Explorer.js.map +1 -1
  9. package/lib/index.css +1 -1
  10. package/lib/package.json +1 -1
  11. package/lib/stores/editor/EditorStore.d.ts +2 -2
  12. package/lib/stores/editor/EditorStore.d.ts.map +1 -1
  13. package/lib/stores/editor/EditorStore.js +3 -3
  14. package/lib/stores/editor/EditorStore.js.map +1 -1
  15. package/lib/stores/editor/GraphEditFormModeState.js +1 -1
  16. package/lib/stores/editor/GraphEditFormModeState.js.map +1 -1
  17. package/lib/stores/editor/__test-utils__/EditorStoreTestUtils.d.ts.map +1 -1
  18. package/lib/stores/editor/__test-utils__/EditorStoreTestUtils.js +4 -0
  19. package/lib/stores/editor/__test-utils__/EditorStoreTestUtils.js.map +1 -1
  20. package/lib/stores/editor/panel-group/{SQLPlaygroundPanelState.d.ts → StudioSQLPlaygroundPanelState.d.ts} +8 -15
  21. package/lib/stores/editor/panel-group/StudioSQLPlaygroundPanelState.d.ts.map +1 -0
  22. package/lib/stores/editor/panel-group/{SQLPlaygroundPanelState.js → StudioSQLPlaygroundPanelState.js} +29 -44
  23. package/lib/stores/editor/panel-group/StudioSQLPlaygroundPanelState.js.map +1 -0
  24. package/package.json +11 -11
  25. package/src/components/editor/__test-utils__/EditorComponentTestUtils.tsx +4 -0
  26. package/src/components/editor/panel-group/SQLPlaygroundPanel.tsx +12 -576
  27. package/src/components/editor/side-bar/Explorer.tsx +1 -1
  28. package/src/stores/editor/EditorStore.ts +3 -3
  29. package/src/stores/editor/GraphEditFormModeState.ts +1 -1
  30. package/src/stores/editor/__test-utils__/EditorStoreTestUtils.ts +4 -1
  31. package/src/stores/editor/panel-group/{SQLPlaygroundPanelState.ts → StudioSQLPlaygroundPanelState.ts} +47 -60
  32. package/tsconfig.json +1 -1
  33. package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.d.ts.map +0 -1
  34. package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.js.map +0 -1
@@ -20,6 +20,7 @@ import { SDLCServerClient } from '@finos/legend-server-sdlc';
20
20
  import { DepotServerClient } from '@finos/legend-server-depot';
21
21
  import { ApplicationStore } from '@finos/legend-application';
22
22
  import { TEST__getLegendStudioApplicationConfig } from '../../__test-utils__/LegendStudioApplicationTestUtils.js';
23
+ import { MockedMonacoEditorAPI } from '@finos/legend-lego/code-editor/test';
23
24
 
24
25
  export const TEST__getTestEditorStore = (
25
26
  pluginManager = LegendStudioPluginManager.create(),
@@ -28,7 +29,9 @@ export const TEST__getTestEditorStore = (
28
29
  TEST__getLegendStudioApplicationConfig(),
29
30
  pluginManager,
30
31
  );
31
-
32
+ MockedMonacoEditorAPI.createModel.mockReturnValue({
33
+ setValue(): void {},
34
+ });
32
35
  return new EditorStore(
33
36
  applicationStore,
34
37
  new SDLCServerClient({
@@ -19,9 +19,10 @@ import {
19
19
  assertErrorThrown,
20
20
  LogEvent,
21
21
  ActionState,
22
+ uniqBy,
22
23
  } from '@finos/legend-shared';
23
24
  import { observable, makeObservable, flow, flowResult, action } from 'mobx';
24
- import { editor as monacoEditorAPI } from 'monaco-editor';
25
+ import { languages as monacoLanguagesAPI } from 'monaco-editor';
25
26
  import {
26
27
  type Database,
27
28
  type PackageableConnection,
@@ -29,14 +30,12 @@ import {
29
30
  GRAPH_MANAGER_EVENT,
30
31
  } from '@finos/legend-graph';
31
32
  import type { EditorStore } from '../EditorStore.js';
32
- import {
33
- CODE_EDITOR_LANGUAGE,
34
- moveCursorToPosition,
35
- } from '@finos/legend-code-editor';
33
+
36
34
  import type { CommandRegistrar } from '@finos/legend-application';
37
35
  import { STO_RELATIONAL_LEGEND_STUDIO_COMMAND_KEY } from '../../../__lib__/STO_Relational_LegendStudioCommand.js';
38
36
  import { PANEL_MODE } from '../EditorConfig.js';
39
37
  import { DatabaseSchemaExplorerState } from '../editor-state/element-editor-state/connection/DatabaseBuilderState.js';
38
+ import { AbstractSQLPlaygroundState } from '@finos/legend-lego/sql-playground';
40
39
 
41
40
  const DEFAULT_SQL_TEXT = `--Start building your SQL. Note that you can also drag-and-drop nodes from schema explorer\n`;
42
41
 
@@ -45,50 +44,33 @@ export interface SQL_ExecutionResult {
45
44
  sqlDuration: number;
46
45
  }
47
46
 
48
- export class SQLPlaygroundPanelState implements CommandRegistrar {
47
+ export class StudioSQLPlaygroundPanelState
48
+ extends AbstractSQLPlaygroundState
49
+ implements CommandRegistrar
50
+ {
49
51
  readonly editorStore: EditorStore;
50
52
 
51
53
  isFetchingSchema = ActionState.create();
52
- executeRawSQLState = ActionState.create();
53
-
54
54
  connection?: PackageableConnection | undefined;
55
55
  database?: Database | undefined;
56
56
  schemaExplorerState?: DatabaseSchemaExplorerState | undefined;
57
-
58
- readonly sqlEditorTextModel: monacoEditorAPI.ITextModel;
59
- sqlEditor?: monacoEditorAPI.IStandaloneCodeEditor | undefined;
60
- sqlEditorViewState?: monacoEditorAPI.ICodeEditorViewState | undefined;
61
- sqlText = DEFAULT_SQL_TEXT;
62
- sqlExecutionResult?: SQL_ExecutionResult | undefined;
63
-
64
- isLocalModeEnabled = false;
57
+ databaseSchema: monacoLanguagesAPI.CompletionItem[];
65
58
 
66
59
  constructor(editorStore: EditorStore) {
60
+ super();
67
61
  makeObservable(this, {
68
62
  isFetchingSchema: observable,
69
- executeRawSQLState: observable,
70
63
  connection: observable,
71
64
  database: observable,
72
65
  schemaExplorerState: observable,
73
- sqlText: observable,
74
- isLocalModeEnabled: observable,
75
- sqlExecutionResult: observable,
76
- sqlEditor: observable.ref,
77
- sqlEditorViewState: observable.ref,
78
- stopExecuteSQL: action,
79
- toggleIsLocalModeEnabled: action,
66
+ databaseSchema: observable,
80
67
  setConnection: action,
81
- setSQLEditor: action,
82
- setSQLEditorViewState: action,
83
- setSQLText: action,
68
+ setDataBaseSchema: action,
84
69
  executeRawSQL: flow,
85
70
  });
86
-
71
+ this.sqlEditorTextModel.setValue(DEFAULT_SQL_TEXT);
87
72
  this.editorStore = editorStore;
88
- this.sqlEditorTextModel = monacoEditorAPI.createModel(
89
- this.sqlText,
90
- CODE_EDITOR_LANGUAGE.SQL,
91
- );
73
+ this.databaseSchema = [];
92
74
  }
93
75
 
94
76
  setConnection(val: PackageableConnection | undefined): void {
@@ -107,32 +89,42 @@ export class SQLPlaygroundPanelState implements CommandRegistrar {
107
89
  this.sqlEditorTextModel.setValue(DEFAULT_SQL_TEXT);
108
90
  }
109
91
 
110
- setSQLText(val: string): void {
111
- this.sqlText = val;
112
- }
113
-
114
- setSQLEditor(val: monacoEditorAPI.IStandaloneCodeEditor | undefined): void {
115
- this.sqlEditor = val;
116
- if (val) {
117
- const lines = this.sqlText.split('\n');
118
- moveCursorToPosition(val, {
119
- lineNumber: lines.length,
120
- column: lines.at(-1)?.length ?? 0,
121
- });
122
- }
92
+ setDataBaseSchema(val: monacoLanguagesAPI.CompletionItem[]): void {
93
+ this.databaseSchema = val;
123
94
  }
124
95
 
125
- stopExecuteSQL(): void {
126
- this.sqlExecutionResult = undefined;
96
+ fetchSchemaMetaData(): GeneratorFn<void> | undefined {
97
+ return this.schemaExplorerState?.fetchDatabaseMetadata();
127
98
  }
128
-
129
- setSQLEditorViewState(
130
- val: monacoEditorAPI.ICodeEditorViewState | undefined,
131
- ): void {
132
- this.sqlEditorViewState = val;
99
+ override getCodeCompletionSuggestions(): string[] {
100
+ const base = super.getCodeCompletionSuggestions();
101
+ if (this.schemaExplorerState?.treeData) {
102
+ const dbLabelText = uniqBy(
103
+ Array.from(this.schemaExplorerState.treeData.nodes.values()).map(
104
+ (value) => value.label,
105
+ ),
106
+ (label) => label,
107
+ );
108
+ const dbLabelsCompletionItem = uniqBy(
109
+ dbLabelText.map(
110
+ (value) =>
111
+ ({
112
+ label: value,
113
+ kind: monacoLanguagesAPI.CompletionItemKind.Field,
114
+ insertTextRules:
115
+ monacoLanguagesAPI.CompletionItemInsertTextRule.InsertAsSnippet,
116
+ insertText: `${value} `,
117
+ }) as monacoLanguagesAPI.CompletionItem,
118
+ ),
119
+ (val) => val.label,
120
+ );
121
+ this.setDataBaseSchema(dbLabelsCompletionItem);
122
+ return base.concat(dbLabelText);
123
+ }
124
+ return base;
133
125
  }
134
126
 
135
- registerCommands(): void {
127
+ override registerCommands(): void {
136
128
  this.editorStore.applicationStore.commandService.registerCommand({
137
129
  key: STO_RELATIONAL_LEGEND_STUDIO_COMMAND_KEY.SQL_PLAYGROUND_EXECUTE,
138
130
  trigger: () =>
@@ -148,19 +140,14 @@ export class SQLPlaygroundPanelState implements CommandRegistrar {
148
140
  });
149
141
  }
150
142
 
151
- deregisterCommands(): void {
143
+ override deregisterCommands(): void {
152
144
  [STO_RELATIONAL_LEGEND_STUDIO_COMMAND_KEY.SQL_PLAYGROUND_EXECUTE].forEach(
153
145
  (key) =>
154
146
  this.editorStore.applicationStore.commandService.deregisterCommand(key),
155
147
  );
156
148
  }
157
149
 
158
- toggleIsLocalModeEnabled(): void {
159
- this.isLocalModeEnabled = !this.isLocalModeEnabled;
160
- this.sqlExecutionResult = undefined;
161
- }
162
-
163
- *executeRawSQL(): GeneratorFn<void> {
150
+ override *executeRawSQL(): GeneratorFn<void> {
164
151
  if (!this.connection || this.executeRawSQLState.isInProgress) {
165
152
  return;
166
153
  }
package/tsconfig.json CHANGED
@@ -172,7 +172,7 @@
172
172
  "./src/stores/editor/editor-state/project-configuration-editor-state/ProjectConfigurationEditorState.ts",
173
173
  "./src/stores/editor/editor-state/project-configuration-editor-state/ProjectDependencyEditorState.ts",
174
174
  "./src/stores/editor/panel-group/DevToolPanelState.ts",
175
- "./src/stores/editor/panel-group/SQLPlaygroundPanelState.ts",
175
+ "./src/stores/editor/panel-group/StudioSQLPlaygroundPanelState.ts",
176
176
  "./src/stores/editor/sidebar-state/BulkServiceRegistrationState.ts",
177
177
  "./src/stores/editor/sidebar-state/LocalChangesState.ts",
178
178
  "./src/stores/editor/sidebar-state/ProjectOverviewState.ts",
@@ -1 +0,0 @@
1
- {"version":3,"file":"SQLPlaygroundPanelState.d.ts","sourceRoot":"","sources":["../../../../src/stores/editor/panel-group/SQLPlaygroundPanelState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,KAAK,WAAW,EAGhB,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,qBAAqB,EAG3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yEAAyE,CAAC;AAItH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAElC,gBAAgB,cAAwB;IACxC,kBAAkB,cAAwB;IAE1C,UAAU,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,mBAAmB,CAAC,EAAE,2BAA2B,GAAG,SAAS,CAAC;IAE9D,QAAQ,CAAC,kBAAkB,EAAE,eAAe,CAAC,UAAU,CAAC;IACxD,SAAS,CAAC,EAAE,eAAe,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAC9D,kBAAkB,CAAC,EAAE,eAAe,CAAC,oBAAoB,GAAG,SAAS,CAAC;IACtE,OAAO,SAAoB;IAC3B,kBAAkB,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAErD,kBAAkB,UAAS;gBAEf,WAAW,EAAE,WAAW;IA4BpC,aAAa,CAAC,GAAG,EAAE,qBAAqB,GAAG,SAAS,GAAG,IAAI;IAgB3D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,YAAY,CAAC,GAAG,EAAE,eAAe,CAAC,qBAAqB,GAAG,SAAS,GAAG,IAAI;IAW1E,cAAc,IAAI,IAAI;IAItB,qBAAqB,CACnB,GAAG,EAAE,eAAe,CAAC,oBAAoB,GAAG,SAAS,GACpD,IAAI;IAIP,gBAAgB,IAAI,IAAI;IAgBxB,kBAAkB,IAAI,IAAI;IAO1B,wBAAwB,IAAI,IAAI;IAK/B,aAAa,IAAI,WAAW,CAAC,IAAI,CAAC;CAsCpC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SQLPlaygroundPanelState.js","sourceRoot":"","sources":["../../../../src/stores/editor/panel-group/SQLPlaygroundPanelState.ts"],"names":[],"mappings":"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"}