@allurereport/web-awesome 3.0.0-beta.4 → 3.0.0-beta.5

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 (85) hide show
  1. package/.eslintrc.cjs +1 -1
  2. package/CONTRIBUTING.md +34 -0
  3. package/dist/multi/{141.app-13f840d5.js → 141.app-71d7f77e.js} +1 -1
  4. package/dist/multi/222.app-71d7f77e.js +1 -0
  5. package/dist/multi/335.app-71d7f77e.js +1 -0
  6. package/dist/multi/{34.app-13f840d5.js → 34.app-71d7f77e.js} +1 -1
  7. package/dist/multi/349.app-71d7f77e.js +1 -0
  8. package/dist/multi/378.app-71d7f77e.js +1 -0
  9. package/dist/multi/{406.app-13f840d5.js → 406.app-71d7f77e.js} +1 -1
  10. package/dist/multi/476.app-71d7f77e.js +1 -0
  11. package/dist/multi/{53.app-13f840d5.js → 53.app-71d7f77e.js} +1 -1
  12. package/dist/multi/{584.app-13f840d5.js → 584.app-71d7f77e.js} +1 -1
  13. package/dist/multi/690.app-71d7f77e.js +1 -0
  14. package/dist/multi/{747.app-13f840d5.js → 747.app-71d7f77e.js} +1 -1
  15. package/dist/multi/{767.app-13f840d5.js → 767.app-71d7f77e.js} +1 -1
  16. package/dist/multi/{816.app-13f840d5.js → 816.app-71d7f77e.js} +1 -1
  17. package/dist/multi/83.app-71d7f77e.js +1 -0
  18. package/dist/multi/{873.app-13f840d5.js → 873.app-71d7f77e.js} +1 -1
  19. package/dist/multi/{920.app-13f840d5.js → 920.app-71d7f77e.js} +1 -1
  20. package/dist/multi/{991.app-13f840d5.js → 991.app-71d7f77e.js} +1 -1
  21. package/dist/multi/app-71d7f77e.js +2 -0
  22. package/dist/multi/manifest.json +20 -20
  23. package/dist/multi/{styles-13f840d5.css → styles-71d7f77e.css} +4 -4
  24. package/dist/single/app-7aa8b012.js +2 -0
  25. package/dist/single/manifest.json +1 -1
  26. package/package.json +11 -4
  27. package/src/components/app/ArrowButton/index.tsx +3 -2
  28. package/src/components/app/BaseLayout/index.tsx +5 -5
  29. package/src/components/app/ReportBody/Filters.tsx +12 -10
  30. package/src/components/app/ReportBody/HeaderActions.tsx +3 -3
  31. package/src/components/app/ReportBody/SortBy.tsx +8 -8
  32. package/src/components/app/ReportBody/context.tsx +0 -1
  33. package/src/components/app/Tabs/index.tsx +2 -3
  34. package/src/components/app/TestResult/TestResultDescription/index.tsx +3 -3
  35. package/src/components/app/TestResult/TestResultNavigation/index.tsx +34 -37
  36. package/src/components/app/TestResult/TestResultNavigation/styles.scss +1 -1
  37. package/src/components/app/TestResult/TestResultSteps/attachment.tsx +4 -6
  38. package/src/components/app/Tree/Tree.tsx +54 -101
  39. package/src/components/app/Tree/TreeHeader.tsx +13 -12
  40. package/src/components/app/Tree/TreeItem.tsx +3 -1
  41. package/src/components/app/Tree/index.tsx +31 -7
  42. package/src/components/app/Tree/styles.scss +9 -3
  43. package/src/components/commons/Menu/index.tsx +4 -4
  44. package/src/components/commons/SearchBox/index.tsx +8 -6
  45. package/src/components/commons/Toggle/index.tsx +2 -1
  46. package/src/components/commons/Tooltip/index.tsx +3 -3
  47. package/src/i18n/constants.ts +21 -2
  48. package/src/i18n/locales/am.json +3 -1
  49. package/src/i18n/locales/az.json +3 -1
  50. package/src/i18n/locales/de.json +3 -1
  51. package/src/i18n/locales/en.json +4 -2
  52. package/src/i18n/locales/es.json +3 -0
  53. package/src/i18n/locales/fr.json +3 -1
  54. package/src/i18n/locales/he.json +3 -1
  55. package/src/i18n/locales/it.json +3 -1
  56. package/src/i18n/locales/ja.json +3 -1
  57. package/src/i18n/locales/ka.json +3 -1
  58. package/src/i18n/locales/kr.json +3 -1
  59. package/src/i18n/locales/nl.json +3 -1
  60. package/src/i18n/locales/pl.json +3 -1
  61. package/src/i18n/locales/pt.json +3 -1
  62. package/src/i18n/locales/ru.json +3 -1
  63. package/src/i18n/locales/sv.json +3 -1
  64. package/src/i18n/locales/tr.json +3 -1
  65. package/src/i18n/locales/zh.json +4 -2
  66. package/src/index.html +1 -0
  67. package/src/stores/chart.ts +2 -2
  68. package/src/stores/testResults.ts +26 -4
  69. package/src/stores/tree.ts +98 -4
  70. package/src/types/globals.d.ts +6 -1
  71. package/src/utils/treeFilters.ts +73 -120
  72. package/test/utils/treeFilters.test.ts +424 -0
  73. package/types.d.ts +25 -4
  74. package/vitest.config.ts +12 -0
  75. package/dist/multi/222.app-13f840d5.js +0 -1
  76. package/dist/multi/335.app-13f840d5.js +0 -1
  77. package/dist/multi/349.app-13f840d5.js +0 -1
  78. package/dist/multi/378.app-13f840d5.js +0 -1
  79. package/dist/multi/476.app-13f840d5.js +0 -1
  80. package/dist/multi/690.app-13f840d5.js +0 -1
  81. package/dist/multi/83.app-13f840d5.js +0 -1
  82. package/dist/multi/app-13f840d5.js +0 -2
  83. package/dist/single/app-d31bd53e.js +0 -2
  84. /package/dist/multi/{app-13f840d5.js.LICENSE.txt → app-71d7f77e.js.LICENSE.txt} +0 -0
  85. /package/dist/single/{app-d31bd53e.js.LICENSE.txt → app-7aa8b012.js.LICENSE.txt} +0 -0
