@allurereport/web-dashboard 3.3.0 → 3.4.0

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 (50) hide show
  1. package/dist/multi/310.app-c35820f9526d89a9502d.js +1 -0
  2. package/dist/multi/507.app-c35820f9526d89a9502d.js +1 -0
  3. package/dist/multi/686.app-c35820f9526d89a9502d.js +1 -0
  4. package/dist/multi/app-c35820f9526d89a9502d.js +2 -0
  5. package/dist/multi/manifest.json +23 -21
  6. package/dist/multi/{styles-011dd2d56853503b8210.css → styles-ba2f7910ded8751a5da3.css} +4 -4
  7. package/dist/single/app-31fba1f25f971fe4047e.js +2 -0
  8. package/dist/single/manifest.json +1 -1
  9. package/package.json +17 -35
  10. package/src/components/BaseLayout/index.tsx +2 -0
  11. package/src/components/Dashboard/index.tsx +3 -0
  12. package/src/components/EnvironmentPicker/index.tsx +78 -18
  13. package/src/components/EnvironmentPicker/styles.scss +19 -0
  14. package/src/components/Footer/FooterLogo.tsx +1 -0
  15. package/src/components/Footer/FooterVersion.tsx +2 -0
  16. package/src/components/Footer/index.tsx +3 -1
  17. package/src/components/Header/index.tsx +3 -0
  18. package/src/components/Header/styles.scss +1 -0
  19. package/src/index.tsx +3 -0
  20. package/src/locales/ar.json +227 -0
  21. package/src/locales/az.json +14 -14
  22. package/src/locales/zh-TW.json +227 -0
  23. package/src/stores/dashboard.ts +1 -0
  24. package/src/stores/env.ts +14 -3
  25. package/src/stores/locale.ts +1 -0
  26. package/tsconfig.json +2 -2
  27. package/.eslintrc.cjs +0 -18
  28. package/dist/multi/686.app-6e16634fb6316062546e.js +0 -1
  29. package/dist/multi/app-6e16634fb6316062546e.js +0 -2
  30. package/dist/single/app-a4723ecfb6c2e831c7c0.js +0 -2
  31. /package/dist/multi/{173.app-6e16634fb6316062546e.js → 173.app-c35820f9526d89a9502d.js} +0 -0
  32. /package/dist/multi/{174.app-6e16634fb6316062546e.js → 174.app-c35820f9526d89a9502d.js} +0 -0
  33. /package/dist/multi/{252.app-6e16634fb6316062546e.js → 252.app-c35820f9526d89a9502d.js} +0 -0
  34. /package/dist/multi/{282.app-6e16634fb6316062546e.js → 282.app-c35820f9526d89a9502d.js} +0 -0
  35. /package/dist/multi/{29.app-6e16634fb6316062546e.js → 29.app-c35820f9526d89a9502d.js} +0 -0
  36. /package/dist/multi/{416.app-6e16634fb6316062546e.js → 416.app-c35820f9526d89a9502d.js} +0 -0
  37. /package/dist/multi/{527.app-6e16634fb6316062546e.js → 527.app-c35820f9526d89a9502d.js} +0 -0
  38. /package/dist/multi/{600.app-6e16634fb6316062546e.js → 600.app-c35820f9526d89a9502d.js} +0 -0
  39. /package/dist/multi/{605.app-6e16634fb6316062546e.js → 605.app-c35820f9526d89a9502d.js} +0 -0
  40. /package/dist/multi/{638.app-6e16634fb6316062546e.js → 638.app-c35820f9526d89a9502d.js} +0 -0
  41. /package/dist/multi/{672.app-6e16634fb6316062546e.js → 672.app-c35820f9526d89a9502d.js} +0 -0
  42. /package/dist/multi/{725.app-6e16634fb6316062546e.js → 725.app-c35820f9526d89a9502d.js} +0 -0
  43. /package/dist/multi/{741.app-6e16634fb6316062546e.js → 741.app-c35820f9526d89a9502d.js} +0 -0
  44. /package/dist/multi/{749.app-6e16634fb6316062546e.js → 749.app-c35820f9526d89a9502d.js} +0 -0
  45. /package/dist/multi/{755.app-6e16634fb6316062546e.js → 755.app-c35820f9526d89a9502d.js} +0 -0
  46. /package/dist/multi/{894.app-6e16634fb6316062546e.js → 894.app-c35820f9526d89a9502d.js} +0 -0
  47. /package/dist/multi/{943.app-6e16634fb6316062546e.js → 943.app-c35820f9526d89a9502d.js} +0 -0
  48. /package/dist/multi/{980.app-6e16634fb6316062546e.js → 980.app-c35820f9526d89a9502d.js} +0 -0
  49. /package/dist/multi/{app-6e16634fb6316062546e.js.LICENSE.txt → app-c35820f9526d89a9502d.js.LICENSE.txt} +0 -0
  50. /package/dist/single/{app-a4723ecfb6c2e831c7c0.js.LICENSE.txt → app-31fba1f25f971fe4047e.js.LICENSE.txt} +0 -0
