@finos/legend-application-studio 28.3.5 → 28.4.1

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 (44) hide show
  1. package/lib/application/LegendStudioApplicationConfig.d.ts +5 -0
  2. package/lib/application/LegendStudioApplicationConfig.d.ts.map +1 -1
  3. package/lib/application/LegendStudioApplicationConfig.js +7 -1
  4. package/lib/application/LegendStudioApplicationConfig.js.map +1 -1
  5. package/lib/components/editor/editor-group/FunctionEditor.d.ts.map +1 -1
  6. package/lib/components/editor/editor-group/FunctionEditor.js +1 -1
  7. package/lib/components/editor/editor-group/FunctionEditor.js.map +1 -1
  8. package/lib/components/editor/editor-group/GrammarTextEditor.d.ts.map +1 -1
  9. package/lib/components/editor/editor-group/GrammarTextEditor.js +100 -4
  10. package/lib/components/editor/editor-group/GrammarTextEditor.js.map +1 -1
  11. package/lib/components/editor/editor-group/mapping-editor/DEPRECATED__MappingTestEditor.d.ts.map +1 -1
  12. package/lib/components/editor/editor-group/mapping-editor/DEPRECATED__MappingTestEditor.js +1 -1
  13. package/lib/components/editor/editor-group/mapping-editor/DEPRECATED__MappingTestEditor.js.map +1 -1
  14. package/lib/components/editor/editor-group/mapping-editor/MappingExecutionBuilder.d.ts.map +1 -1
  15. package/lib/components/editor/editor-group/mapping-editor/MappingExecutionBuilder.js +1 -1
  16. package/lib/components/editor/editor-group/mapping-editor/MappingExecutionBuilder.js.map +1 -1
  17. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.d.ts.map +1 -1
  18. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.js +1 -1
  19. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.js.map +1 -1
  20. package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.d.ts.map +1 -1
  21. package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.js +2 -2
  22. package/lib/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.js.map +1 -1
  23. package/lib/components/editor/editor-group/uml-editor/ClassQueryBuilder.d.ts.map +1 -1
  24. package/lib/components/editor/editor-group/uml-editor/ClassQueryBuilder.js +1 -1
  25. package/lib/components/editor/editor-group/uml-editor/ClassQueryBuilder.js.map +1 -1
  26. package/lib/index.css +1 -1
  27. package/lib/package.json +8 -8
  28. package/lib/stores/LegendStudioApplicationPlugin.d.ts +5 -0
  29. package/lib/stores/LegendStudioApplicationPlugin.d.ts.map +1 -1
  30. package/lib/stores/editor/editor-state/element-editor-state/mapping/MappingExecutionQueryBuilderState.d.ts +2 -2
  31. package/lib/stores/editor/editor-state/element-editor-state/mapping/MappingExecutionQueryBuilderState.d.ts.map +1 -1
  32. package/lib/stores/editor/editor-state/element-editor-state/mapping/MappingExecutionQueryBuilderState.js +3 -3
  33. package/lib/stores/editor/editor-state/element-editor-state/mapping/MappingExecutionQueryBuilderState.js.map +1 -1
  34. package/package.json +19 -19
  35. package/src/application/LegendStudioApplicationConfig.ts +10 -0
  36. package/src/components/editor/editor-group/FunctionEditor.tsx +1 -0
  37. package/src/components/editor/editor-group/GrammarTextEditor.tsx +180 -0
  38. package/src/components/editor/editor-group/mapping-editor/DEPRECATED__MappingTestEditor.tsx +1 -0
  39. package/src/components/editor/editor-group/mapping-editor/MappingExecutionBuilder.tsx +1 -0
  40. package/src/components/editor/editor-group/mapping-editor/MappingTestableEditor.tsx +1 -0
  41. package/src/components/editor/editor-group/service-editor/ServiceExecutionQueryEditor.tsx +6 -0
  42. package/src/components/editor/editor-group/uml-editor/ClassQueryBuilder.tsx +1 -0
  43. package/src/stores/LegendStudioApplicationPlugin.ts +6 -0
  44. package/src/stores/editor/editor-state/element-editor-state/mapping/MappingExecutionQueryBuilderState.ts +6 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finos/legend-application-studio",
