@finos/legend-query-builder 4.19.12 → 4.19.14

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 (118) hide show
  1. package/lib/__lib__/QueryBuilderDocumentation.d.ts +2 -1
  2. package/lib/__lib__/QueryBuilderDocumentation.d.ts.map +1 -1
  3. package/lib/__lib__/QueryBuilderDocumentation.js +1 -0
  4. package/lib/__lib__/QueryBuilderDocumentation.js.map +1 -1
  5. package/lib/__lib__/QueryBuilderEvent.d.ts +63 -2
  6. package/lib/__lib__/QueryBuilderEvent.d.ts.map +1 -1
  7. package/lib/__lib__/QueryBuilderEvent.js +74 -1
  8. package/lib/__lib__/QueryBuilderEvent.js.map +1 -1
  9. package/lib/__lib__/QueryBuilderTelemetryHelper.d.ts +204 -8
  10. package/lib/__lib__/QueryBuilderTelemetryHelper.d.ts.map +1 -1
  11. package/lib/__lib__/QueryBuilderTelemetryHelper.js +104 -0
  12. package/lib/__lib__/QueryBuilderTelemetryHelper.js.map +1 -1
  13. package/lib/components/QueryBuilder.d.ts.map +1 -1
  14. package/lib/components/QueryBuilder.js +83 -14
  15. package/lib/components/QueryBuilder.js.map +1 -1
  16. package/lib/components/QueryBuilderConstantExpressionPanel.d.ts.map +1 -1
  17. package/lib/components/QueryBuilderConstantExpressionPanel.js +18 -1
  18. package/lib/components/QueryBuilderConstantExpressionPanel.js.map +1 -1
  19. package/lib/components/QueryBuilderParametersPanel.d.ts.map +1 -1
  20. package/lib/components/QueryBuilderParametersPanel.js +18 -1
  21. package/lib/components/QueryBuilderParametersPanel.js.map +1 -1
  22. package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
  23. package/lib/components/QueryBuilderSideBar.js +19 -0
  24. package/lib/components/QueryBuilderSideBar.js.map +1 -1
  25. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  26. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +42 -1
  27. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  28. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  29. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +25 -5
  30. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
  31. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  32. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +55 -0
  33. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
  34. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  35. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +95 -8
  36. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  37. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
  38. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +37 -4
  39. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
  40. package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
  41. package/lib/components/filter/QueryBuilderFilterPanel.js +24 -5
  42. package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
  43. package/lib/components/result/QueryBuilderDataProductErrorPanel.d.ts +61 -0
  44. package/lib/components/result/QueryBuilderDataProductErrorPanel.d.ts.map +1 -0
  45. package/lib/components/result/QueryBuilderDataProductErrorPanel.js +176 -0
  46. package/lib/components/result/QueryBuilderDataProductErrorPanel.js.map +1 -0
  47. package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
  48. package/lib/components/result/QueryBuilderResultPanel.js +24 -18
  49. package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
  50. package/lib/data-access-overview.css +1 -1
  51. package/lib/index.css +2 -2
  52. package/lib/index.css.map +1 -1
  53. package/lib/index.d.ts +2 -1
  54. package/lib/index.d.ts.map +1 -1
  55. package/lib/index.js +1 -0
  56. package/lib/index.js.map +1 -1
  57. package/lib/package.json +1 -1
  58. package/lib/stores/QueryBuilderResultState.d.ts +11 -1
  59. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  60. package/lib/stores/QueryBuilderResultState.js +79 -15
  61. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  62. package/lib/stores/QueryBuilderState.d.ts +139 -9
  63. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  64. package/lib/stores/QueryBuilderState.js +134 -22
  65. package/lib/stores/QueryBuilderState.js.map +1 -1
  66. package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts +13 -0
  67. package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts.map +1 -1
  68. package/lib/stores/QueryLoaderState.d.ts +33 -5
  69. package/lib/stores/QueryLoaderState.d.ts.map +1 -1
  70. package/lib/stores/QueryLoaderState.js +10 -1
  71. package/lib/stores/QueryLoaderState.js.map +1 -1
  72. package/lib/stores/data-access/DataProductAccessInfo.d.ts +37 -0
  73. package/lib/stores/data-access/DataProductAccessInfo.d.ts.map +1 -0
  74. package/lib/stores/data-access/DataProductAccessInfo.js +17 -0
  75. package/lib/stores/data-access/DataProductAccessInfo.js.map +1 -0
  76. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.js +1 -1
  77. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.js.map +1 -1
  78. package/lib/stores/explorer/QueryBuilderExplorerState.js +1 -1
  79. package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
  80. package/lib/stores/milestoning/QueryBuilderMilestoningHelper.d.ts.map +1 -1
  81. package/lib/stores/milestoning/QueryBuilderMilestoningHelper.js +34 -9
  82. package/lib/stores/milestoning/QueryBuilderMilestoningHelper.js.map +1 -1
  83. package/lib/stores/milestoning/QueryBuilderMilestoningState.d.ts +5 -0
  84. package/lib/stores/milestoning/QueryBuilderMilestoningState.d.ts.map +1 -1
  85. package/lib/stores/milestoning/QueryBuilderMilestoningState.js +13 -0
  86. package/lib/stores/milestoning/QueryBuilderMilestoningState.js.map +1 -1
  87. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.d.ts +2 -0
  88. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.d.ts.map +1 -1
  89. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js +50 -1
  90. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js.map +1 -1
  91. package/package.json +10 -10
  92. package/src/__lib__/QueryBuilderDocumentation.ts +1 -0
  93. package/src/__lib__/QueryBuilderEvent.ts +80 -1
  94. package/src/__lib__/QueryBuilderTelemetryHelper.ts +450 -8
  95. package/src/components/QueryBuilder.tsx +157 -38
  96. package/src/components/QueryBuilderConstantExpressionPanel.tsx +24 -2
  97. package/src/components/QueryBuilderParametersPanel.tsx +25 -2
  98. package/src/components/QueryBuilderSideBar.tsx +28 -0
  99. package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +56 -1
  100. package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +31 -4
  101. package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +74 -0
  102. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +123 -8
  103. package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +49 -4
  104. package/src/components/filter/QueryBuilderFilterPanel.tsx +31 -4
  105. package/src/components/result/QueryBuilderDataProductErrorPanel.tsx +441 -0
  106. package/src/components/result/QueryBuilderResultPanel.tsx +49 -32
  107. package/src/index.ts +2 -0
  108. package/src/stores/QueryBuilderResultState.ts +107 -19
  109. package/src/stores/QueryBuilderState.ts +260 -29
  110. package/src/stores/QueryBuilder_LegendApplicationPlugin_Extension.ts +20 -0
  111. package/src/stores/QueryLoaderState.ts +47 -6
  112. package/src/stores/data-access/DataProductAccessInfo.ts +37 -0
  113. package/src/stores/data-cube/QueryBuilderDataCubeEngine.ts +1 -1
  114. package/src/stores/explorer/QueryBuilderExplorerState.ts +1 -1
  115. package/src/stores/milestoning/QueryBuilderMilestoningHelper.ts +63 -8
  116. package/src/stores/milestoning/QueryBuilderMilestoningState.ts +20 -0
  117. package/src/stores/workflows/dataProduct/DataProductQueryBuilderState.ts +68 -0
  118. package/tsconfig.json +2 -0