@@ -1,3 +1,3 @@
1
1
  {
2
- "main.js": "app-a4723ecfb6c2e831c7c0.js"
2
+ "main.js": "app-31fba1f25f971fe4047e.js"
3
3
  }
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@allurereport/web-dashboard",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "description": "The static files for Allure Dashboard Report",
5
5
  "keywords": [
6
6
  "allure",
7
- "testing",
7
+ "html",
8
8
  "report",
9
- "html"
9
+ "testing"
10
10
  ],
11
- "repository": "https://github.com/allure-framework/allure3",
12
11
  "license": "Apache-2.0",
13
12
  "author": "Qameta Software",
13
+ "repository": "https://github.com/allure-framework/allure3",
14
14
  "type": "module",
15
15
  "types": "./types.d.ts",
16
16
  "scripts": {
@@ -22,19 +22,15 @@
22
22
  "build:prod:multi": "webpack --mode production",
23
23
  "build:dev:single": "SINGLE_FILE_MODE=1 webpack --mode development",
24
24
  "build:dev:multi": "webpack --mode development",
25
- "lint": "eslint --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
26
- "test": "vitest run"
25
+ "lint": "oxlint --import-plugin src test features stories",
26
+ "test": "vitest run",
27
+ "lint:fix": "oxlint --import-plugin --fix src test features stories"
27
28
  },
28
- "browserslist": [
29
- "last 1 version",
30
- "> 1%",
31
- "IE 11"
32
- ],
33
29
  "dependencies": {
34
- "@allurereport/charts-api": "3.3.0",
35
- "@allurereport/core-api": "3.3.0",
36
- "@allurereport/web-commons": "3.3.0",
37
- "@allurereport/web-components": "3.3.0",
30
+ "@allurereport/charts-api": "3.4.0",
31
+ "@allurereport/core-api": "3.4.0",
32
+ "@allurereport/web-commons": "3.4.0",
33
+ "@allurereport/web-components": "3.4.0",
38
34
  "@preact/signals": "^2.6.1",
39
35
  "clsx": "^2.1.1",
40
36
  "i18next": "^24.0.2",
@@ -45,17 +41,12 @@
45
41
  "@babel/plugin-transform-react-jsx": "^7.27.1",
46
42
  "@babel/preset-env": "^7.27.2",
47
43
  "@babel/preset-typescript": "^7.27.1",
48
- "@eslint/js": "^9.10.0",
49
44
  "@floating-ui/dom": "^1.6.12",
50
45
  "@preact/compat": "^18.3.1",
51
- "@stylistic/eslint-plugin": "^2.6.1",
52
46
  "@types/babel__core": "^7.20.5",
53
47
  "@types/d3-shape": "^3.1.6",
54
48
  "@types/diff": "^7",
55
- "@types/eslint": "^8.56.11",
56
49
  "@types/node": "^20.17.9",
57
- "@typescript-eslint/eslint-plugin": "^8.0.0",
58
- "@typescript-eslint/parser": "^8.0.0",
59
50
  "@vitest/runner": "^2.1.9",
60
51
  "@vitest/snapshot": "^2.1.9",
61
52
  "allure-vitest": "^3.3.3",
@@ -63,19 +54,6 @@
63
54
  "babel-loader": "^9.2.1",
64
55
  "babel-plugin-prismjs": "^2.1.0",
65
56
  "css-loader": "^7.1.2",
66
- "eslint": "^8.57.0",
67
- "eslint-config-preact": "^1.5.0",
68
- "eslint-config-prettier": "^9.1.0",
69
- "eslint-plugin-compat": "^6.0.1",
70
- "eslint-plugin-import": "^2.29.1",
71
- "eslint-plugin-jsdoc": "^50.0.0",
72
- "eslint-plugin-jsx-a11y": "^6.10.0",
73
- "eslint-plugin-n": "^17.10.1",
74
- "eslint-plugin-no-null": "^1.0.2",
75
- "eslint-plugin-preact": "^0.1.0",
76
- "eslint-plugin-prefer-arrow": "^1.2.3",
77
- "eslint-plugin-react": "^7.36.1",
78
- "eslint-plugin-react-hooks": "^4.6.2",
79
57
  "fork-ts-checker-webpack-plugin": "^9.0.2",
80
58
  "globals": "^15.9.0",
81
59
  "html-webpack-plugin": "^5.6.3",
@@ -88,11 +66,15 @@
88
66
  "style-loader": "^4.0.0",
89
67
  "svg-sprite-loader": "^6.0.11",
90
68
  "typescript": "^5.6.3",
91
- "typescript-eslint": "^8.6.0",
92
69
  "vitest": "^2.1.9",
93
70
  "webpack": "^5.99.9",
94
71
  "webpack-cli": "^5.1.4",
95
72
  "webpack-dev-server": "^5.2.2",
96
73
  "webpack-manifest-plugin": "^5.0.0"
97
- }
74
+ },
75
+ "browserslist": [
76
+ "last 1 version",
77
+ "> 1%",
78
+ "IE 11"
79
+ ]
98
80
  }
