@allurereport/web-dashboard 3.0.0-beta.12
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/.babelrc.js +22 -0
- package/.eslintrc.cjs +18 -0
- package/CONTRIBUTING.md +33 -0
- package/README.md +27 -0
- package/dist/multi/173.app-1ef294bc.js +1 -0
- package/dist/multi/174.app-1ef294bc.js +1 -0
- package/dist/multi/252.app-1ef294bc.js +1 -0
- package/dist/multi/282.app-1ef294bc.js +1 -0
- package/dist/multi/29.app-1ef294bc.js +1 -0
- package/dist/multi/416.app-1ef294bc.js +1 -0
- package/dist/multi/527.app-1ef294bc.js +1 -0
- package/dist/multi/600.app-1ef294bc.js +1 -0
- package/dist/multi/605.app-1ef294bc.js +1 -0
- package/dist/multi/638.app-1ef294bc.js +1 -0
- package/dist/multi/672.app-1ef294bc.js +1 -0
- package/dist/multi/686.app-1ef294bc.js +1 -0
- package/dist/multi/725.app-1ef294bc.js +1 -0
- package/dist/multi/741.app-1ef294bc.js +1 -0
- package/dist/multi/755.app-1ef294bc.js +1 -0
- package/dist/multi/894.app-1ef294bc.js +1 -0
- package/dist/multi/943.app-1ef294bc.js +1 -0
- package/dist/multi/980.app-1ef294bc.js +1 -0
- package/dist/multi/JetBrainsMono_vf-9e9649b6..woff2 +0 -0
- package/dist/multi/JetBrainsMono_vf-b9a9c326..woff +0 -0
- package/dist/multi/app-1ef294bc.js +2 -0
- package/dist/multi/app-1ef294bc.js.LICENSE.txt +15 -0
- package/dist/multi/manifest.json +26 -0
- package/dist/multi/pt-root-ui_vf-22fe60ca..woff +0 -0
- package/dist/multi/pt-root-ui_vf-9d251e8b..woff2 +0 -0
- package/dist/multi/styles-1ef294bc.css +8 -0
- package/dist/single/app-4b8d700b.js +2 -0
- package/dist/single/app-4b8d700b.js.LICENSE.txt +15 -0
- package/dist/single/manifest.json +3 -0
- package/package.json +98 -0
- package/postcss.config.js +5 -0
- package/src/assets/scss/_common.scss +143 -0
- package/src/assets/scss/day.scss +51 -0
- package/src/assets/scss/fonts.scss +3 -0
- package/src/assets/scss/index.scss +7 -0
- package/src/assets/scss/night.scss +61 -0
- package/src/assets/scss/palette.scss +393 -0
- package/src/assets/scss/theme.scss +119 -0
- package/src/assets/scss/vars.scss +8 -0
- 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/BaseLayout/index.tsx +17 -0
- package/src/components/BaseLayout/styles.scss +59 -0
- package/src/components/Dashboard/components/TrendChartWidget/index.tsx +69 -0
- package/src/components/Dashboard/components/Widget/index.tsx +19 -0
- package/src/components/Dashboard/components/Widget/styles.scss +31 -0
- package/src/components/Dashboard/index.tsx +75 -0
- package/src/components/Dashboard/styles.scss +29 -0
- package/src/components/Footer/FooterLogo.tsx +15 -0
- package/src/components/Footer/FooterVersion.tsx +37 -0
- package/src/components/Footer/index.tsx +13 -0
- package/src/components/Footer/styles.scss +14 -0
- package/src/components/Header/index.tsx +21 -0
- package/src/components/Header/styles.scss +33 -0
- package/src/components/MainReport/index.tsx +12 -0
- package/src/components/MainReport/styles.scss +6 -0
- package/src/index.html +39 -0
- package/src/index.tsx +34 -0
- package/src/locales/az.json +32 -0
- package/src/locales/de.json +32 -0
- package/src/locales/en.json +32 -0
- package/src/locales/es.json +32 -0
- package/src/locales/fr.json +32 -0
- package/src/locales/he.json +32 -0
- package/src/locales/hy.json +32 -0
- package/src/locales/it.json +32 -0
- package/src/locales/ja.json +32 -0
- package/src/locales/ka.json +32 -0
- package/src/locales/kr.json +32 -0
- package/src/locales/nl.json +32 -0
- package/src/locales/pl.json +32 -0
- package/src/locales/pt.json +32 -0
- package/src/locales/ru.json +32 -0
- package/src/locales/sv.json +32 -0
- package/src/locales/tr.json +32 -0
- package/src/locales/zh.json +32 -0
- package/src/stores/dashboard.ts +206 -0
- package/src/stores/locale.ts +75 -0
- package/src/stores/theme.ts +32 -0
- package/src/stores/types.ts +5 -0
- package/src/styles.scss +45 -0
- package/src/types/globals.d.ts +13 -0
- package/src/types/window.d.ts +8 -0
- package/src/utils/isMac.ts +8 -0
- package/tsconfig.json +27 -0
- package/types.d.ts +21 -0
- package/vitest.config.ts +19 -0
- package/webpack.config.js +112 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { TrendChart, TrendChartKind, makeSymlogScale } from "@allurereport/web-components";
|
|
2
|
+
import type { Serie, Slice } from "@allurereport/web-components";
|
|
3
|
+
import type { CSSProperties } from "preact/compat";
|
|
4
|
+
import { useCallback, useMemo, useState } from "preact/hooks";
|
|
5
|
+
import { useI18n } from "@/stores/locale";
|
|
6
|
+
import { Widget } from "../Widget";
|
|
7
|
+
|
|
8
|
+
interface TrendChartWidgetProps<TSlice = { metadata: { executionId: string } }> {
|
|
9
|
+
title: string;
|
|
10
|
+
items: readonly Serie[];
|
|
11
|
+
slices: readonly TSlice[];
|
|
12
|
+
min: number;
|
|
13
|
+
max: number;
|
|
14
|
+
height?: CSSProperties["height"];
|
|
15
|
+
width?: CSSProperties["width"];
|
|
16
|
+
rootAriaLabel?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const TrendChartWidget = ({
|
|
20
|
+
title,
|
|
21
|
+
items,
|
|
22
|
+
slices,
|
|
23
|
+
min,
|
|
24
|
+
max,
|
|
25
|
+
height = 400,
|
|
26
|
+
width = "100%",
|
|
27
|
+
rootAriaLabel,
|
|
28
|
+
}: TrendChartWidgetProps) => {
|
|
29
|
+
const { t } = useI18n("empty");
|
|
30
|
+
const [selectedSliceIds, setSelectedSliceIds] = useState<string[]>([]);
|
|
31
|
+
|
|
32
|
+
const emptyLabel = t("no-results");
|
|
33
|
+
|
|
34
|
+
const yScale = useMemo(() => makeSymlogScale(min, max, { constant: 8 }), [max, min]);
|
|
35
|
+
|
|
36
|
+
const handleSliceClick = useCallback((slice: Slice) => {
|
|
37
|
+
const executionIds = slice.points.reduce((acc, point) => {
|
|
38
|
+
acc.push(point.data.x as string);
|
|
39
|
+
|
|
40
|
+
return acc;
|
|
41
|
+
}, [] as string[]);
|
|
42
|
+
|
|
43
|
+
setSelectedSliceIds(() => executionIds);
|
|
44
|
+
}, []);
|
|
45
|
+
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
47
|
+
const selectedSlices = useMemo(
|
|
48
|
+
() => slices.filter((slice) => selectedSliceIds.includes(slice.metadata.executionId)),
|
|
49
|
+
[slices, selectedSliceIds],
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<Widget title={title}>
|
|
54
|
+
<TrendChart
|
|
55
|
+
kind={TrendChartKind.SlicesX}
|
|
56
|
+
data={items}
|
|
57
|
+
height={height}
|
|
58
|
+
width={width}
|
|
59
|
+
emptyLabel={emptyLabel}
|
|
60
|
+
emptyAriaLabel={emptyLabel}
|
|
61
|
+
rootAriaLabel={rootAriaLabel}
|
|
62
|
+
colors={({ color }) => color}
|
|
63
|
+
yScale={yScale}
|
|
64
|
+
onSliceClick={handleSliceClick}
|
|
65
|
+
onSliceTouchEnd={handleSliceClick}
|
|
66
|
+
/>
|
|
67
|
+
</Widget>
|
|
68
|
+
);
|
|
69
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Heading } from "@allurereport/web-components";
|
|
2
|
+
import type { FunctionalComponent } from "preact";
|
|
3
|
+
import * as styles from "./styles.scss";
|
|
4
|
+
|
|
5
|
+
interface WidgetProps {
|
|
6
|
+
title: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const Widget: FunctionalComponent<WidgetProps> = ({ children, title }) => {
|
|
10
|
+
return (
|
|
11
|
+
<div className={styles.widget}>
|
|
12
|
+
<div className={styles.header}>
|
|
13
|
+
<div className={styles.dragArea} />
|
|
14
|
+
<Heading size="s">{title}</Heading>
|
|
15
|
+
</div>
|
|
16
|
+
<div className={styles.content}>{children}</div>
|
|
17
|
+
</div>
|
|
18
|
+
);
|
|
19
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
.widget {
|
|
2
|
+
border-radius: 8px;
|
|
3
|
+
box-shadow: var(--shadow-small);
|
|
4
|
+
overflow: hidden;
|
|
5
|
+
height: 100%;
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-direction: column;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.header {
|
|
11
|
+
padding: 16px 20px;
|
|
12
|
+
border-bottom: 1px solid var(--on-border-primary);
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
gap: 12px;
|
|
16
|
+
flex: 0 0 auto;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.dragArea {
|
|
20
|
+
width: 24px;
|
|
21
|
+
height: 24px;
|
|
22
|
+
margin-left: -8px;
|
|
23
|
+
flex: 0 0 auto;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.content {
|
|
27
|
+
padding: 16px;
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-direction: column;
|
|
30
|
+
flex: 1 1 auto;
|
|
31
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
2
|
+
import { capitalize } from "@allurereport/web-commons";
|
|
3
|
+
import { Grid, GridItem, Loadable, PageLoader, SuccessRatePieChart } from "@allurereport/web-components";
|
|
4
|
+
import { useEffect } from "preact/hooks";
|
|
5
|
+
import { type ChartData, ChartType, dashboardStore, fetchDashboardData } from "@/stores/dashboard";
|
|
6
|
+
import { useI18n } from "@/stores/locale";
|
|
7
|
+
import { TrendChartWidget } from "./components/TrendChartWidget";
|
|
8
|
+
import { Widget } from "./components/Widget";
|
|
9
|
+
import * as styles from "./styles.scss";
|
|
10
|
+
|
|
11
|
+
const getChartWidgetByType = (chartData: ChartData, t: (key: string, options?: any) => string) => {
|
|
12
|
+
switch (chartData.type) {
|
|
13
|
+
case ChartType.Trend: {
|
|
14
|
+
const type = t(`trend.type.${chartData.dataType}`);
|
|
15
|
+
const title = chartData.title ?? t("trend.title", { type: capitalize(type) });
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<TrendChartWidget
|
|
19
|
+
title={title}
|
|
20
|
+
items={chartData.items}
|
|
21
|
+
slices={chartData.slices}
|
|
22
|
+
min={chartData.min}
|
|
23
|
+
max={chartData.max}
|
|
24
|
+
/>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
case ChartType.Pie: {
|
|
28
|
+
const title = chartData.title ?? t("pie.title");
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<Widget title={title}>
|
|
32
|
+
<div className={styles["overview-grid-item-pie-chart-wrapper"]}>
|
|
33
|
+
<div className={styles["overview-grid-item-pie-chart-wrapper-squeezer"]}>
|
|
34
|
+
<SuccessRatePieChart slices={chartData.slices} percentage={chartData.percentage} />
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</Widget>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const Dashboard = () => {
|
|
44
|
+
const { t } = useI18n("charts");
|
|
45
|
+
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
fetchDashboardData();
|
|
48
|
+
}, []);
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<Loadable
|
|
52
|
+
source={dashboardStore}
|
|
53
|
+
renderLoader={() => <PageLoader />}
|
|
54
|
+
renderData={(data) => {
|
|
55
|
+
const charts = Object.entries(data).map(([chartId, value]) => {
|
|
56
|
+
const chartWidget = getChartWidgetByType(value, t);
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<GridItem key={chartId} className={styles["overview-grid-item"]}>
|
|
60
|
+
{chartWidget}
|
|
61
|
+
</GridItem>
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<div className={styles.overview}>
|
|
67
|
+
<Grid kind="swap" className={styles["overview-grid"]}>
|
|
68
|
+
{charts}
|
|
69
|
+
</Grid>
|
|
70
|
+
</div>
|
|
71
|
+
);
|
|
72
|
+
}}
|
|
73
|
+
/>
|
|
74
|
+
);
|
|
75
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
.overview {
|
|
2
|
+
padding: 24px;
|
|
3
|
+
width: 100%;
|
|
4
|
+
height: 100%;
|
|
5
|
+
overflow-y: auto;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.overview-grid {
|
|
9
|
+
display: grid;
|
|
10
|
+
gap: 24px;
|
|
11
|
+
grid-template-columns: repeat(auto-fit, minmax(min(100%, calc(50% - 12px)), 1fr));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.overview-grid-item {
|
|
15
|
+
padding: 12px;
|
|
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
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReportLogoFull, Text } from "@allurereport/web-components";
|
|
2
|
+
import * as styles from "./styles.scss";
|
|
3
|
+
|
|
4
|
+
export const FooterLogo = () => {
|
|
5
|
+
return (
|
|
6
|
+
<div className={styles["footer-logo"]}>
|
|
7
|
+
<a href="https://allurereport.org" target={"_blank"} rel="noreferrer">
|
|
8
|
+
<Text type="paragraph" size="m" className={styles["footer-logo"]}>
|
|
9
|
+
Powered by
|
|
10
|
+
</Text>
|
|
11
|
+
<ReportLogoFull className={styles.logo} />
|
|
12
|
+
</a>
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { getReportOptions } from "@allurereport/web-commons";
|
|
2
|
+
import { Text } from "@allurereport/web-components";
|
|
3
|
+
import { useEffect, useState } from "preact/hooks";
|
|
4
|
+
import type { DashboardReportOptions } from "types";
|
|
5
|
+
import { currentLocaleIso } from "@/stores/locale";
|
|
6
|
+
import * as styles from "./styles.scss";
|
|
7
|
+
|
|
8
|
+
export const FooterVersion = () => {
|
|
9
|
+
const [createdAt, setCreatedAt] = useState<number | null>(null);
|
|
10
|
+
const [currentVersion, setCurrentVersion] = useState<string>();
|
|
11
|
+
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const reportOptions = getReportOptions<DashboardReportOptions>();
|
|
14
|
+
if (reportOptions?.createdAt) {
|
|
15
|
+
setCreatedAt(Number(reportOptions.createdAt));
|
|
16
|
+
}
|
|
17
|
+
if (reportOptions?.allureVersion) {
|
|
18
|
+
setCurrentVersion(reportOptions.allureVersion as string);
|
|
19
|
+
}
|
|
20
|
+
}, []);
|
|
21
|
+
|
|
22
|
+
const formattedCreatedAt = new Date(createdAt as number).toLocaleDateString(currentLocaleIso.value as string, {
|
|
23
|
+
month: "numeric",
|
|
24
|
+
day: "numeric",
|
|
25
|
+
year: "numeric",
|
|
26
|
+
hour: "numeric",
|
|
27
|
+
minute: "numeric",
|
|
28
|
+
second: "numeric",
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<Text type="paragraph" size="m" className={styles.version}>
|
|
33
|
+
{formattedCreatedAt}
|
|
34
|
+
{currentVersion && <span> Ver: {currentVersion}</span>}
|
|
35
|
+
</Text>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { clsx } from "clsx";
|
|
2
|
+
import * as styles from "@/components/BaseLayout/styles.scss";
|
|
3
|
+
import { FooterLogo } from "@/components/Footer/FooterLogo";
|
|
4
|
+
import { FooterVersion } from "@/components/Footer/FooterVersion";
|
|
5
|
+
|
|
6
|
+
export const Footer = () => {
|
|
7
|
+
return (
|
|
8
|
+
<div className={clsx(styles.below)}>
|
|
9
|
+
<FooterLogo />
|
|
10
|
+
<FooterVersion />
|
|
11
|
+
</div>
|
|
12
|
+
);
|
|
13
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { LanguagePicker, ThemeButton } from "@allurereport/web-components";
|
|
2
|
+
import type { ClassValue } from "clsx";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { currentLocale, setLocale } from "@/stores/locale";
|
|
5
|
+
import { getTheme, themeStore, toggleTheme } from "@/stores/theme";
|
|
6
|
+
import * as styles from "./styles.scss";
|
|
7
|
+
|
|
8
|
+
interface HeaderProps {
|
|
9
|
+
className?: ClassValue;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const Header = ({ className }: HeaderProps) => {
|
|
13
|
+
return (
|
|
14
|
+
<div className={clsx(styles.above, className)}>
|
|
15
|
+
<div className={styles.right}>
|
|
16
|
+
<LanguagePicker locale={currentLocale.value} setLocale={setLocale} />
|
|
17
|
+
<ThemeButton theme={themeStore.value} toggleTheme={toggleTheme} getTheme={getTheme} />
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
.above {
|
|
2
|
+
margin-bottom: 12px;
|
|
3
|
+
display: flex;
|
|
4
|
+
width: 100%;
|
|
5
|
+
justify-content: space-between;
|
|
6
|
+
align-items: center;
|
|
7
|
+
gap: 12px;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.logoWrapper {
|
|
11
|
+
margin-right: auto;
|
|
12
|
+
color: var(--on-text-secondary);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.logo {
|
|
16
|
+
margin-right: 8px;
|
|
17
|
+
color: var(--on-icon-secondary);
|
|
18
|
+
top: -2px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.left {
|
|
22
|
+
margin-right: auto;
|
|
23
|
+
display: flex;
|
|
24
|
+
gap: 12px;
|
|
25
|
+
align-items: center;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.right {
|
|
29
|
+
margin-left: auto;
|
|
30
|
+
display: flex;
|
|
31
|
+
gap: 4px;
|
|
32
|
+
align-items: center;
|
|
33
|
+
}
|
package/src/index.html
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>Allure Dashboard</title>
|
|
5
|
+
<link rel="icon" href="data:image/svg+xml,%3Csvg width='32' height='32' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M22.232 4.662a3.6 3.6 0 0 1 5.09.035c2.855 2.894 4.662 6.885 4.662 11.295a3.6 3.6 0 0 1-7.2 0c0-2.406-.981-4.61-2.587-6.24a3.6 3.6 0 0 1 .035-5.09Z' fill='url(%23a)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12.392 3.6a3.6 3.6 0 0 1 3.6-3.6c4.41 0 8.401 1.807 11.296 4.662a3.6 3.6 0 1 1-5.056 5.126C20.602 8.18 18.398 7.2 15.992 7.2a3.6 3.6 0 0 1-3.6-3.6Z' fill='url(%23b)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M0 15.992C0 7.157 7.157 0 15.992 0a3.6 3.6 0 0 1 0 7.2A8.789 8.789 0 0 0 7.2 15.992c0 2.406.981 4.61 2.588 6.24a3.6 3.6 0 0 1-5.126 5.056C1.807 24.393 0 20.402 0 15.992Z' fill='url(%23c)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4.661 22.232a3.6 3.6 0 0 1 5.091-.035c1.63 1.606 3.834 2.587 6.24 2.587a3.6 3.6 0 0 1 0 7.2c-4.41 0-8.401-1.807-11.295-4.661a3.6 3.6 0 0 1-.036-5.091Z' fill='url(%23d)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M28.384 12.392a3.6 3.6 0 0 1 3.6 3.6c0 8.835-7.157 15.992-15.992 15.992a3.6 3.6 0 0 1 0-7.2 8.789 8.789 0 0 0 8.792-8.792 3.6 3.6 0 0 1 3.6-3.6Z' fill='url(%23e)'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M28.385 12.392a3.6 3.6 0 0 1 3.6 3.6v12.392a3.6 3.6 0 0 1-7.2 0V15.992a3.6 3.6 0 0 1 3.6-3.6Z' fill='url(%23f)'/%3E%3Cg clip-path='url(%23g)'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M22.232 4.662a3.6 3.6 0 0 1 5.091.035c2.855 2.894 4.662 6.885 4.662 11.295a3.6 3.6 0 0 1-7.2 0c0-2.406-.982-4.61-2.588-6.24a3.6 3.6 0 0 1 .035-5.09Z' fill='url(%23h)'/%3E%3C/g%3E%3Cdefs%3E%3ClinearGradient id='a' x1='26.4' y1='9.6' x2='28.8' y2='15' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%237E22CE'/%3E%3Cstop offset='1' stop-color='%238B5CF6'/%3E%3C/linearGradient%3E%3ClinearGradient id='b' x1='26.8' y1='9.4' x2='17.8' y2='3.6' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%23EF4444'/%3E%3Cstop offset='1' stop-color='%23DC2626'/%3E%3C/linearGradient%3E%3ClinearGradient id='c' x1='3.6' y1='14' x2='5.4' y2='24.8' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2322C55E'/%3E%3Cstop offset='1' stop-color='%2315803D'/%3E%3C/linearGradient%3E%3ClinearGradient id='d' x1='4.8' y1='22.2' x2='14.4' y2='29.2' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%2394A3B8'/%3E%3Cstop offset='.958' stop-color='%2364748B'/%3E%3Cstop offset='1' stop-color='%2364748B'/%3E%3C/linearGradient%3E%3ClinearGradient id='e' x1='28.4' y1='22.173' x2='22.188' y2='28.384' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%23D97706'/%3E%3Cstop offset='1' stop-color='%23FBBF24'/%3E%3C/linearGradient%3E%3ClinearGradient id='f' x1='29.2' y1='54.4' x2='30.626' y2='54.256' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%23FBBF24'/%3E%3Cstop offset='1' stop-color='%23FBBF24'/%3E%3C/linearGradient%3E%3ClinearGradient id='h' x1='26.4' y1='9.6' x2='28.8' y2='15' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%237E22CE'/%3E%3Cstop offset='1' stop-color='%238B5CF6'/%3E%3C/linearGradient%3E%3CclipPath id='g'%3E%3Cpath fill='%23fff' transform='translate(24.8 12)' d='M0 0h7.2v8H0z'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E" />
|
|
6
|
+
<base href="http://localhost:8080" />
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div id="app"></div>
|
|
10
|
+
<script>
|
|
11
|
+
window.allure = window.allure || {};
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<script>
|
|
15
|
+
const { origin, pathname } = window.location;
|
|
16
|
+
const url = new URL(pathname, origin);
|
|
17
|
+
const baseEl = document.createElement("base");
|
|
18
|
+
|
|
19
|
+
baseEl.href = url.toString();
|
|
20
|
+
|
|
21
|
+
window.document.head.appendChild(baseEl);
|
|
22
|
+
</script>
|
|
23
|
+
<script>
|
|
24
|
+
window.allureReportOptions = {
|
|
25
|
+
"reportName": "Allure Report",
|
|
26
|
+
"logo": "",
|
|
27
|
+
"theme": "light",
|
|
28
|
+
"reportLanguage": "en",
|
|
29
|
+
"createdAt": 1739819870336,
|
|
30
|
+
"reportUuid": "51b36daf-614b-409c-b6a2-e8e401b2c145",
|
|
31
|
+
"layout": [],
|
|
32
|
+
"allureVersion": "3.0.0-beta.8"
|
|
33
|
+
};
|
|
34
|
+
</script>
|
|
35
|
+
<script async>
|
|
36
|
+
window.allureReportDataReady = true;
|
|
37
|
+
</script>
|
|
38
|
+
</body>
|
|
39
|
+
</html>
|
package/src/index.tsx
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ensureReportDataReady } from "@allurereport/web-commons";
|
|
2
|
+
import "@allurereport/web-components/index.css";
|
|
3
|
+
import { render } from "preact";
|
|
4
|
+
import "@/assets/scss/index.scss";
|
|
5
|
+
import { BaseLayout } from "@/components/BaseLayout";
|
|
6
|
+
import { getLocale, waitForI18next } from "@/stores/locale";
|
|
7
|
+
import { getTheme } from "@/stores/theme";
|
|
8
|
+
import { isMac } from "@/utils/isMac";
|
|
9
|
+
import * as styles from "./styles.scss";
|
|
10
|
+
|
|
11
|
+
const App = () => (
|
|
12
|
+
<div className={styles.main}>
|
|
13
|
+
<BaseLayout />
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
const rootElement = document.getElementById("app");
|
|
18
|
+
|
|
19
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
20
|
+
if (isMac) {
|
|
21
|
+
document.documentElement.setAttribute("data-os", "mac");
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
(async () => {
|
|
26
|
+
await waitForI18next;
|
|
27
|
+
if (globalThis) {
|
|
28
|
+
await getLocale();
|
|
29
|
+
getTheme();
|
|
30
|
+
}
|
|
31
|
+
await ensureReportDataReady();
|
|
32
|
+
|
|
33
|
+
render(<App />, rootElement);
|
|
34
|
+
})();
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"statuses": {
|
|
3
|
+
"passed": "Keçdi",
|
|
4
|
+
"failed": "Uğursuz",
|
|
5
|
+
"broken": "Sınıq",
|
|
6
|
+
"skipped": "Keçildi",
|
|
7
|
+
"unknown": "Naməlum",
|
|
8
|
+
"total": "Cəmi"
|
|
9
|
+
},
|
|
10
|
+
"empty": {
|
|
11
|
+
"no-results": "Nəticə tapılmadı"
|
|
12
|
+
},
|
|
13
|
+
"severity": {
|
|
14
|
+
"blocker": "Bloklayıcı",
|
|
15
|
+
"critical": "Kritik",
|
|
16
|
+
"normal": "Normal",
|
|
17
|
+
"minor": "Kiçik",
|
|
18
|
+
"trivial": "Əhəmiyyətsiz"
|
|
19
|
+
},
|
|
20
|
+
"charts": {
|
|
21
|
+
"trend": {
|
|
22
|
+
"title": "Trend qrafiki: {{type}}",
|
|
23
|
+
"type": {
|
|
24
|
+
"status": "Status",
|
|
25
|
+
"severity": "Ciddilik"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"pie": {
|
|
29
|
+
"title": "Test Uğur Dərəcəsi"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"statuses": {
|
|
3
|
+
"passed": "Bestanden",
|
|
4
|
+
"failed": "Fehlgeschlagen",
|
|
5
|
+
"broken": "Defekt",
|
|
6
|
+
"skipped": "Übersprungen",
|
|
7
|
+
"unknown": "Unbekannt",
|
|
8
|
+
"total": "Gesamt"
|
|
9
|
+
},
|
|
10
|
+
"empty": {
|
|
11
|
+
"no-results": "Keine Ergebnisse"
|
|
12
|
+
},
|
|
13
|
+
"severity": {
|
|
14
|
+
"blocker": "Blocker",
|
|
15
|
+
"critical": "Kritisch",
|
|
16
|
+
"normal": "Normal",
|
|
17
|
+
"minor": "Geringfügig",
|
|
18
|
+
"trivial": "Trivial"
|
|
19
|
+
},
|
|
20
|
+
"charts": {
|
|
21
|
+
"trend": {
|
|
22
|
+
"title": "Trenddiagramm: {{type}}",
|
|
23
|
+
"type": {
|
|
24
|
+
"status": "Status",
|
|
25
|
+
"severity": "Schweregrad"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"pie": {
|
|
29
|
+
"title": "Testerfolgsrate"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"statuses": {
|
|
3
|
+
"passed": "Passed",
|
|
4
|
+
"failed": "Failed",
|
|
5
|
+
"broken": "Broken",
|
|
6
|
+
"skipped": "Skipped",
|
|
7
|
+
"unknown": "Unknown",
|
|
8
|
+
"total": "Total"
|
|
9
|
+
},
|
|
10
|
+
"empty": {
|
|
11
|
+
"no-results": "No results"
|
|
12
|
+
},
|
|
13
|
+
"severity": {
|
|
14
|
+
"blocker": "Blocker",
|
|
15
|
+
"critical": "Critical",
|
|
16
|
+
"normal": "Normal",
|
|
17
|
+
"minor": "Minor",
|
|
18
|
+
"trivial": "Trivial"
|
|
19
|
+
},
|
|
20
|
+
"charts": {
|
|
21
|
+
"trend": {
|
|
22
|
+
"title": "Trend Chart: {{type}}",
|
|
23
|
+
"type": {
|
|
24
|
+
"status": "Status",
|
|
25
|
+
"severity": "Severity"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"pie": {
|
|
29
|
+
"title": "Test Success Rate"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"statuses": {
|
|
3
|
+
"passed": "Aprobado",
|
|
4
|
+
"failed": "Fallido",
|
|
5
|
+
"broken": "Roto",
|
|
6
|
+
"skipped": "Omitido",
|
|
7
|
+
"unknown": "Desconocido",
|
|
8
|
+
"total": "Total"
|
|
9
|
+
},
|
|
10
|
+
"empty": {
|
|
11
|
+
"no-results": "Sin resultados"
|
|
12
|
+
},
|
|
13
|
+
"severity": {
|
|
14
|
+
"blocker": "Bloqueante",
|
|
15
|
+
"critical": "Crítico",
|
|
16
|
+
"normal": "Normal",
|
|
17
|
+
"minor": "Menor",
|
|
18
|
+
"trivial": "Trivial"
|
|
19
|
+
},
|
|
20
|
+
"charts": {
|
|
21
|
+
"trend": {
|
|
22
|
+
"title": "Gráfico de tendencia: {{type}}",
|
|
23
|
+
"type": {
|
|
24
|
+
"status": "Estado",
|
|
25
|
+
"severity": "Severidad"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"pie": {
|
|
29
|
+
"title": "Tasa de éxito de pruebas"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"statuses": {
|
|
3
|
+
"passed": "Réussi",
|
|
4
|
+
"failed": "Échoué",
|
|
5
|
+
"broken": "Cassé",
|
|
6
|
+
"skipped": "Ignoré",
|
|
7
|
+
"unknown": "Inconnu",
|
|
8
|
+
"total": "Total"
|
|
9
|
+
},
|
|
10
|
+
"empty": {
|
|
11
|
+
"no-results": "Aucun résultat"
|
|
12
|
+
},
|
|
13
|
+
"severity": {
|
|
14
|
+
"blocker": "Bloquant",
|
|
15
|
+
"critical": "Critique",
|
|
16
|
+
"normal": "Normal",
|
|
17
|
+
"minor": "Mineur",
|
|
18
|
+
"trivial": "Trivial"
|
|
19
|
+
},
|
|
20
|
+
"charts": {
|
|
21
|
+
"trend": {
|
|
22
|
+
"title": "Graphique de tendance: {{type}}",
|
|
23
|
+
"type": {
|
|
24
|
+
"status": "Statut",
|
|
25
|
+
"severity": "Sévérité"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"pie": {
|
|
29
|
+
"title": "Taux de réussite des tests"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"statuses": {
|
|
3
|
+
"passed": "עבר",
|
|
4
|
+
"failed": "נכשל",
|
|
5
|
+
"broken": "שבור",
|
|
6
|
+
"skipped": "דולג",
|
|
7
|
+
"unknown": "לא ידוע",
|
|
8
|
+
"total": "סך הכל"
|
|
9
|
+
},
|
|
10
|
+
"empty": {
|
|
11
|
+
"no-results": "אין תוצאות"
|
|
12
|
+
},
|
|
13
|
+
"severity": {
|
|
14
|
+
"blocker": "חוסם",
|
|
15
|
+
"critical": "קריטי",
|
|
16
|
+
"normal": "רגיל",
|
|
17
|
+
"minor": "משני",
|
|
18
|
+
"trivial": "שולי"
|
|
19
|
+
},
|
|
20
|
+
"charts": {
|
|
21
|
+
"trend": {
|
|
22
|
+
"title": "תרשים מגמה: {{type}}",
|
|
23
|
+
"type": {
|
|
24
|
+
"status": "סטטוס",
|
|
25
|
+
"severity": "חומרה"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"pie": {
|
|
29
|
+
"title": "שיעור הצלחת הבדיקות"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|