@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.
- package/.eslintrc.cjs +1 -1
- package/CONTRIBUTING.md +34 -0
- package/dist/multi/{141.app-13f840d5.js → 141.app-71d7f77e.js} +1 -1
- package/dist/multi/222.app-71d7f77e.js +1 -0
- package/dist/multi/335.app-71d7f77e.js +1 -0
- package/dist/multi/{34.app-13f840d5.js → 34.app-71d7f77e.js} +1 -1
- package/dist/multi/349.app-71d7f77e.js +1 -0
- package/dist/multi/378.app-71d7f77e.js +1 -0
- package/dist/multi/{406.app-13f840d5.js → 406.app-71d7f77e.js} +1 -1
- package/dist/multi/476.app-71d7f77e.js +1 -0
- package/dist/multi/{53.app-13f840d5.js → 53.app-71d7f77e.js} +1 -1
- package/dist/multi/{584.app-13f840d5.js → 584.app-71d7f77e.js} +1 -1
- package/dist/multi/690.app-71d7f77e.js +1 -0
- package/dist/multi/{747.app-13f840d5.js → 747.app-71d7f77e.js} +1 -1
- package/dist/multi/{767.app-13f840d5.js → 767.app-71d7f77e.js} +1 -1
- package/dist/multi/{816.app-13f840d5.js → 816.app-71d7f77e.js} +1 -1
- package/dist/multi/83.app-71d7f77e.js +1 -0
- package/dist/multi/{873.app-13f840d5.js → 873.app-71d7f77e.js} +1 -1
- package/dist/multi/{920.app-13f840d5.js → 920.app-71d7f77e.js} +1 -1
- package/dist/multi/{991.app-13f840d5.js → 991.app-71d7f77e.js} +1 -1
- package/dist/multi/app-71d7f77e.js +2 -0
- package/dist/multi/manifest.json +20 -20
- package/dist/multi/{styles-13f840d5.css → styles-71d7f77e.css} +4 -4
- package/dist/single/app-7aa8b012.js +2 -0
- package/dist/single/manifest.json +1 -1
- package/package.json +11 -4
- package/src/components/app/ArrowButton/index.tsx +3 -2
- package/src/components/app/BaseLayout/index.tsx +5 -5
- package/src/components/app/ReportBody/Filters.tsx +12 -10
- package/src/components/app/ReportBody/HeaderActions.tsx +3 -3
- package/src/components/app/ReportBody/SortBy.tsx +8 -8
- package/src/components/app/ReportBody/context.tsx +0 -1
- package/src/components/app/Tabs/index.tsx +2 -3
- package/src/components/app/TestResult/TestResultDescription/index.tsx +3 -3
- package/src/components/app/TestResult/TestResultNavigation/index.tsx +34 -37
- package/src/components/app/TestResult/TestResultNavigation/styles.scss +1 -1
- package/src/components/app/TestResult/TestResultSteps/attachment.tsx +4 -6
- package/src/components/app/Tree/Tree.tsx +54 -101
- package/src/components/app/Tree/TreeHeader.tsx +13 -12
- package/src/components/app/Tree/TreeItem.tsx +3 -1
- package/src/components/app/Tree/index.tsx +31 -7
- package/src/components/app/Tree/styles.scss +9 -3
- package/src/components/commons/Menu/index.tsx +4 -4
- package/src/components/commons/SearchBox/index.tsx +8 -6
- package/src/components/commons/Toggle/index.tsx +2 -1
- package/src/components/commons/Tooltip/index.tsx +3 -3
- package/src/i18n/constants.ts +21 -2
- package/src/i18n/locales/am.json +3 -1
- package/src/i18n/locales/az.json +3 -1
- package/src/i18n/locales/de.json +3 -1
- package/src/i18n/locales/en.json +4 -2
- package/src/i18n/locales/es.json +3 -0
- package/src/i18n/locales/fr.json +3 -1
- package/src/i18n/locales/he.json +3 -1
- package/src/i18n/locales/it.json +3 -1
- package/src/i18n/locales/ja.json +3 -1
- package/src/i18n/locales/ka.json +3 -1
- package/src/i18n/locales/kr.json +3 -1
- package/src/i18n/locales/nl.json +3 -1
- package/src/i18n/locales/pl.json +3 -1
- package/src/i18n/locales/pt.json +3 -1
- package/src/i18n/locales/ru.json +3 -1
- package/src/i18n/locales/sv.json +3 -1
- package/src/i18n/locales/tr.json +3 -1
- package/src/i18n/locales/zh.json +4 -2
- package/src/index.html +1 -0
- package/src/stores/chart.ts +2 -2
- package/src/stores/testResults.ts +26 -4
- package/src/stores/tree.ts +98 -4
- package/src/types/globals.d.ts +6 -1
- package/src/utils/treeFilters.ts +73 -120
- package/test/utils/treeFilters.test.ts +424 -0
- package/types.d.ts +25 -4
- package/vitest.config.ts +12 -0
- package/dist/multi/222.app-13f840d5.js +0 -1
- package/dist/multi/335.app-13f840d5.js +0 -1
- package/dist/multi/349.app-13f840d5.js +0 -1
- package/dist/multi/378.app-13f840d5.js +0 -1
- package/dist/multi/476.app-13f840d5.js +0 -1
- package/dist/multi/690.app-13f840d5.js +0 -1
- package/dist/multi/83.app-13f840d5.js +0 -1
- package/dist/multi/app-13f840d5.js +0 -2
- package/dist/single/app-d31bd53e.js +0 -2
- /package/dist/multi/{app-13f840d5.js.LICENSE.txt → app-71d7f77e.js.LICENSE.txt} +0 -0
- /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
|
|
19
|
-
const minWidthTab
|
|
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
|
|
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[
|
|
53
|
-
const style = { flexGrow:
|
|
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
|
|
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={(
|
|
20
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
}
|
package/src/i18n/constants.ts
CHANGED
|
@@ -1,4 +1,23 @@
|
|
|
1
|
-
export const AVAILABLE_LOCALES = [
|
|
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
|
};
|
package/src/i18n/locales/am.json
CHANGED
|
@@ -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": "Կրկնությունների մասին տեղեկություններ չկան"
|
package/src/i18n/locales/az.json
CHANGED
|
@@ -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
|
+
}
|
package/src/i18n/locales/de.json
CHANGED
|
@@ -60,7 +60,9 @@
|
|
|
60
60
|
"status-desc-short": "Umgekehrt"
|
|
61
61
|
},
|
|
62
62
|
"empty": {
|
|
63
|
-
"no-results": "Keine Ergebnisse
|
|
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"
|
package/src/i18n/locales/en.json
CHANGED
|
@@ -60,7 +60,9 @@
|
|
|
60
60
|
"status-desc-short": "Reversed"
|
|
61
61
|
},
|
|
62
62
|
"empty": {
|
|
63
|
-
"no-results": "No results
|
|
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
|
+
}
|
package/src/i18n/locales/es.json
CHANGED
|
@@ -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"
|
package/src/i18n/locales/fr.json
CHANGED
|
@@ -60,7 +60,9 @@
|
|
|
60
60
|
"status-desc-short": "Inversé"
|
|
61
61
|
},
|
|
62
62
|
"empty": {
|
|
63
|
-
"no-results": "Aucun résultat
|
|
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"
|
package/src/i18n/locales/he.json
CHANGED
|
@@ -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": "לא נמצאה מידע על נסיונות חוזרים"
|
package/src/i18n/locales/it.json
CHANGED
|
@@ -60,7 +60,9 @@
|
|
|
60
60
|
"status-desc-short": "Invertito"
|
|
61
61
|
},
|
|
62
62
|
"empty": {
|
|
63
|
-
"no-results": "Nessun risultato
|
|
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"
|
package/src/i18n/locales/ja.json
CHANGED
|
@@ -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": "再試行情報が利用できません"
|
package/src/i18n/locales/ka.json
CHANGED
|
@@ -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": "ხელახალი ცდების ინფორმ���ცია არ არის ხელმისაწვდომი"
|
package/src/i18n/locales/kr.json
CHANGED
|
@@ -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": "재시도 정보를 사용할 수 없습니다"
|
package/src/i18n/locales/nl.json
CHANGED
|
@@ -60,7 +60,9 @@
|
|
|
60
60
|
"status-desc-short": "Omgekeerd"
|
|
61
61
|
},
|
|
62
62
|
"empty": {
|
|
63
|
-
"no-results": "Geen resultaten
|
|
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"
|
package/src/i18n/locales/pl.json
CHANGED
|
@@ -57,7 +57,9 @@
|
|
|
57
57
|
"status-desc-short": "Domyślnie"
|
|
58
58
|
},
|
|
59
59
|
"empty": {
|
|
60
|
-
"no-results": "
|
|
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"
|
package/src/i18n/locales/pt.json
CHANGED
|
@@ -60,7 +60,9 @@
|
|
|
60
60
|
"status-desc-short": "Invertido"
|
|
61
61
|
},
|
|
62
62
|
"empty": {
|
|
63
|
-
"no-results": "
|
|
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"
|
package/src/i18n/locales/ru.json
CHANGED
|
@@ -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": "Информация о перезапусках отсутствует"
|
package/src/i18n/locales/sv.json
CHANGED
|
@@ -60,7 +60,9 @@
|
|
|
60
60
|
"status-desc-short": "Omvänd"
|
|
61
61
|
},
|
|
62
62
|
"empty": {
|
|
63
|
-
"no-results": "Inga resultat
|
|
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"
|
package/src/i18n/locales/tr.json
CHANGED
|
@@ -60,7 +60,9 @@
|
|
|
60
60
|
"status-desc-short": "Ters"
|
|
61
61
|
},
|
|
62
62
|
"empty": {
|
|
63
|
-
"no-results": "Sonuç
|
|
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"
|
package/src/i18n/locales/zh.json
CHANGED
|
@@ -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
package/src/stores/chart.ts
CHANGED
|
@@ -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 },
|