@allurereport/web-awesome 3.0.0-beta.5 → 3.0.0-beta.7

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 (88) hide show
  1. package/dist/multi/141.app-4468f0e2.js +1 -0
  2. package/dist/multi/222.app-4468f0e2.js +1 -0
  3. package/dist/multi/335.app-4468f0e2.js +1 -0
  4. package/dist/multi/34.app-4468f0e2.js +1 -0
  5. package/dist/multi/349.app-4468f0e2.js +1 -0
  6. package/dist/multi/378.app-4468f0e2.js +1 -0
  7. package/dist/multi/406.app-4468f0e2.js +1 -0
  8. package/dist/multi/476.app-4468f0e2.js +1 -0
  9. package/dist/multi/53.app-4468f0e2.js +1 -0
  10. package/dist/multi/584.app-4468f0e2.js +1 -0
  11. package/dist/multi/690.app-4468f0e2.js +1 -0
  12. package/dist/multi/747.app-4468f0e2.js +1 -0
  13. package/dist/multi/767.app-4468f0e2.js +1 -0
  14. package/dist/multi/{816.app-71d7f77e.js → 816.app-4468f0e2.js} +1 -1
  15. package/dist/multi/83.app-4468f0e2.js +1 -0
  16. package/dist/multi/873.app-4468f0e2.js +1 -0
  17. package/dist/multi/920.app-4468f0e2.js +1 -0
  18. package/dist/multi/991.app-4468f0e2.js +1 -0
  19. package/dist/multi/app-4468f0e2.js +2 -0
  20. package/dist/multi/manifest.json +20 -20
  21. package/dist/multi/{styles-71d7f77e.css → styles-4468f0e2.css} +5 -5
  22. package/dist/single/app-33b3c367.js +2 -0
  23. package/dist/single/manifest.json +1 -1
  24. package/package.json +3 -3
  25. package/src/assets/svg/line-alerts-alert-circle.svg +12 -0
  26. package/src/assets/svg/line-general-eye.svg +7 -0
  27. package/src/assets/svg/line-icon-bomb-2.svg +12 -0
  28. package/src/components/app/ArrowButton/styles.scss +3 -0
  29. package/src/components/app/ReportMetadata/MetadataSummary.tsx +22 -18
  30. package/src/components/app/ReportMetadata/MetadataWithIcon.tsx +2 -2
  31. package/src/components/app/TestResult/TestResultError/index.tsx +18 -16
  32. package/src/components/app/TestResult/TestResultError/styles.scss +16 -5
  33. package/src/components/app/TestResult/TestResultHeader/index.tsx +2 -2
  34. package/src/components/app/TestResult/TestResultHistory/TestResultHistoryItem.tsx +21 -10
  35. package/src/components/app/TestResult/TestResultInfo/TestResultInfoStatuses.tsx +31 -0
  36. package/src/components/app/TestResult/TestResultInfo/index.tsx +6 -4
  37. package/src/components/app/TestResult/TestResultInfo/styles.scss +17 -0
  38. package/src/components/app/TestResult/TestResultNavigation/index.tsx +1 -2
  39. package/src/components/app/TestResult/TestResultPrevStatuses/index.tsx +6 -6
  40. package/src/components/app/TestResult/TestResultTeardown/index.tsx +2 -2
  41. package/src/components/app/TestResult/index.tsx +2 -2
  42. package/src/components/app/Tree/TreeItem.tsx +3 -1
  43. package/src/components/app/Tree/styles.scss +7 -1
  44. package/src/components/commons/Button/styles.scss +6 -4
  45. package/src/i18n/constants.ts +2 -2
  46. package/src/i18n/locales/am.json +2 -1
  47. package/src/i18n/locales/az.json +2 -1
  48. package/src/i18n/locales/de.json +2 -1
  49. package/src/i18n/locales/en.json +2 -1
  50. package/src/i18n/locales/es.json +2 -1
  51. package/src/i18n/locales/fr.json +2 -1
  52. package/src/i18n/locales/he.json +2 -1
  53. package/src/i18n/locales/it.json +2 -1
  54. package/src/i18n/locales/ja.json +2 -1
  55. package/src/i18n/locales/ka.json +2 -1
  56. package/src/i18n/locales/kr.json +2 -1
  57. package/src/i18n/locales/nl.json +2 -1
  58. package/src/i18n/locales/pl.json +2 -1
  59. package/src/i18n/locales/pt.json +2 -1
  60. package/src/i18n/locales/ru.json +2 -1
  61. package/src/i18n/locales/sv.json +2 -1
  62. package/src/i18n/locales/tr.json +2 -1
  63. package/src/i18n/locales/zh.json +2 -1
  64. package/src/index.tsx +4 -0
  65. package/src/stores/stats.ts +1 -1
  66. package/src/stores/testResults.ts +1 -1
  67. package/src/utils/copyToClipboard.ts +14 -1
  68. package/dist/multi/141.app-71d7f77e.js +0 -1
  69. package/dist/multi/222.app-71d7f77e.js +0 -1
  70. package/dist/multi/335.app-71d7f77e.js +0 -1
  71. package/dist/multi/34.app-71d7f77e.js +0 -1
  72. package/dist/multi/349.app-71d7f77e.js +0 -1
  73. package/dist/multi/378.app-71d7f77e.js +0 -1
  74. package/dist/multi/406.app-71d7f77e.js +0 -1
  75. package/dist/multi/476.app-71d7f77e.js +0 -1
  76. package/dist/multi/53.app-71d7f77e.js +0 -1
  77. package/dist/multi/584.app-71d7f77e.js +0 -1
  78. package/dist/multi/690.app-71d7f77e.js +0 -1
  79. package/dist/multi/747.app-71d7f77e.js +0 -1
  80. package/dist/multi/767.app-71d7f77e.js +0 -1
  81. package/dist/multi/83.app-71d7f77e.js +0 -1
  82. package/dist/multi/873.app-71d7f77e.js +0 -1
  83. package/dist/multi/920.app-71d7f77e.js +0 -1
  84. package/dist/multi/991.app-71d7f77e.js +0 -1
  85. package/dist/multi/app-71d7f77e.js +0 -2
  86. package/dist/single/app-7aa8b012.js +0 -2
  87. /package/dist/multi/{app-71d7f77e.js.LICENSE.txt → app-4468f0e2.js.LICENSE.txt} +0 -0
  88. /package/dist/single/{app-7aa8b012.js.LICENSE.txt → app-33b3c367.js.LICENSE.txt} +0 -0
