@finos/legend-query-builder 4.14.18 → 4.14.20
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +5 -3
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.js +71 -45
- package/lib/components/QueryBuilderConstantExpressionPanel.js.map +1 -1
- package/lib/components/QueryBuilderDiffPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderDiffPanel.js +2 -1
- package/lib/components/QueryBuilderDiffPanel.js.map +1 -1
- package/lib/components/QueryBuilderParametersPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderParametersPanel.js +25 -26
- package/lib/components/QueryBuilderParametersPanel.js.map +1 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts +11 -2
- package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.js +35 -10
- package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
- package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
- package/lib/components/QueryBuilderSideBar.js +6 -1
- package/lib/components/QueryBuilderSideBar.js.map +1 -1
- package/lib/components/QueryBuilderTextEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderTextEditor.js +3 -3
- package/lib/components/QueryBuilderTextEditor.js.map +1 -1
- package/lib/components/QueryLoader.d.ts.map +1 -1
- package/lib/components/QueryLoader.js +90 -39
- package/lib/components/QueryLoader.js.map +1 -1
- package/lib/components/QueryUsageViewer.d.ts.map +1 -1
- package/lib/components/QueryUsageViewer.js +2 -2
- package/lib/components/QueryUsageViewer.js.map +1 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.d.ts +2 -0
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.d.ts.map +1 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js +19 -2
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js.map +1 -1
- package/lib/components/data-access/DataAccessOverview.d.ts.map +1 -1
- package/lib/components/data-access/DataAccessOverview.js +6 -1
- package/lib/components/data-access/DataAccessOverview.js.map +1 -1
- package/lib/components/execution-plan/ExecutionPlanViewer.d.ts.map +1 -1
- package/lib/components/execution-plan/ExecutionPlanViewer.js +6 -6
- package/lib/components/execution-plan/ExecutionPlanViewer.js.map +1 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.js +3 -2
- package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
- package/lib/components/explorer/QueryBuilderMilestoningEditor.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderMilestoningEditor.js +3 -2
- package/lib/components/explorer/QueryBuilderMilestoningEditor.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +6 -3
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +4 -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 -22
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +2 -2
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.js +2 -1
- package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSGridResult.js +5 -1
- package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js +11 -2
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js.map +1 -1
- package/lib/components/shared/BasicValueSpecificationEditor.d.ts.map +1 -1
- package/lib/components/shared/BasicValueSpecificationEditor.js +25 -22
- package/lib/components/shared/BasicValueSpecificationEditor.js.map +1 -1
- package/lib/components/shared/CustomDatePicker.d.ts.map +1 -1
- package/lib/components/shared/CustomDatePicker.js +8 -5
- package/lib/components/shared/CustomDatePicker.js.map +1 -1
- package/lib/components/shared/LambdaEditor.d.ts.map +1 -1
- package/lib/components/shared/LambdaEditor.js +17 -3
- package/lib/components/shared/LambdaEditor.js.map +1 -1
- package/lib/components/shared/LambdaParameterValuesEditor.d.ts.map +1 -1
- package/lib/components/shared/LambdaParameterValuesEditor.js +2 -2
- package/lib/components/shared/LambdaParameterValuesEditor.js.map +1 -1
- package/lib/components/shared/QueryBuilderPropertyInfoTooltip.d.ts +6 -0
- package/lib/components/shared/QueryBuilderPropertyInfoTooltip.d.ts.map +1 -1
- package/lib/components/shared/QueryBuilderPropertyInfoTooltip.js +40 -3
- package/lib/components/shared/QueryBuilderPropertyInfoTooltip.js.map +1 -1
- package/lib/components/watermark/QueryBuilderWatermark.d.ts.map +1 -1
- package/lib/components/watermark/QueryBuilderWatermark.js +28 -12
- package/lib/components/watermark/QueryBuilderWatermark.js.map +1 -1
- package/lib/index.css +17 -1
- package/lib/index.css.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderConstantsState.d.ts +1 -0
- package/lib/stores/QueryBuilderConstantsState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderConstantsState.js +7 -1
- package/lib/stores/QueryBuilderConstantsState.js.map +1 -1
- package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts +24 -1
- package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts.map +1 -1
- package/lib/stores/QueryLoaderState.d.ts +14 -4
- package/lib/stores/QueryLoaderState.d.ts.map +1 -1
- package/lib/stores/QueryLoaderState.js +35 -5
- package/lib/stores/QueryLoaderState.js.map +1 -1
- package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts +1 -2
- package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts.map +1 -1
- package/lib/stores/watermark/QueryBuilderWatermarkState.js +2 -12
- package/lib/stores/watermark/QueryBuilderWatermarkState.js.map +1 -1
- package/package.json +8 -8
- package/src/components/QueryBuilder.tsx +14 -2
- package/src/components/QueryBuilderConstantExpressionPanel.tsx +145 -69
- package/src/components/QueryBuilderDiffPanel.tsx +10 -2
- package/src/components/QueryBuilderParametersPanel.tsx +42 -37
- package/src/components/QueryBuilderPropertyExpressionEditor.tsx +87 -24
- package/src/components/QueryBuilderSideBar.tsx +20 -0
- package/src/components/QueryBuilderTextEditor.tsx +6 -4
- package/src/components/QueryLoader.tsx +291 -130
- package/src/components/QueryUsageViewer.tsx +7 -1
- package/src/components/__test-utils__/QueryBuilderComponentTestUtils.tsx +40 -4
- package/src/components/data-access/DataAccessOverview.tsx +9 -1
- package/src/components/execution-plan/ExecutionPlanViewer.tsx +11 -8
- package/src/components/explorer/QueryBuilderExplorerPanel.tsx +5 -2
- package/src/components/explorer/QueryBuilderMilestoningEditor.tsx +5 -2
- package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +12 -5
- package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +8 -4
- package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +56 -72
- package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +8 -2
- package/src/components/result/QueryBuilderResultPanel.tsx +8 -1
- package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +6 -3
- package/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx +14 -4
- package/src/components/shared/BasicValueSpecificationEditor.tsx +39 -25
- package/src/components/shared/CustomDatePicker.tsx +18 -5
- package/src/components/shared/LambdaEditor.tsx +27 -11
- package/src/components/shared/LambdaParameterValuesEditor.tsx +4 -1
- package/src/components/shared/QueryBuilderPropertyInfoTooltip.tsx +115 -64
- package/src/components/watermark/QueryBuilderWatermark.tsx +60 -19
- package/src/stores/QueryBuilderConstantsState.ts +12 -0
- package/src/stores/QueryBuilder_LegendApplicationPlugin_Extension.ts +39 -1
- package/src/stores/QueryLoaderState.ts +64 -12
- package/src/stores/watermark/QueryBuilderWatermarkState.ts +2 -12
@@ -41,11 +41,12 @@ import {
|
|
41
41
|
ThinChevronRightIcon,
|
42
42
|
InfoCircleIcon,
|
43
43
|
} from '@finos/legend-art';
|
44
|
-
import type { LightQuery } from '@finos/legend-graph';
|
44
|
+
import type { LightQuery, RawLambda } from '@finos/legend-graph';
|
45
45
|
import {
|
46
46
|
debounce,
|
47
47
|
formatDistanceToNow,
|
48
48
|
guaranteeNonNullable,
|
49
|
+
isNonNullable,
|
49
50
|
quantifyList,
|
50
51
|
} from '@finos/legend-shared';
|
51
52
|
import { flowResult } from 'mobx';
|
@@ -59,6 +60,7 @@ import {
|
|
59
60
|
const QueryPreviewViewer = observer(
|
60
61
|
(props: { queryLoaderState: QueryLoaderState }) => {
|
61
62
|
const { queryLoaderState } = props;
|
63
|
+
const applicationStore = queryLoaderState.applicationStore;
|
62
64
|
const close = (): void => {
|
63
65
|
queryLoaderState.setShowPreviewViewer(false);
|
64
66
|
};
|
@@ -72,7 +74,12 @@ const QueryPreviewViewer = observer(
|
|
72
74
|
paper: 'editor-modal__content',
|
73
75
|
}}
|
74
76
|
>
|
75
|
-
<Modal
|
77
|
+
<Modal
|
78
|
+
className="editor-modal"
|
79
|
+
darkMode={
|
80
|
+
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
81
|
+
}
|
82
|
+
>
|
76
83
|
<ModalHeader
|
77
84
|
title={
|
78
85
|
guaranteeNonNullable(queryLoaderState.queryPreviewContent).name
|
@@ -89,7 +96,7 @@ const QueryPreviewViewer = observer(
|
|
89
96
|
/>
|
90
97
|
</ModalBody>
|
91
98
|
<ModalFooter>
|
92
|
-
<ModalFooterButton onClick={close} text="Close" />
|
99
|
+
<ModalFooterButton onClick={close} text="Close" type="secondary" />
|
93
100
|
</ModalFooter>
|
94
101
|
</Modal>
|
95
102
|
</Dialog>
|
@@ -104,6 +111,21 @@ export const QueryLoader = observer(
|
|
104
111
|
const searchInputRef = useRef<HTMLInputElement>(null);
|
105
112
|
const queryRenameInputRef = useRef<HTMLInputElement>(null);
|
106
113
|
const results = queryLoaderState.queries;
|
114
|
+
const curatedTemplateQueries =
|
115
|
+
queryLoaderState.curatedTemplateQuerySepcifications
|
116
|
+
.map((s) =>
|
117
|
+
queryLoaderState.queryBuilderState
|
118
|
+
? s.getCuratedTemplateQueries(queryLoaderState.queryBuilderState)
|
119
|
+
: [],
|
120
|
+
)
|
121
|
+
.flat();
|
122
|
+
const loadCuratedTemplateQuery =
|
123
|
+
queryLoaderState.curatedTemplateQuerySepcifications
|
124
|
+
// already using an arrow function suggested by @typescript-eslint/unbound-method
|
125
|
+
// eslint-disable-next-line
|
126
|
+
.map((s) => () => s.loadCuratedTemplateQuery)
|
127
|
+
.filter(isNonNullable)[0];
|
128
|
+
|
107
129
|
const [isMineOnly, setIsMineOnly] = useState(false);
|
108
130
|
const [showQueryNameEditInput, setShowQueryNameEditInput] = useState<
|
109
131
|
number | undefined
|
@@ -167,7 +189,25 @@ export const QueryLoader = observer(
|
|
167
189
|
debouncedLoadQueries.cancel();
|
168
190
|
debouncedLoadQueries(queryLoaderState.searchText);
|
169
191
|
};
|
170
|
-
|
192
|
+
const toggleCuratedTemplate = (): void => {
|
193
|
+
Array.from(queryLoaderState.extraFilters).map(([key, value]) =>
|
194
|
+
queryLoaderState.extraFilters.set(key, false),
|
195
|
+
);
|
196
|
+
queryLoaderState.setShowCurrentUserQueriesOnly(false);
|
197
|
+
setIsMineOnly(false);
|
198
|
+
queryLoaderState.extraQueryFilterOptionsRelatedToTemplateQuery.forEach(
|
199
|
+
(op) =>
|
200
|
+
queryLoaderState.extraFilters.set(
|
201
|
+
op,
|
202
|
+
!queryLoaderState.isCuratedTemplateToggled,
|
203
|
+
),
|
204
|
+
);
|
205
|
+
queryLoaderState.showingDefaultQueries =
|
206
|
+
queryLoaderState.isCuratedTemplateToggled;
|
207
|
+
queryLoaderState.setIsCuratedTemplateToggled(
|
208
|
+
!queryLoaderState.isCuratedTemplateToggled,
|
209
|
+
);
|
210
|
+
};
|
171
211
|
useEffect(() => {
|
172
212
|
flowResult(queryLoaderState.searchQueries('')).catch(
|
173
213
|
applicationStore.alertUnhandledError,
|
@@ -201,10 +241,16 @@ export const QueryLoader = observer(
|
|
201
241
|
}
|
202
242
|
};
|
203
243
|
|
204
|
-
const showPreview = (
|
205
|
-
|
206
|
-
|
207
|
-
|
244
|
+
const showPreview = (
|
245
|
+
queryId: string | undefined,
|
246
|
+
template?: {
|
247
|
+
queryName: string;
|
248
|
+
queryContent: RawLambda;
|
249
|
+
},
|
250
|
+
): void => {
|
251
|
+
flowResult(
|
252
|
+
queryLoaderState.getPreviewQueryContent(queryId, template),
|
253
|
+
).catch(applicationStore.alertUnhandledError);
|
208
254
|
queryLoaderState.setShowPreviewViewer(true);
|
209
255
|
};
|
210
256
|
|
@@ -248,6 +294,12 @@ export const QueryLoader = observer(
|
|
248
294
|
'query-loader__filter__toggler__btn--toggled': isMineOnly,
|
249
295
|
})}
|
250
296
|
onClick={toggleShowCurrentUserQueriesOnly}
|
297
|
+
disabled={queryLoaderState.isCuratedTemplateToggled}
|
298
|
+
title={
|
299
|
+
queryLoaderState.isCuratedTemplateToggled
|
300
|
+
? 'current fitler is disabled when `Curated Template Query` is on'
|
301
|
+
: 'click to add filter'
|
302
|
+
}
|
251
303
|
tabIndex={-1}
|
252
304
|
>
|
253
305
|
Mine Only
|
@@ -261,6 +313,12 @@ export const QueryLoader = observer(
|
|
261
313
|
className={clsx('query-loader__filter__toggler__btn', {
|
262
314
|
'query-loader__filter__toggler__btn--toggled': value,
|
263
315
|
})}
|
316
|
+
disabled={queryLoaderState.isCuratedTemplateToggled}
|
317
|
+
title={
|
318
|
+
queryLoaderState.isCuratedTemplateToggled
|
319
|
+
? 'current fitler is disabled when `Curated Template Query` is on'
|
320
|
+
: 'click to add filter'
|
321
|
+
}
|
264
322
|
onClick={(): void => toggleExtraFilters(key)}
|
265
323
|
tabIndex={-1}
|
266
324
|
>
|
@@ -270,6 +328,21 @@ export const QueryLoader = observer(
|
|
270
328
|
)}
|
271
329
|
</div>
|
272
330
|
)}
|
331
|
+
{queryLoaderState.extraQueryFilterOptionsRelatedToTemplateQuery
|
332
|
+
.length > 0 && (
|
333
|
+
<div className="query-loader__filter__extra__filters">
|
334
|
+
<button
|
335
|
+
className={clsx('query-loader__filter__toggler__btn', {
|
336
|
+
'query-loader__filter__toggler__btn--toggled':
|
337
|
+
queryLoaderState.isCuratedTemplateToggled,
|
338
|
+
})}
|
339
|
+
onClick={toggleCuratedTemplate}
|
340
|
+
tabIndex={-1}
|
341
|
+
>
|
342
|
+
Curated Template Query
|
343
|
+
</button>
|
344
|
+
</div>
|
345
|
+
)}
|
273
346
|
</div>
|
274
347
|
</div>
|
275
348
|
</div>
|
@@ -291,7 +364,20 @@ export const QueryLoader = observer(
|
|
291
364
|
queryLoaderState.generateDefaultQueriesSummaryText?.(
|
292
365
|
results,
|
293
366
|
) ?? 'Refine your search to get better matches'
|
294
|
-
) :
|
367
|
+
) : !queryLoaderState.isCuratedTemplateToggled ? (
|
368
|
+
results.length >= QUERY_LOADER_TYPEAHEAD_SEARCH_LIMIT ? (
|
369
|
+
<>
|
370
|
+
{`Found ${QUERY_LOADER_TYPEAHEAD_SEARCH_LIMIT}+ matches`}{' '}
|
371
|
+
<InfoCircleIcon
|
372
|
+
title="Some queries are not listed, refine your search to get better matches"
|
373
|
+
className="query-loader__results__summary__info"
|
374
|
+
/>
|
375
|
+
</>
|
376
|
+
) : (
|
377
|
+
`Found ${quantifyList(results, 'match', 'matches')}`
|
378
|
+
)
|
379
|
+
) : curatedTemplateQueries.length >=
|
380
|
+
QUERY_LOADER_TYPEAHEAD_SEARCH_LIMIT ? (
|
295
381
|
<>
|
296
382
|
{`Found ${QUERY_LOADER_TYPEAHEAD_SEARCH_LIMIT}+ matches`}{' '}
|
297
383
|
<InfoCircleIcon
|
@@ -300,139 +386,211 @@ export const QueryLoader = observer(
|
|
300
386
|
/>
|
301
387
|
</>
|
302
388
|
) : (
|
303
|
-
`Found ${quantifyList(
|
389
|
+
`Found ${quantifyList(
|
390
|
+
curatedTemplateQueries,
|
391
|
+
'match',
|
392
|
+
'matches',
|
393
|
+
)}`
|
304
394
|
)}
|
305
395
|
</div>
|
306
|
-
{
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
<
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
event.
|
327
|
-
|
328
|
-
|
329
|
-
event.
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
396
|
+
{!queryLoaderState.isCuratedTemplateToggled &&
|
397
|
+
results
|
398
|
+
.slice(0, QUERY_LOADER_TYPEAHEAD_SEARCH_LIMIT)
|
399
|
+
.map((query, idx) => (
|
400
|
+
<div
|
401
|
+
className="query-loader__result"
|
402
|
+
title={`Click to ${loadActionLabel}...`}
|
403
|
+
key={query.id}
|
404
|
+
onClick={() => queryLoaderState.loadQuery(query)}
|
405
|
+
>
|
406
|
+
<div className="query-loader__result__content">
|
407
|
+
{showQueryNameEditInput === idx ? (
|
408
|
+
<div className="query-loader__result__title__editor">
|
409
|
+
<input
|
410
|
+
className="query-loader__result__title__editor__input input--dark"
|
411
|
+
spellCheck={false}
|
412
|
+
ref={queryRenameInputRef}
|
413
|
+
value={queryNameInputValue}
|
414
|
+
onChange={changeQueryNameInputValue}
|
415
|
+
onKeyDown={(event) => {
|
416
|
+
if (event.code === 'Enter') {
|
417
|
+
event.stopPropagation();
|
418
|
+
renameQuery(query)();
|
419
|
+
} else if (event.code === 'Escape') {
|
420
|
+
event.stopPropagation();
|
421
|
+
hideEditQueryNameInput();
|
422
|
+
}
|
423
|
+
}}
|
424
|
+
onBlur={() => hideEditQueryNameInput()}
|
425
|
+
// avoid clicking on the input causing the call to load query
|
426
|
+
onClick={(event) => event.stopPropagation()}
|
427
|
+
/>
|
428
|
+
</div>
|
429
|
+
) : (
|
430
|
+
<div
|
431
|
+
className="query-loader__result__title"
|
432
|
+
title={query.name}
|
433
|
+
>
|
434
|
+
{query.name}
|
435
|
+
</div>
|
436
|
+
)}
|
437
|
+
<div className="query-loader__result__description">
|
438
|
+
<div className="query-loader__result__description__date__icon">
|
439
|
+
<LastModifiedIcon />
|
440
|
+
</div>
|
441
|
+
<div className="query-loader__result__description__date">
|
442
|
+
{query.lastUpdatedAt
|
443
|
+
? formatDistanceToNow(
|
444
|
+
new Date(query.lastUpdatedAt),
|
445
|
+
{
|
446
|
+
includeSeconds: true,
|
447
|
+
addSuffix: true,
|
448
|
+
},
|
449
|
+
)
|
450
|
+
: '(unknown)'}
|
451
|
+
</div>
|
452
|
+
<div
|
453
|
+
className={clsx(
|
454
|
+
'query-loader__result__description__author__icon',
|
455
|
+
{
|
456
|
+
'query-loader__result__description__author__icon--owner':
|
457
|
+
query.isCurrentUserQuery,
|
458
|
+
},
|
459
|
+
)}
|
460
|
+
>
|
461
|
+
<UserIcon />
|
462
|
+
</div>
|
463
|
+
<div className="query-loader__result__description__author__name">
|
464
|
+
{query.isCurrentUserQuery ? (
|
465
|
+
<div
|
466
|
+
title={query.owner}
|
467
|
+
className="query-loader__result__description__owner"
|
468
|
+
>
|
469
|
+
Me
|
470
|
+
</div>
|
471
|
+
) : (
|
472
|
+
query.owner
|
473
|
+
)}
|
474
|
+
</div>
|
337
475
|
</div>
|
338
|
-
|
476
|
+
</div>
|
477
|
+
<DropdownMenu
|
478
|
+
className="query-loader__result__actions-menu"
|
479
|
+
title="More Actions..."
|
480
|
+
content={
|
481
|
+
<MenuContent>
|
482
|
+
<MenuContentItem
|
483
|
+
onClick={(): void => showPreview(query.id)}
|
484
|
+
>
|
485
|
+
Show Query Preview
|
486
|
+
</MenuContentItem>
|
487
|
+
{!queryLoaderState.isReadOnly && (
|
488
|
+
<MenuContentItem
|
489
|
+
disabled={!query.isCurrentUserQuery}
|
490
|
+
onClick={deleteQuery(query)}
|
491
|
+
>
|
492
|
+
Delete
|
493
|
+
</MenuContentItem>
|
494
|
+
)}
|
495
|
+
{!queryLoaderState.isReadOnly && (
|
496
|
+
<MenuContentItem
|
497
|
+
disabled={!query.isCurrentUserQuery}
|
498
|
+
onClick={showEditQueryNameInput(
|
499
|
+
query.name,
|
500
|
+
idx,
|
501
|
+
)}
|
502
|
+
>
|
503
|
+
Rename
|
504
|
+
</MenuContentItem>
|
505
|
+
)}
|
506
|
+
</MenuContent>
|
507
|
+
}
|
508
|
+
menuProps={{
|
509
|
+
anchorOrigin: {
|
510
|
+
vertical: 'bottom',
|
511
|
+
horizontal: 'left',
|
512
|
+
},
|
513
|
+
transformOrigin: {
|
514
|
+
vertical: 'top',
|
515
|
+
horizontal: 'left',
|
516
|
+
},
|
517
|
+
elevation: 7,
|
518
|
+
}}
|
519
|
+
>
|
520
|
+
<MoreVerticalIcon />
|
521
|
+
</DropdownMenu>
|
522
|
+
<div className="query-loader__result__arrow">
|
523
|
+
<ThinChevronRightIcon />
|
524
|
+
</div>
|
525
|
+
</div>
|
526
|
+
))}
|
527
|
+
{queryLoaderState.queryBuilderState &&
|
528
|
+
queryLoaderState.isCuratedTemplateToggled &&
|
529
|
+
loadCuratedTemplateQuery &&
|
530
|
+
curatedTemplateQueries
|
531
|
+
.slice(0, QUERY_LOADER_TYPEAHEAD_SEARCH_LIMIT)
|
532
|
+
.map((templateQuery, idx) => (
|
533
|
+
<div
|
534
|
+
className="query-loader__result"
|
535
|
+
title={`Click to ${loadActionLabel}...`}
|
536
|
+
key={templateQuery.title}
|
537
|
+
onClick={() => {
|
538
|
+
loadCuratedTemplateQuery()(
|
539
|
+
templateQuery,
|
540
|
+
guaranteeNonNullable(
|
541
|
+
queryLoaderState.queryBuilderState,
|
542
|
+
),
|
543
|
+
);
|
544
|
+
queryLoaderState.setQueryLoaderDialogOpen(false);
|
545
|
+
}}
|
546
|
+
>
|
547
|
+
<div className="query-loader__result__content">
|
339
548
|
<div
|
340
549
|
className="query-loader__result__title"
|
341
|
-
title={
|
550
|
+
title={templateQuery.title}
|
342
551
|
>
|
343
|
-
{
|
344
|
-
</div>
|
345
|
-
)}
|
346
|
-
<div className="query-loader__result__description">
|
347
|
-
<div className="query-loader__result__description__date__icon">
|
348
|
-
<LastModifiedIcon />
|
349
|
-
</div>
|
350
|
-
<div className="query-loader__result__description__date">
|
351
|
-
{query.lastUpdatedAt
|
352
|
-
? formatDistanceToNow(
|
353
|
-
new Date(query.lastUpdatedAt),
|
354
|
-
{
|
355
|
-
includeSeconds: true,
|
356
|
-
addSuffix: true,
|
357
|
-
},
|
358
|
-
)
|
359
|
-
: '(unknown)'}
|
552
|
+
{templateQuery.title}
|
360
553
|
</div>
|
361
|
-
<div
|
362
|
-
|
363
|
-
'query-loader__result__description__author__icon',
|
364
|
-
{
|
365
|
-
'query-loader__result__description__author__icon--owner':
|
366
|
-
query.isCurrentUserQuery,
|
367
|
-
},
|
368
|
-
)}
|
369
|
-
>
|
370
|
-
<UserIcon />
|
371
|
-
</div>
|
372
|
-
<div className="query-loader__result__description__author__name">
|
373
|
-
{query.isCurrentUserQuery ? (
|
374
|
-
<div
|
375
|
-
title={query.owner}
|
376
|
-
className="query-loader__result__description__owner"
|
377
|
-
>
|
378
|
-
Me
|
379
|
-
</div>
|
380
|
-
) : (
|
381
|
-
query.owner
|
382
|
-
)}
|
554
|
+
<div className="query-loader__result__description">
|
555
|
+
{templateQuery.description}
|
383
556
|
</div>
|
384
557
|
</div>
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
<MenuContent>
|
391
|
-
<MenuContentItem
|
392
|
-
onClick={(): void => showPreview(query.id)}
|
393
|
-
>
|
394
|
-
Show Query Preview
|
395
|
-
</MenuContentItem>
|
396
|
-
{!queryLoaderState.isReadOnly && (
|
397
|
-
<MenuContentItem
|
398
|
-
disabled={!query.isCurrentUserQuery}
|
399
|
-
onClick={deleteQuery(query)}
|
400
|
-
>
|
401
|
-
Delete
|
402
|
-
</MenuContentItem>
|
403
|
-
)}
|
404
|
-
{!queryLoaderState.isReadOnly && (
|
558
|
+
<DropdownMenu
|
559
|
+
className="query-loader__result__actions-menu"
|
560
|
+
title="More Actions..."
|
561
|
+
content={
|
562
|
+
<MenuContent>
|
405
563
|
<MenuContentItem
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
564
|
+
onClick={(): void =>
|
565
|
+
showPreview(undefined, {
|
566
|
+
queryContent: templateQuery.query,
|
567
|
+
queryName: templateQuery.title,
|
568
|
+
})
|
569
|
+
}
|
411
570
|
>
|
412
|
-
|
571
|
+
Show Query Preview
|
413
572
|
</MenuContentItem>
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
573
|
+
</MenuContent>
|
574
|
+
}
|
575
|
+
menuProps={{
|
576
|
+
anchorOrigin: {
|
577
|
+
vertical: 'bottom',
|
578
|
+
horizontal: 'left',
|
579
|
+
},
|
580
|
+
transformOrigin: {
|
581
|
+
vertical: 'top',
|
582
|
+
horizontal: 'left',
|
583
|
+
},
|
584
|
+
elevation: 7,
|
585
|
+
}}
|
586
|
+
>
|
587
|
+
<MoreVerticalIcon />
|
588
|
+
</DropdownMenu>
|
589
|
+
<div className="query-loader__result__arrow">
|
590
|
+
<ThinChevronRightIcon />
|
591
|
+
</div>
|
433
592
|
</div>
|
434
|
-
|
435
|
-
))}
|
593
|
+
))}
|
436
594
|
</>
|
437
595
|
)}
|
438
596
|
{!queryLoaderState.searchQueriesState.hasCompleted && (
|
@@ -456,6 +614,7 @@ export const QueryLoaderDialog = observer(
|
|
456
614
|
loadActionLabel?: string | undefined;
|
457
615
|
}) => {
|
458
616
|
const { queryLoaderState, title, loadActionLabel } = props;
|
617
|
+
const applicationStore = queryLoaderState.applicationStore;
|
459
618
|
|
460
619
|
const close = (): void => {
|
461
620
|
queryLoaderState.setQueryLoaderDialogOpen(false);
|
@@ -475,7 +634,9 @@ export const QueryLoaderDialog = observer(
|
|
475
634
|
}}
|
476
635
|
>
|
477
636
|
<Modal
|
478
|
-
darkMode={
|
637
|
+
darkMode={
|
638
|
+
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
639
|
+
}
|
479
640
|
className="modal query-loader__dialog__body__content"
|
480
641
|
>
|
481
642
|
<div className="modal query-loader__dialog__header">
|
@@ -56,7 +56,12 @@ export const QueryUsageViewer = observer(
|
|
56
56
|
open={resultState.isQueryUsageViewerOpened}
|
57
57
|
onClose={() => resultState.setIsQueryUsageViewerOpened(false)}
|
58
58
|
>
|
59
|
-
<Modal
|
59
|
+
<Modal
|
60
|
+
className="query-builder__usage-viewer__modal"
|
61
|
+
darkMode={
|
62
|
+
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
63
|
+
}
|
64
|
+
>
|
60
65
|
<ModalHeader title="Query Usage" />
|
61
66
|
<ModalBody className="query-builder__usage-viewer__body">
|
62
67
|
<>
|
@@ -102,6 +107,7 @@ export const QueryUsageViewer = observer(
|
|
102
107
|
<ModalFooterButton
|
103
108
|
onClick={() => resultState.setIsQueryUsageViewerOpened(false)}
|
104
109
|
text="Close"
|
110
|
+
type="secondary"
|
105
111
|
/>
|
106
112
|
</ModalFooter>
|
107
113
|
</Modal>
|
@@ -52,15 +52,19 @@ import {
|
|
52
52
|
import { STYLE_PREFIX, STYLE_PREFIX__DARK } from '@finos/legend-art';
|
53
53
|
import { expect } from '@jest/globals';
|
54
54
|
|
55
|
+
const getSelectorContainerClassName = (lightMode?: boolean): string =>
|
56
|
+
'.' + `${lightMode ? STYLE_PREFIX : STYLE_PREFIX__DARK}__value-container`;
|
57
|
+
|
58
|
+
const getSelectorInputClassName = (lightMode?: boolean): string =>
|
59
|
+
'.' + `${lightMode ? STYLE_PREFIX : STYLE_PREFIX__DARK}__single-value`;
|
60
|
+
|
55
61
|
export const selectFromCustomSelectorInput = (
|
56
62
|
selectorContainer: HTMLElement,
|
57
63
|
optionText: string,
|
58
64
|
lightMode?: boolean,
|
59
65
|
): void => {
|
60
|
-
const selectorContainerClassName =
|
61
|
-
|
62
|
-
const selectorInputValue =
|
63
|
-
'.' + `${lightMode ? STYLE_PREFIX : STYLE_PREFIX__DARK}__single-value`;
|
66
|
+
const selectorContainerClassName = getSelectorContainerClassName(lightMode);
|
67
|
+
const selectorInputValue = getSelectorInputClassName(lightMode);
|
64
68
|
|
65
69
|
let foundOptionText = false;
|
66
70
|
const selector = selectorContainer.querySelector(
|
@@ -106,6 +110,38 @@ export const selectFromCustomSelectorInput = (
|
|
106
110
|
}
|
107
111
|
};
|
108
112
|
|
113
|
+
export const selectFirstOptionFromCustomSelectorInput = (
|
114
|
+
selectorContainer: HTMLElement,
|
115
|
+
lightMode?: boolean,
|
116
|
+
): void => {
|
117
|
+
const selectorContainerClassName = getSelectorContainerClassName(lightMode);
|
118
|
+
const selectorInputValue = getSelectorInputClassName(lightMode);
|
119
|
+
|
120
|
+
const selector = selectorContainer.querySelector(
|
121
|
+
selectorContainerClassName,
|
122
|
+
) as HTMLSelectElement;
|
123
|
+
|
124
|
+
fireEvent.keyDown(selector, { key: 'ArrowDown' });
|
125
|
+
fireEvent.keyDown(selector, { key: 'Enter' });
|
126
|
+
expect(selector.querySelector(selectorInputValue)).not.toBeNull();
|
127
|
+
};
|
128
|
+
|
129
|
+
export const getCustomSelectorInputValue = (
|
130
|
+
selectorContainer: HTMLElement,
|
131
|
+
lightMode?: boolean,
|
132
|
+
): string | null => {
|
133
|
+
const selectorContainerClassName = getSelectorContainerClassName(lightMode);
|
134
|
+
const selectorInputValue = getSelectorInputClassName(lightMode);
|
135
|
+
|
136
|
+
const selector = guaranteeNonNullable(
|
137
|
+
selectorContainer.querySelector(selectorContainerClassName),
|
138
|
+
) as HTMLSelectElement;
|
139
|
+
const selectorInput = guaranteeNonNullable(
|
140
|
+
selector.querySelector(selectorInputValue),
|
141
|
+
);
|
142
|
+
return selectorInput.textContent;
|
143
|
+
};
|
144
|
+
|
109
145
|
export const dragAndDrop = async (
|
110
146
|
source: HTMLElement,
|
111
147
|
drop: HTMLElement,
|
@@ -217,9 +217,17 @@ const AccessStatusCellRenderer = observer(
|
|
217
217
|
const DataAccessOverviewGrid = observer(
|
218
218
|
(props: { dataAccessState: DataAccessState }) => {
|
219
219
|
const { dataAccessState } = props;
|
220
|
+
const darkMode =
|
221
|
+
!dataAccessState.applicationStore.layoutService
|
222
|
+
.TEMPORARY__isLightColorThemeEnabled;
|
220
223
|
|
221
224
|
return (
|
222
|
-
<div
|
225
|
+
<div
|
226
|
+
className={clsx('data-access-overview__grid', {
|
227
|
+
'ag-theme-balham': !darkMode,
|
228
|
+
'ag-theme-balham-dark': darkMode,
|
229
|
+
})}
|
230
|
+
>
|
223
231
|
<DataGrid
|
224
232
|
rowData={dataAccessState.datasets}
|
225
233
|
gridOptions={{
|