@finos/legend-application-studio 28.19.25 → 28.19.27

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 (27) hide show
  1. package/lib/components/editor/editor-group/dataProduct/DataPoductEditor.d.ts.map +1 -1
  2. package/lib/components/editor/editor-group/dataProduct/DataPoductEditor.js +48 -5
  3. package/lib/components/editor/editor-group/dataProduct/DataPoductEditor.js.map +1 -1
  4. package/lib/components/editor/editor-group/testable/TestableSharedComponents.d.ts.map +1 -1
  5. package/lib/components/editor/editor-group/testable/TestableSharedComponents.js +74 -3
  6. package/lib/components/editor/editor-group/testable/TestableSharedComponents.js.map +1 -1
  7. package/lib/index.css +2 -2
  8. package/lib/index.css.map +1 -1
  9. package/lib/package.json +1 -1
  10. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.d.ts +1 -0
  11. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.d.ts.map +1 -1
  12. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.js +26 -0
  13. package/lib/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.js.map +1 -1
  14. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.d.ts +5 -0
  15. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.d.ts.map +1 -1
  16. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js +20 -0
  17. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js.map +1 -1
  18. package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.d.ts +2 -1
  19. package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.d.ts.map +1 -1
  20. package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.js +27 -4
  21. package/lib/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.js.map +1 -1
  22. package/package.json +9 -9
  23. package/src/components/editor/editor-group/dataProduct/DataPoductEditor.tsx +138 -30
  24. package/src/components/editor/editor-group/testable/TestableSharedComponents.tsx +202 -2
  25. package/src/stores/editor/editor-state/element-editor-state/dataProduct/DataProductEditorState.ts +26 -0
  26. package/src/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.ts +25 -1
  27. package/src/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.ts +34 -10
@@ -57,17 +57,40 @@ export const dataProduct_setSupportInfoIfAbsent = action((product) => {
57
57
  product.supportInfo = observe_SupportInfo(new SupportInfo());
58
58
  }
59
59
  });
60
+ export const supportInfo_setLinkLabel = action((link, label) => {
61
+ link.label = label;
62
+ });
60
63
  export const supportInfo_setDocumentationUrl = action((supportInfo, documentationUrl) => {
61
- supportInfo.documentation = observer_DataProductLink(new DataProductLink(documentationUrl));
64
+ if (!supportInfo.documentation) {
65
+ supportInfo.documentation = observer_DataProductLink(new DataProductLink(documentationUrl));
66
+ }
67
+ else {
68
+ supportInfo.documentation.url = documentationUrl;
69
+ }
62
70
  });
63
71
  export const supportInfo_setWebsite = action((supportInfo, website) => {
64
- supportInfo.website = observer_DataProductLink(new DataProductLink(website));
72
+ if (!supportInfo.website) {
73
+ supportInfo.website = observer_DataProductLink(new DataProductLink(website));
74
+ }
75
+ else {
76
+ supportInfo.website.url = website;
77
+ }
65
78
  });
66
79
  export const supportInfo_setFaqUrl = action((supportInfo, faqUrl) => {
67
- supportInfo.faqUrl = observer_DataProductLink(new DataProductLink(faqUrl));
80
+ if (!supportInfo.faqUrl) {
81
+ supportInfo.faqUrl = observer_DataProductLink(new DataProductLink(faqUrl));
82
+ }
83
+ else {
84
+ supportInfo.faqUrl.url = faqUrl;
85
+ }
68
86
  });
69
87
  export const supportInfo_setSupportUrl = action((supportInfo, supportUrl) => {
70
- supportInfo.supportUrl = observer_DataProductLink(new DataProductLink(supportUrl));
88
+ if (!supportInfo.supportUrl) {
89
+ supportInfo.supportUrl = observer_DataProductLink(new DataProductLink(supportUrl));
90
+ }
91
+ else {
92
+ supportInfo.supportUrl.url = supportUrl;
93
+ }
71
94
  });