@@ -1,3 +1,3 @@
1
1
  {
2
- "main.js": "app-7aa8b012.js"
2
+ "main.js": "app-33b3c367.js"
3
3
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allurereport/web-awesome",
3
- "version": "3.0.0-beta.5",
3
+ "version": "3.0.0-beta.7",
4
4
  "description": "The static files for Allure Awesome Report",
5
5
  "keywords": [
6
6
  "allure",
@@ -31,8 +31,8 @@
31
31
  "IE 11"
32
32
  ],
33
33
  "dependencies": {
34
- "@allurereport/core-api": "3.0.0-beta.5",
35
- "@allurereport/web-commons": "3.0.0-beta.5",
34
+ "@allurereport/core-api": "3.0.0-beta.7",
35
+ "@allurereport/web-commons": "3.0.0-beta.7",
36
36
  "@preact/signals": "^1.3.0",
37
37
  "clsx": "^2.1.1",
38
38
  "d3-shape": "^3.2.0",
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none">
2
+ <g clip-path="url(#a)">
3
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".56"
4
+ stroke-width="1.5"
5
+ d="M8 5.333V8m0 2.666h.006M14.666 8A6.667 6.667 0 1 1 1.333 8a6.667 6.667 0 0 1 13.333 0Z"/>
6
+ </g>
7
+ <defs>
8
+ <clipPath id="a">
9
+ <path fill="currentColor" d="M0 0h16v16H0z"/>
10
+ </clipPath>
11
+ </defs>
12
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none">
2
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".56"
3
+ stroke-width="1.5"
4
+ d="M1.613 8.475c-.09-.144-.136-.216-.161-.326a.782.782 0 0 1 0-.298c.025-.111.07-.183.161-.327C2.363 6.336 4.597 3.333 8 3.333c3.404 0 5.637 3.003 6.387 4.191.09.144.136.216.162.327.019.083.019.214 0 .298-.026.11-.071.182-.162.326-.75 1.188-2.983 4.191-6.387 4.191-3.403 0-5.636-3.003-6.387-4.19Z"/>
5
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".56"
6
+ stroke-width="1.5" d="M8 10a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z"/>
7
+ </svg>
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none">
2
+ <g clip-path="url(#a)">
3
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".56"
4
+ stroke-width="1.5"
5
+ d="m9.566 3.1 1.3-1.3a1.607 1.607 0 0 1 2.267 0L14.2 2.867a1.6 1.6 0 0 1 0 2.266l-1.3 1.3m1.766-5.1-1 1m-.333 6.334a6 6 0 1 1-12 0 6 6 0 0 1 12 0Z"/>
6
+ </g>
7
+ <defs>
8
+ <clipPath id="a">
9
+ <path fill="currentColor" d="M0 0h16v16H0z"/>
10
+ </clipPath>
11
+ </defs>
12
+ </svg>
@@ -2,10 +2,13 @@
2
2
  background: transparent;
3
3
  border: none;
4
4
  padding: 8px 4px;
5
+ border-radius: 4px;
6
+ cursor: pointer;
5
7
  color: var(--on-icon-secondary);
6
8
 
7
9
  &:hover {
8
10
  background: var(--bg-control-flat-medium);
11
+ color: var(--on-icon-primary);
9
12
  }
10
13
  }
11
14
 
@@ -1,7 +1,9 @@
1
+ import type { Statistic } from "@allurereport/core-api";
1
2
  import { statusesList } from "@allurereport/core-api";
2
3
  import { computed } from "@preact/signals";
3
- import { FunctionComponent } from "preact";
4
- import MetadataItem, { MetadataProps } from "@/components/app/ReportMetadata/MetadataItem";
4
+ import type { FunctionComponent } from "preact";
5
+ import type { MetadataProps } from "@/components/app/ReportMetadata/MetadataItem";
6
+ import MetadataItem from "@/components/app/ReportMetadata/MetadataItem";
5
7
  import { MetadataTestType } from "@/components/app/ReportMetadata/MetadataTestType";
6
8
  import { MetadataWithIcon } from "@/components/app/ReportMetadata/MetadataWithIcon";
7
9
  import * as styles from "@/components/app/ReportMetadata/styles.scss";
@@ -12,6 +14,7 @@ import { capitalize } from "@/utils/capitalize";
12
14
 
13
15
  export const MetadataSummary: FunctionComponent = () => {
14
16
  const { t } = useI18n("statuses");
17
+ const { t: testSummary } = useI18n("testSummary");
15
18
 
16
19
  return (
17
20
  <Loadable
@@ -23,20 +26,21 @@ export const MetadataSummary: FunctionComponent = () => {
23
26
  type: "all",
24
27
  count: stats.total,
25
28
  }));
26
- // TODO: https://github.com/qameta/allure3/issues/178
27
- // const metadataStatsKeys: (keyof Statistic)[] = ["flakyTests", "retryTests", "newTests"];
28
- // const metaDataTests = metadataStatsKeys
29
- // .filter((key) => stats[key])
30
- // .map((key) => {
31
- // const title = t[key];
32
- // const props = { title, count: stats[key], type: key };
33
- //
34
- // return (
35
- // <>
36
- // <MetadataItem key={key} props={props} renderComponent={MetadataWithIcon} />
37
- // </>
38
- // );
39
- // });
29
+ const metaDataTests = ["flaky", "retry"]
30
+ .map((key) => {
31
+ if (!stats[key]) {
32
+ return;
33
+ }
34
+ const title = testSummary(key);
35
+ const props = { title, count: stats[key] || 0, type: key };
36
+
37
+ return (
38
+ <div key={key}>
39
+ <MetadataItem key={key} props={props} renderComponent={MetadataWithIcon} />
40
+ </div>
41
+ );
42
+ })
43
+ .filter(Boolean);
40
44
 
41
45
  const metadataStatuses = statusesList
42
46
  .map((status) => ({ status, value: stats[status] }))
@@ -67,8 +71,8 @@ export const MetadataSummary: FunctionComponent = () => {
67
71
  props={allTest.value}
68
72
  renderComponent={MetadataWithIcon}
69
73
  />
70
- {/*<div className={styles["report-metadata-separator"]}></div>*/}
71
- {/*{metaDataTests}*/}
74
+ {Boolean(metaDataTests.length) && <div className={styles["report-metadata-separator"]} />}
75
+ {metaDataTests}
72
76
  </div>
73
77
  <div className={styles["report-metadata-status"]}>{metadataStatuses}</div>
74
78
  </div>
@@ -1,8 +1,8 @@
1
- import { FunctionComponent, h } from "preact";
1
+ import type { FunctionComponent } from "preact";
2
2
  import notifications from "@/assets/svg/line-alerts-notification-box.svg";
3
3
  import refresh from "@/assets/svg/line-arrows-refresh-ccw-1.svg";
4
4
  import lineGeneralZap from "@/assets/svg/line-general-zap.svg";
5
- import { MetadataProps } from "@/components/app/ReportMetadata/MetadataItem";
5
+ import type { MetadataProps } from "@/components/app/ReportMetadata/MetadataItem";
6
6
  import { SvgIcon } from "@/components/commons/SvgIcon";
7
7
  import { Text } from "@/components/commons/Typography";
8
8
  import * as styles from "./styles.scss";
@@ -1,16 +1,20 @@
1
+ import { sanitizeHtml } from "@allurereport/web-commons";
1
2
  import { useState } from "preact/hooks";
2
3
  import LineGeneralCopy3 from "@/assets/svg/line-general-copy-3.svg";
3
4
  import { IconButton } from "@/components/commons/Button";
5
+ import { TooltipWrapper } from "@/components/commons/Tooltip";
4
6
  import { Code, Text } from "@/components/commons/Typography";
5
7
  import { useI18n } from "@/stores/locale";
6
8
  import { copyToClipboard } from "@/utils/copyToClipboard";
7
9
  import * as styles from "./styles.scss";
8
10
 
9
11
  const TestResultErrorTrace = ({ trace }) => {
12
+ const sanitizedTrace = sanitizeHtml(trace);
13
+
10
14
  return (
11
15
  <div data-testid="test-result-error-trace" className={styles["test-result-error-trace"]}>
12
16
  <Code size={"s"} type={"ui"}>
13
- <pre>{trace}</pre>
17
+ <pre dangerouslySetInnerHTML={{ __html: sanitizedTrace }} />
14
18
  </Code>
15
19
  </div>
16
20
  );
@@ -19,28 +23,26 @@ const TestResultErrorTrace = ({ trace }) => {
19
23
  export const TestResultError = ({ message, trace }) => {
20
24
  const [isOpen, setIsOpen] = useState(false);
21
25
  const { t } = useI18n("ui");
26
+ const { t: tooltip } = useI18n("controls");
22
27
 
23
28
  return (
24
29
  <div data-testid="test-result-error" className={styles["test-result-error"]}>
25
- <div
26
- data-testid="test-result-error-header"
27
- className={styles["test-result-error-header"]}
28
- onClick={() => setIsOpen(!isOpen)}
29
- >
30
+ <div data-testid="test-result-error-header" className={styles["test-result-error-header"]}>
30
31
  <Text tag={"p"} size={"m"} bold className={styles["test-result-error-text"]}>
31
32
  {t("error")}
32
33
  </Text>
33
- <IconButton
34
- style={"ghost"}
35
- size={"s"}
36
- icon={LineGeneralCopy3.id}
37
- onClick={(e) => {
38
- e.stopPropagation();
39
- copyToClipboard(message);
40
- }}
41
- />
34
+ <TooltipWrapper tooltipText={tooltip("clipboard")} tooltipTextAfterClick={tooltip("clipboardSuccess")}>
35
+ <IconButton
36
+ style={"ghost"}
37
+ size={"s"}
38
+ icon={LineGeneralCopy3.id}
39
+ onClick={() => {
40
+ copyToClipboard(message);
41
+ }}
42
+ />
43
+ </TooltipWrapper>
42
44
  </div>
43
- <div onClick={() => setIsOpen(!isOpen)}>
45
+ <div className={styles["test-result-error-message"]} onClick={() => setIsOpen(!isOpen)}>
44
46
  <Code data-testid="test-result-error-message" size={"s"}>
45
47
  {message}
46
48
  </Code>
@@ -1,10 +1,9 @@
1
1
  .test-result-error {
2
- padding: 8px 8px 12px 24px;
2
+ padding: 8px 8px 12px 16px;
3
3
  background-color: var(--bg-alpha-capella);
4
4
  border-radius: 8px;
5
5
  position: relative;
6
6
  overflow: hidden;
7
- cursor: pointer;
8
7
 
9
8
  &:before {
10
9
  content: "";
@@ -26,15 +25,27 @@
26
25
 
27
26
  .test-result-error-text {
28
27
  margin-bottom: 8px;
28
+ padding-left: 8px;
29
29
  color: var(--on-support-capella);
30
30
  }
31
31
 
32
32
  .test-result-error-trace {
33
33
  margin-top: 8px;
34
+ padding-left: 8px;
34
35
 
35
36
  pre {
36
- overflow-wrap: break-word;
37
- word-wrap: break-word;
38
- white-space: pre-wrap;
37
+ overflow: scroll;
38
+ padding-bottom: 24px;
39
+ }
40
+ }
41
+
42
+ .test-result-error-message {
43
+ padding: 8px;
44
+ border-radius: 8px;
45
+ cursor: pointer;
46
+ transition: background-color 300ms;
47
+
48
+ &:hover {
49
+ background: var(--bg-alpha-capella);
39
50
  }
40
51
  }
@@ -1,6 +1,6 @@
1
1
  import clsx from "clsx";
2
- import { FunctionalComponent } from "preact";
3
- import { AllureAwesomeTestResult } from "types";
2
+ import type { FunctionalComponent } from "preact";
3
+ import type { AllureAwesomeTestResult } from "types";
4
4
  import LineArrowsChevronDown from "@/assets/svg/line-arrows-chevron-down.svg";
5
5
  import LineGeneralHomeLine from "@/assets/svg/line-general-home-line.svg";
6
6
  import { LanguagePicker } from "@/components/app/LanguagePicker";
@@ -9,30 +9,41 @@ import TreeItemIcon from "@/components/app/Tree/TreeItemIcon";
9
9
  import { IconButton } from "@/components/commons/Button";
10
10
  import { TooltipWrapper } from "@/components/commons/Tooltip";
11
11
  import { Text } from "@/components/commons/Typography";
12
- import { navigateTo } from "@/index";
12
+ import { navigateTo, openInNewTab } from "@/index";
13
+ import { useI18n } from "@/stores";
13
14
  import { timestampToDate } from "@/utils/time";
14
15
 
15
16
  export const TestResultHistoryItem = ({ testResultItem }) => {
16
- const { status, message, trace, stop, duration, id, uuid } = testResultItem;
17
+ const { status, message, trace, stop, duration, id } = testResultItem;
17
18
  const [isOpened, setIsOpen] = useState(false);
18
19
  const convertedStop = timestampToDate(stop);
19
- const formattedDuration = formatDuration(duration);
20
+ const formattedDuration = formatDuration(duration as number);
21
+ const { t } = useI18n("controls");
20
22
 
21
- const navigateUrl = `/${uuid}/${id}`;
23
+ const navigateUrl = `/testresult/${id}`;
22
24
 
23
25
  return (
24
26
  <div>
25
- <div className={styles["test-result-history-item-header"]} onClick={() => setIsOpen(!isOpened)}>
26
- {Boolean(message) && <ArrowButton isOpened={isOpened} icon={arrowsChevronDown.id} />}
27
- <div className={styles["test-result-history-item-wrap"]}>
27
+ <div className={styles["test-result-history-item-header"]}>
28
+ {Boolean(message) && (
29
+ <span onClick={() => setIsOpen(!isOpened)}>
30
+ <ArrowButton isOpened={isOpened} icon={arrowsChevronDown.id} />
31
+ </span>
32
+ )}
33
+ <div
34
+ className={styles["test-result-history-item-wrap"]}
35
+ onClick={(e) => {
36
+ e.stopPropagation();
37
+ navigateTo(navigateUrl);
38
+ }}
39
+ >
28
40
  <TreeItemIcon status={status} className={styles["test-result-history-item-status"]} />
29
41
  <Text className={styles["test-result-history-item-text"]}>{convertedStop}</Text>
30
42
  <div className={styles["test-result-history-item-info"]}>
31
43
  <Text type="ui" size={"s"} className={styles["item-time"]}>
32
44
  {formattedDuration}
33
45
  </Text>
34
-
35
- <TooltipWrapper tooltipText={"Go to error"}>
46
+ <TooltipWrapper tooltipText={t("openInNewTab")}>
36
47
  <IconButton
37
48
  icon={LineGeneralLinkExternal.id}
38
49
  style={"ghost"}
@@ -40,7 +51,7 @@ export const TestResultHistoryItem = ({ testResultItem }) => {
40
51
  className={styles["test-result-history-item-link"]}
41
52
  onClick={(e) => {
42
53
  e.stopPropagation();
43
- navigateTo(navigateUrl);
54
+ openInNewTab(navigateUrl);
44
55
  }}
45
56
  />
46
57
  </TooltipWrapper>
@@ -0,0 +1,31 @@
1
+ import lineAlertsAlertCircle from "@/assets/svg/line-alerts-alert-circle.svg";
2
+ import lineGeneralEye from "@/assets/svg/line-general-eye.svg";
3
+ import lineIconBomb2 from "@/assets/svg/line-icon-bomb-2.svg";
4
+ import { SvgIcon } from "@/components/commons/SvgIcon";
5
+ import { useI18n } from "@/stores";
6
+ import { capitalize } from "@/utils/capitalize";
7
+ import * as styles from "./styles.scss";
8
+
9
+ const icons = {
10
+ flaky: lineIconBomb2.id,
11
+ known: lineAlertsAlertCircle.id,
12
+ muted: lineGeneralEye.id,
13
+ };
14
+
15
+ export const TestResultInfoStatuses = ({ statuses }) => {
16
+ const { t } = useI18n("filters");
17
+ return (
18
+ <div className={styles["test-result-info-statuses"]}>
19
+ {statuses.map(([status], key: number) => {
20
+ const title = t(status);
21
+
22
+ return (
23
+ <div key={key} className={styles["test-result-info-status"]}>
24
+ <SvgIcon className={styles["metadata-icon"]} id={icons[status]} size={"s"} />
25
+ {capitalize(title)}
26
+ </div>
27
+ );
28
+ })}
29
+ </div>
30
+ );
31
+ };
@@ -1,7 +1,7 @@
1
1
  import { formatDuration } from "@allurereport/core-api";
2
- import * as test from "node:test";
3
- import { FunctionalComponent } from "preact";
4
- import { AllureAwesomeTestResult } from "types";
2
+ import type { FunctionalComponent } from "preact";
3
+ import type { AllureAwesomeTestResult } from "types";
4
+ import { TestResultInfoStatuses } from "@/components/app/TestResult/TestResultInfo/TestResultInfoStatuses";
5
5
  import { TestResultNavigation } from "@/components/app/TestResult/TestResultNavigation";
6
6
  import { TestResultPrevStatuses } from "@/components/app/TestResult/TestResultPrevStatuses";
7
7
  import { TestResultSeverity } from "@/components/app/TestResult/TestResultSeverity";
@@ -19,11 +19,12 @@ export type TestResultInfoProps = {
19
19
  };
20
20
 
21
21
  export const TestResultInfo: FunctionalComponent<TestResultInfoProps> = ({ testResult }) => {
22
- const { name, status, duration, labels, history, retries, attachments, stop } = testResult ?? {};
22
+ const { name, status, muted, flaky, known, duration, labels, history, retries, attachments, stop } = testResult ?? {};
23
23
  const formattedDuration = formatDuration(duration);
24
24
  const fullDate = stop && timestampToDate(stop);
25
25
  const severity = labels?.find((label) => label.name === "severity")?.value ?? "normal";
26
26
  const { t } = useI18n("ui");
27
+ const statuses = Object.entries({ flaky, muted, known }).filter(([, value]) => value);
27
28
 
28
29
  const Content = () => {
29
30
  return (
@@ -37,6 +38,7 @@ export const TestResultInfo: FunctionalComponent<TestResultInfoProps> = ({ testR
37
38
  {Boolean(status) && <TestResultStatus status={status} />}
38
39
  {Boolean(history?.length) && <TestResultPrevStatuses history={history} />}
39
40
  <TestResultSeverity severity={severity} />
41
+ {Boolean(statuses.length) && <TestResultInfoStatuses statuses={statuses} />}
40
42
  <TooltipWrapper tooltipText={fullDate}>
41
43
  <Text tag={"div"} size={"s"} bold className={styles["test-result-duration"]}>
42
44
  {formattedDuration}
@@ -31,3 +31,20 @@
31
31
  gap: 4px;
32
32
  align-items: center;
33
33
  }
34
+
35
+ .test-result-info-statuses {
36
+ display: flex;
37
+ align-items: center;
38
+ gap: 8px;
39
+ }
40
+
41
+ .test-result-info-status {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 2px;
45
+ }
46
+
47
+ .metadata-icon {
48
+ margin-right: 8px;
49
+ color: var(--on-icon-secondary);
50
+ }
@@ -44,11 +44,10 @@ export const TestResultNavigation: FunctionalComponent<TestResultNavigationProps
44
44
  source={testResultNavStore}
45
45
  renderData={(data) => {
46
46
  const currentIndex = data.indexOf(id) + 1;
47
-
48
47
  return (
49
48
  <div className={styles["test-result-nav"]}>
50
49
  {fullName && <FullName />}
51
- {data && (
50
+ {data && !testResult?.hidden && (
52
51
  <div className={styles["test-result-navigator"]}>
53
52
  <TooltipWrapper tooltipText={tooltip("prevTR")} isTriggerActive={currentIndex > 1}>
54
53
  <IconButton
@@ -1,11 +1,11 @@
1
- import { autoUpdate, computePosition, flip, offset, shift } from "@floating-ui/dom";
2
- import { FunctionalComponent } from "preact";
3
- import { useEffect, useRef, useState } from "preact/hooks";
4
- import { AllureAwesomeTestResult } from "types";
1
+ import type { FunctionalComponent } from "preact";
2
+ import type { AllureAwesomeTestResult } from "types";
5
3
  import LineShapesDotCircle from "@/assets/svg/line-shapes-dot-circle.svg";
4
+ import { useTestResultTabsContext } from "@/components/app/TestResult/TestResultTabs";
6
5
  import { SvgIcon } from "@/components/commons/SvgIcon";
7
6
  import { TooltipWrapper } from "@/components/commons/Tooltip";
8
7
  import { Text } from "@/components/commons/Typography";
8
+ import { navigateTo, openInNewTab } from "@/index";
9
9
  import { useI18n } from "@/stores";
10
10
  import { capitalize } from "@/utils/capitalize";
11
11
  import { timestampToDate } from "@/utils/time";
@@ -13,7 +13,7 @@ import * as styles from "./styles.scss";
13
13
 
14
14
  const TestResultPrevStatus = ({ item }) => {
15
15
  return (
16
- <div className={styles["test-result-prev-status"]}>
16
+ <div className={styles["test-result-prev-status"]} onClick={() => navigateTo(`testresult/${item.id}`)}>
17
17
  <SvgIcon id={LineShapesDotCircle.id} className={styles[`status-${item?.status}`]} />
18
18
  </div>
19
19
  );
@@ -41,7 +41,7 @@ export const TestResultPrevStatuses: FunctionalComponent<TestResultPrevStatusesP
41
41
  return (
42
42
  <div className={styles["test-result-prev-statuses"]}>
43
43
  {history?.slice(0, 6).map((item, key) => (
44
- <div className={styles["test-result-prev-status"]}>
44
+ <div key={key} className={styles["test-result-prev-status"]}>
45
45
  <TooltipWrapper key={key} tooltipComponent={<TestResultPrevStatusTooltip item={item} />}>
46
46
  <TestResultPrevStatus item={item} />
47
47
  </TooltipWrapper>
@@ -1,6 +1,6 @@
1
- import { FunctionalComponent } from "preact";
1
+ import type { FunctionalComponent } from "preact";
2
2
  import { useState } from "preact/hooks";
3
- import { AllureAwesomeTestResult } from "types";
3
+ import type { AllureAwesomeTestResult } from "types";
4
4
  import lineHelpersFlag from "@/assets/svg/line-helpers-flag.svg";
5
5
  import { TestResultDropdown } from "@/components/app/TestResult/TestResultDropdown";
6
6
  import * as styles from "@/components/app/TestResult/TestResultSteps/styles.scss";
@@ -1,5 +1,5 @@
1
- import { FunctionComponent, FunctionalComponent } from "preact";
2
- import { AllureAwesomeTestResult } from "types";
1
+ import type { FunctionComponent, FunctionalComponent } from "preact";
2
+ import type { AllureAwesomeTestResult } from "types";
3
3
  import * as styles from "@/components/app/BaseLayout/styles.scss";
4
4
  import { TestResultAttachmentView } from "@/components/app/TestResult/TestResultAttachmentsView";
5
5
  import TestResultEmpty from "@/components/app/TestResult/TestResultEmpty";
@@ -19,7 +19,9 @@ export const TreeItem: FunctionComponent<TreeItemProps> = ({ name, groupOrder, s
19
19
  return (
20
20
  <div {...rest} className={styles["tree-item"]} onClick={() => navigateTo(id)}>
21
21
  <TreeItemIcon status={status} />
22
- <span data-testid="tree-leaf-order" class={styles.order}>#{groupOrder}</span>
22
+ <span data-testid="tree-leaf-order" class={styles.order}>
23
+ {groupOrder}
24
+ </span>
23
25
  <Text data-testid="tree-leaf-title" className={styles["item-title"]}>
24
26
  {name}
25
27
  </Text>
@@ -49,7 +49,6 @@
49
49
  padding: 6px 8px 6px 6px;
50
50
  transition: background-color 300ms;
51
51
  gap: 4px;
52
- align-items: center;
53
52
  cursor: pointer;
54
53
  position: relative;
55
54
 
@@ -173,4 +172,11 @@
173
172
 
174
173
  .order {
175
174
  user-select: none;
175
+ color: var(--on-text-hint);
176
+ min-width: 16px;
177
+ text-align: center;
178
+ box-sizing: content-box;
179
+ padding-top: 2px;
180
+ line-height: 16px;
181
+ width: 24px;
176
182
  }
@@ -290,6 +290,12 @@
290
290
 
291
291
  &:hover {
292
292
  --allure-btn-bg-color: var(--bg-control-flat-medium);
293
+
294
+ .contentIcon,
295
+ .leadingIcon,
296
+ .dropdownIcon {
297
+ color: var(--allure-btn-icon-color);
298
+ }
293
299
  }
294
300
 
295
301
  &:active,
@@ -520,10 +526,6 @@
520
526
  transition: color var(--color-change-transition-duration);
521
527
  user-select: none;
522
528
 
523
- &:hover {
524
- color: var(--allure-btn-icon-color);
525
- }
526
-
527
529
  &:focus {
528
530
  outline: none;
529
531
  }
@@ -63,8 +63,8 @@ export const LANG_LOCALE: Record<
63
63
  },
64
64
  am: {
65
65
  short: "Am",
66
- full: "አማርኛ",
67
- iso: "am-ET",
66
+ full: "Հայերեն",
67
+ iso: "hy-AM",
68
68
  },
69
69
  az: {
70
70
  short: "Az",
@@ -109,7 +109,8 @@
109
109
  "collapse": "Կծկել",
110
110
  "expand": "Ընդլայնել",
111
111
  "fullscreen": "Լրիվ էկրան",
112
- "language": "Փոխել լեզուն"
112
+ "language": "Փոխել լեզուն",
113
+ "openInNewTab": "Բացել նոր ներդիրում"
113
114
  },
114
115
  "errors": {
115
116
  "missedAttachment": "Կցորդը չի գտնվել"
@@ -109,7 +109,8 @@
109
109
  "collapse": "Daralt",
110
110
  "expand": "Genişləndir",
111
111
  "fullscreen": "Tam ekran",
112
- "language": "Dili dəyiş"
112
+ "language": "Dili dəyiş",
113
+ "openInNewTab": "Yeni tabda aç"
113
114
  },
114
115
  "errors": {
115
116
  "missedAttachment": "Əlavə tapılmadı"
@@ -109,7 +109,8 @@
109
109
  "collapse": "Einklappen",
110
110
  "expand": "Ausklappen",
111
111
  "fullscreen": "Vollbild",
112
- "language": "Sprache ändern"
112
+ "language": "Sprache ändern",
113
+ "openInNewTab": "In neuem Tab öffnen"
113
114
  },
114
115
  "errors": {
115
116
  "missedAttachment": "Anhang nicht gefunden"
@@ -109,7 +109,8 @@
109
109
  "collapse": "Collapse",
110
110
  "expand": "Expand",
111
111
  "fullscreen": "Full screen",
112
- "language": "Change language"
112
+ "language": "Change language",
113
+ "openInNewTab": "Open in new tab"
113
114
  },
114
115
  "errors": {
115
116
  "missedAttachment": "Attachment not found"
@@ -109,7 +109,8 @@
109
109
  "collapse": "Colapsar",
110
110
  "expand": "Expandir",
111
111
  "fullscreen": "Pantalla completa",
112
- "language": "Cambiar idioma"
112
+ "language": "Cambiar idioma",
113
+ "openInNewTab": "Abrir en nueva pestaña"
113
114
  },
114
115
  "errors": {
115
116
  "missedAttachment": "Adjunto no encontrado"
@@ -109,7 +109,8 @@
109
109
  "collapse": "Réduire",
110
110
  "expand": "Agrandir",
111
111
  "fullscreen": "Plein écran",
112
- "language": "Changer la langue"
112
+ "language": "Changer la langue",
113
+ "openInNewTab": "Ouvrir dans un nouvel onglet"
113
114
  },
114
115
  "errors": {
115
116
  "missedAttachment": "Pièce jointe non trouvée"
@@ -109,7 +109,8 @@
109
109
  "collapse": "כווץ",
110
110
  "expand": "הרחב",
111
111
  "fullscreen": "מסך מלא",
112
- "language": "שנה שפה"
112
+ "language": "שנה שפה",
113
+ "openInNewTab": "פתח בכרטיסייה חדשה"
113
114
  },
114
115
  "errors": {
115
116
  "missedAttachment": "הקובץ המצורף לא נמצא"