@@ -71,6 +71,7 @@ import {
71
71
  import { QueryBuilderParametersPanel } from './QueryBuilderParametersPanel.js';
72
72
  import { QueryBuilderFunctionsExplorerPanel } from './explorer/QueryBuilderFunctionsExplorerPanel.js';
73
73
  import { QueryBuilderTDSState } from '../stores/fetch-structure/tds/QueryBuilderTDSState.js';
74
+ import { DataProductQueryBuilderState } from '../stores/workflows/dataProduct/DataProductQueryBuilderState.js';
74
75
  import { QueryBuilderDiffViewPanelDiaglog } from './QueryBuilderDiffPanel.js';
75
76
  import { guaranteeType, returnUndefOnError } from '@finos/legend-shared';
76
77
  import { QueryBuilderGraphFetchTreeState } from '../stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js';
@@ -265,18 +266,36 @@ export const QueryBuilder = observer(
265
266
  );
266
267
  };
267
268
  const toggleShowParameterPanel = (): void => {
268
- queryBuilderState.setShowParametersPanel(
269
- !queryBuilderState.showParametersPanel,
269
+ const nextEnabled = !queryBuilderState.showParametersPanel;
270
+ queryBuilderState.setShowParametersPanel(nextEnabled);
271
+ QueryBuilderTelemetryHelper.logEvent_TogglePanelParameter(
272
+ applicationStore.telemetryService,
273
+ {
274
+ ...queryBuilderState.safeGetTelemetryContext(),
275
+ enabled: nextEnabled,
276
+ },
270
277
  );
271
278
  };
272
279
  const toggleConstantPanel = (): void => {
273
- queryBuilderState.constantState.setShowConstantPanel(
274
- !queryBuilderState.constantState.showConstantPanel,
280
+ const nextEnabled = !queryBuilderState.constantState.showConstantPanel;
281
+ queryBuilderState.constantState.setShowConstantPanel(nextEnabled);
282
+ QueryBuilderTelemetryHelper.logEvent_TogglePanelConstant(
283
+ applicationStore.telemetryService,
284
+ {
285
+ ...queryBuilderState.safeGetTelemetryContext(),
286
+ enabled: nextEnabled,
287
+ },
275
288
  );
276
289
  };
277
290
  const toggleShowFilterPanel = (): void => {
278
- queryBuilderState.filterState.setShowPanel(
279
- !queryBuilderState.filterState.showPanel,
291
+ const nextEnabled = !queryBuilderState.filterState.showPanel;
292
+ queryBuilderState.filterState.setShowPanel(nextEnabled);
293
+ QueryBuilderTelemetryHelper.logEvent_TogglePanelFilter(
294
+ applicationStore.telemetryService,
295
+ {
296
+ ...queryBuilderState.safeGetTelemetryContext(),
297
+ enabled: nextEnabled,
298
+ },
280
299
  );
281
300
  };
282
301
  const toggleShowPostFilterPanel = (): void => {
@@ -290,6 +309,13 @@ export const QueryBuilder = observer(
290
309
  QUERY_BUILDER_SETTING_KEY.SHOW_POST_FILTER_PANEL,
291
310
  tdsState.showPostFilterPanel,
292
311
  );
312
+ QueryBuilderTelemetryHelper.logEvent_TogglePanelPostFilter(
313
+ applicationStore.telemetryService,
314
+ {
315
+ ...queryBuilderState.safeGetTelemetryContext(),
316
+ enabled: tdsState.showPostFilterPanel,
317
+ },
318
+ );
293
319
  }
294
320
  };
295
321
 
@@ -311,6 +337,13 @@ export const QueryBuilder = observer(
311
337
  ) {
312
338
  queryBuilderState.fetchStructureState.implementation.aggregationState.disableCalendar();
313
339
  }
340
+ QueryBuilderTelemetryHelper.logEvent_ToggleCalendar(
341
+ applicationStore.telemetryService,
342
+ {
343
+ ...queryBuilderState.safeGetTelemetryContext(),
344
+ enabled: false,
345
+ },
346
+ );
314
347
  },
315
348
  },
