@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.
Files changed (93) hide show
  1. package/.babelrc.js +22 -0
  2. package/.eslintrc.cjs +18 -0
  3. package/CONTRIBUTING.md +33 -0
  4. package/README.md +27 -0
  5. package/dist/multi/173.app-1ef294bc.js +1 -0
  6. package/dist/multi/174.app-1ef294bc.js +1 -0
  7. package/dist/multi/252.app-1ef294bc.js +1 -0
  8. package/dist/multi/282.app-1ef294bc.js +1 -0
  9. package/dist/multi/29.app-1ef294bc.js +1 -0
  10. package/dist/multi/416.app-1ef294bc.js +1 -0
  11. package/dist/multi/527.app-1ef294bc.js +1 -0
  12. package/dist/multi/600.app-1ef294bc.js +1 -0
  13. package/dist/multi/605.app-1ef294bc.js +1 -0
  14. package/dist/multi/638.app-1ef294bc.js +1 -0
  15. package/dist/multi/672.app-1ef294bc.js +1 -0
  16. package/dist/multi/686.app-1ef294bc.js +1 -0
  17. package/dist/multi/725.app-1ef294bc.js +1 -0
  18. package/dist/multi/741.app-1ef294bc.js +1 -0
  19. package/dist/multi/755.app-1ef294bc.js +1 -0
  20. package/dist/multi/894.app-1ef294bc.js +1 -0
  21. package/dist/multi/943.app-1ef294bc.js +1 -0
  22. package/dist/multi/980.app-1ef294bc.js +1 -0
  23. package/dist/multi/JetBrainsMono_vf-9e9649b6..woff2 +0 -0
  24. package/dist/multi/JetBrainsMono_vf-b9a9c326..woff +0 -0
  25. package/dist/multi/app-1ef294bc.js +2 -0
  26. package/dist/multi/app-1ef294bc.js.LICENSE.txt +15 -0
  27. package/dist/multi/manifest.json +26 -0
  28. package/dist/multi/pt-root-ui_vf-22fe60ca..woff +0 -0
  29. package/dist/multi/pt-root-ui_vf-9d251e8b..woff2 +0 -0
  30. package/dist/multi/styles-1ef294bc.css +8 -0
  31. package/dist/single/app-4b8d700b.js +2 -0
  32. package/dist/single/app-4b8d700b.js.LICENSE.txt +15 -0
  33. package/dist/single/manifest.json +3 -0
  34. package/package.json +98 -0
  35. package/postcss.config.js +5 -0
  36. package/src/assets/scss/_common.scss +143 -0
  37. package/src/assets/scss/day.scss +51 -0
  38. package/src/assets/scss/fonts.scss +3 -0
  39. package/src/assets/scss/index.scss +7 -0
  40. package/src/assets/scss/night.scss +61 -0
  41. package/src/assets/scss/palette.scss +393 -0
  42. package/src/assets/scss/theme.scss +119 -0
  43. package/src/assets/scss/vars.scss +8 -0
  44. package/src/assets/svg/line-alerts-alert-circle.svg +12 -0
  45. package/src/assets/svg/line-general-eye.svg +7 -0
  46. package/src/assets/svg/line-icon-bomb-2.svg +12 -0
  47. package/src/components/BaseLayout/index.tsx +17 -0
  48. package/src/components/BaseLayout/styles.scss +59 -0
  49. package/src/components/Dashboard/components/TrendChartWidget/index.tsx +69 -0
  50. package/src/components/Dashboard/components/Widget/index.tsx +19 -0
  51. package/src/components/Dashboard/components/Widget/styles.scss +31 -0
  52. package/src/components/Dashboard/index.tsx +75 -0
  53. package/src/components/Dashboard/styles.scss +29 -0
  54. package/src/components/Footer/FooterLogo.tsx +15 -0
  55. package/src/components/Footer/FooterVersion.tsx +37 -0
  56. package/src/components/Footer/index.tsx +13 -0
  57. package/src/components/Footer/styles.scss +14 -0
  58. package/src/components/Header/index.tsx +21 -0
  59. package/src/components/Header/styles.scss +33 -0
  60. package/src/components/MainReport/index.tsx +12 -0
  61. package/src/components/MainReport/styles.scss +6 -0
  62. package/src/index.html +39 -0
  63. package/src/index.tsx +34 -0
  64. package/src/locales/az.json +32 -0
  65. package/src/locales/de.json +32 -0
  66. package/src/locales/en.json +32 -0
  67. package/src/locales/es.json +32 -0
  68. package/src/locales/fr.json +32 -0
  69. package/src/locales/he.json +32 -0
  70. package/src/locales/hy.json +32 -0
  71. package/src/locales/it.json +32 -0
  72. package/src/locales/ja.json +32 -0
  73. package/src/locales/ka.json +32 -0
  74. package/src/locales/kr.json +32 -0
  75. package/src/locales/nl.json +32 -0
  76. package/src/locales/pl.json +32 -0
  77. package/src/locales/pt.json +32 -0
  78. package/src/locales/ru.json +32 -0
  79. package/src/locales/sv.json +32 -0
  80. package/src/locales/tr.json +32 -0
  81. package/src/locales/zh.json +32 -0
  82. package/src/stores/dashboard.ts +206 -0
  83. package/src/stores/locale.ts +75 -0
  84. package/src/stores/theme.ts +32 -0
  85. package/src/stores/types.ts +5 -0
  86. package/src/styles.scss +45 -0
  87. package/src/types/globals.d.ts +13 -0
  88. package/src/types/window.d.ts +8 -0
  89. package/src/utils/isMac.ts +8 -0
  90. package/tsconfig.json +27 -0
  91. package/types.d.ts +21 -0
  92. package/vitest.config.ts +19 -0
  93. 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,14 @@
1
+ .footer-logo {
2
+ color: var(--on-text-secondary);
3
+ a {
4
+ text-decoration: none;
5
+ }
6
+ }
7
+
8
+ .logo {
9
+ margin-left: 8px;
10
+ }
11
+
12
+ .version {
13
+ color: var(--on-text-hint);
14
+ }
@@ -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
+ }
@@ -0,0 +1,12 @@
1
+ import { Dashboard } from "@/components/Dashboard";
2
+ import { Header } from "@/components/Header";
3
+
4
+ const MainReport = () => {
5
+ return (
6
+ <>
7
+ <Header />
8
+ <Dashboard />
9
+ </>
10
+ );
11
+ };
12
+ export default MainReport;
@@ -0,0 +1,6 @@
1
+ .content {
2
+ box-shadow: var(--shadow-small);
3
+ background: var(--bg-base-primary);
4
+ border-radius: 12px;
5
+ width: 100%;
6
+ }
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
+ }