@@ -1,6 +1,8 @@
1
1
  import type { FC } from "preact/compat";
2
+
2
3
  import { Footer } from "@/components/Footer";
3
4
  import MainReport from "@/components/MainReport";
5
+
4
6
  import * as styles from "./styles.scss";
5
7
 
6
8
  export type BaseLayoutProps = {};
@@ -22,9 +22,11 @@ import {
22
22
  } from "@allurereport/web-components";
23
23
  import { computed } from "@preact/signals";
24
24
  import { useEffect } from "preact/hooks";
25
+
25
26
  import { dashboardStore, fetchDashboardData } from "@/stores/dashboard";
26
27
  import { currentEnvironment, fetchEnvironments } from "@/stores/env";
27
28
  import { useI18n } from "@/stores/locale";
29
+
28
30
  import * as styles from "./styles.scss";
29
31
 
30
32
  const currentTheme = computed(() => themeStore.value.current);
@@ -97,6 +99,7 @@ const getChartWidgetByType = (
97
99
  data={chartData.data}
98
100
  keys={chartData.keys}
99
101
  i18n={(key, props = {}) => t(`stabilityDistribution.${key}`, props)}
102
+ threshold={chartData.threshold}
100
103
  />
101
104
  );
102
105
  }
@@ -1,12 +1,57 @@
1
- import { DropdownButton, Menu, SvgIcon, Text, allureIcons } from "@allurereport/web-components";
2
- import { currentEnvironment, environmentsStore, setCurrentEnvironment } from "@/stores/env";
1
+ import {
2
+ DropdownButton,
3
+ Menu,
4
+ SvgIcon,
5
+ Text,
6
+ TooltipWrapper,
7
+ allureIcons,
8
+ useElementTruncation,
9
+ } from "@allurereport/web-components";
10
+ import { useEffect, useRef, useState } from "preact/hooks";
11
+
12
+ import { currentEnvironment, environmentNameById, environmentsStore, setCurrentEnvironment } from "@/stores/env";
3
13
  import { useI18n } from "@/stores/locale";
14
+
4
15
  import * as styles from "./styles.scss";
5
16
 
