@allurereport/web-awesome 3.0.0-beta.23 → 3.0.0-beta.24
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/{173.app-5f97f0fc2fd3d653a804.js → 173.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{174.app-5f97f0fc2fd3d653a804.js → 174.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{252.app-5f97f0fc2fd3d653a804.js → 252.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{282.app-5f97f0fc2fd3d653a804.js → 282.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{29.app-5f97f0fc2fd3d653a804.js → 29.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{416.app-5f97f0fc2fd3d653a804.js → 416.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{527.app-5f97f0fc2fd3d653a804.js → 527.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{600.app-5f97f0fc2fd3d653a804.js → 600.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{605.app-5f97f0fc2fd3d653a804.js → 605.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{638.app-5f97f0fc2fd3d653a804.js → 638.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{672.app-5f97f0fc2fd3d653a804.js → 672.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{686.app-5f97f0fc2fd3d653a804.js → 686.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{725.app-5f97f0fc2fd3d653a804.js → 725.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{741.app-5f97f0fc2fd3d653a804.js → 741.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{755.app-5f97f0fc2fd3d653a804.js → 755.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{894.app-5f97f0fc2fd3d653a804.js → 894.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{943.app-5f97f0fc2fd3d653a804.js → 943.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/{980.app-5f97f0fc2fd3d653a804.js → 980.app-9744a06934ffbef2c892.js} +1 -1
- package/dist/multi/app-9744a06934ffbef2c892.js +2 -0
- package/dist/multi/manifest.json +20 -20
- package/dist/multi/styles-c0d22dac0f1d971a76eb.css +48 -0
- package/dist/single/app-bfa8df3fad4158726f8e.js +2 -0
- package/dist/single/manifest.json +1 -1
- package/package.json +6 -6
- package/src/assets/scss/theme.scss +2 -0
- package/src/components/Charts/index.tsx +72 -16
- package/src/components/Charts/styles.scss +1 -13
- package/src/components/SectionPicker/index.tsx +1 -0
- package/src/components/SectionSwitcher/index.tsx +2 -0
- package/src/components/Timeline/index.tsx +108 -0
- package/src/components/Timeline/styles.scss +45 -0
- package/src/locales/az.json +32 -3
- package/src/locales/de.json +32 -3
- package/src/locales/en.json +32 -3
- package/src/locales/es.json +32 -3
- package/src/locales/fr.json +32 -3
- package/src/locales/he.json +32 -3
- package/src/locales/hy.json +32 -3
- package/src/locales/it.json +32 -3
- package/src/locales/ja.json +32 -3
- package/src/locales/ka.json +32 -3
- package/src/locales/kr.json +32 -3
- package/src/locales/nl.json +32 -3
- package/src/locales/pl.json +40 -3
- package/src/locales/pt.json +32 -3
- package/src/locales/ru.json +40 -3
- package/src/locales/sv.json +32 -3
- package/src/locales/tr.json +32 -3
- package/src/locales/zh.json +32 -3
- package/src/stores/locale.ts +13 -3
- package/src/stores/timeline.ts +34 -0
- package/dist/multi/app-5f97f0fc2fd3d653a804.js +0 -2
- package/dist/multi/styles-d0a3b9e6a5609fee622f.css +0 -47
- package/dist/single/app-e0a811d47859e51f6510.js +0 -2
- /package/dist/multi/{app-5f97f0fc2fd3d653a804.js.LICENSE.txt → app-9744a06934ffbef2c892.js.LICENSE.txt} +0 -0
- /package/dist/single/{app-e0a811d47859e51f6510.js.LICENSE.txt → app-bfa8df3fad4158726f8e.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.24",
|
|
4
4
|
"description": "The static files for Allure Awesome Report",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"allure",
|
|
@@ -31,11 +31,11 @@
|
|
|
31
31
|
"IE 11"
|
|
32
32
|
],
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@allurereport/charts-api": "3.0.0-beta.
|
|
35
|
-
"@allurereport/core-api": "3.0.0-beta.
|
|
36
|
-
"@allurereport/plugin-api": "3.0.0-beta.
|
|
37
|
-
"@allurereport/web-commons": "3.0.0-beta.
|
|
38
|
-
"@allurereport/web-components": "3.0.0-beta.
|
|
34
|
+
"@allurereport/charts-api": "3.0.0-beta.24",
|
|
35
|
+
"@allurereport/core-api": "3.0.0-beta.24",
|
|
36
|
+
"@allurereport/plugin-api": "3.0.0-beta.24",
|
|
37
|
+
"@allurereport/web-commons": "3.0.0-beta.24",
|
|
38
|
+
"@allurereport/web-components": "3.0.0-beta.24",
|
|
39
39
|
"@preact/signals": "^1.3.0",
|
|
40
40
|
"clsx": "^2.1.1",
|
|
41
41
|
"d3-shape": "^3.2.0",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
--constant-on-border-heavy: var(--constant-on-border-heavy-day);
|
|
31
31
|
--constant-on-icon-primary: var(--constant-on-icon-primary-day);
|
|
32
32
|
--constant-on-text-primary: var(--constant-on-text-primary-day);
|
|
33
|
+
--constant-on-text-secondary: var(--gray-neutral-alpha-night-300);
|
|
33
34
|
--on-border-control: var(--on-border-control-day);
|
|
34
35
|
--on-border-heavy: var(--on-border-heavy-day);
|
|
35
36
|
--on-border-medium: var(--on-border-medium-day);
|
|
@@ -98,6 +99,7 @@
|
|
|
98
99
|
--constant-on-border-heavy: var(--constant-on-border-heavy-night);
|
|
99
100
|
--constant-on-icon-primary: var(--constant-on-icon-primary-night);
|
|
100
101
|
--constant-on-text-primary: var(--constant-on-text-primary-night);
|
|
102
|
+
--constant-on-text-secondary: var(--gray-neutral-alpha-night-300);
|
|
101
103
|
--on-border-control: var(--on-border-control-night);
|
|
102
104
|
--on-border-heavy: var(--on-border-heavy-night);
|
|
103
105
|
--on-border-medium: var(--on-border-medium-night);
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
2
|
-
import { BarChartType, ChartType, FunnelChartType } from "@allurereport/charts-api";
|
|
3
|
-
import { capitalize } from "@allurereport/core-api";
|
|
2
|
+
import { BarChartType, ChartDataType, ChartType, FunnelChartType } from "@allurereport/charts-api";
|
|
3
|
+
import { capitalize, statusesList } from "@allurereport/core-api";
|
|
4
4
|
import { type UIChartData } from "@allurereport/web-commons";
|
|
5
5
|
import {
|
|
6
6
|
BarChartWidget,
|
|
7
7
|
ComingSoonChartWidget,
|
|
8
|
+
CurrentStatusChartWidget,
|
|
8
9
|
Grid,
|
|
9
10
|
GridItem,
|
|
10
11
|
HeatMapWidget,
|
|
11
12
|
Loadable,
|
|
12
13
|
PageLoader,
|
|
13
14
|
StabilityRateDistributionWidget,
|
|
14
|
-
SuccessRatePieChart,
|
|
15
15
|
TestingPyramidWidget,
|
|
16
16
|
TreeMapChartWidget,
|
|
17
17
|
TrendChartWidget,
|
|
18
|
-
Widget,
|
|
19
18
|
} from "@allurereport/web-components";
|
|
20
19
|
import { useEffect } from "preact/hooks";
|
|
21
20
|
import { chartsStore, fetchChartsData } from "@/stores/chart";
|
|
@@ -31,12 +30,17 @@ const getChartWidgetByType = (
|
|
|
31
30
|
case ChartType.Trend: {
|
|
32
31
|
const type = t(`trend.type.${chartData.dataType}`);
|
|
33
32
|
const title = chartData.title ?? t("trend.title", { type: capitalize(type) });
|
|
33
|
+
let isDataEmpty = false;
|
|
34
|
+
|
|
35
|
+
if (chartData.dataType === ChartDataType.Status) {
|
|
36
|
+
isDataEmpty = !chartData.slices.some((slice) => slice.min > 0 || slice.max > 0);
|
|
37
|
+
}
|
|
34
38
|
|
|
35
39
|
return (
|
|
36
40
|
<TrendChartWidget
|
|
37
41
|
title={title}
|
|
38
42
|
mode={chartData.mode}
|
|
39
|
-
items={chartData.items}
|
|
43
|
+
items={isDataEmpty ? [] : chartData.items}
|
|
40
44
|
slices={chartData.slices}
|
|
41
45
|
min={chartData.min}
|
|
42
46
|
max={chartData.max}
|
|
@@ -44,22 +48,29 @@ const getChartWidgetByType = (
|
|
|
44
48
|
/>
|
|
45
49
|
);
|
|
46
50
|
}
|
|
47
|
-
case ChartType.
|
|
48
|
-
const title = chartData.title ?? t("
|
|
51
|
+
case ChartType.CurrentStatus: {
|
|
52
|
+
const title = chartData.title ?? t("currentStatus.title");
|
|
49
53
|
|
|
50
54
|
return (
|
|
51
|
-
<
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
<CurrentStatusChartWidget
|
|
56
|
+
title={title}
|
|
57
|
+
data={chartData.data}
|
|
58
|
+
statuses={chartData.statuses}
|
|
59
|
+
metric={chartData.metric}
|
|
60
|
+
i18n={(key, props = {}) => t(`currentStatus.${key}`, props)}
|
|
61
|
+
/>
|
|
58
62
|
);
|
|
59
63
|
}
|
|
60
64
|
case ChartType.Bar: {
|
|
61
65
|
const type = t(`bar.type.${chartData.dataType}`);
|
|
62
66
|
const title = chartData.title ?? t("bar.title", { type: capitalize(type) });
|
|
67
|
+
/**
|
|
68
|
+
* A flag that indicates whether the chart data should be considered empty.
|
|
69
|
+
* For some chart types, simply checking the `data` array length is not sufficient,
|
|
70
|
+
* because additional logic may be needed to assess the presence of meaningful data.
|
|
71
|
+
* This flag ensures that specific conditions for data emptiness are handled per chart type.
|
|
72
|
+
*/
|
|
73
|
+
let isDataEmpty = false;
|
|
63
74
|
|
|
64
75
|
if (chartData.dataType === BarChartType.StabilityRateDistribution) {
|
|
65
76
|
return (
|
|
@@ -80,11 +91,54 @@ const getChartWidgetByType = (
|
|
|
80
91
|
);
|
|
81
92
|
}
|
|
82
93
|
|
|
94
|
+
if (chartData.dataType === BarChartType.StatusChangeTrend) {
|
|
95
|
+
/*
|
|
96
|
+
* For StatusChangeTrend data:
|
|
97
|
+
* - The data consists of keys such as newPassed, newFailed, newBroken, newSkipped, etc., all with numeric values.
|
|
98
|
+
* - We must check if any of these metrics in any group are greater than 0.
|
|
99
|
+
* - If at least one statistic is greater than 0, we should display the chart.
|
|
100
|
+
*/
|
|
101
|
+
isDataEmpty = !chartData.data.some((item) => chartData.keys.some((key) => (item[key] ?? 0) > 0));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (chartData.dataType === BarChartType.StatusBySeverity) {
|
|
105
|
+
/*
|
|
106
|
+
* Data for this chart type consists of statistics where each group contains
|
|
107
|
+
* metrics such as passed, failed, broken, etc., represented as numbers.
|
|
108
|
+
* To determine if the chart should be displayed, we need to check if any of these
|
|
109
|
+
* metrics in any group is greater than 0. If at least one of the statistics is
|
|
110
|
+
* greater than 0, we display the chart; otherwise, we consider the data empty.
|
|
111
|
+
*/
|
|
112
|
+
isDataEmpty = !chartData.data.some(
|
|
113
|
+
(item) => chartData.keys.includes(item.groupId) && statusesList.some((status) => (item[status] ?? 0) > 0),
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (chartData.dataType === BarChartType.StatusTrend) {
|
|
118
|
+
/*
|
|
119
|
+
* The data structure contains keys such as passed, failed, and broken, each associated with numeric values.
|
|
120
|
+
* To determine whether the chart should be displayed, we need to check if any value for these keys
|
|
121
|
+
* is greater than 0 in any of the data groups. If at least one of those metrics is greater than 0,
|
|
122
|
+
* the chart will be displayed; otherwise, it should be considered empty.
|
|
123
|
+
*/
|
|
124
|
+
isDataEmpty = !chartData.data.some((item) => chartData.keys.some((key) => (item[key] ?? 0) > 0));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (chartData.dataType === BarChartType.FbsuAgePyramid) {
|
|
128
|
+
/*
|
|
129
|
+
* For FbsuAgePyramid data:
|
|
130
|
+
* - Each group contains keys such as passed, failed, broken, etc., with numeric values.
|
|
131
|
+
* - To determine if the chart should be shown, check if any statistic in any group is greater than 0.
|
|
132
|
+
* - If at least one such statistic exists, display the chart; otherwise, consider the data empty.
|
|
133
|
+
*/
|
|
134
|
+
isDataEmpty = !chartData.data.some((item) => chartData.keys.some((key) => (item[key] ?? 0) > 0));
|
|
135
|
+
}
|
|
136
|
+
|
|
83
137
|
return (
|
|
84
138
|
<BarChartWidget
|
|
85
139
|
title={title}
|
|
86
140
|
mode={chartData.mode}
|
|
87
|
-
data={chartData.data}
|
|
141
|
+
data={isDataEmpty ? [] : chartData.data}
|
|
88
142
|
keys={chartData.keys}
|
|
89
143
|
indexBy={chartData.indexBy}
|
|
90
144
|
colors={chartData.colors}
|
|
@@ -124,10 +178,12 @@ const getChartWidgetByType = (
|
|
|
124
178
|
return null;
|
|
125
179
|
}
|
|
126
180
|
|
|
181
|
+
const isDataEmpty = !chartData.data.some((item) => item.testCount > 0);
|
|
182
|
+
|
|
127
183
|
return (
|
|
128
184
|
<TestingPyramidWidget
|
|
129
185
|
title={chartData.title}
|
|
130
|
-
data={chartData.data}
|
|
186
|
+
data={isDataEmpty ? [] : chartData.data}
|
|
131
187
|
translations={{ "no-results": empty("no-results") }}
|
|
132
188
|
/>
|
|
133
189
|
);
|
|
@@ -14,16 +14,4 @@
|
|
|
14
14
|
.overview-grid-item {
|
|
15
15
|
padding: 4px;
|
|
16
16
|
width: 100%;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
.overview-grid-item-pie-chart-wrapper {
|
|
20
|
-
display: flex;
|
|
21
|
-
justify-content: center;
|
|
22
|
-
align-items: center;
|
|
23
|
-
width: 100%;
|
|
24
|
-
height: 100%;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
.overview-grid-item-pie-chart-wrapper-squeezer {
|
|
28
|
-
width: 50%;
|
|
29
|
-
}
|
|
17
|
+
}
|
|
@@ -13,6 +13,7 @@ const defaultSection: SectionItem = { name: "report", logo: allureIcons.reportLo
|
|
|
13
13
|
const sectionMap: Record<string, SectionItem> = {
|
|
14
14
|
default: defaultSection,
|
|
15
15
|
charts: { name: "charts", logo: allureIcons.lineChartsBarChartSquare },
|
|
16
|
+
timeline: { name: "timeline", logo: allureIcons.lineChartsTimeline },
|
|
16
17
|
};
|
|
17
18
|
|
|
18
19
|
export const SectionPicker = () => {
|
|
@@ -2,12 +2,14 @@ import type { VNode } from "preact";
|
|
|
2
2
|
import { Charts } from "@/components/Charts";
|
|
3
3
|
import { Report } from "@/components/Report";
|
|
4
4
|
import { currentSection } from "@/stores/sections";
|
|
5
|
+
import { Timeline } from "../Timeline";
|
|
5
6
|
import * as styles from "./styles.scss";
|
|
6
7
|
|
|
7
8
|
export const SectionSwitcher = () => {
|
|
8
9
|
const sectionMap: Record<string, VNode> = {
|
|
9
10
|
report: <Report />,
|
|
10
11
|
charts: <Charts />,
|
|
12
|
+
timeline: <Timeline />,
|
|
11
13
|
};
|
|
12
14
|
|
|
13
15
|
return <div className={styles.layout}>{sectionMap[currentSection.value] || sectionMap.report}</div>;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
2
|
+
import type { TestResult } from "@allurereport/core-api";
|
|
3
|
+
import { Timeline as AllureTimeline, Grid, GridItem, Loadable, PageLoader, Widget } from "@allurereport/web-components";
|
|
4
|
+
import { computed } from "@preact/signals";
|
|
5
|
+
import { useEffect, useMemo } from "preact/hooks";
|
|
6
|
+
import { useI18n } from "@/stores";
|
|
7
|
+
import { currentEnvironment } from "@/stores/env";
|
|
8
|
+
import { fetchTimelineData, timelineStore } from "@/stores/timeline";
|
|
9
|
+
import * as styles from "./styles.scss";
|
|
10
|
+
|
|
11
|
+
const getHosts = (tests: TestResult[]) => [
|
|
12
|
+
...new Set(tests.map((test) => test.labels.find((label) => label.name === "host")?.value).filter(Boolean)),
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
const filterTestsByHost = (tests: TestResult[], host: string) =>
|
|
16
|
+
tests.filter((test) => test.labels.find((label) => label.name === "host")?.value === host);
|
|
17
|
+
|
|
18
|
+
const currentTimelineData = computed(() => {
|
|
19
|
+
if (!timelineStore.value.data) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (currentEnvironment.value) {
|
|
24
|
+
const testsToEnv = timelineStore.value.data.filter((test) => test.environment === currentEnvironment.value);
|
|
25
|
+
const hostsByEnv = getHosts(testsToEnv);
|
|
26
|
+
|
|
27
|
+
return hostsByEnv.map((host) => ({
|
|
28
|
+
data: filterTestsByHost(testsToEnv, host),
|
|
29
|
+
host,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const hosts = getHosts(timelineStore.value.data);
|
|
34
|
+
|
|
35
|
+
return hosts.map((host) => ({
|
|
36
|
+
data: filterTestsByHost(timelineStore.value.data, host),
|
|
37
|
+
host,
|
|
38
|
+
}));
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Detects if the user prefers reduced motion to disable animations for accessibility
|
|
42
|
+
const prefersLessMovement = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
43
|
+
export const Timeline = () => {
|
|
44
|
+
const { t } = useI18n("timeline");
|
|
45
|
+
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
fetchTimelineData();
|
|
48
|
+
}, []);
|
|
49
|
+
|
|
50
|
+
const translations = useMemo(
|
|
51
|
+
() => ({
|
|
52
|
+
empty: t("empty"),
|
|
53
|
+
selected: (props: { count: number; percentage: string; minDuration: string; maxDuration: string }) =>
|
|
54
|
+
t("selected", {
|
|
55
|
+
count: props.count,
|
|
56
|
+
percentage: props.percentage,
|
|
57
|
+
minDuration: props.minDuration,
|
|
58
|
+
maxDuration: props.maxDuration,
|
|
59
|
+
}),
|
|
60
|
+
}),
|
|
61
|
+
[t],
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<Loadable
|
|
66
|
+
source={timelineStore}
|
|
67
|
+
renderLoader={() => <PageLoader />}
|
|
68
|
+
renderData={() => {
|
|
69
|
+
if (currentTimelineData.value.length === 0) {
|
|
70
|
+
return (
|
|
71
|
+
<div className={styles.overview}>
|
|
72
|
+
<Grid kind="swap" className={styles["overview-grid"]}>
|
|
73
|
+
<GridItem className={styles["overview-grid-item"]}>
|
|
74
|
+
<Widget>
|
|
75
|
+
<div className={styles.empty}>{t("empty")}</div>
|
|
76
|
+
</Widget>
|
|
77
|
+
</GridItem>
|
|
78
|
+
</Grid>
|
|
79
|
+
</div>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<div className={styles.overview}>
|
|
85
|
+
<Grid kind="swap" className={styles["overview-grid"]}>
|
|
86
|
+
{currentTimelineData.value.map(({ data, host }) => (
|
|
87
|
+
<GridItem key={host} className={styles["overview-grid-item"]}>
|
|
88
|
+
<Widget title={t("host", { host })}>
|
|
89
|
+
{data.length > 0 && (
|
|
90
|
+
<AllureTimeline
|
|
91
|
+
data={data}
|
|
92
|
+
dataId={host}
|
|
93
|
+
width={100}
|
|
94
|
+
enableAnimations={!prefersLessMovement}
|
|
95
|
+
translations={translations}
|
|
96
|
+
/>
|
|
97
|
+
)}
|
|
98
|
+
{data.length === 0 && <div className={styles.empty}>{t("empty_host", { host })}</div>}
|
|
99
|
+
</Widget>
|
|
100
|
+
</GridItem>
|
|
101
|
+
))}
|
|
102
|
+
</Grid>
|
|
103
|
+
</div>
|
|
104
|
+
);
|
|
105
|
+
}}
|
|
106
|
+
/>
|
|
107
|
+
);
|
|
108
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
.overview {
|
|
2
|
+
padding: 0 24px;
|
|
3
|
+
width: 100%;
|
|
4
|
+
height: 100%;
|
|
5
|
+
overflow-y: auto;
|
|
6
|
+
|
|
7
|
+
--timeline-font-family: var(--font-family);
|
|
8
|
+
--timeline-grid: var(--on-border-control);
|
|
9
|
+
--timeline-border-primary: var(--on-border-primary);
|
|
10
|
+
--timeline-axis-text: var(--on-text-secondary);
|
|
11
|
+
--timeline-bg: var(--bg-base-primary);
|
|
12
|
+
--timeline-selection-bg: var(--bg-control-flat-medium);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.overview-grid {
|
|
16
|
+
display: flex;
|
|
17
|
+
flex-direction: column;
|
|
18
|
+
gap: 12px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.overview-grid-item {
|
|
22
|
+
padding: 4px;
|
|
23
|
+
width: 100%;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.overview-grid-item-pie-chart-wrapper {
|
|
27
|
+
display: flex;
|
|
28
|
+
justify-content: center;
|
|
29
|
+
align-items: center;
|
|
30
|
+
width: 100%;
|
|
31
|
+
height: 100%;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.overview-grid-item-pie-chart-wrapper-squeezer {
|
|
35
|
+
width: 50%;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.empty {
|
|
39
|
+
display: flex;
|
|
40
|
+
justify-content: center;
|
|
41
|
+
align-items: center;
|
|
42
|
+
width: 100%;
|
|
43
|
+
min-height: 320px;
|
|
44
|
+
color: var(--on-text-hint);
|
|
45
|
+
}
|
package/src/locales/az.json
CHANGED
|
@@ -162,7 +162,15 @@
|
|
|
162
162
|
},
|
|
163
163
|
"sections": {
|
|
164
164
|
"report": "Report",
|
|
165
|
-
"charts": "Qrafiklər"
|
|
165
|
+
"charts": "Qrafiklər",
|
|
166
|
+
"timeline": "Zaman xətti"
|
|
167
|
+
},
|
|
168
|
+
"timeline": {
|
|
169
|
+
"empty": "Məlumat yoxdur",
|
|
170
|
+
"empty_host": "{{ host }} üçün məlumat yoxdur",
|
|
171
|
+
"selected_one": "{{ count }} test ({{ percentage }}%) {{ minDuration }}-dən çox və {{ maxDuration }}-dən az müddətlə seçildi",
|
|
172
|
+
"selected_other": "{{ count }} test ({{ percentage }}%) {{ minDuration }}-dən çox və {{ maxDuration }}-dən az müddətlə seçildi",
|
|
173
|
+
"host": "Host: {{ host }}"
|
|
166
174
|
},
|
|
167
175
|
"charts": {
|
|
168
176
|
"trend": {
|
|
@@ -172,8 +180,29 @@
|
|
|
172
180
|
"severity": "Ciddilik"
|
|
173
181
|
}
|
|
174
182
|
},
|
|
175
|
-
"
|
|
176
|
-
"title": "
|
|
183
|
+
"currentStatus": {
|
|
184
|
+
"title": "Cari Status",
|
|
185
|
+
"status": {
|
|
186
|
+
"passed": "$t(statuses:passed, capitalize)",
|
|
187
|
+
"failed": "$t(statuses:failed, capitalize)",
|
|
188
|
+
"broken": "$t(statuses:broken, capitalize)",
|
|
189
|
+
"skipped": "$t(statuses:skipped, capitalize)",
|
|
190
|
+
"unknown": "$t(statuses:unknown, capitalize)"
|
|
191
|
+
},
|
|
192
|
+
"percentage": "{{percentage}}%",
|
|
193
|
+
"of": "{{total}} dən",
|
|
194
|
+
"total": "cəmi",
|
|
195
|
+
"tests": {
|
|
196
|
+
"new_zero": "Yeni test yoxdur",
|
|
197
|
+
"new_one": "{{count}} yeni test",
|
|
198
|
+
"new_other": "{{count}} yeni test",
|
|
199
|
+
"flaky_zero": "Qeyri-sabit test yoxdur",
|
|
200
|
+
"flaky_one": "{{count}} qeyri-sabit test",
|
|
201
|
+
"flaky_other": "{{count}} qeyri-sabit test",
|
|
202
|
+
"retries_zero": "Yenidən cəhd edilmiş test yoxdur",
|
|
203
|
+
"retries_one": "{{count}} yenidən cəhd edilmiş test",
|
|
204
|
+
"retries_other": "{{count}} yenidən cəhd edilmiş test"
|
|
205
|
+
}
|
|
177
206
|
}
|
|
178
207
|
},
|
|
179
208
|
"transitions.description": {
|
package/src/locales/de.json
CHANGED
|
@@ -162,7 +162,15 @@
|
|
|
162
162
|
},
|
|
163
163
|
"sections": {
|
|
164
164
|
"report": "Report",
|
|
165
|
-
"charts": "Graphen"
|
|
165
|
+
"charts": "Graphen",
|
|
166
|
+
"timeline": "Zeitleiste"
|
|
167
|
+
},
|
|
168
|
+
"timeline": {
|
|
169
|
+
"empty": "Keine Daten",
|
|
170
|
+
"empty_host": "Keine Daten für {{ host }}",
|
|
171
|
+
"selected_one": "{{ count }} Test ({{ percentage }}%) mit Dauer mehr als {{ minDuration }} und weniger als {{ maxDuration }} ausgewählt",
|
|
172
|
+
"selected_other": "{{ count }} Tests ({{ percentage }}%) mit Dauer mehr als {{ minDuration }} und weniger als {{ maxDuration }} ausgewählt",
|
|
173
|
+
"host": "Host: {{ host }}"
|
|
166
174
|
},
|
|
167
175
|
"charts": {
|
|
168
176
|
"trend": {
|
|
@@ -172,8 +180,29 @@
|
|
|
172
180
|
"severity": "Schweregrad"
|
|
173
181
|
}
|
|
174
182
|
},
|
|
175
|
-
"
|
|
176
|
-
"title": "
|
|
183
|
+
"currentStatus": {
|
|
184
|
+
"title": "Aktueller Status",
|
|
185
|
+
"status": {
|
|
186
|
+
"passed": "$t(statuses:passed, capitalize)",
|
|
187
|
+
"failed": "$t(statuses:failed, capitalize)",
|
|
188
|
+
"broken": "$t(statuses:broken, capitalize)",
|
|
189
|
+
"skipped": "$t(statuses:skipped, capitalize)",
|
|
190
|
+
"unknown": "$t(statuses:unknown, capitalize)"
|
|
191
|
+
},
|
|
192
|
+
"percentage": "{{percentage}}%",
|
|
193
|
+
"of": "von {{total}}",
|
|
194
|
+
"total": "gesamt",
|
|
195
|
+
"tests": {
|
|
196
|
+
"new_zero": "Keine neuen Tests",
|
|
197
|
+
"new_one": "{{count}} neuer Test",
|
|
198
|
+
"new_other": "{{count}} neue Tests",
|
|
199
|
+
"flaky_zero": "Keine instabilen Tests",
|
|
200
|
+
"flaky_one": "{{count}} instabiler Test",
|
|
201
|
+
"flaky_other": "{{count}} instabile Tests",
|
|
202
|
+
"retries_zero": "Keine wiederholten Tests",
|
|
203
|
+
"retries_one": "{{count}} wiederholter Test",
|
|
204
|
+
"retries_other": "{{count}} wiederholte Tests"
|
|
205
|
+
}
|
|
177
206
|
}
|
|
178
207
|
},
|
|
179
208
|
"transitions.description": {
|
package/src/locales/en.json
CHANGED
|
@@ -162,7 +162,15 @@
|
|
|
162
162
|
},
|
|
163
163
|
"sections": {
|
|
164
164
|
"report": "Report",
|
|
165
|
-
"charts": "Graphs"
|
|
165
|
+
"charts": "Graphs",
|
|
166
|
+
"timeline": "Timeline"
|
|
167
|
+
},
|
|
168
|
+
"timeline": {
|
|
169
|
+
"empty": "No data",
|
|
170
|
+
"empty_host": "No data for {{ host }}",
|
|
171
|
+
"selected_one": "Selected {{ count }} test ({{ percentage }}%) with duration more than {{ minDuration }} and less than {{ maxDuration }}",
|
|
172
|
+
"selected_other": "Selected {{ count }} tests ({{ percentage }}%) with duration more than {{ minDuration }} and less than {{ maxDuration }}",
|
|
173
|
+
"host": "Host: {{ host }}"
|
|
166
174
|
},
|
|
167
175
|
"charts": {
|
|
168
176
|
"trend": {
|
|
@@ -172,8 +180,29 @@
|
|
|
172
180
|
"severity": "Severity"
|
|
173
181
|
}
|
|
174
182
|
},
|
|
175
|
-
"
|
|
176
|
-
"title": "
|
|
183
|
+
"currentStatus": {
|
|
184
|
+
"title": "Current Status",
|
|
185
|
+
"status": {
|
|
186
|
+
"passed": "$t(statuses:passed, capitalize)",
|
|
187
|
+
"failed": "$t(statuses:failed, capitalize)",
|
|
188
|
+
"broken": "$t(statuses:broken, capitalize)",
|
|
189
|
+
"skipped": "$t(statuses:skipped, capitalize)",
|
|
190
|
+
"unknown": "$t(statuses:unknown, capitalize)"
|
|
191
|
+
},
|
|
192
|
+
"percentage": "{{percentage}}%",
|
|
193
|
+
"of": "of {{total}}",
|
|
194
|
+
"total": "total",
|
|
195
|
+
"tests": {
|
|
196
|
+
"new_zero": "No new tests",
|
|
197
|
+
"new_one": "{{count}} new test",
|
|
198
|
+
"new_other": "{{count}} new tests",
|
|
199
|
+
"flaky_zero": "No flaky tests",
|
|
200
|
+
"flaky_one": "{{count}} flaky test",
|
|
201
|
+
"flaky_other": "{{count}} flaky tests",
|
|
202
|
+
"retries_zero": "No retried tests",
|
|
203
|
+
"retries_one": "{{count}} retried test",
|
|
204
|
+
"retries_other": "{{count}} retried tests"
|
|
205
|
+
}
|
|
177
206
|
}
|
|
178
207
|
},
|
|
179
208
|
"transitions.description": {
|
package/src/locales/es.json
CHANGED
|
@@ -162,7 +162,15 @@
|
|
|
162
162
|
},
|
|
163
163
|
"sections": {
|
|
164
164
|
"report": "Report",
|
|
165
|
-
"charts": "Gráficas"
|
|
165
|
+
"charts": "Gráficas",
|
|
166
|
+
"timeline": "Línea de tiempo"
|
|
167
|
+
},
|
|
168
|
+
"timeline": {
|
|
169
|
+
"empty": "Sin datos",
|
|
170
|
+
"empty_host": "Sin datos para {{ host }}",
|
|
171
|
+
"selected_one": "{{ count }} prueba ({{ percentage }}%) con duración superior a {{ minDuration }} e inferior a {{ maxDuration }} seleccionada",
|
|
172
|
+
"selected_other": "{{ count }} pruebas ({{ percentage }}%) con duración superior a {{ minDuration }} e inferior a {{ maxDuration }} seleccionadas",
|
|
173
|
+
"host": "Host: {{ host }}"
|
|
166
174
|
},
|
|
167
175
|
"charts": {
|
|
168
176
|
"trend": {
|
|
@@ -172,8 +180,29 @@
|
|
|
172
180
|
"severity": "Severidad"
|
|
173
181
|
}
|
|
174
182
|
},
|
|
175
|
-
"
|
|
176
|
-
"title": "
|
|
183
|
+
"currentStatus": {
|
|
184
|
+
"title": "Estado actual",
|
|
185
|
+
"status": {
|
|
186
|
+
"passed": "$t(statuses:passed, capitalize)",
|
|
187
|
+
"failed": "$t(statuses:failed, capitalize)",
|
|
188
|
+
"broken": "$t(statuses:broken, capitalize)",
|
|
189
|
+
"skipped": "$t(statuses:skipped, capitalize)",
|
|
190
|
+
"unknown": "$t(statuses:unknown, capitalize)"
|
|
191
|
+
},
|
|
192
|
+
"percentage": "{{percentage}}%",
|
|
193
|
+
"of": "de {{total}}",
|
|
194
|
+
"total": "total",
|
|
195
|
+
"tests": {
|
|
196
|
+
"new_zero": "No hay pruebas nuevas",
|
|
197
|
+
"new_one": "{{count}} prueba nueva",
|
|
198
|
+
"new_other": "{{count}} pruebas nuevas",
|
|
199
|
+
"flaky_zero": "No hay pruebas inestables",
|
|
200
|
+
"flaky_one": "{{count}} prueba inestable",
|
|
201
|
+
"flaky_other": "{{count}} pruebas inestables",
|
|
202
|
+
"retries_zero": "No hay pruebas reintentadas",
|
|
203
|
+
"retries_one": "{{count}} prueba reintentada",
|
|
204
|
+
"retries_other": "{{count}} pruebas reintentadas"
|
|
205
|
+
}
|
|
177
206
|
}
|
|
178
207
|
},
|
|
179
208
|
"transitions.description": {
|
package/src/locales/fr.json
CHANGED
|
@@ -162,7 +162,15 @@
|
|
|
162
162
|
},
|
|
163
163
|
"sections": {
|
|
164
164
|
"report": "Report",
|
|
165
|
-
"charts": "Graphes"
|
|
165
|
+
"charts": "Graphes",
|
|
166
|
+
"timeline": "Chronologie"
|
|
167
|
+
},
|
|
168
|
+
"timeline": {
|
|
169
|
+
"empty": "Aucune donnée",
|
|
170
|
+
"empty_host": "Aucune donnée pour {{ host }}",
|
|
171
|
+
"selected_one": "{{ count }} test ({{ percentage }}%) avec une durée supérieure à {{ minDuration }} et inférieure à {{ maxDuration }} sélectionné",
|
|
172
|
+
"selected_other": "{{ count }} tests ({{ percentage }}%) avec une durée supérieure à {{ minDuration }} et inférieure à {{ maxDuration }} sélectionnés",
|
|
173
|
+
"host": "Hôte : {{ host }}"
|
|
166
174
|
},
|
|
167
175
|
"charts": {
|
|
168
176
|
"trend": {
|
|
@@ -172,8 +180,29 @@
|
|
|
172
180
|
"severity": "Sévérité"
|
|
173
181
|
}
|
|
174
182
|
},
|
|
175
|
-
"
|
|
176
|
-
"title": "
|
|
183
|
+
"currentStatus": {
|
|
184
|
+
"title": "Statut actuel",
|
|
185
|
+
"status": {
|
|
186
|
+
"passed": "$t(statuses:passed, capitalize)",
|
|
187
|
+
"failed": "$t(statuses:failed, capitalize)",
|
|
188
|
+
"broken": "$t(statuses:broken, capitalize)",
|
|
189
|
+
"skipped": "$t(statuses:skipped, capitalize)",
|
|
190
|
+
"unknown": "$t(statuses:unknown, capitalize)"
|
|
191
|
+
},
|
|
192
|
+
"percentage": "{{percentage}}%",
|
|
193
|
+
"of": "sur {{total}}",
|
|
194
|
+
"total": "total",
|
|
195
|
+
"tests": {
|
|
196
|
+
"new_zero": "Aucun nouveau test",
|
|
197
|
+
"new_one": "{{count}} nouveau test",
|
|
198
|
+
"new_other": "{{count}} nouveaux tests",
|
|
199
|
+
"flaky_zero": "Aucun test instable",
|
|
200
|
+
"flaky_one": "{{count}} test instable",
|
|
201
|
+
"flaky_other": "{{count}} tests instables",
|
|
202
|
+
"retries_zero": "Aucun test relancé",
|
|
203
|
+
"retries_one": "{{count}} test relancé",
|
|
204
|
+
"retries_other": "{{count}} tests relancés"
|
|
205
|
+
}
|
|
177
206
|
}
|
|
178
207
|
},
|
|
179
208
|
"transitions.description": {
|