@@ -1,10 +1,11 @@
1
- import { Statistic, statusesList } from "@allurereport/core-api";
1
+ import { type Statistic, statusesList } from "@allurereport/core-api";
2
2
  import { clsx } from "clsx";
3
- import { FunctionComponent } from "preact";
3
+ import { type FunctionComponent } from "preact";
4
4
  import { ArrowButton } from "@/components/app/ArrowButton";
5
5
  import { Loadable } from "@/components/commons/Loadable";
6
6
  import { Text } from "@/components/commons/Typography";
7
7
  import { statsStore } from "@/stores";
8
+ import { treeFiltersStore } from "@/stores/tree";
8
9
  import * as styles from "./styles.scss";
9
10
 
10
11
  interface TreeHeaderProps {
@@ -12,15 +13,14 @@ interface TreeHeaderProps {
12
13
  categoryTitle: string;
13
14
  isOpened: boolean;
14
15
  toggleTree: () => void;
15
- statusFilter?: string;
16
16
  }
17
17
 
18
- const maxWidthTab: number = 140;
19
- const minWidthTab: number = 46;
18
+ const maxWidthTab = 140;
19
+ const minWidthTab = 46;
20
20
  // to make the progress bar more visually responsive for smaller values,
21
21
  // we can adjust the formula by adding an offset to stretch the lower part
22
22
  // of the logarithmic scale
23
- const offset: number = 10;
23
+ const offset = 10;
24
24
 
25
25
  const progress = (current: number, total: number) => {
26
26
  const logOffset = Math.log(offset);
@@ -31,10 +31,11 @@ const TreeHeader: FunctionComponent<TreeHeaderProps> = ({
31
31
  categoryTitle,
32
32
  isOpened,
33
33
  toggleTree,
34
- statusFilter = "total",
35
34
  statistic,
36
35
  ...rest
37
36
  }) => {
37
+ const { status: statusFilter } = treeFiltersStore.value;
38
+
38
39
  return (
39
40
  <Loadable
40
41
  source={statsStore}
@@ -49,8 +50,8 @@ const TreeHeader: FunctionComponent<TreeHeaderProps> = ({
49
50
  value !== undefined && (statusFilter === "total" || (statusFilter === status && value > 0)),
50
51
  )
51
52
  .map(({ status, value }) => {
52
- const className = clsx(styles[`tree-header-bar-item`], styles[status]);
53
- const style = { flexGrow: `${value}` };
53
+ const className = clsx(styles["tree-header-bar-item"], styles[status]);
54
+ const style = { flexGrow: value };
54
55
 
55
56
  return (
56
57
  <div key={status} className={className} style={style}>
@@ -61,9 +62,9 @@ const TreeHeader: FunctionComponent<TreeHeaderProps> = ({
61
62
  : null;
62
63
 
63
64
  return (
64
- <div {...rest} className={styles["tree-header"]} onClick={toggleTree}>
65
- <ArrowButton isOpened={isOpened} />
66
- <Text size="m" bold className={styles["tree-header-title"]}>
65
+ <div data-testid="tree-header" {...rest} className={styles["tree-header"]} onClick={toggleTree}>
66
+ <ArrowButton data-testid="tree-arrow" isOpened={isOpened} />
67
+ <Text data-testid="tree-header-title" size="m" bold className={styles["tree-header-title"]}>
67
68
  {categoryTitle}
68
69
  </Text>
69
70
  {treeHeaderBar && (
@@ -10,14 +10,16 @@ interface TreeItemProps {
10
10
  status: TestStatus;
11
11
  duration?: number;
12
12
  id: string;
13
+ groupOrder: number;
13
14
  }
14
15
 
15
- export const TreeItem: FunctionComponent<TreeItemProps> = ({ name, status, duration, id, ...rest }) => {
16
+ export const TreeItem: FunctionComponent<TreeItemProps> = ({ name, groupOrder, status, duration, id, ...rest }) => {
16
17
  const formattedDuration = formatDuration(duration);
17
18
 
18
19
  return (
19
20
  <div {...rest} className={styles["tree-item"]} onClick={() => navigateTo(id)}>
20
21
  <TreeItemIcon status={status} />
22
+ <span data-testid="tree-leaf-order" class={styles.order}>#{groupOrder}</span>
21
23
  <Text data-testid="tree-leaf-title" className={styles["item-title"]}>
22
24
  {name}
23
25
  </Text>
@@ -1,25 +1,29 @@
1
- import type { TestStatus } from "@allurereport/core-api";
1
+ import { useEffect } from "preact/hooks";
2
2
  import { useTabsContext } from "@/components/app/Tabs";
3
3
  import Tree from "@/components/app/Tree/Tree";
4
+ import { Button } from "@/components/commons/Button";
4
5
  import { Loadable } from "@/components/commons/Loadable";
5
6
  import { PageLoader } from "@/components/commons/PageLoader";
6
7
  import { Text } from "@/components/commons/Typography";
7
8
  import { useI18n } from "@/stores/locale";
8
- import { treeStore } from "@/stores/tree";
9
+ import { clearTreeFilters, filteredTree, noTests, noTestsFound, setTreeStatus, treeStore } from "@/stores/tree";
10
+ import type { AllureAwesomeStatus } from "../../../../types";
9
11
  import * as styles from "./styles.scss";
10
12
 
11
13
  export const TreeList = () => {
12
14
  const { t } = useI18n("empty");
13
15
  const { currentTab } = useTabsContext();
14
16
 
17
+ useEffect(() => {
18
+ setTreeStatus(currentTab as AllureAwesomeStatus);
19
+ }, [currentTab]);
20
+
15
21
  return (
16
22
  <Loadable
17
23
  source={treeStore}
18
24
  renderLoader={() => <PageLoader />}
19
- renderData={(treeData) => {
20
- const { groups, leaves } = treeData?.root ?? {};
21
-
22
- if (!groups && !leaves) {
25
+ renderData={() => {
26
+ if (noTests.value) {
23
27
  return (
24
28
  <div className={styles["tree-list"]}>
25
29
  <div className={styles["tree-empty-results"]}>
@@ -29,9 +33,29 @@ export const TreeList = () => {
29
33
  );
30
34
  }
31
35
 
36
+ if (noTestsFound.value) {
37
+ return (
38
+ <div className={styles["tree-list"]}>
39
+ <div className={styles["tree-empty-results"]}>
40
+ <Text tag="p" className={styles["tree-empty-results-title"]}>
41
+ {t("no-tests-found")}
42
+ </Text>
43
+ <Button
44
+ className={styles["tree-empty-results-clear-button"]}
45
+ type="button"
46
+ text={t("clear-filters")}
47
+ size={"s"}
48
+ style={"outline"}
49
+ onClick={() => clearTreeFilters()}
50
+ />
51
+ </div>
52
+ </div>
53
+ );
54
+ }
55
+
32
56
  return (
33
57
  <div className={styles["tree-list"]}>
34
- <Tree groups={groups} leaves={leaves} statusFilter={currentTab as TestStatus} root />
58
+ <Tree tree={filteredTree.value} statusFilter={currentTab as AllureAwesomeStatus} root />
35
59
  </div>
36
60
  );
37
61
  }}
@@ -159,12 +159,18 @@
159
159
  }
160
160
 
161
161
  .tree-empty-results {
162
- display: flex;
163
162
  padding: 44px 24px;
164
- align-items: center;
165
- justify-content: center;
163
+ text-align: center;
166
164
  }
167
165
 
168
166
  .tree-empty-results-title {
169
167
  color: var(--on-text-secondary);
170
168
  }
169
+
170
+ .tree-empty-results-clear-button {
171
+ margin-top: 4px;
172
+ }
173
+
174
+ .order {
175
+ user-select: none;
176
+ }
@@ -99,9 +99,9 @@ export const Menu = (props: {
99
99
  }).then(({ x, y }) => {
100
100
  if (menuRef.current) {
101
101
  Object.assign(menuRef.current.style, {
102
- left: `${x}px`,
103
- top: `${y}px`,
104
- position: "absolute",
102
+ "left": `${x}px`,
103
+ "top": `${y}px`,
104
+ "position": "absolute",
105
105
  "z-index": 10,
106
106
  });
107
107
  }
@@ -147,7 +147,7 @@ type ItemProps = {
147
147
  rightSlot?: ComponentChildren;
148
148
  closeMenuOnClick?: boolean;
149
149
  ariaLabel?: string;
150
- setIsOpened: (isOpened: boolean) => void;
150
+ setIsOpened?: (isOpened: boolean) => void;
151
151
  };
152
152
 
153
153
  Menu.Item = (props: ItemProps) => {
@@ -1,5 +1,5 @@
1
1
  import { clsx } from "clsx";
2
- import { useState } from "preact/hooks";
2
+ import {useEffect, useState} from "preact/hooks";
3
3
  import searchIcon from "@/assets/svg/line-general-search-md.svg";
4
4
  import closeIcon from "@/assets/svg/line-general-x-close.svg";
5
5
  import { useDebouncedCallback } from "@/hooks/useDebouncedCallback";
@@ -20,25 +20,27 @@ type Props = {
20
20
  export const SearchBox = (props: Props) => {
21
21
  const { placeholder, value, onChange, changeDebounce = 300 } = props;
22
22
  const [localValue, setLocalValue] = useState(value);
23
-
24
23
  const onChangeDebounced = useDebouncedCallback(onChange, changeDebounce);
25
-
26
24
  const handleChange = (e: Event) => {
27
25
  const newValue = (e.target as HTMLInputElement).value;
28
26
 
29
27
  setLocalValue(newValue);
30
28
  onChangeDebounced(newValue);
31
29
  };
32
-
33
30
  const handleClear = (e: PointerEvent) => {
34
31
  e.preventDefault();
35
32
  e.stopPropagation();
36
33
  setLocalValue("");
37
34
  onChangeDebounced("");
38
35
  };
39
-
40
36
  const showClear = !!localValue;
41
37
 
38
+ useEffect(() => {
39
+ if (localValue !== value) {
40
+ setLocalValue(value);
41
+ }
42
+ }, [value]);
43
+
42
44
  return (
43
45
  <Text className={styles.inputWrap} type="ui" size="m" tag="div">
44
46
  <SvgIcon id={searchIcon.id} size="s" className={styles.leadingIcon} />
@@ -50,7 +52,7 @@ export const SearchBox = (props: Props) => {
50
52
  value={localValue}
51
53
  name="search"
52
54
  autocomplete="off"
53
- data-testid="search-input"
55
+ data-testid="search-input"
54
56
  />
55
57
  {showClear && (
56
58
  <div className={styles.clearButton}>
@@ -8,7 +8,7 @@ type Props = {
8
8
  };
9
9
 
10
10
  export const Toggle = (props: Props) => {
11
- const { value, label, onChange, focusable = true } = props;
11
+ const { value, label, onChange, focusable = true, ...rest } = props;
12
12
 
13
13
  const handleChange = (e: Event) => {
14
14
  const newValue = !(e.target as HTMLInputElement).checked;
@@ -17,6 +17,7 @@ export const Toggle = (props: Props) => {
17
17
 
18
18
  return (
19
19
  <input
20
+ {...rest}
20
21
  tabIndex={focusable ? 0 : -1}
21
22
  className={styles.toggle}
22
23
  role="switch"
@@ -49,9 +49,9 @@ export const TooltipWrapper: FunctionalComponent<TooltipWrapperProps> = ({
49
49
  }).then(({ x, y }) => {
50
50
  if (tooltipRef.current) {
51
51
  Object.assign(tooltipRef.current.style, {
52
- left: `${x}px`,
53
- top: `${y}px`,
54
- position: "absolute",
52
+ "left": `${x}px`,
53
+ "top": `${y}px`,
54
+ "position": "absolute",
55
55
  "z-index": 100,
56
56
  });
57
57
  }
@@ -1,4 +1,23 @@
1
- export const AVAILABLE_LOCALES = ["en", "ru", "pl", "es", "pt", "de", "am", "az", "fr", "it", "ja", "he", "ka", "kr", "nl", "sv", "tr", "zh"] as const;
1
+ export const AVAILABLE_LOCALES = [
2
+ "en",
3
+ "ru",
4
+ "pl",
5
+ "es",
6
+ "pt",
7
+ "de",
8
+ "am",
9
+ "az",
10
+ "fr",
11
+ "it",
12
+ "ja",
13
+ "he",
14
+ "ka",
15
+ "kr",
16
+ "nl",
17
+ "sv",
18
+ "tr",
19
+ "zh",
20
+ ] as const;
2
21
 
3
22
  export const DEFAULT_LOCALE = "en";
4
23
 
@@ -101,5 +120,5 @@ export const LANG_LOCALE: Record<
101
120
  short: "Zh",
102
121
  full: "中文",
103
122
  iso: "zh-CN",
104
- }
123
+ },
105
124
  };
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "Հակադարձված"
61
61
  },
62
62
  "empty": {
63
- "no-results": "Արդյունքներ չեն գտնվել",
63
+ "no-results": "Ոչ մի արդյունք",
64
+ "no-tests-found": "Արդյունքներ չեն գտնվել",
65
+ "clear-filters": "Մաքրել ֆիլտրները",
64
66
  "no-attachments-results": "Կցորդների մասին տեղեկություններ չկան",
65
67
  "no-history-results": "Պատմության մասին տեղեկություններ չկան",
66
68
  "no-retries-results": "Կրկնությունների մասին տեղեկություններ չկան"
@@ -61,6 +61,8 @@
61
61
  },
62
62
  "empty": {
63
63
  "no-results": "Nəticə tapılmadı",
64
+ "no-tests-found": "Nəticə tapılmadı",
65
+ "clear-filters": "Filtrləri təmizlə",
64
66
  "no-attachments-results": "Əlavə məlumatı mövcud deyil",
65
67
  "no-history-results": "Tarixçə məlumatı mövcud deyil",
66
68
  "no-retries-results": "Təkrar məlumatı mövcud deyil"
@@ -112,4 +114,4 @@
112
114
  "errors": {
113
115
  "missedAttachment": "Əlavə tapılmadı"
114
116
  }
115
- }
117
+ }
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "Umgekehrt"
61
61
  },
62
62
  "empty": {
63
- "no-results": "Keine Ergebnisse gefunden",
63
+ "no-results": "Keine Ergebnisse",
64
+ "no-tests-found": "Keine Ergebnisse gefunden",
65
+ "clear-filters": "Filter löschen",
64
66
  "no-attachments-results": "Keine Anhängeinformationen verfügbar",
65
67
  "no-history-results": "Keine Verlaufsinformationen verfügbar",
66
68
  "no-retries-results": "Keine Wiederholungsinformationen verfügbar"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "Reversed"
61
61
  },
62
62
  "empty": {
63
- "no-results": "No results found",
63
+ "no-results": "No results",
64
+ "no-tests-found": "No results found",
65
+ "clear-filters": "Clear filters",
64
66
  "no-attachments-results": "No attachments information available",
65
67
  "no-history-results": "No history information available",
66
68
  "no-retries-results": "No retries information available"
@@ -112,4 +114,4 @@
112
114
  "errors": {
113
115
  "missedAttachment": "Attachment not found"
114
116
  }
115
- }
117
+ }
@@ -60,6 +60,9 @@
60
60
  "status-desc-short": "Invertido"
61
61
  },
62
62
  "empty": {
63
+ "no-results": "Sin resultados",
64
+ "no-tests-found": "No se encontraron resultados",
65
+ "clear-filters": "Limpiar filtros",
63
66
  "no-attachments-results": "No hay información de adjuntos disponible",
64
67
  "no-history-results": "No hay información de historial disponible",
65
68
  "no-retries-results": "No hay información de reintentos disponible"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "Inversé"
61
61
  },
62
62
  "empty": {
63
- "no-results": "Aucun résultat trouvé",
63
+ "no-results": "Aucun résultat",
64
+ "no-tests-found": "Aucun résultat trouvé",
65
+ "clear-filters": "Effacer les filtres",
64
66
  "no-attachments-results": "Aucune information sur les pièces jointes disponible",
65
67
  "no-history-results": "Aucune information sur l'historique disponible",
66
68
  "no-retries-results": "Aucune information sur les réessais disponible"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "הפוך"
61
61
  },
62
62
  "empty": {
63
- "no-results": "לא נמצאו תוצאות",
63
+ "no-results": "אין תוצאות",
64
+ "no-tests-found": "לא נמצאו תוצאות",
65
+ "clear-filters": "נקה מסננים",
64
66
  "no-attachments-results": "לא נמצאה מידע על קבצים מצורפים",
65
67
  "no-history-results": "לא נמצאה מידע על היסטוריה",
66
68
  "no-retries-results": "לא נמצאה מידע על נסיונות חוזרים"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "Invertito"
61
61
  },
62
62
  "empty": {
63
- "no-results": "Nessun risultato trovato",
63
+ "no-results": "Nessun risultato",
64
+ "no-tests-found": "Nessun risultato trovato",
65
+ "clear-filters": "Cancella i filtri",
64
66
  "no-attachments-results": "Nessuna informazione sugli allegati disponibile",
65
67
  "no-history-results": "Nessuna informazione sulla cronologia disponibile",
66
68
  "no-retries-results": "Nessuna informazione sui ritentativi disponibile"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "逆順"
61
61
  },
62
62
  "empty": {
63
- "no-results": "結果が見つかりません",
63
+ "no-results": "結果がありません",
64
+ "no-tests-found": "結果が見つかりません",
65
+ "clear-filters": "フィルターをクリア",
64
66
  "no-attachments-results": "添付ファイル情報が利用できません",
65
67
  "no-history-results": "履歴情報が利用できません",
66
68
  "no-retries-results": "再試行情報が利用できません"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "შებრუნებული"
61
61
  },
62
62
  "empty": {
63
- "no-results": "შედეგები არ მოიძებნა",
63
+ "no-results": "შედეგები არ არის",
64
+ "no-tests-found": "შედეგები არ მოიძებნა",
65
+ "clear-filters": "ფილტრების გასუფთავება",
64
66
  "no-attachments-results": "დანართების ინფორმაცია არ არის ხელმისაწვდომი",
65
67
  "no-history-results": "ისტორიის ინფორმაცია არ არის ხელმისაწვდომი",
66
68
  "no-retries-results": "ხელახალი ცდების ინფორმ���ცია არ არის ხელმისაწვდომი"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "역순"
61
61
  },
62
62
  "empty": {
63
- "no-results": "결과를 찾을 수 없습니다",
63
+ "no-results": "결과 없음",
64
+ "no-tests-found": "결과를 찾을 수 없음",
65
+ "clear-filters": "필터 지우기",
64
66
  "no-attachments-results": "첨부파일 정보를 사용할 수 없습니다",
65
67
  "no-history-results": "기록 정보를 사용할 수 없습니다",
66
68
  "no-retries-results": "재시도 정보를 사용할 수 없습니다"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "Omgekeerd"
61
61
  },
62
62
  "empty": {
63
- "no-results": "Geen resultaten gevonden",
63
+ "no-results": "Geen resultaten",
64
+ "no-tests-found": "Geen resultaten gevonden",
65
+ "clear-filters": "Filters wissen",
64
66
  "no-attachments-results": "Geen bijlageninformatie beschikbaar",
65
67
  "no-history-results": "Geen geschiedenisinformatie beschikbaar",
66
68
  "no-retries-results": "Geen herhalingsinformatie beschikbaar"
@@ -57,7 +57,9 @@
57
57
  "status-desc-short": "Domyślnie"
58
58
  },
59
59
  "empty": {
60
- "no-results": "Nie znaleziono wyników",
60
+ "no-results": "Brak wyników",
61
+ "no-tests-found": "Nie znaleziono wyników",
62
+ "clear-filters": "Wyczyść filtry",
61
63
  "no-attachments-results": "Brak dostępnych informacji o załącznikach",
62
64
  "no-history-results": "Brak dostępnych informacji o historii",
63
65
  "no-retries-results": "Brak dostępnych informacji o ponownych próbach"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "Invertido"
61
61
  },
62
62
  "empty": {
63
- "no-results": "Nenhum resultado encontrado",
63
+ "no-results": "Sem resultados",
64
+ "no-tests-found": "Nenhum resultado encontrado",
65
+ "clear-filters": "Limpar filtros",
64
66
  "no-attachments-results": "Nenhuma informação de anexos disponível",
65
67
  "no-history-results": "Nenhuma informação de histórico disponível",
66
68
  "no-retries-results": "Nenhuma informação de repetições disponível"
@@ -57,7 +57,9 @@
57
57
  "status-desc-short": "По обычному"
58
58
  },
59
59
  "empty": {
60
- "no-results": "Результатов не найдено",
60
+ "no-results": "Нет результатов",
61
+ "no-tests-found": "Результаты не найдены",
62
+ "clear-filters": "Очистить фильтры",
61
63
  "no-attachments-results": "Информация о вложениях отсутствует",
62
64
  "no-history-results": "Информация об истории отсутствует",
63
65
  "no-retries-results": "Информация о перезапусках отсутствует"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "Omvänd"
61
61
  },
62
62
  "empty": {
63
- "no-results": "Inga resultat hittades",
63
+ "no-results": "Inga resultat",
64
+ "no-tests-found": "Inga resultat hittades",
65
+ "clear-filters": "Rensa filter",
64
66
  "no-attachments-results": "Ingen bilaga information tillgänglig",
65
67
  "no-history-results": "Ingen historik information tillgänglig",
66
68
  "no-retries-results": "Ingen omtagningar information tillgänglig"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "Ters"
61
61
  },
62
62
  "empty": {
63
- "no-results": "Sonuç bulunamadı",
63
+ "no-results": "Sonuç yok",
64
+ "no-tests-found": "Sonuç bulunamadı",
65
+ "clear-filters": "Filtreleri temizle",
64
66
  "no-attachments-results": "Ek bilgisi mevcut değil",
65
67
  "no-history-results": "Geçmiş bilgisi mevcut değil",
66
68
  "no-retries-results": "Tekrar deneme bilgisi mevcut değil"
@@ -60,7 +60,9 @@
60
60
  "status-desc-short": "反转"
61
61
  },
62
62
  "empty": {
63
- "no-results": "未找到结果",
63
+ "no-results": "没有结果",
64
+ "no-tests-found": "未找到结果",
65
+ "clear-filters": "清除过滤器",
64
66
  "no-attachments-results": "没有附件信息",
65
67
  "no-history-results": "没有历史信息",
66
68
  "no-retries-results": "没有重试信息"
@@ -112,4 +114,4 @@
112
114
  "errors": {
113
115
  "missedAttachment": "未找到附件"
114
116
  }
115
- }
117
+ }
package/src/index.html CHANGED
@@ -26,6 +26,7 @@
26
26
  theme: "light",
27
27
  reportLanguage: "ru",
28
28
  createdAt: 1731513697651,
29
+ groupBy: "suite",
29
30
  };
30
31
  </script>
31
32
  <script async>
@@ -21,12 +21,12 @@ export const fetchPieChartData = async () => {
21
21
  pieChartStore.value = {
22
22
  data: res,
23
23
  error: undefined,
24
- loading: false
24
+ loading: false,
25
25
  };
26
26
  } catch (err) {
27
27
  pieChartStore.value = {
28
28
  error: err.message,
29
- loading: false
29
+ loading: false,
30
30
  };
31
31
  }
32
32
  };
@@ -9,6 +9,30 @@ export const testResultStore = signal<StoreSignalState<Record<string, AllureAwes
9
9
  data: undefined,
10
10
  });
11
11
 
12
+ export const testResultNavStore = signal<StoreSignalState<string[]>>({
13
+ loading: true,
14
+ error: undefined,
15
+ data: undefined,
16
+ });
17
+
18
+ export const fetchTestResultNav = async () => {
19
+ try {
20
+ const data = await fetchReportJsonData<string[]>("widgets/nav.json");
21
+
22
+ testResultNavStore.value = {
23
+ data,
24
+ error: undefined,
25
+ loading: false,
26
+ };
27
+ } catch (err) {
28
+ testResultNavStore.value = {
29
+ ...testResultNavStore.value,
30
+ error: err.message,
31
+ loading: false,
32
+ };
33
+ }
34
+ };
35
+
12
36
  export const fetchTestResult = async (testResultId: string) => {
13
37
  if (!testResultId || testResultStore.value.data?.[testResultId]) {
14
38
  return;
@@ -18,12 +42,10 @@ export const fetchTestResult = async (testResultId: string) => {
18
42
  ...testResultStore.value,
19
43
  loading: true,
20
44
  error: undefined,
21
- }
45
+ };
22
46
 
23
47
  try {
24
- const data = await fetchReportJsonData<AllureAwesomeTestResult>(
25
- `data/test-results/${testResultId}.json`,
26
- );
48
+ const data = await fetchReportJsonData<AllureAwesomeTestResult>(`data/test-results/${testResultId}.json`);
27
49
 
28
50
  testResultStore.value = {
29
51
  data: { ...testResultStore.value.data, [testResultId]: data },