@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.
- package/dist/multi/141.app-4468f0e2.js +1 -0
- package/dist/multi/222.app-4468f0e2.js +1 -0
- package/dist/multi/335.app-4468f0e2.js +1 -0
- package/dist/multi/34.app-4468f0e2.js +1 -0
- package/dist/multi/349.app-4468f0e2.js +1 -0
- package/dist/multi/378.app-4468f0e2.js +1 -0
- package/dist/multi/406.app-4468f0e2.js +1 -0
- package/dist/multi/476.app-4468f0e2.js +1 -0
- package/dist/multi/53.app-4468f0e2.js +1 -0
- package/dist/multi/584.app-4468f0e2.js +1 -0
- package/dist/multi/690.app-4468f0e2.js +1 -0
- package/dist/multi/747.app-4468f0e2.js +1 -0
- package/dist/multi/767.app-4468f0e2.js +1 -0
- package/dist/multi/{816.app-71d7f77e.js → 816.app-4468f0e2.js} +1 -1
- package/dist/multi/83.app-4468f0e2.js +1 -0
- package/dist/multi/873.app-4468f0e2.js +1 -0
- package/dist/multi/920.app-4468f0e2.js +1 -0
- package/dist/multi/991.app-4468f0e2.js +1 -0
- package/dist/multi/app-4468f0e2.js +2 -0
- package/dist/multi/manifest.json +20 -20
- package/dist/multi/{styles-71d7f77e.css → styles-4468f0e2.css} +5 -5
- package/dist/single/app-33b3c367.js +2 -0
- package/dist/single/manifest.json +1 -1
- package/package.json +3 -3
- package/src/assets/svg/line-alerts-alert-circle.svg +12 -0
- package/src/assets/svg/line-general-eye.svg +7 -0
- package/src/assets/svg/line-icon-bomb-2.svg +12 -0
- package/src/components/app/ArrowButton/styles.scss +3 -0
- package/src/components/app/ReportMetadata/MetadataSummary.tsx +22 -18
- package/src/components/app/ReportMetadata/MetadataWithIcon.tsx +2 -2
- package/src/components/app/TestResult/TestResultError/index.tsx +18 -16
- package/src/components/app/TestResult/TestResultError/styles.scss +16 -5
- package/src/components/app/TestResult/TestResultHeader/index.tsx +2 -2
- package/src/components/app/TestResult/TestResultHistory/TestResultHistoryItem.tsx +21 -10
- package/src/components/app/TestResult/TestResultInfo/TestResultInfoStatuses.tsx +31 -0
- package/src/components/app/TestResult/TestResultInfo/index.tsx +6 -4
- package/src/components/app/TestResult/TestResultInfo/styles.scss +17 -0
- package/src/components/app/TestResult/TestResultNavigation/index.tsx +1 -2
- package/src/components/app/TestResult/TestResultPrevStatuses/index.tsx +6 -6
- package/src/components/app/TestResult/TestResultTeardown/index.tsx +2 -2
- package/src/components/app/TestResult/index.tsx +2 -2
- package/src/components/app/Tree/TreeItem.tsx +3 -1
- package/src/components/app/Tree/styles.scss +7 -1
- package/src/components/commons/Button/styles.scss +6 -4
- package/src/i18n/constants.ts +2 -2
- package/src/i18n/locales/am.json +2 -1
- package/src/i18n/locales/az.json +2 -1
- package/src/i18n/locales/de.json +2 -1
- package/src/i18n/locales/en.json +2 -1
- package/src/i18n/locales/es.json +2 -1
- package/src/i18n/locales/fr.json +2 -1
- package/src/i18n/locales/he.json +2 -1
- package/src/i18n/locales/it.json +2 -1
- package/src/i18n/locales/ja.json +2 -1
- package/src/i18n/locales/ka.json +2 -1
- package/src/i18n/locales/kr.json +2 -1
- package/src/i18n/locales/nl.json +2 -1
- package/src/i18n/locales/pl.json +2 -1
- package/src/i18n/locales/pt.json +2 -1
- package/src/i18n/locales/ru.json +2 -1
- package/src/i18n/locales/sv.json +2 -1
- package/src/i18n/locales/tr.json +2 -1
- package/src/i18n/locales/zh.json +2 -1
- package/src/index.tsx +4 -0
- package/src/stores/stats.ts +1 -1
- package/src/stores/testResults.ts +1 -1
- package/src/utils/copyToClipboard.ts +14 -1
- package/dist/multi/141.app-71d7f77e.js +0 -1
- package/dist/multi/222.app-71d7f77e.js +0 -1
- package/dist/multi/335.app-71d7f77e.js +0 -1
- package/dist/multi/34.app-71d7f77e.js +0 -1
- package/dist/multi/349.app-71d7f77e.js +0 -1
- package/dist/multi/378.app-71d7f77e.js +0 -1
- package/dist/multi/406.app-71d7f77e.js +0 -1
- package/dist/multi/476.app-71d7f77e.js +0 -1
- package/dist/multi/53.app-71d7f77e.js +0 -1
- package/dist/multi/584.app-71d7f77e.js +0 -1
- package/dist/multi/690.app-71d7f77e.js +0 -1
- package/dist/multi/747.app-71d7f77e.js +0 -1
- package/dist/multi/767.app-71d7f77e.js +0 -1
- package/dist/multi/83.app-71d7f77e.js +0 -1
- package/dist/multi/873.app-71d7f77e.js +0 -1
- package/dist/multi/920.app-71d7f77e.js +0 -1
- package/dist/multi/991.app-71d7f77e.js +0 -1
- package/dist/multi/app-71d7f77e.js +0 -2
- package/dist/single/app-7aa8b012.js +0 -2
- /package/dist/multi/{app-71d7f77e.js.LICENSE.txt → app-4468f0e2.js.LICENSE.txt} +0 -0
- /package/dist/single/{app-7aa8b012.js.LICENSE.txt → app-33b3c367.js.LICENSE.txt} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@allurereport/web-awesome",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
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.
|
|
35
|
-
"@allurereport/web-commons": "3.0.0-beta.
|
|
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>
|
|
@@ -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
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
{
|
|
71
|
-
{
|
|
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
|
|
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
|
|
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
|
-
<
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
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
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
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 =
|
|
23
|
+
const navigateUrl = `/testresult/${id}`;
|
|
22
24
|
|
|
23
25
|
return (
|
|
24
26
|
<div>
|
|
25
|
-
<div className={styles["test-result-history-item-header"]}
|
|
26
|
-
{Boolean(message) &&
|
|
27
|
-
|
|
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
|
-
|
|
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
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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 {
|
|
2
|
-
import {
|
|
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}
|
|
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
|
}
|
package/src/i18n/constants.ts
CHANGED
package/src/i18n/locales/am.json
CHANGED
|
@@ -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": "Կցորդը չի գտնվել"
|
package/src/i18n/locales/az.json
CHANGED
package/src/i18n/locales/de.json
CHANGED
|
@@ -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"
|
package/src/i18n/locales/en.json
CHANGED
|
@@ -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"
|
package/src/i18n/locales/es.json
CHANGED
|
@@ -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"
|
package/src/i18n/locales/fr.json
CHANGED
|
@@ -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"
|
package/src/i18n/locales/he.json
CHANGED