72
95
  export const supportInfo_addEmail = action((supportInfo, email) => {
73
96
  addUniqueEntry(supportInfo.emails, observe_Email(email));
@@ -1 +1 @@
1
- {"version":3,"file":"DSL_DataProduct_GraphModifierHelper.js","sourceRoot":"","sources":["../../../src/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DSL_DataProduct_GraphModifierHelper.js","sourceRoot":"","sources":["../../../src/stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finos/legend-application-studio",
3
- "version": "28.19.25",
3
+ "version": "28.19.27",
4
4
  "description": "Legend Studio application core",
5
5
  "keywords": [
6
6
  "legend",
@@ -45,15 +45,15 @@
45
45
  "test:watch": "jest --watch"
46
46
  },
47
47
  "dependencies": {
48
- "@finos/legend-application": "16.0.62",
49
- "@finos/legend-art": "7.1.116",
50
- "@finos/legend-code-editor": "2.0.107",
51
- "@finos/legend-data-cube": "0.3.13",
52
- "@finos/legend-graph": "32.1.65",
53
- "@finos/legend-lego": "2.0.114",
54
- "@finos/legend-query-builder": "4.17.25",
48
+ "@finos/legend-application": "16.0.63",
49
+ "@finos/legend-art": "7.1.117",
50
+ "@finos/legend-code-editor": "2.0.109",
51
+ "@finos/legend-data-cube": "0.3.15",
52
+ "@finos/legend-graph": "32.1.67",
53
+ "@finos/legend-lego": "2.0.116",
54
+ "@finos/legend-query-builder": "4.17.27",
55
55
  "@finos/legend-server-depot": "6.0.98",
56
- "@finos/legend-server-lakehouse": "0.1.4",
56
+ "@finos/legend-server-lakehouse": "0.1.6",
57
57
  "@finos/legend-server-sdlc": "5.3.64",
58
58
  "@finos/legend-server-showcase": "0.2.60",
59
59
  "@finos/legend-shared": "11.0.19",
@@ -49,7 +49,6 @@ import {
49
49
  MenuContentItem,
50
50
  CaretDownIcon,
51
51
  WarningIcon,
52
- PanelFormSection,
53
52
  useDragPreviewLayer,
54
53
  DragPreviewLayer,
55
54
  PanelDnDEntry,
@@ -109,6 +108,7 @@ import {
109
108
  supportInfo_deleteEmail,
110
109
  accessPoint_setClassification,
111
110
  accessPoint_setReproducible,
111
+ supportInfo_setLinkLabel,
112
112
  } from '../../../../stores/graph-modifier/DSL_DataProduct_GraphModifierHelper.js';
113
113
  import { LEGEND_STUDIO_TEST_ID } from '../../../../__lib__/LegendStudioTesting.js';
114
114
  import { LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY } from '../../../../__lib__/LegendStudioApplicationNavigationContext.js';
@@ -1413,8 +1413,12 @@ const HomeTab = observer(
1413
1413
  );
1414
1414
 
1415
1415
  const SupportTab = observer(
1416
- (props: { product: DataProduct; isReadOnly: boolean }) => {
1417
- const { product, isReadOnly } = props;
1416
+ (props: {
1417
+ dataProductEditorState: DataProductEditorState;
1418
+ isReadOnly: boolean;
1419
+ }) => {
1420
+ const { dataProductEditorState, isReadOnly } = props;
1421
+ const product = dataProductEditorState.product;
1418
1422
  const updateSupportInfoDocumentationUrl = (
1419
1423
  val: string | undefined,
1420
1424
  ): void => {
@@ -1422,6 +1426,16 @@ const SupportTab = observer(
1422
1426
  if (product.supportInfo) {
1423
1427
  supportInfo_setDocumentationUrl(product.supportInfo, val ?? '');
1424
1428
  }
1429
+ if (!val) {
1430
+ dataProductEditorState.clearSupportInfo();
1431
+ }
1432
+ };
1433
+ const updateSupportInfoDocumentationLabel = (
1434
+ val: string | undefined,
1435
+ ): void => {
1436
+ if (product.supportInfo?.documentation) {
1437
+ supportInfo_setLinkLabel(product.supportInfo.documentation, val);
1438
+ }
1425
1439
  };
1426
1440
 
1427
1441
  const updateSupportInfoWebsite = (val: string | undefined): void => {
@@ -1429,6 +1443,14 @@ const SupportTab = observer(
1429
1443
  if (product.supportInfo) {
1430
1444
  supportInfo_setWebsite(product.supportInfo, val ?? '');
1431
1445
  }
1446
+ if (!val) {
1447
+ dataProductEditorState.clearSupportInfo();
1448
+ }
1449
+ };
1450
+ const updateSupportInfoWebsiteLabel = (val: string | undefined): void => {
1451
+ if (product.supportInfo?.website) {
1452
+ supportInfo_setLinkLabel(product.supportInfo.website, val);
1453
+ }
1432
1454
  };
1433
1455
 
1434
1456
  const updateSupportInfoFaqUrl = (val: string | undefined): void => {
@@ -1436,6 +1458,14 @@ const SupportTab = observer(
1436
1458
  if (product.supportInfo) {
1437
1459
  supportInfo_setFaqUrl(product.supportInfo, val ?? '');
1438
1460
  }
1461
+ if (!val) {
1462
+ dataProductEditorState.clearSupportInfo();
1463
+ }
1464
+ };
1465
+ const updateSupportInfoFaqLabel = (val: string | undefined): void => {
1466
+ if (product.supportInfo?.faqUrl) {
1467
+ supportInfo_setLinkLabel(product.supportInfo.faqUrl, val);
1468
+ }
1439
1469
  };
1440
1470
 
1441
1471
  const updateSupportInfoSupportUrl = (val: string | undefined): void => {
@@ -1443,6 +1473,26 @@ const SupportTab = observer(
1443
1473
  if (product.supportInfo) {
1444
1474
  supportInfo_setSupportUrl(product.supportInfo, val ?? '');
1445
1475
  }
1476
+ if (!val) {
1477
+ dataProductEditorState.clearSupportInfo();
1478
+ }
1479
+ const supportLabelOptions = ['Keystone', 'Jira', 'ServiceNow'];
1480
+ supportLabelOptions.forEach((derivedLabel) => {
1481
+ if (
1482
+ val?.includes(derivedLabel.toLowerCase()) &&
1483
+ product.supportInfo?.supportUrl
1484
+ ) {
1485
+ supportInfo_setLinkLabel(
1486
+ product.supportInfo.supportUrl,
1487
+ derivedLabel,
1488
+ );
1489
+ }
1490
+ });
1491
+ };
1492
+ const updateSupportInfoSupportLabel = (val: string | undefined): void => {
1493
+ if (product.supportInfo?.supportUrl) {
1494
+ supportInfo_setLinkLabel(product.supportInfo.supportUrl, val);
1495
+ }
1446
1496
  };
1447
1497
 
1448
1498
  const handleSupportInfoEmailAdd = (
@@ -1459,6 +1509,9 @@ const SupportTab = observer(
1459
1509
  if (product.supportInfo) {
1460
1510
  supportInfo_deleteEmail(product.supportInfo, email);
1461
1511
  }
1512
+ if (product.supportInfo?.emails.length === 0) {
1513
+ dataProductEditorState.clearSupportInfo();
1514
+ }
1462
1515
  };
1463
1516
 
1464
1517
  const SupportEmailComponent = observer(
@@ -1527,37 +1580,87 @@ const SupportTab = observer(
1527
1580
  );
1528
1581
 
1529
1582
  return (
1530
- <PanelFormSection>
1583
+ <div className="data-product-editor__support-info">
1531
1584
  <div className="panel__content__form__section__header__label">
1532
1585
  Support Information
1533
1586
  </div>
1534
1587
  <div className="panel__content__form__section__header__prompt">
1535
1588
  Configure support information for this Lakehouse Data Product.
1536
1589
  </div>
1537
- <PanelFormTextField
1538
- name="Documentation URL"
1539
- value={product.supportInfo?.documentation?.url ?? ''}
1540
- update={updateSupportInfoDocumentationUrl}
1541
- placeholder="Enter Documentation URL"
1542
- />
1543
- <PanelFormTextField
1544
- name="Website"
1545
- value={product.supportInfo?.website?.url ?? ''}
1546
- update={updateSupportInfoWebsite}
1547
- placeholder="Enter Website"
1548
- />
1549
- <PanelFormTextField
1550
- name="FAQ URL"
1551
- value={product.supportInfo?.faqUrl?.url}
1552
- update={updateSupportInfoFaqUrl}
1553
- placeholder="Enter FAQ URL"
1554
- />
1555
- <PanelFormTextField
1556
- name="Support URL"
1557
- value={product.supportInfo?.supportUrl?.url ?? ''}
1558
- update={updateSupportInfoSupportUrl}
1559
- placeholder="Enter Support URL"
1560
- />
1590
+ <div className="data-product-editor__support-info__link-container">
1591
+ <PanelFormTextField
1592
+ className="data-product-editor__support-info__input"
1593
+ name="Documentation"
1594
+ prompt="URL"
1595
+ value={product.supportInfo?.documentation?.url ?? ''}
1596
+ update={updateSupportInfoDocumentationUrl}
1597
+ placeholder="Documentation URL"
1598
+ />
1599
+ <PanelFormTextField
1600
+ className="data-product-editor__support-info__input"
1601
+ name=""
1602
+ prompt="Label"
1603
+ isReadOnly={!Boolean(product.supportInfo?.documentation)}
1604
+ value={product.supportInfo?.documentation?.label ?? ''}
1605
+ update={updateSupportInfoDocumentationLabel}
1606
+ placeholder="Documentation Label"
1607
+ />
1608
+ </div>
1609
+
1610
+ <div className="data-product-editor__support-info__link-container">
1611
+ <PanelFormTextField
1612
+ name="Website"
1613
+ prompt="URL"
1614
+ value={product.supportInfo?.website?.url ?? ''}
1615
+ update={updateSupportInfoWebsite}
1616
+ placeholder="Website URL"
1617
+ />
1618
+ <PanelFormTextField
1619
+ name=""
1620
+ prompt="Label"
1621
+ isReadOnly={!Boolean(product.supportInfo?.website)}
1622
+ value={product.supportInfo?.website?.label ?? ''}
1623
+ update={updateSupportInfoWebsiteLabel}
1624
+ placeholder="Website Label"
1625
+ />
1626
+ </div>
1627
+
1628
+ <div className="data-product-editor__support-info__link-container">
1629
+ <PanelFormTextField
1630
+ name="FAQ"
1631
+ prompt="URL"
1632
+ value={product.supportInfo?.faqUrl?.url}
1633
+ update={updateSupportInfoFaqUrl}
1634
+ placeholder="FAQ URL"
1635
+ />
1636
+ <PanelFormTextField
1637
+ name=""
1638
+ prompt="Label"
1639
+ isReadOnly={!Boolean(product.supportInfo?.faqUrl)}
1640
+ value={product.supportInfo?.faqUrl?.label}
1641
+ update={updateSupportInfoFaqLabel}
1642
+ placeholder="FAQ Label"
1643
+ />
1644
+ </div>
1645
+
1646
+ <div className="data-product-editor__support-info__link-container">
1647
+ <PanelFormTextField
1648
+ name="Support"
1649
+ prompt="URL"
1650
+ value={product.supportInfo?.supportUrl?.url ?? ''}
1651
+ update={updateSupportInfoSupportUrl}
1652
+ placeholder="Support URL"
1653
+ />
1654
+ <PanelFormTextField
1655
+ name=""
1656
+ prompt="Label"
1657
+ isReadOnly={!Boolean(product.supportInfo?.supportUrl)}
1658
+ value={product.supportInfo?.supportUrl?.label}
1659
+ update={updateSupportInfoSupportLabel}
1660
+ placeholder="Support Label"
1661
+ />
1662
+ </div>
1663
+
1561
1664
  <ListEditor
1562
1665
  title="Emails"
1563
1666
  items={product.supportInfo?.emails}
@@ -1568,7 +1671,7 @@ const SupportTab = observer(
1568
1671
  isReadOnly={isReadOnly}
1569
1672
  emptyMessage="No emails specified"
1570
1673
  />
1571
- </PanelFormSection>
1674
+ </div>
1572
1675
  );
1573
1676
  },
1574
1677
  );
@@ -1611,7 +1714,12 @@ export const DataProductEditor = observer(() => {
1611
1714
  case DATA_PRODUCT_TAB.HOME:
1612
1715
  return <HomeTab product={product} isReadOnly={isReadOnly} />;
1613
1716
  case DATA_PRODUCT_TAB.SUPPORT:
1614
- return <SupportTab product={product} isReadOnly={isReadOnly} />;
1717
+ return (
1718
+ <SupportTab
1719
+ dataProductEditorState={dataProductEditorState}
1720
+ isReadOnly={isReadOnly}
1721
+ />
1722
+ );
1615
1723
  case DATA_PRODUCT_TAB.APG:
1616
1724
  return (
1617
1725
  <AccessPointGroupTab
@@ -60,6 +60,7 @@ import {
60
60
  type TestAssertionEditorState,
61
61
  type TestAssertionState,
62
62
  EqualToAssertionState,
63
+ EqualToAssertFailState,
63
64
  } from '../../../../stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js';
64
65
  import { externalFormatData_setData } from '../../../../stores/graph-modifier/DSL_Data_GraphModifierHelper.js';
65
66
  import { TESTABLE_RESULT } from '../../../../stores/editor/sidebar-state/testable/GlobalTestRunnerState.js';
@@ -328,6 +329,26 @@ const EqualToJsonAssertFailViewer = observer(
328
329
  const expected = equalToJsonAssertFailState.status.expected;
329
330
  const actual = equalToJsonAssertFailState.status.actual;
330
331
 
332
+ const acceptActualValue = (): void => {
333
+ try {
334
+ const assertionState =
335
+ equalToJsonAssertFailState.resultState.assertionState;
336
+ if (
337
+ assertionState.assertionState instanceof EqualToJsonAssertionState
338
+ ) {
339
+ assertionState.assertionState.setExpectedValue(actual);
340
+ applicationStore.notificationService.notifySuccess(
341
+ 'Expected value updated successfully!',
342
+ );
343
+ close();
344
+ }
345
+ } catch (error) {
346
+ applicationStore.notificationService.notifyError(
347
+ `Failed to update expected value: ${error instanceof Error ? error.message : String(error)}`,
348
+ );
349
+ }
350
+ };
351
+
331
352
  return (
332
353
  <>
333
354
  <div className="equal-to-json-editor__message" onClick={open}>
@@ -367,6 +388,10 @@ const EqualToJsonAssertFailViewer = observer(
367
388
  <JSONDiffView from={expected} to={actual} lossless={true} />
368
389
  </ModalBody>
369
390
  <ModalFooter>
391
+ <ModalFooterButton
392
+ text="Accept Actual Result"
393
+ onClick={acceptActualValue}
394
+ />
370
395
  <ModalFooterButton
371
396
  text="Close"
372
397
  onClick={close}
@@ -381,6 +406,116 @@ const EqualToJsonAssertFailViewer = observer(
381
406
  },
382
407
  );
383
408
 
409
+ const EqualToAssertFailViewer = observer(
410
+ (props: { equalToAssertFailState: EqualToAssertFailState }) => {
411
+ const { equalToAssertFailState } = props;
412
+ const applicationStore =
413
+ equalToAssertFailState.resultState.editorStore.applicationStore;
414
+ const open = (): void => equalToAssertFailState.setDiffModal(true);
415
+ const close = (): void => equalToAssertFailState.setDiffModal(false);
416
+
417
+ const statusMessage = equalToAssertFailState.status.message ?? '';
418
+ const extractValues = (message: string) => {
419
+ const expectedMatch = message.match(
420
+ /expected:\s*(?<expected>.*?)(?:\s+Found\s*:|$)/s,
421
+ );
422
+ const actualMatch = message.match(/Found\s*:\s*(?<actual>.*?)$/s);
423
+
424
+ return {
425
+ expected: expectedMatch?.groups?.expected?.trim() ?? 'N/A',
426
+ actual: actualMatch?.groups?.actual?.trim() ?? 'N/A',
427
+ };
428
+ };
429
+
430
+ const { expected, actual } = extractValues(statusMessage);
431
+
432
+ const acceptActualValue = (): void => {
433
+ const assertionState = equalToAssertFailState.resultState.assertionState;
434
+ if (assertionState.assertionState instanceof EqualToAssertionState) {
435
+ try {
436
+ const editorStore = assertionState.editorStore;
437
+ const graph = editorStore.graphManagerState.graph;
438
+
439
+ const newValueSpec = buildDefaultInstanceValue(
440
+ graph,
441
+ PrimitiveType.STRING,
442
+ editorStore.changeDetectionState.observerContext,
443
+ true,
444
+ );
445
+ (newValueSpec as PrimitiveInstanceValue).values = [actual];
446
+
447
+ assertionState.assertionState.updateValueSpec(newValueSpec);
448
+
449
+ applicationStore.notificationService.notifySuccess(
450
+ 'Expected value updated successfully!',
451
+ );
452
+ close();
453
+ } catch (error) {
454
+ applicationStore.notificationService.notifyError(
455
+ `Failed to update expected value: ${error instanceof Error ? error.message : String(error)}`,
456
+ );
457
+ }
458
+ } else {
459
+ applicationStore.notificationService.notifyError(
460
+ 'Unable to access assertion state for this assertion type',
461
+ );
462
+ }
463
+ };
464
+
465
+ return (
466
+ <>
467
+ <div className="equal-to-json-editor__message" onClick={open}>
468
+ {`<Click to see difference>`}
469
+ </div>
470
+ {equalToAssertFailState.diffModal && (
471
+ <Dialog
472
+ open={equalToAssertFailState.diffModal}
473
+ onClose={close}
474
+ classes={{
475
+ root: 'editor-modal__root-container',
476
+ container: 'editor-modal__container',
477
+ paper: 'editor-modal__content',
478
+ }}
479
+ >
480
+ <Modal
481
+ darkMode={
482
+ !applicationStore.layoutService
483
+ .TEMPORARY__isLightColorThemeEnabled
484
+ }
485
+ className="editor-modal"
486
+ >
487
+ <ModalHeader>
488
+ <div className="equal-to-json-result__diff__summary">
489
+ <div className="equal-to-json-result__diff__header__label">
490
+ expected
491
+ </div>
492
+ <div className="equal-to-json-result__diff__icon">
493
+ <CompareIcon />
494
+ </div>
495
+ <div className="equal-to-json-result__diff__header__label">
496
+ actual
497
+ </div>
498
+ </div>
499
+ </ModalHeader>
500
+
501
+ <ModalBody className="test-assertion-diff-modal__body">
502
+ <JSONDiffView from={expected} to={actual} lossless={false} />
503
+ </ModalBody>
504
+ <ModalFooter>
505
+ <ModalFooterButton
506
+ text="Accept Actual Result"
507
+ onClick={acceptActualValue}
508
+ />
509
+ <ModalFooterButton text="Close" onClick={close} />
510
+ </ModalFooter>
511
+ </Modal>
512
+ </Dialog>
513
+ )}
514
+ </>
515
+ );
516
+ },
517
+ );
518
+
384
519
  const TestErrorViewer = observer((props: { testError: TestError }) => {
385
520
  const { testError } = props;
386
521
  return (
@@ -395,16 +530,81 @@ const TestErrorViewer = observer((props: { testError: TestError }) => {
395
530
  const AssertFailViewer = observer(
396
531
  (props: { assertFailState: AssertFailState }) => {
397
532
  const { assertFailState } = props;
533
+ const applicationStore = useApplicationStore();
534
+ const [showGenericDiffModal, setShowGenericDiffModal] = useState(false);
535
+ const message = assertFailState.status.message ?? '';
536
+ const isGenericEqualToFail =
537
+ message.includes('expected:') && message.includes('Found :');
538
+
539
+ const extractValues = (msg: string) => {
540
+ const expectedMatch = msg.match(
541
+ /expected:\s*(?<expected>.*?)(?:\s+Found\s*:|$)/s,
542
+ );
543
+ const actualMatch = msg.match(/Found\s*:\s*(?<actual>.*?)$/s);
544
+
545
+ return {
546
+ expected: expectedMatch?.groups?.expected?.trim() ?? 'N/A',
547
+ actual: actualMatch?.groups?.actual?.trim() ?? 'N/A',
548
+ };
549
+ };
550
+ const { expected, actual } = extractValues(message);
551
+
398
552
  return (
399
553
  <>
400
554
  <div className="testable-test-assertion-result__summary-info">
401
555
  {assertFailState.status.message}
402
556
  </div>
403
- {assertFailState instanceof EqualToJsonAssertFailState && (
557
+ {assertFailState instanceof EqualToJsonAssertFailState ? (
404
558
  <EqualToJsonAssertFailViewer
405
559
  equalToJsonAssertFailState={assertFailState}
406
560
  />
407
- )}
561
+ ) : assertFailState instanceof EqualToAssertFailState ? (
562
+ <EqualToAssertFailViewer equalToAssertFailState={assertFailState} />
563
+ ) : isGenericEqualToFail ? (
564
+ <>
565
+ <div
566
+ className="equal-to-json-editor__message"
567
+ onClick={() => setShowGenericDiffModal(true)}
568
+ >
569
+ {`<Click to see difference>`}
570
+ </div>
571
+ {showGenericDiffModal && (
572
+ <Dialog
573
+ open={showGenericDiffModal}
574
+ onClose={() => setShowGenericDiffModal(false)}
575
+ classes={{ container: 'search-modal__container' }}
576
+ PaperProps={{
577
+ classes: { root: 'search-modal__inner-container' },
578
+ }}
579
+ >
580
+ <Modal
581
+ darkMode={
582
+ !applicationStore.layoutService
583
+ .TEMPORARY__isLightColorThemeEnabled
584
+ }
585
+ className="modal--xl"
586
+ >
587
+ <ModalHeader>
588
+ <ModalTitle title="Test Assertion Comparison" />
589
+ </ModalHeader>
590
+ <ModalBody>
591
+ <JSONDiffView
592
+ from={expected}
593
+ to={actual}
594
+ lossless={false}
595
+ />
596
+ </ModalBody>
597
+ <ModalFooter>
598
+ <ModalFooterButton
599
+ text="Close"
600
+ onClick={() => setShowGenericDiffModal(false)}
601
+ />
602
+ </ModalFooter>
603
+ </Modal>
604
+ </Dialog>
605
+ )}
606
+ </>
607
+ ) : null}
408
608
  </>
409
609
  );
410
610
  },
@@ -558,6 +558,32 @@ export class DataProductEditorState extends ElementEditorState {
558
558
  }
559
559
  }
560
560
 
561
+ clearSupportInfo(): void {
562
+ const supportInfo = this.product.supportInfo;
563
+ runInAction(() => {
564
+ //if the url is empty, the label should be too
565
+ if (supportInfo?.documentation && !supportInfo.documentation.url) {
566
+ supportInfo.documentation = undefined;
567
+ } else if (supportInfo?.website && !supportInfo.website.url) {
568
+ supportInfo.website = undefined;
569
+ } else if (supportInfo?.faqUrl && !supportInfo.faqUrl.url) {
570
+ supportInfo.faqUrl = undefined;
571
+ } else if (supportInfo?.supportUrl && !supportInfo.supportUrl.url) {
572
+ supportInfo.supportUrl = undefined;
573
+ }
574
+ //clear support info section if everything is clear
575
+ if (
576
+ !supportInfo?.documentation &&
577
+ !supportInfo?.website &&
578
+ !supportInfo?.faqUrl &&
579
+ !supportInfo?.supportUrl &&
580
+ supportInfo?.emails.length === 0
581
+ ) {
582
+ this.product.supportInfo = undefined;
583
+ }
584
+ });
585
+ }
586
+
561
587
  get product(): DataProduct {
562
588
  return guaranteeType(
563
589
  this.element,
@@ -83,6 +83,22 @@ export class AssertFailState extends TestAssertionStatusState {
83
83
  }
84
84
  }
85
85
 
86
+ export class EqualToAssertFailState extends AssertFailState {
87
+ diffModal = false;
88
+
89
+ constructor(resultState: TestAssertionResultState, status: AssertionStatus) {
90
+ super(resultState, status);
91
+ makeObservable(this, {
92
+ diffModal: observable,
93
+ setDiffModal: action,
94
+ });
95
+ }
96
+
97
+ setDiffModal(val: boolean): void {
98
+ this.diffModal = val;
99
+ }
100
+ }
101
+
86
102
  export class EqualToJsonAssertFailState extends AssertFailState {
87
103
  declare status: EqualToJsonAssertFail;
88
104
  diffModal = false;
@@ -157,13 +173,21 @@ export class TestAssertionResultState {
157
173
  return new EqualToJsonAssertFailState(this, val);
158
174
  }
159
175
  if (val instanceof AssertFail) {
176
+ if (this.assertionState.assertion instanceof EqualTo) {
177
+ const message = val.message ?? '';
178
+ const hasExpectedFoundPattern =
179
+ message.includes('expected:') && message.includes('Found :');
180
+
181
+ if (hasExpectedFoundPattern) {
182
+ return new EqualToAssertFailState(this, val);
183
+ }
184
+ }
160
185
  return new AssertFailState(this, val);
161
186
  }
162
187
  return new UnsupportedAssertionStatusState(this, val);
163
188
  }
164
189
  return undefined;
165
190
  }
166
-
167
191
  get result(): TESTABLE_RESULT {
168
192
  if (this.assertionState.testState.runningTestAction.isInProgress) {
169
193
  return TESTABLE_RESULT.IN_PROGRESS;