3
- "version": "28.3.5",
3
+ "version": "28.4.1",
4
4
  "description": "Legend Studio application core",
5
5
  "keywords": [
6
6
  "legend",
@@ -45,21 +45,21 @@
45
45
  "test:watch": "jest --watch"
46
46
  },
47
47
  "dependencies": {
48
- "@finos/legend-application": "15.0.38",
49
- "@finos/legend-art": "7.0.38",
50
- "@finos/legend-graph": "31.1.9",
51
- "@finos/legend-lego": "1.1.25",
52
- "@finos/legend-query-builder": "4.3.9",
53
- "@finos/legend-server-depot": "6.0.28",
54
- "@finos/legend-server-sdlc": "5.1.2",
55
- "@finos/legend-server-showcase": "0.0.8",
56
- "@finos/legend-shared": "10.0.24",
57
- "@finos/legend-storage": "3.0.74",
48
+ "@finos/legend-application": "15.0.40",
49
+ "@finos/legend-art": "7.0.40",
50
+ "@finos/legend-graph": "31.2.0",
51
+ "@finos/legend-lego": "1.1.27",
52
+ "@finos/legend-query-builder": "4.5.0",
53
+ "@finos/legend-server-depot": "6.0.29",
54
+ "@finos/legend-server-sdlc": "5.1.3",
55
+ "@finos/legend-server-showcase": "0.0.9",
56
+ "@finos/legend-shared": "10.0.25",
57
+ "@finos/legend-storage": "3.0.75",
58
58
  "@testing-library/react": "14.0.0",
59
- "@types/react": "18.2.20",
59
+ "@types/react": "18.2.21",
60
60
  "@types/react-dom": "18.2.7",
61
61
  "fast-xml-parser": "4.2.7",
62
- "mobx": "6.10.0",
62
+ "mobx": "6.10.2",
63
63
  "mobx-react-lite": "3.4.3",
64
64
  "mobx-utils": "6.0.8",
65
65
  "monaco-editor": "0.41.0",
@@ -68,18 +68,18 @@
68
68
  "react-dnd": "16.0.1",
69
69
  "react-dom": "18.2.0",
70
70
  "serializr": "3.0.2",
71
- "yaml": "2.3.1"
71
+ "yaml": "2.3.2"
72
72
  },
73
73
  "devDependencies": {
74
- "@finos/legend-dev-utils": "2.0.78",
75
- "@jest/globals": "29.6.3",
74
+ "@finos/legend-dev-utils": "2.0.79",
75
+ "@jest/globals": "29.6.4",
76
76
  "cross-env": "7.0.3",
77
- "eslint": "8.47.0",
78
- "jest": "29.6.3",
77
+ "eslint": "8.48.0",
78
+ "jest": "29.6.4",
79
79
  "npm-run-all": "4.1.5",
80
80
  "rimraf": "5.0.1",
81
81
  "sass": "1.66.1",
82
- "typescript": "5.1.6"
82
+ "typescript": "5.2.2"
83
83
  },