17
+ const isOverflowing = (element: HTMLElement) => element.scrollWidth > element.clientWidth;
18
+
19
+ const EnvironmentMenuItemText = ({ value }: { value: string }) => {
20
+ const textRef = useRef<HTMLSpanElement>(null);
21
+ const [isTruncated, setIsTruncated] = useState(false);
22
+
23
+ useEffect(() => {
24
+ const element = textRef.current;
25
+
26
+ if (!element) {
27
+ return;
28
+ }
29
+
30
+ setIsTruncated(isOverflowing(element));
31
+ }, [value]);
32
+
33
+ const textNode = (
34
+ <span ref={textRef} className={styles["environment-picker-item-text"]}>
35
+ {value}
36
+ </span>
37
+ );
38
+
39
+ if (!isTruncated) {
40
+ return textNode;
41
+ }
42
+
43
+ return <TooltipWrapper tooltipText={value}>{textNode}</TooltipWrapper>;
44
+ };
45
+
6
46
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
7
47
  export const EnvironmentPicker = () => {
8
48
  const { t } = useI18n("environments");
9
- const environment = currentEnvironment.value;
49
+ const environmentId = currentEnvironment.value;
50
+ const selectedEnvironmentLabel = environmentId ? environmentNameById(environmentId) : t("all");
51
+ const { ref: selectedTextRef, isTruncated: isSelectedValueTruncated } = useElementTruncation<HTMLSpanElement>([
52
+ selectedEnvironmentLabel,
53
+ ]);
54
+
10
55
  const handleSelect = (selectedOption: string) => {
11
56
  setCurrentEnvironment(selectedOption);
12
57
  };
@@ -24,33 +69,48 @@ export const EnvironmentPicker = () => {
24
69
  </Text>
25
70
  <Menu
26
71
  size="s"
27
- menuTrigger={({ isOpened, onClick }) => (
28
- <DropdownButton
29
- style="ghost"
30
- size="s"
31
- text={environment || t("all")}
32
- isExpanded={isOpened}
33
- data-testid={"environment-picker-button"}
34
- onClick={onClick}
35
- />
36
- )}
72
+ menuTrigger={({ isOpened, onClick }) => {
73
+ const button = (
74
+ <DropdownButton
75
+ style="ghost"
76
+ size="s"
77
+ text={selectedEnvironmentLabel}
78
+ textRef={selectedTextRef}
79
+ isExpanded={isOpened}
80
+ isTextTruncated
81
+ className={styles["environment-picker-button"]}
82
+ data-testid={"environment-picker-button"}
83
+ onClick={onClick}
84
+ />
85
+ );
86
+
87
+ if (isOpened || !isSelectedValueTruncated) {
88
+ return button;
89
+ }
90
+
91
+ return (
92
+ <TooltipWrapper tooltipText={selectedEnvironmentLabel} data-testid="environment-picker-selected-tooltip">
93
+ {button}
94
+ </TooltipWrapper>
95
+ );
96
+ }}
37
97
  >
38
98
  <Menu.Section>
39
99
  <Menu.ItemWithCheckmark
40
100
  data-testid={"environment-picker-item"}
41
101
  onClick={() => handleSelect("")}
42
- isChecked={!environment}
102
+ isChecked={!environmentId}
43
103
  >
44
104
  {t("all")}
45
105
  </Menu.ItemWithCheckmark>
46
106
  {environmentsStore.value.data.map((env) => (
47
107
  <Menu.ItemWithCheckmark
48
108
  data-testid={"environment-picker-item"}
49
- onClick={() => handleSelect(env)}
50
- key={env}
51
- isChecked={env === environment}
109
+ onClick={() => handleSelect(env.id)}
110
+ key={env.id}
111
+ isChecked={env.id === environmentId}
52
112
  >
53
- {env}
113
+ <EnvironmentMenuItemText value={env.name} />
54
114
  </Menu.ItemWithCheckmark>
55
115
  ))}
56
116
  </Menu.Section>
@@ -2,8 +2,27 @@
2
2
  display: flex;
3
3
  align-items: center;
4
4
  gap: 0 4px;
5
+ min-width: 0;
6
+
7
+ > :last-child {
8
+ min-width: 0;
9
+ max-width: 100%;
10
+ flex: 1 1 auto;
11
+ }
5
12
  }
6
13
 
7
14
  .environment-picker-label {
8
15
  text-transform: capitalize;
9
16
  }
17
+
18
+ .environment-picker-button {
19
+ max-width: 100%;
20
+ }
21
+
22
+ .environment-picker-item-text {
23
+ display: block;
24
+ max-width: 140px;
25
+ white-space: nowrap;
26
+ overflow: hidden;
27
+ text-overflow: ellipsis;
28
+ }
@@ -1,4 +1,5 @@
1
1
  import { ReportLogoFull, Text } from "@allurereport/web-components";
2
+
2
3
  import * as styles from "./styles.scss";
3
4
 
4
5
  export const FooterLogo = () => {
@@ -2,7 +2,9 @@ import { getReportOptions } from "@allurereport/web-commons";
2
2
  import { Text } from "@allurereport/web-components";
3
3
  import { useEffect, useState } from "preact/hooks";
4
4
  import type { DashboardReportOptions } from "types";
5
+
5
6
  import { currentLocaleIso } from "@/stores/locale";
7
+
6
8
  import * as styles from "./styles.scss";
7
9
 
8
10
  export const FooterVersion = () => {
@@ -1,8 +1,10 @@
1
1
  import { clsx } from "clsx";
2
- import * as styles from "@/components/BaseLayout/styles.scss";
2
+
3
3
  import { FooterLogo } from "@/components/Footer/FooterLogo";
4
4
  import { FooterVersion } from "@/components/Footer/FooterVersion";
5
5
 
6
+ import * as styles from "@/components/BaseLayout/styles.scss";
7
+
6
8
  export const Footer = () => {
7
9
  return (
8
10
  <div className={clsx(styles.below)}>
@@ -3,8 +3,11 @@ import { LanguagePicker, ThemeButton } from "@allurereport/web-components";
3
3
  import { computed } from "@preact/signals";
4
4
  import type { ClassValue } from "clsx";
5
5
  import clsx from "clsx";
6
+
6
7
  import { currentLocale, setLocale } from "@/stores/locale";
8
+
7
9
  import { EnvironmentPicker } from "../EnvironmentPicker";
10
+
8
11
  import * as styles from "./styles.scss";
9
12
 
10
13
  interface HeaderProps {
@@ -30,4 +30,5 @@
30
30
  display: flex;
31
31
  gap: 4px;
32
32
  align-items: center;
33
+ min-width: 0;
33
34
  }
package/src/index.tsx CHANGED
@@ -1,10 +1,13 @@
1
1
  import { ensureReportDataReady } from "@allurereport/web-commons";
2
+
2
3
  import "@allurereport/web-components/index.css";
3
4
  import { render } from "preact";
5
+
4
6
  import "@/assets/scss/index.scss";
5
7
  import { BaseLayout } from "@/components/BaseLayout";
6
8
  import { getLocale, waitForI18next } from "@/stores/locale";
7
9
  import { isMac } from "@/utils/isMac";
10
+
8
11
  import * as styles from "./styles.scss";
9
12
 
10
13
  const App = () => (
@@ -0,0 +1,227 @@
1
+ {
2
+ "statuses": {
3
+ "passed": "ناجح",
4
+ "failed": "فشل",
5
+ "broken": "معطل",
6
+ "skipped": "تم تجاوزه",
7
+ "unknown": "غير معروف",
8
+ "total": "الإجمالي"
9
+ },
10
+ "empty": {
11
+ "no-results": "لا توجد نتائج",
12
+ "no-history-results": "لا تتوفر معلومات عن السجل"
13
+ },
14
+ "severity": {
15
+ "blocker": "مانع",
16
+ "critical": "خطورة عالية",
17
+ "normal": "عادي",
18
+ "minor": "ثانوي",
19
+ "trivial": "بسيط"
20
+ },
21
+ "environments": {
22
+ "environment_one": "بيئة",
23
+ "environment_other": "بيئات",
24
+ "all": "الكل"
25
+ },
26
+ "charts": {
27
+ "trend": {
28
+ "title": "مخطط الاتجاه: {{type}}",
29
+ "type": {
30
+ "status": "الحالة",
31
+ "severity": "الخطورة"
32
+ }
33
+ },
34
+ "currentStatus": {
35
+ "title": "الحالة الحالية",
36
+ "status": {
37
+ "passed": "$t(statuses:passed, capitalize)",
38
+ "failed": "$t(statuses:failed, capitalize)",
39
+ "broken": "$t(statuses:broken, capitalize)",
40
+ "skipped": "$t(statuses:skipped, capitalize)",
41
+ "unknown": "$t(statuses:unknown, capitalize)"
42
+ },
43
+ "percentage": "{{percentage}}%",
44
+ "of": "من {{total}}",
45
+ "total": "{{total}}",
46
+ "tests": {
47
+ "new_zero": "لا توجد اختبارات جديدة",
48
+ "new_one": "{{count}} اختبار جديد",
49
+ "new_other": "{{count}} اختبارات جديدة",
50
+ "flaky_zero": "لا توجد اختبارات غير مستقرة",
51
+ "flaky_one": "{{count}} اختبار غير مستقر",
52
+ "flaky_other": "{{count}} اختبارات غير مستقرة",
53
+ "retries_zero": "لا توجد اختبارات مُعاد محاولتها",
54
+ "retries_one": "{{count}} اختبار مُعاد محاولته",
55
+ "retries_other": "{{count}} اختبارات مُعاد محاولتها"
56
+ }
57
+ },
58
+ "statusDynamics": {
59
+ "title": "تطورات الحالة",
60
+ "status": {
61
+ "passed": "$t(statuses:passed, capitalize)",
62
+ "failed": "$t(statuses:failed, capitalize)",
63
+ "broken": "$t(statuses:broken, capitalize)",
64
+ "skipped": "$t(statuses:skipped, capitalize)",
65
+ "unknown": "$t(statuses:unknown, capitalize)"
66
+ },
67
+ "no-history": "$t(empty:no-history-results)",
68
+ "no-results": "$t(empty:no-results)",
69
+ "tooltips": {
70
+ "current": "أحدث تقرير ({{timestamp, timestamp_long_no_seconds}})",
71
+ "history": "تقرير من {{timestamp, timestamp_long_no_seconds}}"
72
+ },
73
+ "ticks": {
74
+ "current": "الأحدث",
75
+ "history": "{{timestamp, timestamp_date}}"
76
+ }
77
+ },
78
+ "statusTransitions": {
79
+ "title": "انتقالات الحالة",
80
+ "legend": {
81
+ "trend": "معدل الإصلاح"
82
+ },
83
+ "transitions": {
84
+ "new": "$t(transitions:new, capitalize)",
85
+ "fixed": "$t(transitions:fixed, capitalize)",
86
+ "regressed": "$t(transitions:regressed, capitalize)",
87
+ "malfunctioned": "$t(transitions:malfunctioned, capitalize)"
88
+ },
89
+ "no-history": "$t(empty:no-history-results)",
90
+ "no-results": "$t(empty:no-results)",
91
+ "tooltips": {
92
+ "current": "أحدث تقرير ({{timestamp, timestamp_long_no_seconds}})",
93
+ "history": "تقرير من {{timestamp, timestamp_long_no_seconds}}"
94
+ },
95
+ "ticks": {
96
+ "current": "الأحدث",
97
+ "history": "{{timestamp, timestamp_date}}"
98
+ }
99
+ },
100
+ "durations": {
101
+ "title": "مدد حسب {{groupBy}} - مخطط بياني",
102
+ "title_none": "مخطط بياني للمدد",
103
+ "no-results": "$t(empty:no-results)",
104
+ "groupBy": {
105
+ "none": "لا شيء",
106
+ "layer": "الطبقة"
107
+ },
108
+ "ticks": {
109
+ "durationRange": "{{from, format_duration}} - {{to, format_duration}}"
110
+ },
111
+ "tooltips": {
112
+ "durationRange": "{{from, format_duration}} - {{to, format_duration}}"
113
+ },
114
+ "legend": {
115
+ "value": "{{value}}",
116
+ "total": "عدد الاختبارات"
117
+ }
118
+ },
119
+ "stabilityDistribution": {
120
+ "title": "توزيع الاستقرار",
121
+ "no-results": "$t(empty:no-results)",
122
+ "legend": {
123
+ "stabilityRate": "معدل الاستقرار"
124
+ }
125
+ },
126
+ "testBaseGrowthDynamics": {
127
+ "title": "نمو قاعدة الاختبارات",
128
+ "status": {
129
+ "newpassed": "جديد $t(statuses:passed)",
130
+ "newfailed": "جديد $t(statuses:failed)",
131
+ "newbroken": "جديد $t(statuses:broken)",
132
+ "newskipped": "جديد $t(statuses:skipped)",
133
+ "newunknown": "جديد $t(statuses:unknown)",
134
+ "removedpassed": "محذوف $t(statuses:passed)",
135
+ "removedfailed": "محذوف $t(statuses:failed)",
136
+ "removedbroken": "محذوف $t(statuses:broken)",
137
+ "removedskipped": "محذوف $t(statuses:skipped)",
138
+ "removedunknown": "محذوف $t(statuses:unknown)"
139
+ },
140
+ "legend": {
141
+ "trend": "اتجاه النمو"
142
+ },
143
+ "no-history": "$t(empty:no-history-results)",
144
+ "no-results": "$t(empty:no-results)",
145
+ "tooltips": {
146
+ "current": "أحدث تقرير ({{timestamp, timestamp_long_no_seconds}})",
147
+ "history": "تقرير من {{timestamp, timestamp_long_no_seconds}}"
148
+ },
149
+ "ticks": {
150
+ "current": "الأحدث",
151
+ "history": "{{timestamp, timestamp_date}}"
152
+ }
153
+ },
154
+ "statusAgePyramid": {
155
+ "title": "هرم عمر الحالة",
156
+ "status": {
157
+ "passed": "$t(statuses:passed, capitalize)",
158
+ "failed": "$t(statuses:failed, capitalize)",
159
+ "broken": "$t(statuses:broken, capitalize)",
160
+ "skipped": "$t(statuses:skipped, capitalize)",
161
+ "unknown": "$t(statuses:unknown, capitalize)"
162
+ },
163
+ "no-history": "$t(empty:no-history-results)",
164
+ "no-results": "$t(empty:no-results)",
165
+ "tooltips": {
166
+ "current": "أحدث تقرير ({{timestamp, timestamp_long_no_seconds}})",
167
+ "history": "تقرير من {{timestamp, timestamp_long_no_seconds}}"
168
+ },
169
+ "ticks": {
170
+ "current": "الأحدث",
171
+ "history": "{{timestamp, timestamp_date}}"
172
+ }
173
+ },
174
+ "trSeverities": {
175
+ "title": "نتائج الاختبارات حسب الخطورة",
176
+ "no-results": "$t(empty:no-results)",
177
+ "status": {
178
+ "passed": "$t(statuses:passed, capitalize)",
179
+ "failed": "$t(statuses:failed, capitalize)",
180
+ "broken": "$t(statuses:broken, capitalize)",
181
+ "skipped": "$t(statuses:skipped, capitalize)",
182
+ "unknown": "$t(statuses:unknown, capitalize)"
183
+ },
184
+ "severity": {
185
+ "blocker": "$t(severity:blocker, capitalize)",
186
+ "critical": "$t(severity:critical, capitalize)",
187
+ "normal": "$t(severity:normal, capitalize)",
188
+ "minor": "$t(severity:minor, capitalize)",
189
+ "trivial": "$t(severity:trivial, capitalize)",
190
+ "unset": "بدون خطورة"
191
+ }
192
+ },
193
+ "durationDynamics": {
194
+ "title": "تطورات المدة",
195
+ "durations": {
196
+ "sequential": "المدة التسلسلية",
197
+ "duration": "مدة الاختبار",
198
+ "speedup": "التسريع"
199
+ },
200
+ "no-results": "$t(empty:no-results)",
201
+ "tooltips": {
202
+ "current": "أحدث تقرير ({{timestamp, timestamp_long_no_seconds}})",
203
+ "history": "تقرير من {{timestamp, timestamp_long_no_seconds}}"
204
+ },
205
+ "ticks": {
206
+ "current": "الأحدث",
207
+ "history": "{{timestamp, timestamp_date}}"
208
+ },
209
+ "legend": {
210
+ "duration": "{{duration, format_duration}}",
211
+ "speedup": "{{speedup}}x"
212
+ }
213
+ }
214
+ },
215
+ "transitions": {
216
+ "description": {
217
+ "new": "أول ظهور لنتيجة الاختبار هذه في التقرير",
218
+ "fixed": "اختبار كان \"فشل\" أو \"معطل\" سابقاً وأصبح الآن \"ناجح\"",
219
+ "regressed": "اختبار كان \"ناجح\" أو \"معطل\" سابقاً وأصبح الآن \"فشل\"",
220
+ "malfunctioned": "اختبار كان \"ناجح\" أو \"فشل\" سابقاً وأصبح الآن \"معطل\""
221
+ },
222
+ "new": "جديد",
223
+ "fixed": "تم الإصلاح",
224
+ "regressed": "تراجع",
225
+ "malfunctioned": "خلل وظيفي"
226
+ }
227
+ }