316
349
  {
@@ -330,7 +363,16 @@ export const QueryBuilder = observer(
330
363
  {
331
364
  label: 'Proceed',
332
365
  type: ActionAlertActionType.PROCEED_WITH_CAUTION,
333
- handler: (): void => queryBuilderState.setIsCalendarEnabled(true),
366
+ handler: (): void => {
367
+ queryBuilderState.setIsCalendarEnabled(true);
368
+ QueryBuilderTelemetryHelper.logEvent_ToggleCalendar(
369
+ applicationStore.telemetryService,
370
+ {
371
+ ...queryBuilderState.safeGetTelemetryContext(),
372
+ enabled: true,
373
+ },
374
+ );
375
+ },
334
376
  },
335
377
  {
336
378
  label: 'Cancel',
@@ -347,6 +389,13 @@ export const QueryBuilder = observer(
347
389
  queryBuilderState.setLambdaWriteMode(
348
390
  QUERY_BUILDER_LAMBDA_WRITER_MODE.STANDARD,
349
391
  );
392
+ QueryBuilderTelemetryHelper.logEvent_ToggleTypedTDS(
393
+ applicationStore.telemetryService,
394
+ {
395
+ ...queryBuilderState.safeGetTelemetryContext(),
396
+ enabled: false,
397
+ },
398
+ );
350
399
  } else {
351
400
  queryBuilderState.applicationStore.alertService.setActionAlertInfo({
352
401
  message:
@@ -357,10 +406,18 @@ export const QueryBuilder = observer(
357
406
  {
358
407
  label: 'Proceed',
359
408
  type: ActionAlertActionType.PROCEED_WITH_CAUTION,
360
- handler: (): void =>
409
+ handler: (): void => {
361
410
  queryBuilderState.setLambdaWriteMode(
362
411
  QUERY_BUILDER_LAMBDA_WRITER_MODE.TYPED_FETCH_STRUCTURE,
363
- ),
412
+ );
413
+ QueryBuilderTelemetryHelper.logEvent_ToggleTypedTDS(
414
+ applicationStore.telemetryService,
415
+ {
416
+ ...queryBuilderState.safeGetTelemetryContext(),
417
+ enabled: true,
418
+ },
419
+ );
420
+ },
364
421
  },
365
422
  {
366
423
  label: 'Cancel',
@@ -373,16 +430,32 @@ export const QueryBuilder = observer(
373
430
  };
374
431
 
375
432
  const editPure = (): void => {
433
+ QueryBuilderTelemetryHelper.logEvent_EditPureLaunched(
434
+ applicationStore.telemetryService,
435
+ queryBuilderState.safeGetTelemetryContext(),
436
+ );
376
437
  openLambdaEditor(QueryBuilderTextEditorMode.TEXT);
377
438
  };
378
439
  const showPure = (): void => {
440
+ QueryBuilderTelemetryHelper.logEvent_ShowPureLaunched(
441
+ applicationStore.telemetryService,
442
+ queryBuilderState.safeGetTelemetryContext(),
443
+ );
379
444
  openPure();
380
445
  };
381
446
  const showProtocol = (): void => {
447
+ QueryBuilderTelemetryHelper.logEvent_ShowProtocolLaunched(
448
+ applicationStore.telemetryService,
449
+ queryBuilderState.safeGetTelemetryContext(),
450
+ );
382
451
  openLambdaEditor(QueryBuilderTextEditorMode.JSON);
383
452
  };
384
453
 
385
454
  const openCheckEntitlmentsEditor = (): void => {
455
+ QueryBuilderTelemetryHelper.logEvent_CheckEntitlementsLaunched(
456
+ applicationStore.telemetryService,
457
+ queryBuilderState.safeGetTelemetryContext(),
458
+ );
386
459
  queryBuilderState.checkEntitlementsState.setShowCheckEntitlementsViewer(
387
460
  true,
388
461
  );
@@ -399,7 +472,15 @@ export const QueryBuilder = observer(
399
472
  queryBuilderState.fetchStructureState.implementation,
400
473
  QueryBuilderTDSState,
401
474
  );
402
- tdsState.setShowWindowFuncPanel(!tdsState.showWindowFuncPanel);
475
+ const nextEnabled = !tdsState.showWindowFuncPanel;
476
+ tdsState.setShowWindowFuncPanel(nextEnabled);
477
+ QueryBuilderTelemetryHelper.logEvent_TogglePanelWindow(
478
+ applicationStore.telemetryService,
479
+ {
480
+ ...queryBuilderState.safeGetTelemetryContext(),
481
+ enabled: nextEnabled,
482
+ },
483
+ );
403
484
  }
404
485
  };
405
486
  const showPostFetchStructurePanel =
@@ -446,6 +527,10 @@ export const QueryBuilder = observer(
446
527
  );
447
528
  const openQueryTutorial = (): void => {
448
529
  if (queryDocEntry?.url) {
530
+ QueryBuilderTelemetryHelper.logEvent_OpenDocumentationLaunched(
531
+ applicationStore.telemetryService,
532
+ queryBuilderState.safeGetTelemetryContext(),
533
+ );
449
534
  applicationStore.navigationService.navigator.visitAddress(
450
535
  queryDocEntry.url,
451
536
  );
@@ -453,6 +538,10 @@ export const QueryBuilder = observer(
453
538
  };
454
539
  const openFrequentlyAskedQuestions = (): void => {
455
540
  if (frequentlyAskedQuestionEntry?.url) {
541
+ QueryBuilderTelemetryHelper.logEvent_OpenFAQLaunched(
542
+ applicationStore.telemetryService,
543
+ queryBuilderState.safeGetTelemetryContext(),
544
+ );
456
545
  applicationStore.navigationService.navigator.visitAddress(
457
546
  frequentlyAskedQuestionEntry.url,
458
547
  );
@@ -460,14 +549,28 @@ export const QueryBuilder = observer(
460
549
  };
461
550
  const openSupportTickets = (): void => {
462
551
  if (supportTicketsEntry?.url) {
552
+ QueryBuilderTelemetryHelper.logEvent_OpenSupportTicketsLaunched(
553
+ applicationStore.telemetryService,
554
+ queryBuilderState.safeGetTelemetryContext(),
555
+ );
463
556
  applicationStore.navigationService.navigator.visitAddress(
464
557
  supportTicketsEntry.url,
465
558
  );
466
559
  }
467
560
  };
468
561
 
469
- const toggleAssistant = (): void =>
562
+ const toggleAssistant = (): void => {
470
563
  applicationStore.assistantService.toggleAssistant();
564
+ // Read the post-toggle state directly rather than pre-computing it —
565
+ // avoids drifting if `toggleAssistant()` ever becomes non-symmetric.
566
+ QueryBuilderTelemetryHelper.logEvent_ToggleVirtualAssistant(
567
+ applicationStore.telemetryService,
568
+ {
569
+ ...queryBuilderState.safeGetTelemetryContext(),
570
+ enabled: !applicationStore.assistantService.isHidden,
571
+ },
572
+ );
573
+ };
471
574
 
472
575
  const extraHelpMenuContentItems = applicationStore.pluginManager
473
576
  .getApplicationPlugins()
@@ -490,11 +593,20 @@ export const QueryBuilder = observer(
490
593
  </MenuContentItem>
491
594
  ));
492
595
 
493
- const compileQuery = applicationStore.guardUnhandledError(() =>
494
- flowResult(queryBuilderState.compileQuery()),
495
- );
496
- const showDiff = (): void =>
596
+ const compileQuery = applicationStore.guardUnhandledError(() => {
597
+ QueryBuilderTelemetryHelper.logEvent_CompileQueryLaunched(
598
+ applicationStore.telemetryService,
599
+ queryBuilderState.safeGetTelemetryContext(),
600
+ );
601
+ return flowResult(queryBuilderState.compileQuery());
602
+ });
603
+ const showDiff = (): void => {
604
+ QueryBuilderTelemetryHelper.logEvent_ShowQueryDiffLaunched(
605
+ applicationStore.telemetryService,
606
+ queryBuilderState.safeGetTelemetryContext(),
607
+ );
497
608
  queryBuilderState.changeDetectionState.showDiffViewPanel();
609
+ };
498
610
 
499
611
  useEffect(() => {
500
612
  // this condition is for passing all exisitng tests because when we initialize a queryBuilderState for a test,
@@ -778,29 +890,36 @@ export const QueryBuilder = observer(
778
890
  </MenuContentItemLabel>
779
891
  </MenuContentItem>
780
892
  <MenuContentDivider />
781
- <MenuContentItem
782
- onClick={openCheckEntitlmentsEditor}
783
- disabled={
784
- (queryBuilderState.isQuerySupported &&
785
- queryBuilderState.fetchStructureState
786
- .implementation instanceof QueryBuilderTDSState &&
787
- queryBuilderState.fetchStructureState.implementation
788
- .projectionColumns.length === 0) ||
789
- !queryBuilderState.canBuildQuery
790
- }
791
- title={
792
- !queryBuilderState.canBuildQuery
793
- ? 'Please fix query errors to check entitlements'
794
- : ''
795
- }
796
- >
797
- <MenuContentItemIcon>
798
- <DataAccessIcon />
799
- </MenuContentItemIcon>
800
- <MenuContentItemLabel>
801
- Check Entitlements
802
- </MenuContentItemLabel>
803
- </MenuContentItem>
893
+ {!(
894
+ queryBuilderState instanceof
895
+ DataProductQueryBuilderState
896
+ ) && (
897
+ <MenuContentItem
898
+ onClick={openCheckEntitlmentsEditor}
899
+ disabled={
900
+ (queryBuilderState.isQuerySupported &&
901
+ queryBuilderState.fetchStructureState
902
+ .implementation instanceof
903
+ QueryBuilderTDSState &&
904
+ queryBuilderState.fetchStructureState
905
+ .implementation.projectionColumns.length ===
906
+ 0) ||
907
+ !queryBuilderState.canBuildQuery
908
+ }
909
+ title={
910
+ !queryBuilderState.canBuildQuery
911
+ ? 'Please fix query errors to check entitlements'
912
+ : ''
913
+ }
914
+ >
915
+ <MenuContentItemIcon>
916
+ <DataAccessIcon />
917
+ </MenuContentItemIcon>
918
+ <MenuContentItemLabel>
919
+ Check Entitlements
920
+ </MenuContentItemLabel>
921
+ </MenuContentItem>
922
+ )}
804
923
  <MenuContentItem
805
924
  onClick={editPure}
806
925
  disabled={!queryBuilderState.canBuildQuery}
@@ -58,6 +58,7 @@ import {
58
58
  import { BasicValueSpecificationEditor } from './shared/BasicValueSpecificationEditor.js';
59
59
  import { QUERY_BUILDER_TEST_ID } from '../__lib__/QueryBuilderTesting.js';
60
60
  import { QUERY_BUILDER_DOCUMENTATION_KEY } from '../__lib__/QueryBuilderDocumentation.js';
61
+ import { QueryBuilderTelemetryHelper } from '../__lib__/QueryBuilderTelemetryHelper.js';
61
62
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
62
63
  import { variableExpression_setName } from '../stores/shared/ValueSpecificationModifierHelper.js';
63
64
  import { LambdaEditor } from './shared/LambdaEditor.js';
@@ -175,6 +176,16 @@ const QueryBuilderSimpleConstantExpressionEditor = observer(
175
176
  if (isCreating) {
176
177
  variableState.addConstant(constantState);
177
178
  }
179
+ QueryBuilderTelemetryHelper.logEvent_ConstantChanged(
180
+ applicationStore.telemetryService,
181
+ {
182
+ ...queryBuilderState.safeGetTelemetryContext(),
183
+ change: {
184
+ action: isCreating ? 'add' : 'edit',
185
+ constantCount: variableState.constants.length,
186
+ },
187
+ },
188
+ );
178
189
  handleCancel();
179
190
  };
180
191
 
@@ -547,8 +558,19 @@ export const QueryBuilderConstantExpressionPanel = observer(
547
558
  actions={{
548
559
  editVariable: () =>
549
560
  constantState.setSelectedConstant(constState),
550
- deleteVariable: () =>
551
- constantState.removeConstant(constState),
561
+ deleteVariable: () => {
562
+ constantState.removeConstant(constState);
563
+ QueryBuilderTelemetryHelper.logEvent_ConstantChanged(
564
+ queryBuilderState.applicationStore.telemetryService,
565
+ {
566
+ ...queryBuilderState.safeGetTelemetryContext(),
567
+ change: {
568
+ action: 'remove',
569
+ constantCount: constantState.constants.length,
570
+ },
571
+ },
572
+ );
573
+ },
552
574
  }}
553
575
  extraContextMenuActions={getExtraContextMenu(constState)}
554
576
  isReadOnly={isReadOnly}
@@ -50,6 +50,7 @@ import { LambdaParameterValuesEditor } from './shared/LambdaParameterValuesEdito
50
50
  import { VariableViewer } from './shared/QueryBuilderVariableSelector.js';
51
51
  import { QUERY_BUILDER_TEST_ID } from '../__lib__/QueryBuilderTesting.js';
52
52
  import { QUERY_BUILDER_DOCUMENTATION_KEY } from '../__lib__/QueryBuilderDocumentation.js';
53
+ import { QueryBuilderTelemetryHelper } from '../__lib__/QueryBuilderTelemetryHelper.js';
53
54
  import { useCallback, useState } from 'react';
54
55
  import {
55
56
  buildElementOption,
@@ -166,6 +167,16 @@ const VariableExpressionEditor = observer(
166
167
  defaultMilestoningValue,
167
168
  );
168
169
  }
170
+ QueryBuilderTelemetryHelper.logEvent_ParameterChanged(
171
+ applicationStore.telemetryService,
172
+ {
173
+ ...queryBuilderState.safeGetTelemetryContext(),
174
+ change: {
175
+ action: isCreating ? 'add' : 'edit',
176
+ parameterCount: queryParametersState.parameterStates.length,
177
+ },
178
+ },
179
+ );
169
180
 
170
181
  handleCancel();
171
182
  };
@@ -390,8 +401,20 @@ export const QueryBuilderParametersPanel = observer(
390
401
  actions={{
391
402
  editVariable: () =>
392
403
  queryParameterState.setSelectedParameter(pState),
393
- deleteVariable: () =>
394
- queryParameterState.removeParameter(pState),
404
+ deleteVariable: () => {
405
+ queryParameterState.removeParameter(pState);
406
+ QueryBuilderTelemetryHelper.logEvent_ParameterChanged(
407
+ queryBuilderState.applicationStore.telemetryService,
408
+ {
409
+ ...queryBuilderState.safeGetTelemetryContext(),
410
+ change: {
411
+ action: 'remove',
412
+ parameterCount:
413
+ queryParameterState.parameterStates.length,
414
+ },
415
+ },
416
+ );
417
+ },
395
418
  }}
396
419
  />
397
420
  ))}
@@ -47,6 +47,7 @@ import {
47
47
  type PackageableElementOption,
48
48
  } from '@finos/legend-lego/graph-editor';
49
49
  import type { QueryBuilder_LegendApplicationPlugin_Extension } from '../stores/QueryBuilder_LegendApplicationPlugin_Extension.js';
50
+ import { QueryBuilderTelemetryHelper } from '../__lib__/QueryBuilderTelemetryHelper.js';
50
51
 
51
52
  export const getParameterValue = (
52
53
  parameter: ValueSpecification | undefined,
@@ -130,6 +131,15 @@ export const QueryBuilderClassSelector = observer(
130
131
  return;
131
132
  }
132
133
  queryBuilderState.changeSourceElement(val.value);
134
+ QueryBuilderTelemetryHelper.logEvent_ExecutionContextChanged(
135
+ applicationStore.telemetryService,
136
+ {
137
+ ...queryBuilderState.safeGetTelemetryContext(),
138
+ change: {
139
+ subtype: 'class',
140
+ },
141
+ },
142
+ );
133
143
  onClassChange?.(val.value);
134
144
  };
135
145
 
@@ -256,6 +266,15 @@ const BasicQueryBuilderSetup = observer(
256
266
  return;
257
267
  }
258
268
  queryBuilderState.changeMapping(val.value);
269
+ QueryBuilderTelemetryHelper.logEvent_ExecutionContextChanged(
270
+ applicationStore.telemetryService,
271
+ {
272
+ ...queryBuilderState.safeGetTelemetryContext(),
273
+ change: {
274
+ subtype: 'mapping',
275
+ },
276
+ },
277
+ );
259
278
  };
260
279
  const mappingFilterOption = createFilter({
261
280
  ignoreCase: true,
@@ -287,6 +306,15 @@ const BasicQueryBuilderSetup = observer(
287
306
  return;
288
307
  }
289
308
  queryBuilderState.changeRuntime(val.value);
309
+ QueryBuilderTelemetryHelper.logEvent_ExecutionContextChanged(
310
+ applicationStore.telemetryService,
311
+ {
312
+ ...queryBuilderState.safeGetTelemetryContext(),
313
+ change: {
314
+ subtype: 'runtime',
315
+ },
316
+ },
317
+ );
290
318
  };
291
319
  const runtimeFilterOption = createFilter({
292
320
  ignoreCase: true,
@@ -409,6 +409,17 @@ export const QueryBuilderGraphFetchExternalConfig = observer(
409
409
  } else {
410
410
  removeNodeRecursively(serializationTreeData, node);
411
411
  serializationState.setGraphFetchTree({ ...serializationTreeData });
412
+ QueryBuilderTelemetryHelper.logEvent_GraphFetchChanged(
413
+ graphFetchState.queryBuilderState.applicationStore.telemetryService,
414
+ {
415
+ ...graphFetchState.queryBuilderState.safeGetTelemetryContext(),
416
+ change: {
417
+ action: 'remove',
418
+ nodeCount: serializationTreeData.nodes.size,
419
+ serializationType: serializationState.getLabel(),
420
+ },
421
+ },
422
+ );
412
423
  }
413
424
  };
414
425
 
@@ -533,10 +544,31 @@ export const QueryBuilderGraphFetchTreeExplorer = observer(
533
544
  updateTreeData({ ...serializationState.treeData });
534
545
  }
535
546
  updateTreeData({ ...treeData });
547
+ QueryBuilderTelemetryHelper.logEvent_GraphFetchChanged(
548
+ graphFetchState.queryBuilderState.applicationStore.telemetryService,
549
+ {
550
+ ...graphFetchState.queryBuilderState.safeGetTelemetryContext(),
551
+ change: {
552
+ action: 'remove',
553
+ nodeCount: treeData.nodes.size,
554
+ },
555
+ },
556
+ );
536
557
  };
537
558
 
538
- const toggleChecked = (): void =>
559
+ const toggleChecked = (): void => {
539
560
  graphFetchState.setChecked(!graphFetchState.isChecked);
561
+ QueryBuilderTelemetryHelper.logEvent_GraphFetchChanged(
562
+ graphFetchState.queryBuilderState.applicationStore.telemetryService,
563
+ {
564
+ ...graphFetchState.queryBuilderState.safeGetTelemetryContext(),
565
+ change: {
566
+ action: 'check-toggle',
567
+ nodeCount: treeData.nodes.size,
568
+ },
569
+ },
570
+ );
571
+ };
540
572
 
541
573
  const openConfigModal = (): void => {
542
574
  if (serializationState instanceof GraphFetchPureSerializationState) {
@@ -594,6 +626,18 @@ export const QueryBuilderGraphFetchTreeExplorer = observer(
594
626
  );
595
627
  break;
596
628
  }
629
+ QueryBuilderTelemetryHelper.logEvent_GraphFetchChanged(
630
+ graphFetchState.queryBuilderState.applicationStore
631
+ .telemetryService,
632
+ {
633
+ ...graphFetchState.queryBuilderState.safeGetTelemetryContext(),
634
+ change: {
635
+ action: 'serialization-change',
636
+ nodeCount: treeData.nodes.size,
637
+ serializationType: implementationType,
638
+ },
639
+ },
640
+ );
597
641
  },
598
642
  ),
599
643
  },
@@ -769,6 +813,17 @@ const QueryBuilderGraphFetchTreePanel = observer(
769
813
  refreshTreeData: true,
770
814
  });
771
815
  }
816
+ QueryBuilderTelemetryHelper.logEvent_GraphFetchChanged(
817
+ graphFetchTreeState.queryBuilderState.applicationStore
818
+ .telemetryService,
819
+ {
820
+ ...graphFetchTreeState.queryBuilderState.safeGetTelemetryContext(),
821
+ change: {
822
+ action: 'add',
823
+ nodeCount: graphFetchTreeState.treeData?.nodes.size ?? 0,
824
+ },
825
+ },
826
+ );
772
827
  },
773
828
  [graphFetchTreeState, serializationState],
774
829
  );
@@ -144,8 +144,19 @@ const QueryBuilderPostFilterConditionContextMenu = observer(
144
144
  >(function QueryBuilderPostFilterConditionContextMenu(props, ref) {
145
145
  const { tdsState, node } = props;
146
146
  const postFilterState = tdsState.postFilterState;
147
- const removeNode = (): void =>
147
+ const applicationStore = useApplicationStore();
148
+ const removeNode = (): void => {
148
149
  postFilterState.removeNodeAndPruneBranch(node);
150
+ QueryBuilderTelemetryHelper.logEvent_PostFilterChanged(
151
+ applicationStore.telemetryService,
152
+ {
153
+ ...tdsState.queryBuilderState.safeGetTelemetryContext(),
154
+ change: {
155
+ action: 'remove',
156
+ },
157
+ },
158
+ );
159
+ };
149
160
  const createCondition = (): void => {
150
161
  postFilterState.addNodeFromNode(
151
162
  new QueryBuilderPostFilterTreeBlankConditionNodeData(undefined),
@@ -184,19 +195,34 @@ const QueryBuilderPostFilterConditionContextMenu = observer(
184
195
 
185
196
  const QueryBuilderPostFilterGroupConditionEditor = observer(
186
197
  (props: {
198
+ tdsState: QueryBuilderTDSState;
187
199
  node: QueryBuilderPostFilterTreeGroupNodeData;
188
200
  isDragOver: boolean;
189
201
  isDroppable: boolean;
190
202
  }) => {
191
- const { node, isDragOver, isDroppable } = props;
203
+ const { tdsState, node, isDragOver, isDroppable } = props;
204
+ const applicationStore = useApplicationStore();
192
205
  const switchOperation: React.MouseEventHandler<HTMLDivElement> = (
193
206
  event,
194
207
  ): void => {
195
208
  event.stopPropagation(); // prevent triggering selecting the node
196
- node.setGroupOperation(
209
+ const nextOperation =
197
210
  node.groupOperation === QUERY_BUILDER_GROUP_OPERATION.AND
198
211
  ? QUERY_BUILDER_GROUP_OPERATION.OR
199
- : QUERY_BUILDER_GROUP_OPERATION.AND,
212
+ : QUERY_BUILDER_GROUP_OPERATION.AND;
213
+ node.setGroupOperation(nextOperation);
214
+ QueryBuilderTelemetryHelper.logEvent_PostFilterChanged(
215
+ applicationStore.telemetryService,
216
+ {
217
+ ...tdsState.queryBuilderState.safeGetTelemetryContext(),
218
+ change: {
219
+ action: 'group-operation-change',
220
+ groupOperation:
221
+ nextOperation === QUERY_BUILDER_GROUP_OPERATION.AND
222
+ ? 'and'
223
+ : 'or',
224
+ },
225
+ },
200
226
  );
201
227
  };
202
228
 
@@ -771,6 +797,7 @@ const QueryBuilderPostFilterTreeNodeContainer = observer(
771
797
  >
772
798
  {node instanceof QueryBuilderPostFilterTreeGroupNodeData && (
773
799
  <QueryBuilderPostFilterGroupConditionEditor
800
+ tdsState={tdsState}
774
801
  node={node}
775
802
  isDroppable={isDroppable}
776
803
  isDragOver={isDragOver}