@finos/legend-query-builder 4.14.36 → 4.14.38
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -278,12 +278,10 @@ const AllVersionsInRangelMilestoningParametersEditor = observer(
|
|
278
278
|
},
|
279
279
|
);
|
280
280
|
|
281
|
-
export const
|
281
|
+
export const MilestoningParametersEditorContent = observer(
|
282
282
|
(props: { queryBuilderState: QueryBuilderState }) => {
|
283
283
|
const { queryBuilderState } = props;
|
284
|
-
const applicationStore = queryBuilderState.applicationStore;
|
285
284
|
const milestoningState = queryBuilderState.milestoningState;
|
286
|
-
const close = (): void => milestoningState.setShowMilestoningEditor(false);
|
287
285
|
const isCompatibleMilestoningParameter = (
|
288
286
|
variable: VariableExpression,
|
289
287
|
): boolean =>
|
@@ -292,6 +290,62 @@ export const MilestoningParametersEditor = observer(
|
|
292
290
|
variable.genericType?.value.rawType.name === PRIMITIVE_TYPE.DATE ||
|
293
291
|
variable.genericType?.value.rawType.name === PRIMITIVE_TYPE.DATETIME;
|
294
292
|
|
293
|
+
return (
|
294
|
+
<>
|
295
|
+
{milestoningState.isCurrentClassMilestoned && (
|
296
|
+
<PanelFormBooleanField
|
297
|
+
isReadOnly={false}
|
298
|
+
value={milestoningState.isAllVersionsEnabled}
|
299
|
+
name="all Versions"
|
300
|
+
prompt="Query All Milestoned Versions of the Root Class"
|
301
|
+
update={(value: boolean | undefined): void =>
|
302
|
+
milestoningState.setAllVersions(value)
|
303
|
+
}
|
304
|
+
/>
|
305
|
+
)}
|
306
|
+
{milestoningState.isAllVersionsEnabled &&
|
307
|
+
milestoningState.isCurrentClassSupportsVersionsInRange && (
|
308
|
+
<>
|
309
|
+
<PanelFormBooleanField
|
310
|
+
isReadOnly={false}
|
311
|
+
value={milestoningState.isAllVersionsInRangeEnabled}
|
312
|
+
name=" All Versions In Range"
|
313
|
+
prompt="Optionally apply a date range to get All Versions for"
|
314
|
+
update={(value: boolean | undefined): void =>
|
315
|
+
milestoningState.setAllVersionsInRange(value)
|
316
|
+
}
|
317
|
+
/>
|
318
|
+
|
319
|
+
{milestoningState.isAllVersionsInRangeEnabled && (
|
320
|
+
<AllVersionsInRangelMilestoningParametersEditor
|
321
|
+
queryBuilderState={queryBuilderState}
|
322
|
+
/>
|
323
|
+
)}
|
324
|
+
</>
|
325
|
+
)}
|
326
|
+
<TemporalMilestoningEditor queryBuilderState={queryBuilderState} />
|
327
|
+
<PanelFormSection>
|
328
|
+
<div className="panel__content__form__section__header__label">
|
329
|
+
List of compatible milestoning parameters
|
330
|
+
</div>
|
331
|
+
</PanelFormSection>
|
332
|
+
<div className="panel__content__form__section__list__items">
|
333
|
+
<VariableSelector
|
334
|
+
queryBuilderState={queryBuilderState}
|
335
|
+
filterBy={isCompatibleMilestoningParameter}
|
336
|
+
/>
|
337
|
+
</div>
|
338
|
+
</>
|
339
|
+
);
|
340
|
+
},
|
341
|
+
);
|
342
|
+
|
343
|
+
export const MilestoningParametersEditor = observer(
|
344
|
+
(props: { queryBuilderState: QueryBuilderState }) => {
|
345
|
+
const { queryBuilderState } = props;
|
346
|
+
const applicationStore = queryBuilderState.applicationStore;
|
347
|
+
const milestoningState = queryBuilderState.milestoningState;
|
348
|
+
const close = (): void => milestoningState.setShowMilestoningEditor(false);
|
295
349
|
return (
|
296
350
|
<Dialog
|
297
351
|
open={milestoningState.showMilestoningEditor}
|
@@ -310,49 +364,9 @@ export const MilestoningParametersEditor = observer(
|
|
310
364
|
>
|
311
365
|
<ModalHeader title="Milestoning Parameters" />
|
312
366
|
<ModalBody className="query-builder__variables__modal__body">
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
value={milestoningState.isAllVersionsEnabled}
|
317
|
-
name="all Versions"
|
318
|
-
prompt="Query All Milestoned Versions of the Root Class"
|
319
|
-
update={(value: boolean | undefined): void =>
|
320
|
-
milestoningState.setAllVersions(value)
|
321
|
-
}
|
322
|
-
/>
|
323
|
-
)}
|
324
|
-
{milestoningState.isAllVersionsEnabled &&
|
325
|
-
milestoningState.isCurrentClassSupportsVersionsInRange && (
|
326
|
-
<>
|
327
|
-
<PanelFormBooleanField
|
328
|
-
isReadOnly={false}
|
329
|
-
value={milestoningState.isAllVersionsInRangeEnabled}
|
330
|
-
name=" All Versions In Range"
|
331
|
-
prompt="Optionally apply a date range to get All Versions for"
|
332
|
-
update={(value: boolean | undefined): void =>
|
333
|
-
milestoningState.setAllVersionsInRange(value)
|
334
|
-
}
|
335
|
-
/>
|
336
|
-
|
337
|
-
{milestoningState.isAllVersionsInRangeEnabled && (
|
338
|
-
<AllVersionsInRangelMilestoningParametersEditor
|
339
|
-
queryBuilderState={queryBuilderState}
|
340
|
-
/>
|
341
|
-
)}
|
342
|
-
</>
|
343
|
-
)}
|
344
|
-
<TemporalMilestoningEditor queryBuilderState={queryBuilderState} />
|
345
|
-
<PanelFormSection>
|
346
|
-
<div className="panel__content__form__section__header__label">
|
347
|
-
List of compatible milestoning parameters
|
348
|
-
</div>
|
349
|
-
</PanelFormSection>
|
350
|
-
<div className="panel__content__form__section__list__items">
|
351
|
-
<VariableSelector
|
352
|
-
queryBuilderState={queryBuilderState}
|
353
|
-
filterBy={isCompatibleMilestoningParameter}
|
354
|
-
/>
|
355
|
-
</div>
|
367
|
+
<MilestoningParametersEditorContent
|
368
|
+
queryBuilderState={queryBuilderState}
|
369
|
+
/>
|
356
370
|
</ModalBody>
|
357
371
|
<ModalFooter>
|
358
372
|
<ModalFooterButton text="Close" onClick={close} type="secondary" />
|
@@ -48,7 +48,7 @@ import { useApplicationStore } from '@finos/legend-application';
|
|
48
48
|
import type { QueryBuilderTDSState } from '../../stores/fetch-structure/tds/QueryBuilderTDSState.js';
|
49
49
|
import type { QueryBuilderTDSColumnState } from '../../stores/fetch-structure/tds/QueryBuilderTDSColumnState.js';
|
50
50
|
import { COLUMN_SORT_TYPE } from '../../graph/QueryBuilderMetaModelConst.js';
|
51
|
-
import { useCallback, useEffect, useState } from 'react';
|
51
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
52
52
|
import type { QueryBuilderProjectionColumnState } from '../../stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js';
|
53
53
|
import { QUERY_BUILDER_TEST_ID } from '../../__lib__/QueryBuilderTesting.js';
|
54
54
|
import { VariableSelector } from '../shared/QueryBuilderVariableSelector.js';
|
@@ -65,6 +65,7 @@ import {
|
|
65
65
|
type QueryBuilderVariableDragSource,
|
66
66
|
} from '../shared/BasicValueSpecificationEditor.js';
|
67
67
|
import { useDrop } from 'react-dnd';
|
68
|
+
import { MilestoningParametersEditorContent } from '../explorer/QueryBuilderMilestoningEditor.js';
|
68
69
|
|
69
70
|
const ColumnSortEditor = observer(
|
70
71
|
(props: {
|
@@ -270,6 +271,31 @@ export const QueryResultModifierModal = observer(
|
|
270
271
|
deepClone(watermarkState.value),
|
271
272
|
);
|
272
273
|
|
274
|
+
//milestoning config
|
275
|
+
const milestoningState = tdsState.queryBuilderState.milestoningState;
|
276
|
+
const businessDate = useRef(milestoningState.businessDate);
|
277
|
+
const processingDate = useRef(milestoningState.processingDate);
|
278
|
+
const isAllVersionsEnabled = useRef(milestoningState.isAllVersionsEnabled);
|
279
|
+
const isAllVersionsInRangeEnabled = useRef(
|
280
|
+
milestoningState.isAllVersionsInRangeEnabled,
|
281
|
+
);
|
282
|
+
const startDate = useRef(milestoningState.startDate);
|
283
|
+
const endDate = useRef(milestoningState.endDate);
|
284
|
+
|
285
|
+
const resetMilestoningToInitial = (): void => {
|
286
|
+
if (isAllVersionsInRangeEnabled.current) {
|
287
|
+
milestoningState.setAllVersionsInRange(
|
288
|
+
isAllVersionsInRangeEnabled.current,
|
289
|
+
);
|
290
|
+
milestoningState.setStartDate(startDate.current);
|
291
|
+
milestoningState.setEndDate(endDate.current);
|
292
|
+
} else {
|
293
|
+
milestoningState.setAllVersions(isAllVersionsEnabled.current);
|
294
|
+
}
|
295
|
+
milestoningState.setBusinessDate(businessDate.current);
|
296
|
+
milestoningState.setProcessingDate(processingDate.current);
|
297
|
+
};
|
298
|
+
|
273
299
|
// Sync temp state with tdsState when modal is opened/closed
|
274
300
|
useEffect(() => {
|
275
301
|
setSortColumns(cloneSortColumnStateArray(stateSortColumns));
|
@@ -287,7 +313,10 @@ export const QueryResultModifierModal = observer(
|
|
287
313
|
]);
|
288
314
|
|
289
315
|
// Handle user actions
|
290
|
-
const closeModal = (): void =>
|
316
|
+
const closeModal = (): void => {
|
317
|
+
resetMilestoningToInitial();
|
318
|
+
resultSetModifierState.setShowModal(false);
|
319
|
+
};
|
291
320
|
const applyChanges = (): void => {
|
292
321
|
resultSetModifierState.setSortColumns(sortColumns);
|
293
322
|
resultSetModifierState.setDistinct(distinct);
|
@@ -299,6 +328,13 @@ export const QueryResultModifierModal = observer(
|
|
299
328
|
}
|
300
329
|
resultSetModifierState.setShowModal(false);
|
301
330
|
watermarkState.setValue(watermarkValue);
|
331
|
+
businessDate.current = milestoningState.businessDate;
|
332
|
+
processingDate.current = milestoningState.processingDate;
|
333
|
+
isAllVersionsEnabled.current = milestoningState.isAllVersionsEnabled;
|
334
|
+
isAllVersionsInRangeEnabled.current =
|
335
|
+
milestoningState.isAllVersionsInRangeEnabled;
|
336
|
+
startDate.current = milestoningState.startDate;
|
337
|
+
endDate.current = milestoningState.endDate;
|
302
338
|
};
|
303
339
|
|
304
340
|
const handleLimitResultsChange: React.ChangeEventHandler<
|
@@ -408,9 +444,23 @@ export const QueryResultModifierModal = observer(
|
|
408
444
|
}
|
409
445
|
className="editor-modal query-builder__projection__modal"
|
410
446
|
>
|
411
|
-
<ModalHeader title="
|
447
|
+
<ModalHeader title="Query Options" />
|
412
448
|
<ModalBody className="query-builder__projection__modal__body">
|
413
449
|
<div className="query-builder__projection__options">
|
450
|
+
{tdsState.queryBuilderState.milestoningState
|
451
|
+
.isMilestonedQuery && (
|
452
|
+
<>
|
453
|
+
<div className="query-builder__projection__options__section-name">
|
454
|
+
Milestoning
|
455
|
+
</div>
|
456
|
+
<MilestoningParametersEditorContent
|
457
|
+
queryBuilderState={tdsState.queryBuilderState}
|
458
|
+
/>
|
459
|
+
<div className="query-builder__projection__options__section-name">
|
460
|
+
Other
|
461
|
+
</div>
|
462
|
+
</>
|
463
|
+
)}
|
414
464
|
<ColumnsSortEditor
|
415
465
|
projectionColumns={tdsState.projectionColumns}
|
416
466
|
sortColumns={sortColumns}
|
@@ -1148,27 +1148,118 @@ export const QueryBuilderTDSPanel = observer(
|
|
1148
1148
|
>
|
1149
1149
|
<div className="query-builder__projection__result-modifier-prompt__header">
|
1150
1150
|
<button
|
1151
|
-
className="query-builder__projection__result-modifier-prompt__header__label"
|
1151
|
+
className="query-builder__projection__result-modifier-prompt__header__label editable-value"
|
1152
1152
|
onClick={openResultSetModifierEditor}
|
1153
|
-
title="Configure
|
1153
|
+
title="Configure Query Options..."
|
1154
1154
|
>
|
1155
1155
|
<CogIcon className="query-builder__projection__result-modifier-prompt__header__label__icon" />
|
1156
1156
|
<div className="query-builder__projection__result-modifier-prompt__header__label__title">
|
1157
|
-
|
1157
|
+
{tdsState.isQueryOptionsSet
|
1158
|
+
? 'Query Options'
|
1159
|
+
: 'Set Query Options'}
|
1158
1160
|
</div>
|
1159
1161
|
</button>
|
1162
|
+
<div className="query-builder__projection__result-modifier-prompt__divider">
|
1163
|
+
{tdsState.isQueryOptionsSet && ' - '}
|
1164
|
+
</div>
|
1165
|
+
{tdsState.queryBuilderState.milestoningState.businessDate && (
|
1166
|
+
<div className="query-builder__projection__result-modifier-prompt__group">
|
1167
|
+
<div className="query-builder__projection__result-modifier-prompt__group__label">
|
1168
|
+
Business Date
|
1169
|
+
</div>
|
1170
|
+
<button
|
1171
|
+
className="query-builder__projection__result-modifier-prompt__header__label editable-value"
|
1172
|
+
onClick={openResultSetModifierEditor}
|
1173
|
+
>
|
1174
|
+
<div className="query-builder__projection__result-modifier-prompt__header__label__title">
|
1175
|
+
{getNameOfValueSpecification(
|
1176
|
+
tdsState.queryBuilderState.milestoningState
|
1177
|
+
.businessDate,
|
1178
|
+
tdsState.queryBuilderState,
|
1179
|
+
)}
|
1180
|
+
</div>
|
1181
|
+
</button>
|
1182
|
+
</div>
|
1183
|
+
)}
|
1184
|
+
{tdsState.queryBuilderState.milestoningState.processingDate && (
|
1185
|
+
<div className="query-builder__projection__result-modifier-prompt__group">
|
1186
|
+
<div className="query-builder__projection__result-modifier-prompt__group__label">
|
1187
|
+
Processing Date
|
1188
|
+
</div>
|
1189
|
+
<button
|
1190
|
+
className="query-builder__projection__result-modifier-prompt__header__label editable-value"
|
1191
|
+
onClick={openResultSetModifierEditor}
|
1192
|
+
>
|
1193
|
+
<div className="query-builder__projection__result-modifier-prompt__header__label__title">
|
1194
|
+
{getNameOfValueSpecification(
|
1195
|
+
tdsState.queryBuilderState.milestoningState
|
1196
|
+
.processingDate,
|
1197
|
+
tdsState.queryBuilderState,
|
1198
|
+
)}
|
1199
|
+
</div>
|
1200
|
+
</button>
|
1201
|
+
</div>
|
1202
|
+
)}
|
1203
|
+
{tdsState.queryBuilderState.milestoningState
|
1204
|
+
.isAllVersionsEnabled &&
|
1205
|
+
!tdsState.queryBuilderState.milestoningState
|
1206
|
+
.isAllVersionsInRangeEnabled && (
|
1207
|
+
<div className="query-builder__projection__result-modifier-prompt__group">
|
1208
|
+
<div className="query-builder__projection__result-modifier-prompt__group__label">
|
1209
|
+
All Versions
|
1210
|
+
</div>
|
1211
|
+
<button
|
1212
|
+
className="query-builder__projection__result-modifier-prompt__header__label editable-value"
|
1213
|
+
onClick={openResultSetModifierEditor}
|
1214
|
+
>
|
1215
|
+
<div className="query-builder__projection__result-modifier-prompt__header__label__title">
|
1216
|
+
Yes
|
1217
|
+
</div>
|
1218
|
+
</button>
|
1219
|
+
</div>
|
1220
|
+
)}
|
1221
|
+
{tdsState.queryBuilderState.milestoningState
|
1222
|
+
.isAllVersionsInRangeEnabled &&
|
1223
|
+
tdsState.queryBuilderState.milestoningState.startDate &&
|
1224
|
+
tdsState.queryBuilderState.milestoningState.endDate && (
|
1225
|
+
<div className="query-builder__projection__result-modifier-prompt__group">
|
1226
|
+
<div className="query-builder__projection__result-modifier-prompt__group__label">
|
1227
|
+
All Versions
|
1228
|
+
</div>
|
1229
|
+
<button
|
1230
|
+
className="query-builder__projection__result-modifier-prompt__header__label editable-value"
|
1231
|
+
onClick={openResultSetModifierEditor}
|
1232
|
+
>
|
1233
|
+
<div className="query-builder__projection__result-modifier-prompt__header__label__title">
|
1234
|
+
(
|
1235
|
+
{getNameOfValueSpecification(
|
1236
|
+
tdsState.queryBuilderState.milestoningState.startDate,
|
1237
|
+
tdsState.queryBuilderState,
|
1238
|
+
)}{' '}
|
1239
|
+
-{' '}
|
1240
|
+
{getNameOfValueSpecification(
|
1241
|
+
tdsState.queryBuilderState.milestoningState.endDate,
|
1242
|
+
tdsState.queryBuilderState,
|
1243
|
+
)}
|
1244
|
+
)
|
1245
|
+
</div>
|
1246
|
+
</button>
|
1247
|
+
</div>
|
1248
|
+
)}
|
1160
1249
|
</div>
|
1161
1250
|
{tdsState.resultSetModifierState.limit && (
|
1162
1251
|
<div className="query-builder__projection__result-modifier-prompt__group">
|
1163
1252
|
<div className="query-builder__projection__result-modifier-prompt__group__label">
|
1164
1253
|
Max Rows
|
1165
1254
|
</div>
|
1166
|
-
<
|
1167
|
-
className="query-builder__projection__result-modifier-
|
1255
|
+
<button
|
1256
|
+
className="query-builder__projection__result-modifier-prompt__header__label editable-value"
|
1168
1257
|
onClick={openResultSetModifierEditor}
|
1169
1258
|
>
|
1170
|
-
|
1171
|
-
|
1259
|
+
<div className="query-builder__projection__result-modifier-prompt__header__label__title">
|
1260
|
+
{tdsState.resultSetModifierState.limit}
|
1261
|
+
</div>
|
1262
|
+
</button>
|
1172
1263
|
</div>
|
1173
1264
|
)}
|
1174
1265
|
{tdsState.resultSetModifierState.distinct && (
|
@@ -1176,12 +1267,14 @@ export const QueryBuilderTDSPanel = observer(
|
|
1176
1267
|
<div className="query-builder__projection__result-modifier-prompt__group__label">
|
1177
1268
|
Eliminate Duplicate Rows
|
1178
1269
|
</div>
|
1179
|
-
<
|
1180
|
-
className="query-builder__projection__result-modifier-
|
1270
|
+
<button
|
1271
|
+
className="query-builder__projection__result-modifier-prompt__header__label editable-value"
|
1181
1272
|
onClick={openResultSetModifierEditor}
|
1182
1273
|
>
|
1183
|
-
|
1184
|
-
|
1274
|
+
<div className="query-builder__projection__result-modifier-prompt__header__label__title">
|
1275
|
+
Yes
|
1276
|
+
</div>
|
1277
|
+
</button>
|
1185
1278
|
</div>
|
1186
1279
|
)}
|
1187
1280
|
{tdsState.resultSetModifierState.sortColumns.length > 0 && (
|
@@ -1191,13 +1284,15 @@ export const QueryBuilderTDSPanel = observer(
|
|
1191
1284
|
</div>
|
1192
1285
|
{tdsState.resultSetModifierState.sortColumns.map(
|
1193
1286
|
(columnState) => (
|
1194
|
-
<
|
1195
|
-
className="query-builder__projection__result-modifier-prompt__group__content"
|
1287
|
+
<button
|
1196
1288
|
key={columnState.columnState.uuid}
|
1289
|
+
className="query-builder__projection__result-modifier-prompt__header__label editable-value"
|
1197
1290
|
onClick={openResultSetModifierEditor}
|
1198
1291
|
>
|
1199
|
-
|
1200
|
-
|
1292
|
+
<div className="query-builder__projection__result-modifier-prompt__header__label__title">
|
1293
|
+
{`${columnState.columnState.columnName} ${columnState.sortType}`}
|
1294
|
+
</div>
|
1295
|
+
</button>
|
1201
1296
|
),
|
1202
1297
|
)}
|
1203
1298
|
</div>
|
@@ -1207,12 +1302,14 @@ export const QueryBuilderTDSPanel = observer(
|
|
1207
1302
|
<div className="query-builder__projection__result-modifier-prompt__group__label">
|
1208
1303
|
Slice
|
1209
1304
|
</div>
|
1210
|
-
<
|
1211
|
-
className="query-builder__projection__result-modifier-
|
1305
|
+
<button
|
1306
|
+
className="query-builder__projection__result-modifier-prompt__header__label editable-value"
|
1212
1307
|
onClick={openResultSetModifierEditor}
|
1213
1308
|
>
|
1214
|
-
|
1215
|
-
|
1309
|
+
<div className="query-builder__projection__result-modifier-prompt__header__label__title">
|
1310
|
+
{`${tdsState.resultSetModifierState.slice[0]},${tdsState.resultSetModifierState.slice[1]}`}
|
1311
|
+
</div>
|
1312
|
+
</button>
|
1216
1313
|
</div>
|
1217
1314
|
)}
|
1218
1315
|
{tdsState.queryBuilderState.watermarkState.value && (
|
@@ -16,7 +16,6 @@
|
|
16
16
|
|
17
17
|
import {
|
18
18
|
BlankPanelContent,
|
19
|
-
PanelLoadingIndicator,
|
20
19
|
PlayIcon,
|
21
20
|
DropdownMenu,
|
22
21
|
MenuContent,
|
@@ -37,6 +36,14 @@ import {
|
|
37
36
|
PanelDivider,
|
38
37
|
SquareIcon,
|
39
38
|
CheckSquareIcon,
|
39
|
+
MenuContentItemIcon,
|
40
|
+
MenuContentItemLabel,
|
41
|
+
ChartIcon,
|
42
|
+
CsvIcon,
|
43
|
+
DebugIcon,
|
44
|
+
ReportIcon,
|
45
|
+
CubesLoadingIndicatorIcon,
|
46
|
+
CubesLoadingIndicator,
|
40
47
|
} from '@finos/legend-art';
|
41
48
|
import { observer } from 'mobx-react-lite';
|
42
49
|
import { flowResult } from 'mobx';
|
@@ -306,6 +313,31 @@ export const QueryBuilderResultPanel = observer(
|
|
306
313
|
!queryBuilderState.isLocalModeEnabled,
|
307
314
|
);
|
308
315
|
};
|
316
|
+
|
317
|
+
const extraExportMenuContentItems = applicationStore.pluginManager
|
318
|
+
.getApplicationPlugins()
|
319
|
+
.flatMap(
|
320
|
+
(plugin) =>
|
321
|
+
(
|
322
|
+
plugin as QueryBuilder_LegendApplicationPlugin_Extension
|
323
|
+
).getExtraQueryBuilderExportMenuActionConfigurations?.() ?? [],
|
324
|
+
)
|
325
|
+
.map((item) => (
|
326
|
+
<MenuContentItem
|
327
|
+
key={item.key}
|
328
|
+
title={item.title ?? ''}
|
329
|
+
onClick={() => {
|
330
|
+
item.onClick(queryBuilderState);
|
331
|
+
}}
|
332
|
+
>
|
333
|
+
{item.icon && <MenuContentItemIcon>{item.icon}</MenuContentItemIcon>}
|
334
|
+
<MenuContentItemLabel>{item.label}</MenuContentItemLabel>
|
335
|
+
</MenuContentItem>
|
336
|
+
));
|
337
|
+
|
338
|
+
const isLoading =
|
339
|
+
resultState.isRunningQuery || resultState.isGeneratingPlan;
|
340
|
+
|
309
341
|
return (
|
310
342
|
<div
|
311
343
|
data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_RESULT_PANEL}
|
@@ -355,7 +387,7 @@ export const QueryBuilderResultPanel = observer(
|
|
355
387
|
|
356
388
|
<div className="panel__header">
|
357
389
|
<div className="panel__header__title">
|
358
|
-
<div className="panel__header__title__label">
|
390
|
+
<div className="panel__header__title__label">results</div>
|
359
391
|
{executedSql && (
|
360
392
|
<Button
|
361
393
|
onClick={() => setShowSqlModal(true)}
|
@@ -429,7 +461,7 @@ export const QueryBuilderResultPanel = observer(
|
|
429
461
|
{allowSettingPreviewLimit && (
|
430
462
|
<div className="query-builder__result__limit">
|
431
463
|
<div className="query-builder__result__limit__label">
|
432
|
-
preview limit
|
464
|
+
preview row limit
|
433
465
|
</div>
|
434
466
|
<input
|
435
467
|
ref={inputRef}
|
@@ -448,22 +480,20 @@ export const QueryBuilderResultPanel = observer(
|
|
448
480
|
<div className="query-builder__result__execute-btn btn__dropdown-combo btn__dropdown-combo--primary">
|
449
481
|
{resultState.isRunningQuery ? (
|
450
482
|
<button
|
451
|
-
className="btn__dropdown-combo__canceler"
|
483
|
+
className="btn__dropdown-combo__canceler query-builder__result__execute-btn__btn"
|
452
484
|
onClick={cancelQuery}
|
453
485
|
tabIndex={-1}
|
454
486
|
disabled={!isQueryValid}
|
455
487
|
>
|
456
|
-
<div className="btn--dark btn--caution btn__dropdown-combo__canceler__label">
|
457
|
-
<PauseCircleIcon
|
458
|
-
|
459
|
-
Stop
|
460
|
-
</div>
|
488
|
+
<div className="btn--dark btn--caution btn__dropdown-combo__canceler__label query-builder__result__execute-btn__btn">
|
489
|
+
<PauseCircleIcon />
|
490
|
+
Stop
|
461
491
|
</div>
|
462
492
|
</button>
|
463
493
|
) : (
|
464
494
|
<>
|
465
495
|
<button
|
466
|
-
className="btn__dropdown-combo__label"
|
496
|
+
className="btn__dropdown-combo__label query-builder__result__execute-btn__btn query-builder__result__execute-btn__btn--green"
|
467
497
|
onClick={runQuery}
|
468
498
|
tabIndex={-1}
|
469
499
|
title={
|
@@ -475,13 +505,11 @@ export const QueryBuilderResultPanel = observer(
|
|
475
505
|
}
|
476
506
|
disabled={isRunQueryDisabled}
|
477
507
|
>
|
478
|
-
<PlayIcon
|
479
|
-
|
480
|
-
Run Query
|
481
|
-
</div>
|
508
|
+
<PlayIcon />
|
509
|
+
Run Query
|
482
510
|
</button>
|
483
511
|
<DropdownMenu
|
484
|
-
className="btn__dropdown-combo__dropdown-btn"
|
512
|
+
className="btn__dropdown-combo__dropdown-btn query-builder__result__execute-btn__btn query-builder__result__execute-btn__btn--green"
|
485
513
|
disabled={isRunQueryDisabled}
|
486
514
|
content={
|
487
515
|
<MenuContent>
|
@@ -490,14 +518,22 @@ export const QueryBuilderResultPanel = observer(
|
|
490
518
|
onClick={generatePlan}
|
491
519
|
disabled={isRunQueryDisabled}
|
492
520
|
>
|
493
|
-
|
521
|
+
<MenuContentItemIcon>
|
522
|
+
<ReportIcon />
|
523
|
+
</MenuContentItemIcon>
|
524
|
+
<MenuContentItemLabel>
|
525
|
+
Generate Plan
|
526
|
+
</MenuContentItemLabel>
|
494
527
|
</MenuContentItem>
|
495
528
|
<MenuContentItem
|
496
529
|
className="btn__dropdown-combo__option"
|
497
530
|
onClick={debugPlanGeneration}
|
498
531
|
disabled={isRunQueryDisabled}
|
499
532
|
>
|
500
|
-
|
533
|
+
<MenuContentItemIcon>
|
534
|
+
<DebugIcon />
|
535
|
+
</MenuContentItemIcon>
|
536
|
+
<MenuContentItemLabel>Debug</MenuContentItemLabel>
|
501
537
|
</MenuContentItem>
|
502
538
|
</MenuContent>
|
503
539
|
}
|
@@ -522,14 +558,15 @@ export const QueryBuilderResultPanel = observer(
|
|
522
558
|
).map((format) => (
|
523
559
|
<MenuContentItem
|
524
560
|
key={format}
|
525
|
-
className="query-builder__result__export__dropdown__menu__item"
|
526
561
|
onClick={(): void => confirmExport(format)}
|
527
562
|
>
|
528
|
-
|
563
|
+
<MenuContentItemIcon>
|
564
|
+
<CsvIcon />
|
565
|
+
</MenuContentItemIcon>
|
566
|
+
<MenuContentItemLabel>{format}</MenuContentItemLabel>
|
529
567
|
</MenuContentItem>
|
530
568
|
))}
|
531
569
|
<MenuContentItem
|
532
|
-
className="query-builder__result__export__dropdown__menu__item"
|
533
570
|
onClick={(): void =>
|
534
571
|
resultState.setIsQueryUsageViewerOpened(true)
|
535
572
|
}
|
@@ -538,8 +575,12 @@ export const QueryBuilderResultPanel = observer(
|
|
538
575
|
!isExtraQueryUsageOptionsConfigured
|
539
576
|
}
|
540
577
|
>
|
541
|
-
|
578
|
+
<MenuContentItemIcon>
|
579
|
+
<ChartIcon />
|
580
|
+
</MenuContentItemIcon>
|
581
|
+
<MenuContentItemLabel>Others...</MenuContentItemLabel>
|
542
582
|
</MenuContentItem>
|
583
|
+
{extraExportMenuContentItems}
|
543
584
|
</MenuContent>
|
544
585
|
}
|
545
586
|
menuProps={{
|
@@ -558,20 +599,34 @@ export const QueryBuilderResultPanel = observer(
|
|
558
599
|
{resultState.isQueryUsageViewerOpened && (
|
559
600
|
<QueryUsageViewer resultState={resultState} />
|
560
601
|
)}
|
602
|
+
{applicationStore.pluginManager
|
603
|
+
.getApplicationPlugins()
|
604
|
+
.flatMap(
|
605
|
+
(plugin) =>
|
606
|
+
(
|
607
|
+
plugin as QueryBuilder_LegendApplicationPlugin_Extension
|
608
|
+
).getExtraQueryBuilderExportMenuActionConfigurations?.() ??
|
609
|
+
[],
|
610
|
+
)
|
611
|
+
.map((item) => (
|
612
|
+
<div key={item.key}>
|
613
|
+
{item.renderExtraComponent
|
614
|
+
? item.renderExtraComponent(queryBuilderState)
|
615
|
+
: undefined}
|
616
|
+
</div>
|
617
|
+
))}
|
561
618
|
</div>
|
562
619
|
</div>
|
563
|
-
<PanelContent>
|
564
|
-
<
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
/>
|
569
|
-
{!executionResult && (
|
620
|
+
<PanelContent className="query-builder__result__content">
|
621
|
+
<CubesLoadingIndicator isLoading={isLoading}>
|
622
|
+
<CubesLoadingIndicatorIcon />
|
623
|
+
</CubesLoadingIndicator>
|
624
|
+
{!executionResult && !isLoading && (
|
570
625
|
<BlankPanelContent>
|
571
626
|
Build or load a valid query first
|
572
627
|
</BlankPanelContent>
|
573
628
|
)}
|
574
|
-
{executionResult && (
|
629
|
+
{executionResult && !isLoading && (
|
575
630
|
<div className="query-builder__result__values">
|
576
631
|
<QueryBuilderResultValues
|
577
632
|
executionResult={executionResult}
|
@@ -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';
|
@@ -71,7 +72,7 @@ const ClassQueryBuilderSetupPanelContent = observer(
|
|
71
72
|
: []
|
72
73
|
)
|
73
74
|
.map(buildElementOption)
|
74
|
-
.sort(
|
75
|
+
.sort(compareLabelFn);
|
75
76
|
const selectedMappingOption = queryBuilderState.executionContextState
|
76
77
|
.mapping
|
77
78
|
? buildElementOption(queryBuilderState.executionContextState.mapping)
|
@@ -107,7 +108,7 @@ const ClassQueryBuilderSetupPanelContent = observer(
|
|
107
108
|
new RuntimePointer(PackageableElementExplicitReference.create(rt)),
|
108
109
|
)
|
109
110
|
.map(buildRuntimeValueOption)
|
110
|
-
.sort(
|
111
|
+
.sort(compareLabelFn);
|
111
112
|
const selectedRuntimeOption = queryBuilderState.executionContextState
|
112
113
|
.runtimeValue
|
113
114
|
? buildRuntimeValueOption(
|