84
84
  "peerDependencies": {
85
85
  "react": "^18.0.0"
@@ -27,12 +27,14 @@ import {
27
27
  assertNonNullable,
28
28
  guaranteeNonEmptyString,
29
29
  SerializationFactory,
30
+ usingModelSchema,
30
31
  } from '@finos/legend-shared';
31
32
  import {
32
33
  LegendApplicationConfig,
33
34
  type LegendApplicationConfigurationInput,
34
35
  type LegendApplicationConfigurationData,
35
36
  } from '@finos/legend-application';
37
+ import { QueryBuilderConfig } from '@finos/legend-query-builder';
36
38
 
37
39
  export class ServiceRegistrationEnvironmentConfig {
38
40
  env!: string;
@@ -99,6 +101,11 @@ class LegendStudioApplicationCoreOptions {
99
101
  TEMPORARY__serviceRegistrationConfig: ServiceRegistrationEnvironmentConfig[] =
100
102
  [];
101
103
 
104
+ /**
105
+ * Config specific to query builder
106
+ */
107
+ queryBuilderConfig: QueryBuilderConfig | undefined;
108
+
102
109
  private static readonly serialization = new SerializationFactory(
103
110
  createModelSchema(LegendStudioApplicationCoreOptions, {
104
111
  enableGraphBuilderStrictMode: optional(primitive()),
@@ -110,6 +117,9 @@ class LegendStudioApplicationCoreOptions {
110
117
  TEMPORARY__serviceRegistrationConfig: list(
111
118
  object(ServiceRegistrationEnvironmentConfig),
112
119
  ),
120
+ queryBuilderConfig: optional(
121
+ usingModelSchema(QueryBuilderConfig.serialization.schema),
122
+ ),
113
123
  }),
114
124
  );
115
125
 
@@ -1083,6 +1083,7 @@ export const FunctionEditor = observer(() => {
1083
1083
  embeddedQueryBuilderState.editorStore.applicationStore,
1084
1084
  embeddedQueryBuilderState.editorStore.graphManagerState,
1085
1085
  functionEditorState.functionElement,
1086
+ editorStore.applicationStore.config.options.queryBuilderConfig,
1086
1087
  );
1087
1088
  functionQueryBuilderState.initializeWithQuery(
1088
1089
  new RawLambda(
@@ -26,6 +26,8 @@ import {
26
26
  clsx,
27
27
  WordWrapIcon,
28
28
  MoreHorizontalIcon,
29
+ FoldIcon,
30
+ UnfoldIcon,
29
31
  PanelContent,
30
32
  MenuContent,
31
33
  MenuContentItem,
@@ -686,6 +688,7 @@ export const GrammarTextEditor = observer(() => {
686
688
  GraphEditGrammarModeState,
687
689
  ).grammarTextEditorState;
688
690
  const error = editorStore.graphState.error;
691
+ const [elementsFolded, setFoldingElements] = useState(false);
689
692
 
690
693
  const forcedCursorPosition = grammarTextEditorState.forcedCursorPosition;
691
694
  const value = normalizeLineEnding(grammarTextEditorState.graphGrammarText);
@@ -974,12 +977,172 @@ export const GrammarTextEditor = observer(() => {
974
977
  );
975
978
  }
976
979
 
980
+ function toggleAutoFoldingElements(): void {
981
+ const autoFoldingElements = editorStore.pluginManager
982
+ .getApplicationPlugins()
983
+ .flatMap(
984
+ (plugin) =>
985
+ (
986
+ plugin as DSL_LegendStudioApplicationPlugin_Extension
987
+ ).getAutoFoldingCandidateToken?.() ?? [],
988
+ );
989
+ const foldingClass = editor?.getContribution('editor.contrib.folding');
990
+
991
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
992
+ (foldingClass as any).getFoldingModel().then(
993
+ (foldingModel: {
994
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
995
+ _regions: any;
996
+ onDidChange: (arg0: () => void) => void;
997
+ getRegionAtLine: (arg0: unknown) => unknown;
998
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
999
+ getAllRegionsAtLine(arg0: unknown): any;
1000
+ toggleCollapseState: (arg0: unknown) => unknown;
1001
+ }) => {
1002
+ const model = editor?.getModel();
1003
+ const toggleFoldingLines: number[] = [];
1004
+ model?.getLinesContent().forEach((line, j) => {
1005
+ autoFoldingElements.forEach((elementName) => {
1006
+ if (line.match(new RegExp(`^${elementName}`))) {
1007
+ toggleFoldingLines.push(j + 2);
1008
+ }
1009
+ });
1010
+ });
1011
+ let allElementsFolded = true;
1012
+ toggleFoldingLines.forEach((foldingLineRegion, i) => {
1013
+ if (foldingModel.getAllRegionsAtLine(foldingLineRegion)[0]) {
1014
+ if (
1015
+ foldingModel._regions.isCollapsed(
1016
+ foldingModel.getAllRegionsAtLine(foldingLineRegion)[0]
1017
+ .regionIndex,
1018
+ ) === false
1019
+ ) {
1020
+ allElementsFolded = false;
1021
+ }
1022
+ }
1023
+ });
1024
+
1025
+ setFoldingElements(!allElementsFolded);
1026
+
1027
+ toggleFoldingLines.forEach((foldingLineRegion, i) => {
1028
+ if (foldingModel.getAllRegionsAtLine(foldingLineRegion)[0]) {
1029
+ if (
1030
+ foldingModel._regions.isCollapsed(
1031
+ foldingModel.getAllRegionsAtLine(foldingLineRegion)[0]
1032
+ .regionIndex,
1033
+ ) !== elementsFolded
1034
+ ) {
1035
+ foldingModel.toggleCollapseState(
1036
+ foldingModel.getAllRegionsAtLine(foldingLineRegion),
1037
+ );
1038
+ }
1039
+ }
1040
+ });
1041
+ },
1042
+ );
1043
+ }
1044
+
977
1045
  useEffect(() => {
978
1046
  if (editor && forcedCursorPosition) {
979
1047
  moveCursorToPosition(editor, forcedCursorPosition);
980
1048
  }
981
1049
  }, [editor, forcedCursorPosition]);
982
1050
 
1051
+ useEffect(() => {
1052
+ if (editor) {
1053
+ const autoFoldingElements = editorStore.pluginManager
1054
+ .getApplicationPlugins()
1055
+ .flatMap(
1056
+ (plugin) =>
1057
+ (
1058
+ plugin as DSL_LegendStudioApplicationPlugin_Extension
1059
+ ).getAutoFoldingCandidateToken?.() ?? [],
1060
+ );
1061
+ const foldingClass = editor.getContribution('editor.contrib.folding');
1062
+
1063
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1064
+ (foldingClass as any).getFoldingModel().then(
1065
+ (foldingModel: {
1066
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1067
+ _regions: any;
1068
+ onDidChange: (arg0: () => void) => void;
1069
+ getRegionAtLine: (arg0: unknown) => unknown;
1070
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1071
+ getAllRegionsAtLine(arg0: unknown): any;
1072
+ toggleCollapseState: (arg0: unknown) => unknown;
1073
+ }) => {
1074
+ foldingModel.onDidChange(() => {
1075
+ const model = editor.getModel();
1076
+ const toggleFoldingLines: number[] = [];
1077
+ model?.getLinesContent().forEach((line, j) => {
1078
+ autoFoldingElements.forEach((elementName) => {
1079
+ if (line.match(new RegExp(`^${elementName}`))) {
1080
+ toggleFoldingLines.push(j + 2);
1081
+ }
1082
+ });
1083
+ });
1084
+ let allElementsFolded = true;
1085
+ toggleFoldingLines.forEach((foldingLineRegion, i) => {
1086
+ if (foldingModel.getAllRegionsAtLine(foldingLineRegion)[0]) {
1087
+ if (
1088
+ foldingModel._regions.isCollapsed(
1089
+ foldingModel.getAllRegionsAtLine(foldingLineRegion)[0]
1090
+ .regionIndex,
1091
+ ) === false
1092
+ ) {
1093
+ allElementsFolded = false;
1094
+ }
1095
+ }
1096
+ });
1097
+
1098
+ setFoldingElements(!allElementsFolded);
1099
+ });
1100
+ },
1101
+ );
1102
+ }
1103
+ });
1104
+
1105
+ useEffect(() => {
1106
+ if (editor) {
1107
+ const autoFoldingElements = editorStore.pluginManager
1108
+ .getApplicationPlugins()
1109
+ .flatMap(
1110
+ (plugin) =>
1111
+ (
1112
+ plugin as DSL_LegendStudioApplicationPlugin_Extension
1113
+ ).getAutoFoldingCandidateToken?.() ?? [],
1114
+ );
1115
+ const foldingClass = editor.getContribution('editor.contrib.folding');
1116
+
1117
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1118
+ (foldingClass as any)
1119
+ .getFoldingModel()
1120
+ .then(
1121
+ (foldingModel: {
1122
+ onDidChange: (arg0: () => void) => void;
1123
+ getRegionAtLine: (arg0: unknown) => unknown;
1124
+ getAllRegionsAtLine(arg0: unknown): unknown;
1125
+ toggleCollapseState: (arg0: unknown) => unknown;
1126
+ }) => {
1127
+ const model = editor.getModel();
1128
+ const foldingLines: number[] = [];
1129
+ model?.getLinesContent().forEach((line, j) => {
1130
+ autoFoldingElements.forEach((elementName) => {
1131
+ if (line.match(new RegExp(`^${elementName}`))) {
1132
+ foldingLines.push(j + 2);
1133
+ }
1134
+ });
1135
+ });
1136
+ foldingLines.forEach((foldingLineRegion, i) => {
1137
+ foldingModel.toggleCollapseState(
1138
+ foldingModel.getAllRegionsAtLine(foldingLineRegion),
1139
+ );
1140
+ });
1141
+ },
1142
+ );
1143
+ }
1144
+ }, [editor, editorStore.pluginManager]);
1145
+
983
1146
  // NOTE: dispose the editor to prevent potential memory-leak
984
1147
  useEffect(
985
1148
  () => (): void => {
@@ -1036,6 +1199,23 @@ export const GrammarTextEditor = observer(() => {
1036
1199
  >
1037
1200
  <WordWrapIcon className="editor-group__icon__word-wrap" />
1038
1201
  </button>
1202
+ <button
1203
+ className={clsx('editor-group__header__action', {
1204
+ 'editor-group__header__action--active': elementsFolded,
1205
+ })}
1206
+ onClick={toggleAutoFoldingElements}
1207
+ tabIndex={-1}
1208
+ title={`${
1209
+ !elementsFolded ? 'Unfold' : 'Fold'
1210
+ } auto-folding elements`}
1211
+ >
1212
+ {!elementsFolded && (
1213
+ <UnfoldIcon className="editor-group__icon__word-wrap" />
1214
+ )}
1215
+ {elementsFolded && (
1216
+ <FoldIcon className="editor-group__icon__word-wrap" />
1217
+ )}
1218
+ </button>
1039
1219
  </div>
1040
1220
  </div>
1041
1221
  <PanelContent className="editor-group__content">
@@ -117,6 +117,7 @@ const MappingTestQueryEditor = observer(
117
117
  embeddedQueryBuilderState.editorStore.applicationStore,
118
118
  embeddedQueryBuilderState.editorStore.graphManagerState,
119
119
  testState.mappingEditorState.mapping,
120
+ editorStore.applicationStore.config.options.queryBuilderConfig,
120
121
  );
121
122
  queryBuilderState.initializeWithQuery(testState.queryState.query);
122
123
  if (openInTextMode) {
@@ -210,6 +210,7 @@ const MappingExecutionQueryEditor = observer(
210
210
  embeddedQueryBuilderState.editorStore.applicationStore,
211
211
  embeddedQueryBuilderState.editorStore.graphManagerState,
212
212
  executionState.mappingEditorState.mapping,
213
+ editorStore.applicationStore.config.options.queryBuilderConfig,
213
214
  );
214
215
  queryBuilderState.initializeWithQuery(
215
216
  executionState.queryState.query,
@@ -594,6 +594,7 @@ const MappingTestSuiteQueryEditor = observer(
594
594
  embeddedQueryBuilderState.editorStore.applicationStore,
595
595
  embeddedQueryBuilderState.editorStore.graphManagerState,
596
596
  mapping,
597
+ editorStore.applicationStore.config.options.queryBuilderConfig,
597
598
  );
598
599
  queryBuilderState.initializeWithQuery(testableQueryState.query);
599
600
  if (openInTextMode) {
@@ -135,6 +135,9 @@ export const ServiceExecutionQueryEditor = observer(
135
135
  KeyedExecutionParameter
136
136
  ? selectedExecutionState.executionContext.key
137
137
  : undefined,
138
+ undefined,
139
+ undefined,
140
+ embeddedQueryBuilderState.editorStore.applicationStore.config.options.queryBuilderConfig,
138
141
  );
139
142
  queryBuilderState.initializeWithQuery(
140
143
  executionState.execution.func,
@@ -463,6 +466,9 @@ export const queryService = async (
463
466
  service,
464
467
  undefined,
465
468
  selectedExec,
469
+ undefined,
470
+ undefined,
471
+ embeddedQueryBuilderState.editorStore.applicationStore.config.options.queryBuilderConfig,
466
472
  );
467
473
  if (execution) {
468
474
  queryBuilderState.initializeWithQuery(execution.func);
@@ -379,6 +379,7 @@ export const queryClass = async (
379
379
  const queryBuilderState = new ClassQueryBuilderState(
380
380
  embeddedQueryBuilderState.editorStore.applicationStore,
381
381
  embeddedQueryBuilderState.editorStore.graphManagerState,
382
+ editorStore.applicationStore.config.options.queryBuilderConfig,
382
383
  );
383
384
  queryBuilderState.changeClass(_class);
384
385
  queryBuilderState.propagateClassChange(_class);
@@ -326,4 +326,10 @@ export interface DSL_LegendStudioApplicationPlugin_Extension
326
326
  * (e.g. Class, Enum in ###Pure)
327
327
  */
328
328
  getExtraPureGrammarParserElementSnippetSuggestionsGetters?(): PureGrammarParserElementSnippetSuggestionsGetter[];
329
+
330
+ /**
331
+ * Get a string of the Pure grammar element name for auto-folding the element
332
+ * (e.g. Diagram, or Text)
333
+ */
334
+ getAutoFoldingCandidateToken?(): string[];
329
335
  }
@@ -15,7 +15,10 @@
15
15
  */
16
16
 
17
17
  import type { GenericLegendApplicationStore } from '@finos/legend-application';
18
- import { QueryBuilderState } from '@finos/legend-query-builder';
18
+ import {
19
+ type QueryBuilderConfig,
20
+ QueryBuilderState,
21
+ } from '@finos/legend-query-builder';
19
22
  import type { GraphManagerState, Mapping } from '@finos/legend-graph';
20
23
  import { renderMappingExecutionQueryBuilderSetupPanelContent } from '../../../../../components/editor/editor-group/mapping-editor/MappingExecutionQueryBuilder.js';
21
24
 
@@ -29,8 +32,9 @@ export class MappingExecutionQueryBuilderState extends QueryBuilderState {
29
32
  applicationStore: GenericLegendApplicationStore,
30
33
  graphManagerState: GraphManagerState,
31
34
  mapping: Mapping,
35
+ config: QueryBuilderConfig | undefined,
32
36
  ) {
33
- super(applicationStore, graphManagerState);
37
+ super(applicationStore, graphManagerState, config);
34
38
  this.executionMapping = mapping;
35
39
  this.executionContextState.mapping = mapping;
36
40
  }