@finos/legend-query-builder 4.14.36 → 4.14.38
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__/QueryBuilderDocumentation.d.ts +2 -1
- package/lib/__lib__/QueryBuilderDocumentation.d.ts.map +1 -1
- package/lib/__lib__/QueryBuilderDocumentation.js +1 -0
- package/lib/__lib__/QueryBuilderDocumentation.js.map +1 -1
- package/lib/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +26 -9
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
- package/lib/components/QueryBuilderSideBar.js +3 -3
- package/lib/components/QueryBuilderSideBar.js.map +1 -1
- package/lib/components/QueryBuilderTextEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderTextEditor.js +17 -3
- package/lib/components/QueryBuilderTextEditor.js.map +1 -1
- package/lib/components/explorer/QueryBuilderMilestoningEditor.d.ts +5 -0
- package/lib/components/explorer/QueryBuilderMilestoningEditor.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderMilestoningEditor.js +10 -5
- package/lib/components/explorer/QueryBuilderMilestoningEditor.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +35 -3
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +11 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.js +21 -8
- package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/workflows/ClassQueryBuilder.d.ts.map +1 -1
- package/lib/components/workflows/ClassQueryBuilder.js +3 -3
- package/lib/components/workflows/ClassQueryBuilder.js.map +1 -1
- package/lib/components/workflows/MappingQueryBuilder.d.ts.map +1 -1
- package/lib/components/workflows/MappingQueryBuilder.js +3 -3
- package/lib/components/workflows/MappingQueryBuilder.js.map +1 -1
- package/lib/components/workflows/ServiceQueryBuilder.d.ts.map +1 -1
- package/lib/components/workflows/ServiceQueryBuilder.js +3 -3
- package/lib/components/workflows/ServiceQueryBuilder.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderTextEditorState.d.ts +4 -1
- package/lib/stores/QueryBuilderTextEditorState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderTextEditorState.js +19 -2
- package/lib/stores/QueryBuilderTextEditorState.js.map +1 -1
- package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts +16 -0
- package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts.map +1 -1
- package/lib/stores/QueryLoaderState.d.ts +2 -2
- package/lib/stores/QueryLoaderState.d.ts.map +1 -1
- package/lib/stores/QueryLoaderState.js +3 -3
- package/lib/stores/QueryLoaderState.js.map +1 -1
- package/lib/stores/explorer/QueryFunctionsExplorerState.d.ts +1 -1
- package/lib/stores/explorer/QueryFunctionsExplorerState.d.ts.map +1 -1
- package/lib/stores/explorer/QueryFunctionsExplorerState.js +2 -1
- package/lib/stores/explorer/QueryFunctionsExplorerState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +8 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
- package/lib/stores/milestoning/QueryBuilderMilestoningState.d.ts.map +1 -1
- package/lib/stores/milestoning/QueryBuilderMilestoningState.js +9 -3
- package/lib/stores/milestoning/QueryBuilderMilestoningState.js.map +1 -1
- package/package.json +5 -5
- package/src/__lib__/QueryBuilderDocumentation.ts +1 -0
- package/src/components/QueryBuilder.tsx +100 -17
- package/src/components/QueryBuilderSideBar.tsx +3 -2
- package/src/components/QueryBuilderTextEditor.tsx +46 -11
- package/src/components/explorer/QueryBuilderMilestoningEditor.tsx +60 -46
- package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +53 -3
- package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +116 -19
- package/src/components/result/QueryBuilderResultPanel.tsx +84 -29
- package/src/components/workflows/ClassQueryBuilder.tsx +3 -2
- package/src/components/workflows/MappingQueryBuilder.tsx +3 -2
- package/src/components/workflows/ServiceQueryBuilder.tsx +7 -3
- package/src/stores/QueryBuilderTextEditorState.ts +20 -2
- package/src/stores/QueryBuilder_LegendApplicationPlugin_Extension.ts +21 -0
- package/src/stores/QueryLoaderState.ts +5 -7
- package/src/stores/explorer/QueryFunctionsExplorerState.ts +6 -2
- package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +11 -0
- package/src/stores/milestoning/QueryBuilderMilestoningState.ts +11 -7
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import {
|
|
18
18
|
CustomSelectorInput,
|
|
19
19
|
PanelHeader,
|
|
20
|
+
compareLabelFn,
|
|
20
21
|
createFilter,
|
|
21
22
|
} from '@finos/legend-art';
|
|
22
23
|
import { observer } from 'mobx-react-lite';
|
|
@@ -59,7 +60,7 @@ const MappingQueryBuilderSetupPanelContent = observer(
|
|
|
59
60
|
// mapping
|
|
60
61
|
const mappingOptions = queryBuilderState.graphManagerState.usableMappings
|
|
61
62
|
.map(buildElementOption)
|
|
62
|
-
.sort(
|
|
63
|
+
.sort(compareLabelFn);
|
|
63
64
|
const selectedMappingOption = queryBuilderState.executionContextState
|
|
64
65
|
.mapping
|
|
65
66
|
? buildElementOption(queryBuilderState.executionContextState.mapping)
|
|
@@ -93,7 +94,7 @@ const MappingQueryBuilderSetupPanelContent = observer(
|
|
|
93
94
|
new RuntimePointer(PackageableElementExplicitReference.create(rt)),
|
|
94
95
|
)
|
|
95
96
|
.map(buildRuntimeValueOption)
|
|
96
|
-
.sort(
|
|
97
|
+
.sort(compareLabelFn);
|
|
97
98
|
const selectedRuntimeOption = queryBuilderState.executionContextState
|
|
98
99
|
.runtimeValue
|
|
99
100
|
? buildRuntimeValueOption(
|
|
@@ -14,7 +14,11 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
CustomSelectorInput,
|
|
19
|
+
PanelHeader,
|
|
20
|
+
compareLabelFn,
|
|
21
|
+
} from '@finos/legend-art';
|
|
18
22
|
import { observer } from 'mobx-react-lite';
|
|
19
23
|
import { getMappingCompatibleClasses, type Service } from '@finos/legend-graph';
|
|
20
24
|
import { useApplicationStore } from '@finos/legend-application';
|
|
@@ -57,7 +61,7 @@ const ServiceQueryBuilderSetupPanelContent = observer(
|
|
|
57
61
|
const serviceOptions =
|
|
58
62
|
queryBuilderState.usableServices
|
|
59
63
|
?.map(buildElementOption)
|
|
60
|
-
.sort(
|
|
64
|
+
.sort(compareLabelFn) ?? [];
|
|
61
65
|
const selectedServiceOption = buildElementOption(queryBuilderState.service);
|
|
62
66
|
const onServiceOptionChange = (
|
|
63
67
|
option: PackageableElementOption<Service>,
|
|
@@ -71,7 +75,7 @@ const ServiceQueryBuilderSetupPanelContent = observer(
|
|
|
71
75
|
// execution context
|
|
72
76
|
const executionContextOptions = queryBuilderState.executionContexts
|
|
73
77
|
.map(buildExecutionContextOption)
|
|
74
|
-
.sort(
|
|
78
|
+
.sort(compareLabelFn);
|
|
75
79
|
const selectedExecutionContextOption =
|
|
76
80
|
queryBuilderState.selectedExecutionContext
|
|
77
81
|
? buildExecutionContextOption(
|
|
@@ -67,6 +67,7 @@ export class QueryBuilderTextEditorState extends LambdaEditorState {
|
|
|
67
67
|
* TODO: consider moving this to another state if we need to simplify the logic of text-mode
|
|
68
68
|
*/
|
|
69
69
|
readOnlylambdaJson = '';
|
|
70
|
+
isReadOnly: boolean | undefined;
|
|
70
71
|
|
|
71
72
|
constructor(queryBuilderState: QueryBuilderState) {
|
|
72
73
|
super('', '');
|
|
@@ -75,7 +76,9 @@ export class QueryBuilderTextEditorState extends LambdaEditorState {
|
|
|
75
76
|
rawLambdaState: observable,
|
|
76
77
|
isConvertingLambdaToString: observable,
|
|
77
78
|
mode: observable,
|
|
79
|
+
isReadOnly: observable,
|
|
78
80
|
setQueryRawLambdaState: action,
|
|
81
|
+
setIsReadOnly: action,
|
|
79
82
|
setMode: action,
|
|
80
83
|
openModal: action,
|
|
81
84
|
closeModal: flow,
|
|
@@ -89,10 +92,23 @@ export class QueryBuilderTextEditorState extends LambdaEditorState {
|
|
|
89
92
|
return buildSourceInformationSourceId(['query-builder']);
|
|
90
93
|
}
|
|
91
94
|
|
|
95
|
+
get text(): string | undefined {
|
|
96
|
+
if (this.mode === QueryBuilderTextEditorMode.TEXT) {
|
|
97
|
+
return this.fullLambdaString;
|
|
98
|
+
} else if (this.mode === QueryBuilderTextEditorMode.JSON) {
|
|
99
|
+
return this.readOnlylambdaJson;
|
|
100
|
+
}
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
|
|
92
104
|
setQueryRawLambdaState(rawLambdaState: QueryBuilderRawLambdaState): void {
|
|
93
105
|
this.rawLambdaState = rawLambdaState;
|
|
94
106
|
}
|
|
95
107
|
|
|
108
|
+
setIsReadOnly(val: boolean | undefined): void {
|
|
109
|
+
this.isReadOnly = val;
|
|
110
|
+
}
|
|
111
|
+
|
|
96
112
|
setMode(openModal: QueryBuilderTextEditorMode | undefined): void {
|
|
97
113
|
this.mode = openModal;
|
|
98
114
|
}
|
|
@@ -170,7 +186,7 @@ export class QueryBuilderTextEditorState extends LambdaEditorState {
|
|
|
170
186
|
}
|
|
171
187
|
}
|
|
172
188
|
|
|
173
|
-
openModal(mode: QueryBuilderTextEditorMode): void {
|
|
189
|
+
openModal(mode: QueryBuilderTextEditorMode, isReadOnly?: boolean): void {
|
|
174
190
|
try {
|
|
175
191
|
const rawLambda = this.queryBuilderState.buildQuery();
|
|
176
192
|
if (mode === QueryBuilderTextEditorMode.TEXT) {
|
|
@@ -190,6 +206,7 @@ export class QueryBuilderTextEditorState extends LambdaEditorState {
|
|
|
190
206
|
);
|
|
191
207
|
}
|
|
192
208
|
this.setMode(mode);
|
|
209
|
+
this.setIsReadOnly(isReadOnly);
|
|
193
210
|
} catch (error) {
|
|
194
211
|
assertErrorThrown(error);
|
|
195
212
|
this.queryBuilderState.applicationStore.notificationService.notifyError(
|
|
@@ -200,7 +217,7 @@ export class QueryBuilderTextEditorState extends LambdaEditorState {
|
|
|
200
217
|
|
|
201
218
|
*closeModal(): GeneratorFn<void> {
|
|
202
219
|
this.closingQueryState.inProgress();
|
|
203
|
-
if (this.mode === QueryBuilderTextEditorMode.TEXT) {
|
|
220
|
+
if (this.mode === QueryBuilderTextEditorMode.TEXT && !this.isReadOnly) {
|
|
204
221
|
yield flowResult(this.convertLambdaGrammarStringToObject());
|
|
205
222
|
if (this.parserError) {
|
|
206
223
|
this.queryBuilderState.applicationStore.notificationService.notifyError(
|
|
@@ -215,6 +232,7 @@ export class QueryBuilderTextEditorState extends LambdaEditorState {
|
|
|
215
232
|
}
|
|
216
233
|
return;
|
|
217
234
|
}
|
|
235
|
+
this.setIsReadOnly(undefined);
|
|
218
236
|
this.closingQueryState.complete();
|
|
219
237
|
|
|
220
238
|
this.setMode(undefined);
|
|
@@ -83,6 +83,17 @@ export type QueryBuilderHeaderActionConfiguration = {
|
|
|
83
83
|
) => React.ReactNode | undefined;
|
|
84
84
|
};
|
|
85
85
|
|
|
86
|
+
export type QueryBuilderMenuActionConfiguration = {
|
|
87
|
+
key: string;
|
|
88
|
+
title?: string;
|
|
89
|
+
label: string;
|
|
90
|
+
onClick: (queryBuilderState: QueryBuilderState) => void;
|
|
91
|
+
icon?: React.ReactNode;
|
|
92
|
+
renderExtraComponent?: (
|
|
93
|
+
queryBuilderState: QueryBuilderState,
|
|
94
|
+
) => React.ReactNode;
|
|
95
|
+
};
|
|
96
|
+
|
|
86
97
|
export interface QueryBuilder_LegendApplicationPlugin_Extension
|
|
87
98
|
extends LegendApplicationPlugin {
|
|
88
99
|
/**
|
|
@@ -136,4 +147,14 @@ export interface QueryBuilder_LegendApplicationPlugin_Extension
|
|
|
136
147
|
* Get the list of action configurations
|
|
137
148
|
*/
|
|
138
149
|
getExtraQueryBuilderHeaderTitleConfigurations?(): QueryBuilderHeaderActionConfiguration[];
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Get the list of help menu action configurations
|
|
153
|
+
*/
|
|
154
|
+
getExtraQueryBuilderHelpMenuActionConfigurations?(): QueryBuilderMenuActionConfiguration[];
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Get the list of export menu action configurations
|
|
158
|
+
*/
|
|
159
|
+
getExtraQueryBuilderExportMenuActionConfigurations?(): QueryBuilderMenuActionConfiguration[];
|
|
139
160
|
}
|
|
@@ -65,7 +65,7 @@ export class QueryLoaderState {
|
|
|
65
65
|
|
|
66
66
|
readonly isReadOnly?: boolean | undefined;
|
|
67
67
|
readonly onQueryRenamed?: ((query: LightQuery) => void) | undefined;
|
|
68
|
-
readonly onQueryDeleted?: ((query:
|
|
68
|
+
readonly onQueryDeleted?: ((query: string) => void) | undefined;
|
|
69
69
|
readonly handleFetchDefaultQueriesFailure?: (() => void) | undefined;
|
|
70
70
|
|
|
71
71
|
queryBuilderState?: QueryBuilderState | undefined;
|
|
@@ -100,7 +100,7 @@ export class QueryLoaderState {
|
|
|
100
100
|
|
|
101
101
|
isReadOnly?: boolean | undefined;
|
|
102
102
|
onQueryRenamed?: ((query: LightQuery) => void) | undefined;
|
|
103
|
-
onQueryDeleted?: ((query:
|
|
103
|
+
onQueryDeleted?: ((query: string) => void) | undefined;
|
|
104
104
|
handleFetchDefaultQueriesFailure?: (() => void) | undefined;
|
|
105
105
|
},
|
|
106
106
|
) {
|
|
@@ -304,11 +304,9 @@ export class QueryLoaderState {
|
|
|
304
304
|
*deleteQuery(queryId: string): GeneratorFn<void> {
|
|
305
305
|
this.deleteQueryState.inProgress();
|
|
306
306
|
try {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
this.onQueryDeleted?.(query);
|
|
311
|
-
this.applicationStore.notificationService.notify(
|
|
307
|
+
yield this.graphManagerState.graphManager.deleteQuery(queryId);
|
|
308
|
+
this.onQueryDeleted?.(queryId);
|
|
309
|
+
this.applicationStore.notificationService.notifySuccess(
|
|
312
310
|
'Deleted query successfully',
|
|
313
311
|
);
|
|
314
312
|
this.deleteQueryState.pass();
|
|
@@ -30,7 +30,11 @@ import {
|
|
|
30
30
|
} from '@finos/legend-shared';
|
|
31
31
|
import { action, makeObservable, observable } from 'mobx';
|
|
32
32
|
import type { QueryBuilderState } from '../QueryBuilderState.js';
|
|
33
|
-
import
|
|
33
|
+
import {
|
|
34
|
+
type TreeNodeData,
|
|
35
|
+
type TreeData,
|
|
36
|
+
compareLabelFn,
|
|
37
|
+
} from '@finos/legend-art';
|
|
34
38
|
|
|
35
39
|
export const QUERY_BUILDER_FUNCTION_DND_TYPE = 'QUERY_BUILDER_FUNCTION';
|
|
36
40
|
|
|
@@ -206,7 +210,7 @@ export const getFunctionsExplorerTreeNodeChildren = (
|
|
|
206
210
|
return node.childrenIds
|
|
207
211
|
.map((id) => data.nodes.get(id))
|
|
208
212
|
.filter(isNonNullable)
|
|
209
|
-
.sort(
|
|
213
|
+
.sort(compareLabelFn)
|
|
210
214
|
.sort(
|
|
211
215
|
(a, b) =>
|
|
212
216
|
(b.packageableElement instanceof Package ? 1 : 0) -
|
|
@@ -146,6 +146,7 @@ export class QueryBuilderTDSState
|
|
|
146
146
|
TEMPORARY__showPostFetchStructurePanel: computed,
|
|
147
147
|
derivations: computed,
|
|
148
148
|
hasParserError: computed,
|
|
149
|
+
isQueryOptionsSet: computed,
|
|
149
150
|
addColumn: action,
|
|
150
151
|
moveColumn: action,
|
|
151
152
|
removeAllColumns: action,
|
|
@@ -356,6 +357,16 @@ export class QueryBuilderTDSState
|
|
|
356
357
|
return fetchStructureValidationIssues;
|
|
357
358
|
}
|
|
358
359
|
|
|
360
|
+
get isQueryOptionsSet(): boolean {
|
|
361
|
+
return (
|
|
362
|
+
this.resultSetModifierState.limit !== undefined ||
|
|
363
|
+
this.queryBuilderState.milestoningState.isMilestonedQuery ||
|
|
364
|
+
this.resultSetModifierState.slice !== undefined ||
|
|
365
|
+
this.resultSetModifierState.sortColumns.length > 0 ||
|
|
366
|
+
this.resultSetModifierState.distinct
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
|
|
359
370
|
get tdsColumns(): QueryBuilderTDSColumnState[] {
|
|
360
371
|
const aggregationStateCols = this.aggregationState.columns.map(
|
|
361
372
|
(c) => c.projectionColumnState,
|
|
@@ -75,7 +75,7 @@ export class QueryBuilderMilestoningState implements Hashable {
|
|
|
75
75
|
startDate: observable,
|
|
76
76
|
endDate: observable,
|
|
77
77
|
showMilestoningEditor: observable,
|
|
78
|
-
|
|
78
|
+
|
|
79
79
|
setProcessingDate: action,
|
|
80
80
|
setBusinessDate: action,
|
|
81
81
|
setStartDate: action,
|
|
@@ -87,6 +87,10 @@ export class QueryBuilderMilestoningState implements Hashable {
|
|
|
87
87
|
initializeAllVersionsInRangeParameters: action,
|
|
88
88
|
clearAllVersionsInRangeParameters: action,
|
|
89
89
|
clearGetAllParameters: action,
|
|
90
|
+
|
|
91
|
+
isAllVersionsEnabled: computed,
|
|
92
|
+
isAllVersionsInRangeEnabled: computed,
|
|
93
|
+
isMilestonedQuery: computed,
|
|
90
94
|
hashCode: computed,
|
|
91
95
|
});
|
|
92
96
|
|
|
@@ -380,9 +384,9 @@ export class QueryBuilderMilestoningState implements Hashable {
|
|
|
380
384
|
this.queryBuilderState.parametersState.parameterStates.find(
|
|
381
385
|
(p) => p.parameter === this.startDate,
|
|
382
386
|
);
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
387
|
+
if (paramState) {
|
|
388
|
+
this.queryBuilderState.parametersState.removeParameter(paramState);
|
|
389
|
+
}
|
|
386
390
|
}
|
|
387
391
|
if (
|
|
388
392
|
this.endDate instanceof VariableExpression &&
|
|
@@ -394,9 +398,9 @@ export class QueryBuilderMilestoningState implements Hashable {
|
|
|
394
398
|
this.queryBuilderState.parametersState.parameterStates.find(
|
|
395
399
|
(p) => p.parameter === this.endDate,
|
|
396
400
|
);
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
401
|
+
if (paramState) {
|
|
402
|
+
this.queryBuilderState.parametersState.removeParameter(paramState);
|
|
403
|
+
}
|
|
400
404
|
}
|
|
401
405
|
this.setStartDate(undefined);
|
|
402
406
|
this.setEndDate(undefined);
|