@allurereport/web-awesome 3.0.0-beta.8 → 3.0.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 (282) hide show
  1. package/dist/multi/173.app-9931797d1602fc52db5b.js +1 -0
  2. package/dist/multi/174.app-9931797d1602fc52db5b.js +1 -0
  3. package/dist/multi/252.app-9931797d1602fc52db5b.js +1 -0
  4. package/dist/multi/282.app-9931797d1602fc52db5b.js +1 -0
  5. package/dist/multi/29.app-9931797d1602fc52db5b.js +1 -0
  6. package/dist/multi/416.app-9931797d1602fc52db5b.js +1 -0
  7. package/dist/multi/527.app-9931797d1602fc52db5b.js +1 -0
  8. package/dist/multi/600.app-9931797d1602fc52db5b.js +1 -0
  9. package/dist/multi/605.app-9931797d1602fc52db5b.js +1 -0
  10. package/dist/multi/638.app-9931797d1602fc52db5b.js +1 -0
  11. package/dist/multi/672.app-9931797d1602fc52db5b.js +1 -0
  12. package/dist/multi/686.app-9931797d1602fc52db5b.js +1 -0
  13. package/dist/multi/725.app-9931797d1602fc52db5b.js +1 -0
  14. package/dist/multi/741.app-9931797d1602fc52db5b.js +1 -0
  15. package/dist/multi/755.app-9931797d1602fc52db5b.js +1 -0
  16. package/dist/multi/894.app-9931797d1602fc52db5b.js +1 -0
  17. package/dist/multi/91.app-9931797d1602fc52db5b.js +1 -0
  18. package/dist/multi/943.app-9931797d1602fc52db5b.js +1 -0
  19. package/dist/multi/980.app-9931797d1602fc52db5b.js +1 -0
  20. package/dist/multi/app-9931797d1602fc52db5b.js +2 -0
  21. package/dist/multi/app-9931797d1602fc52db5b.js.LICENSE.txt +10 -0
  22. package/dist/multi/manifest.json +25 -24
  23. package/dist/multi/styles-8fe37354d1c2270c691e.css +48 -0
  24. package/dist/single/app-6199dc1c2fd3bddc2526.js +2 -0
  25. package/dist/single/app-6199dc1c2fd3bddc2526.js.LICENSE.txt +10 -0
  26. package/dist/single/manifest.json +1 -1
  27. package/package.json +30 -17
  28. package/src/assets/scss/day.scss +2 -0
  29. package/src/assets/scss/index.scss +1 -3
  30. package/src/assets/scss/night.scss +2 -0
  31. package/src/assets/scss/palette.scss +391 -391
  32. package/src/assets/scss/theme.scss +292 -79
  33. package/src/components/BaseLayout/index.tsx +10 -31
  34. package/src/components/BaseLayout/styles.scss +14 -4
  35. package/src/components/Charts/index.tsx +245 -0
  36. package/src/components/Charts/styles.scss +27 -0
  37. package/src/components/EnvironmentPicker/index.tsx +60 -0
  38. package/src/components/EnvironmentPicker/styles.scss +9 -0
  39. package/src/components/Footer/FooterLogo.tsx +1 -2
  40. package/src/components/Footer/FooterVersion.tsx +7 -3
  41. package/src/components/Footer/index.tsx +6 -2
  42. package/src/components/Header/CiInfo/index.tsx +67 -0
  43. package/src/components/Header/CiInfo/styles.scss +7 -0
  44. package/src/components/Header/index.tsx +21 -8
  45. package/src/components/Header/styles.scss +9 -1
  46. package/src/components/HeaderControls/index.tsx +20 -0
  47. package/src/components/MainReport/index.tsx +84 -6
  48. package/src/components/MainReport/styles.scss +20 -0
  49. package/src/components/Metadata/index.tsx +6 -4
  50. package/src/components/MetadataButton/index.tsx +14 -6
  51. package/src/components/MetadataButton/styles.scss +3 -0
  52. package/src/components/Modal/index.tsx +15 -167
  53. package/src/components/NavTabs/index.tsx +70 -0
  54. package/src/components/{TestResult/TestResultTabs → NavTabs}/styles.scss +0 -3
  55. package/src/components/Report/index.tsx +7 -0
  56. package/src/components/ReportBody/Filters.tsx +45 -66
  57. package/src/components/ReportBody/index.tsx +29 -17
  58. package/src/components/ReportBody/styles.scss +9 -3
  59. package/src/components/ReportGlobalAttachments/index.tsx +34 -0
  60. package/src/components/ReportGlobalAttachments/styles.scss +11 -0
  61. package/src/components/ReportGlobalErrors/index.tsx +30 -0
  62. package/src/components/ReportGlobalErrors/styles.scss +12 -0
  63. package/src/components/ReportHeader/ReportHeaderLogo.tsx +6 -2
  64. package/src/components/ReportHeader/ReportHeaderPie.tsx +1 -2
  65. package/src/components/ReportHeader/index.tsx +38 -12
  66. package/src/components/ReportHeader/styles.scss +9 -1
  67. package/src/components/ReportMetadata/MetadataSummary.tsx +57 -65
  68. package/src/components/ReportMetadata/MetadataWithIcon.tsx +11 -13
  69. package/src/components/ReportMetadata/index.tsx +50 -3
  70. package/src/components/ReportMetadata/styles.scss +0 -2
  71. package/src/components/ReportQualityGateResults/index.tsx +42 -0
  72. package/src/components/ReportQualityGateResults/styles.scss +44 -0
  73. package/src/components/SectionPicker/index.tsx +55 -0
  74. package/src/components/SectionPicker/styles.scss +5 -0
  75. package/src/components/SectionSwitcher/index.tsx +16 -0
  76. package/src/components/SectionSwitcher/styles.scss +4 -0
  77. package/src/components/SectionTabs/index.tsx +0 -0
  78. package/src/components/SideBySide/index.tsx +52 -0
  79. package/src/components/SideBySide/styles.scss +64 -0
  80. package/src/components/SplitLayout/index.tsx +73 -0
  81. package/src/components/SplitLayout/styles.scss +84 -0
  82. package/src/components/Tabs/index.tsx +5 -0
  83. package/src/components/TestResult/TestStepsEmpty/index.tsx +23 -0
  84. package/src/components/TestResult/TestStepsEmpty/styles.scss +25 -0
  85. package/src/components/TestResult/TrAttachmentsView/index.tsx +29 -0
  86. package/src/components/TestResult/{TestResultDescription → TrDescription}/index.tsx +5 -5
  87. package/src/components/TestResult/{TestResultDropdown → TrDropdown}/index.tsx +7 -5
  88. package/src/components/TestResult/{TestResultEmpty → TrEmpty}/index.tsx +10 -9
  89. package/src/components/TestResult/TrEnvironmentItem/index.tsx +82 -0
  90. package/src/components/TestResult/TrEnvironmentItem/styles.scss +60 -0
  91. package/src/components/TestResult/TrEnvironmentsView/index.tsx +64 -0
  92. package/src/components/TestResult/TrEnvironmentsView/styles.scss +11 -0
  93. package/src/components/TestResult/TrError/TrDiff.tsx +121 -0
  94. package/src/components/TestResult/TrError/index.tsx +104 -0
  95. package/src/components/TestResult/TrError/styles.scss +223 -0
  96. package/src/components/TestResult/TrHeader/TrBreadcrumbs.tsx +44 -0
  97. package/src/components/TestResult/TrHeader/index.tsx +15 -0
  98. package/src/components/TestResult/{TestResultHeader → TrHeader}/styles.scss +7 -2
  99. package/src/components/TestResult/TrHistory/TrHistoryItem.tsx +94 -0
  100. package/src/components/TestResult/TrHistory/index.tsx +26 -0
  101. package/src/components/TestResult/{TestResultHistory → TrHistory}/styles.scss +2 -1
  102. package/src/components/TestResult/{TestResultInfo/TestResultInfoStatuses.tsx → TrInfo/TrInfoStatuses.tsx} +6 -4
  103. package/src/components/TestResult/TrInfo/index.tsx +99 -0
  104. package/src/components/TestResult/{TestResultInfo → TrInfo}/styles.scss +18 -0
  105. package/src/components/TestResult/{TestResultLinks → TrLinks}/index.tsx +8 -8
  106. package/src/components/TestResult/{TestResultMetadata → TrMetadata}/index.tsx +6 -6
  107. package/src/components/TestResult/{TestResultNavigation → TrNavigation}/index.tsx +7 -9
  108. package/src/components/TestResult/TrOverview.tsx +46 -0
  109. package/src/components/TestResult/{TestResultParameters → TrParameters}/index.tsx +4 -4
  110. package/src/components/TestResult/TrPrevStatuses/index.tsx +63 -0
  111. package/src/components/TestResult/TrPwTraces/PwTrace.tsx +34 -0
  112. package/src/components/TestResult/TrPwTraces/PwTraceButton.tsx +32 -0
  113. package/src/components/TestResult/TrPwTraces/index.tsx +32 -0
  114. package/src/components/TestResult/TrPwTraces/styles.scss +20 -0
  115. package/src/components/TestResult/TrRetriesView/TrRetriesItem.tsx +70 -0
  116. package/src/components/TestResult/TrRetriesView/index.tsx +29 -0
  117. package/src/components/TestResult/{TestResultSetup → TrSetup}/index.tsx +24 -15
  118. package/src/components/TestResult/{TestResultSeverity → TrSeverity}/index.tsx +2 -2
  119. package/src/components/TestResult/{TestResultStatus → TrStatus}/index.tsx +5 -5
  120. package/src/components/TestResult/TrSteps/TrAttachment.tsx +118 -0
  121. package/src/components/TestResult/{TestResultSteps/testResultAttachmentInfo.tsx → TrSteps/TrAttachmentInfo.tsx} +11 -11
  122. package/src/components/TestResult/TrSteps/TrStep.tsx +98 -0
  123. package/src/components/TestResult/TrSteps/TrStepInfo.tsx +90 -0
  124. package/src/components/TestResult/TrSteps/index.tsx +58 -0
  125. package/src/components/TestResult/{TestResultSteps → TrSteps}/styles.scss +49 -10
  126. package/src/components/TestResult/{TestResultSteps → TrSteps}/wrongAttachment.tsx +1 -1
  127. package/src/components/TestResult/TrTabs/index.tsx +42 -0
  128. package/src/components/TestResult/{TestResultTeardown → TrTeardown}/index.tsx +25 -15
  129. package/src/components/TestResult/index.tsx +54 -38
  130. package/src/components/TestResult/styles.scss +12 -0
  131. package/src/components/Timeline/index.tsx +100 -0
  132. package/src/components/Timeline/styles.scss +45 -0
  133. package/src/components/ToggleLayout/index.tsx +17 -0
  134. package/src/components/Tree/index.tsx +122 -16
  135. package/src/components/Tree/styles.scss +23 -5
  136. package/src/index.html +23 -6
  137. package/src/index.tsx +91 -20
  138. package/src/locales/az.json +376 -0
  139. package/src/locales/de.json +376 -0
  140. package/src/locales/en.json +376 -0
  141. package/src/locales/es.json +376 -0
  142. package/src/locales/fr.json +376 -0
  143. package/src/locales/he.json +376 -0
  144. package/src/locales/hy.json +376 -0
  145. package/src/locales/it.json +376 -0
  146. package/src/locales/ja.json +376 -0
  147. package/src/locales/ka.json +376 -0
  148. package/src/locales/kr.json +376 -0
  149. package/src/locales/nl.json +376 -0
  150. package/src/locales/pl.json +384 -0
  151. package/src/locales/pt.json +376 -0
  152. package/src/locales/ru.json +384 -0
  153. package/src/locales/sv.json +376 -0
  154. package/src/locales/tr.json +376 -0
  155. package/src/locales/ua.json +327 -0
  156. package/src/locales/zh.json +376 -0
  157. package/src/stores/chart.ts +41 -6
  158. package/src/stores/env.ts +88 -0
  159. package/src/stores/envInfo.ts +2 -2
  160. package/src/stores/globals.ts +28 -0
  161. package/src/stores/layout.ts +36 -0
  162. package/src/stores/locale.ts +77 -29
  163. package/src/stores/modal.ts +22 -0
  164. package/src/stores/qualityGate.ts +28 -0
  165. package/src/stores/router.ts +108 -0
  166. package/src/stores/sections.ts +63 -0
  167. package/src/stores/stats.ts +52 -7
  168. package/src/stores/testResults.ts +13 -9
  169. package/src/stores/theme.ts +15 -18
  170. package/src/stores/timeline.ts +39 -0
  171. package/src/stores/tree.ts +101 -31
  172. package/src/stores/variables.ts +40 -0
  173. package/src/styles.scss +66 -0
  174. package/src/utils/loadFromLocalStorage.ts +8 -0
  175. package/src/utils/time.ts +1 -0
  176. package/src/utils/tree.ts +23 -0
  177. package/src/utils/treeFilters.ts +27 -21
  178. package/test/components/Header/CiInfo.test.tsx +177 -0
  179. package/test/components/Header.test.tsx +122 -0
  180. package/test/utils/treeFilters.test.ts +44 -44
  181. package/tsconfig.json +7 -2
  182. package/tsconfig.node.json +8 -0
  183. package/types.d.ts +53 -21
  184. package/vitest.config.ts +15 -2
  185. package/vitest.setup.ts +1 -0
  186. package/webpack.config.js +37 -5
  187. package/dist/multi/141.app-4375537b.js +0 -1
  188. package/dist/multi/222.app-4375537b.js +0 -1
  189. package/dist/multi/335.app-4375537b.js +0 -1
  190. package/dist/multi/34.app-4375537b.js +0 -1
  191. package/dist/multi/349.app-4375537b.js +0 -1
  192. package/dist/multi/378.app-4375537b.js +0 -1
  193. package/dist/multi/406.app-4375537b.js +0 -1
  194. package/dist/multi/476.app-4375537b.js +0 -1
  195. package/dist/multi/53.app-4375537b.js +0 -1
  196. package/dist/multi/584.app-4375537b.js +0 -1
  197. package/dist/multi/690.app-4375537b.js +0 -1
  198. package/dist/multi/747.app-4375537b.js +0 -1
  199. package/dist/multi/767.app-4375537b.js +0 -1
  200. package/dist/multi/816.app-4375537b.js +0 -1
  201. package/dist/multi/83.app-4375537b.js +0 -1
  202. package/dist/multi/873.app-4375537b.js +0 -1
  203. package/dist/multi/920.app-4375537b.js +0 -1
  204. package/dist/multi/991.app-4375537b.js +0 -1
  205. package/dist/multi/app-4375537b.js +0 -2
  206. package/dist/multi/app-4375537b.js.LICENSE.txt +0 -16
  207. package/dist/multi/styles-4375537b.css +0 -283
  208. package/dist/single/app-f16f6693.js +0 -2
  209. package/dist/single/app-f16f6693.js.LICENSE.txt +0 -16
  210. package/src/assets/scss/code.scss +0 -71
  211. package/src/assets/scss/typography.scss +0 -218
  212. package/src/components/ArrowButton/index.tsx +0 -36
  213. package/src/components/ArrowButton/styles.scss +0 -35
  214. package/src/components/LanguagePicker/index.tsx +0 -40
  215. package/src/components/Modal/styles.scss +0 -126
  216. package/src/components/ReportLogo/index.tsx +0 -16
  217. package/src/components/ReportLogo/styles.scss +0 -20
  218. package/src/components/ReportLogoFull/index.tsx +0 -20
  219. package/src/components/ReportLogoFull/styles.scss +0 -7
  220. package/src/components/TestResult/TestResultAttachmentsView/index.tsx +0 -27
  221. package/src/components/TestResult/TestResultError/index.tsx +0 -59
  222. package/src/components/TestResult/TestResultError/styles.scss +0 -51
  223. package/src/components/TestResult/TestResultHeader/index.tsx +0 -55
  224. package/src/components/TestResult/TestResultHistory/TestResultHistoryItem.tsx +0 -67
  225. package/src/components/TestResult/TestResultHistory/index.tsx +0 -26
  226. package/src/components/TestResult/TestResultInfo/index.tsx +0 -79
  227. package/src/components/TestResult/TestResultOverview.tsx +0 -40
  228. package/src/components/TestResult/TestResultPrevStatuses/index.tsx +0 -49
  229. package/src/components/TestResult/TestResultRetriesView/TestResultRetriesItem.tsx +0 -52
  230. package/src/components/TestResult/TestResultRetriesView/index.tsx +0 -24
  231. package/src/components/TestResult/TestResultSteps/HtmlAttachmentPreview.tsx +0 -12
  232. package/src/components/TestResult/TestResultSteps/attachment.tsx +0 -68
  233. package/src/components/TestResult/TestResultSteps/attachmentCode.tsx +0 -20
  234. package/src/components/TestResult/TestResultSteps/attachmentImage.tsx +0 -32
  235. package/src/components/TestResult/TestResultSteps/attachmentVideo.tsx +0 -15
  236. package/src/components/TestResult/TestResultSteps/index.tsx +0 -49
  237. package/src/components/TestResult/TestResultSteps/testResultAttachment.tsx +0 -77
  238. package/src/components/TestResult/TestResultSteps/testResultStep.tsx +0 -78
  239. package/src/components/TestResult/TestResultSteps/testResultStepInfo.tsx +0 -30
  240. package/src/components/TestResult/TestResultTabs/index.tsx +0 -59
  241. package/src/components/ThemeButton/ThemeButton.tsx +0 -20
  242. package/src/components/Tree/Tree.tsx +0 -68
  243. package/src/components/Tree/TreeHeader.tsx +0 -82
  244. package/src/components/Tree/TreeItem.tsx +0 -35
  245. package/src/components/Tree/TreeItemIcon.tsx +0 -32
  246. package/src/i18n/constants.ts +0 -124
  247. package/src/i18n/locales/am.json +0 -118
  248. package/src/i18n/locales/az.json +0 -118
  249. package/src/i18n/locales/de.json +0 -118
  250. package/src/i18n/locales/en.json +0 -119
  251. package/src/i18n/locales/es.json +0 -118
  252. package/src/i18n/locales/fr.json +0 -118
  253. package/src/i18n/locales/he.json +0 -118
  254. package/src/i18n/locales/it.json +0 -118
  255. package/src/i18n/locales/ja.json +0 -118
  256. package/src/i18n/locales/ka.json +0 -118
  257. package/src/i18n/locales/kr.json +0 -118
  258. package/src/i18n/locales/nl.json +0 -118
  259. package/src/i18n/locales/pl.json +0 -116
  260. package/src/i18n/locales/pt.json +0 -118
  261. package/src/i18n/locales/ru.json +0 -116
  262. package/src/i18n/locales/sv.json +0 -118
  263. package/src/i18n/locales/tr.json +0 -118
  264. package/src/i18n/locales/zh.json +0 -118
  265. package/src/utils/attachments.ts +0 -156
  266. package/src/utils/capitalize.ts +0 -6
  267. /package/dist/multi/{JetBrainsMono_vf-b9a9c326..woff → JetBrainsMono_vf.woff} +0 -0
  268. /package/dist/multi/{JetBrainsMono_vf-9e9649b6..woff2 → JetBrainsMono_vf.woff2} +0 -0
  269. /package/dist/multi/{pt-root-ui_vf-22fe60ca..woff → pt-root-ui_vf.woff} +0 -0
  270. /package/dist/multi/{pt-root-ui_vf-9d251e8b..woff2 → pt-root-ui_vf.woff2} +0 -0
  271. /package/src/components/TestResult/{TestResultAttachmentsView → TrAttachmentsView}/styles.scss +0 -0
  272. /package/src/components/TestResult/{TestResultDescription → TrDescription}/styles.scss +0 -0
  273. /package/src/components/TestResult/{TestResultDropdown → TrDropdown}/styles.scss +0 -0
  274. /package/src/components/TestResult/{TestResultEmpty → TrEmpty}/styles.scss +0 -0
  275. /package/src/components/TestResult/{TestResultLinks → TrLinks}/styles.scss +0 -0
  276. /package/src/components/TestResult/{TestResultMetadata → TrMetadata}/styles.scss +0 -0
  277. /package/src/components/TestResult/{TestResultNavigation → TrNavigation}/styles.scss +0 -0
  278. /package/src/components/TestResult/{TestResultParameters → TrParameters}/styles.scss +0 -0
  279. /package/src/components/TestResult/{TestResultPrevStatuses → TrPrevStatuses}/styles.scss +0 -0
  280. /package/src/components/TestResult/{TestResultRetriesView → TrRetriesView}/styles.scss +0 -0
  281. /package/src/components/TestResult/{TestResultSeverity → TrSeverity}/styles.scss +0 -0
  282. /package/src/components/TestResult/{TestResultStatus → TrStatus}/styles.scss +0 -0
@@ -1,34 +1,43 @@
1
1
  import { allureIcons } from "@allurereport/web-components";
2
2
  import type { FunctionalComponent } from "preact";
3
3
  import { useState } from "preact/hooks";
4
- import type { AllureAwesomeTestResult } from "types";
5
- import { TestResultDropdown } from "@/components/TestResult/TestResultDropdown";
6
- import * as styles from "@/components/TestResult/TestResultSteps/styles.scss";
7
- import { TestResultAttachment } from "@/components/TestResult/TestResultSteps/testResultAttachment";
8
- import { TestResultStep } from "@/components/TestResult/TestResultSteps/testResultStep";
4
+ import type { AwesomeTestResult } from "types";
5
+ import { TrDropdown } from "@/components/TestResult/TrDropdown";
6
+ import { TrAttachment } from "@/components/TestResult/TrSteps/TrAttachment";
7
+ import { TrStep } from "@/components/TestResult/TrSteps/TrStep";
8
+ import * as styles from "@/components/TestResult/TrSteps/styles.scss";
9
9
  import { useI18n } from "@/stores/locale";
10
+ import { collapsedTrees, toggleTree } from "@/stores/tree";
10
11
 
11
12
  const typeMap = {
12
- before: TestResultStep,
13
- after: TestResultStep,
14
- step: TestResultStep,
15
- attachment: TestResultAttachment,
13
+ before: TrStep,
14
+ after: TrStep,
15
+ step: TrStep,
16
+ attachment: TrAttachment,
16
17
  };
17
18
 
18
- export type TestResultSetupProps = {
19
- setup: AllureAwesomeTestResult["setup"];
19
+ export type TrSetupProps = {
20
+ setup: AwesomeTestResult["setup"];
21
+ id?: string;
20
22
  };
21
23
 
22
- export const TestResultSetup: FunctionalComponent<TestResultSetupProps> = ({ setup }) => {
23
- const [isOpened, setIsOpen] = useState(false);
24
+ export const TrSetup: FunctionalComponent<TrSetupProps> = ({ setup, id }) => {
25
+ const teardownId = `${id}-setup`;
26
+ const isEarlyCollapsed = Boolean(!collapsedTrees.value.has(teardownId));
27
+ const [isOpened, setIsOpen] = useState<boolean>(isEarlyCollapsed);
28
+
29
+ const handleClick = () => {
30
+ setIsOpen(!isOpened);
31
+ toggleTree(teardownId);
32
+ };
24
33
  const { t } = useI18n("execution");
25
34
 
26
35
  return (
27
36
  <div className={styles["test-result-steps"]}>
28
- <TestResultDropdown
37
+ <TrDropdown
29
38
  icon={allureIcons.lineTimeClockStopwatch}
30
39
  isOpened={isOpened}
31
- setIsOpen={setIsOpen}
40
+ setIsOpen={handleClick}
32
41
  counter={setup?.length}
33
42
  title={t("setup")}
34
43
  />
@@ -1,7 +1,7 @@
1
+ import { capitalize } from "@allurereport/core-api";
1
2
  import { SvgIcon, Text, allureIcons } from "@allurereport/web-components";
2
3
  import clsx from "clsx";
3
4
  import { useI18n } from "@/stores/locale";
4
- import { capitalize } from "@/utils/capitalize";
5
5
  import * as styles from "./styles.scss";
6
6
 
7
7
  const icons: Record<string, string> = {
@@ -12,7 +12,7 @@ const icons: Record<string, string> = {
12
12
  trivial: allureIcons.lineArrowsChevronDownDouble,
13
13
  };
14
14
 
15
- export const TestResultSeverity = ({ severity = "normal" }: { severity?: string }) => {
15
+ export const TrSeverity = ({ severity = "normal" }: { severity?: string }) => {
16
16
  const { t } = useI18n("severity");
17
17
  const statusClass = clsx(styles[`severity-${severity}`]);
18
18
 
@@ -1,13 +1,13 @@
1
1
  import type { TestStatus } from "@allurereport/core-api";
2
- import { Text } from "@allurereport/web-components";
2
+ import { capitalize } from "@allurereport/core-api";
3
+ import { Text, TreeItemIcon } from "@allurereport/web-components";
3
4
  import clsx from "clsx";
4
- import TreeItemIcon from "@/components/Tree/TreeItemIcon";
5
5
  import { useI18n } from "@/stores";
6
- import { capitalize } from "@/utils/capitalize";
7
6
  import * as styles from "./styles.scss";
8
7
 
9
- export const TestResultStatus = ({ status }: { status: TestStatus }) => {
8
+ export const TrStatus = ({ status }: { status: TestStatus }) => {
10
9
  const { t } = useI18n("statuses");
10
+
11
11
  return (
12
12
  <div
13
13
  data-testid={`test-result-status-${status}`}
@@ -18,7 +18,7 @@ export const TestResultStatus = ({ status }: { status: TestStatus }) => {
18
18
  className={styles["test-result-status-icon"]}
19
19
  classNameIcon={styles["test-result-status-icon"]}
20
20
  />
21
- <Text type={"ui"} size={"s"} bold className={styles["test-result-status-text"]}>
21
+ <Text type={"ui"} size={"s"} className={styles["test-result-status-text"]}>
22
22
  {capitalize(t(status) ?? status)}
23
23
  </Text>
24
24
  </div>
@@ -0,0 +1,118 @@
1
+ import type { AttachmentTestStepResult } from "@allurereport/core-api";
2
+ import { attachmentType } from "@allurereport/web-commons";
3
+ import { ArrowButton, Attachment, Code, SvgIcon, Text, allureIcons } from "@allurereport/web-components";
4
+ import cx from "clsx";
5
+ import type { FunctionComponent } from "preact";
6
+ import { useState } from "preact/hooks";
7
+ import { TrAttachmentInfo } from "@/components/TestResult/TrSteps/TrAttachmentInfo";
8
+ import * as styles from "@/components/TestResult/TrSteps/styles.scss";
9
+ import { openModal } from "@/stores/modal";
10
+
11
+ const { lineImagesImage, lineFilesFileAttachment2, playwrightLogo } = allureIcons;
12
+
13
+ const iconMap: Record<string, string> = {
14
+ "text/plain": lineFilesFileAttachment2,
15
+ "application/xml": lineFilesFileAttachment2,
16
+ "text/html": lineFilesFileAttachment2,
17
+ "text/csv": lineFilesFileAttachment2,
18
+ "text/markdown": lineFilesFileAttachment2,
19
+ "text/javascript": lineFilesFileAttachment2,
20
+ "text/typescript": lineFilesFileAttachment2,
21
+ "text/ruby": lineFilesFileAttachment2,
22
+ "text/python": lineFilesFileAttachment2,
23
+ "text/php": lineFilesFileAttachment2,
24
+ "text/java": lineFilesFileAttachment2,
25
+ "text/csharp": lineFilesFileAttachment2,
26
+ "text/cpp": lineFilesFileAttachment2,
27
+ "text/c": lineFilesFileAttachment2,
28
+ "text/go": lineFilesFileAttachment2,
29
+ "text/rust": lineFilesFileAttachment2,
30
+ "text/swift": lineFilesFileAttachment2,
31
+ "text/kotlin": lineFilesFileAttachment2,
32
+ "text/scala": lineFilesFileAttachment2,
33
+ "text/perl": lineFilesFileAttachment2,
34
+ "text/r": lineFilesFileAttachment2,
35
+ "text/dart": lineFilesFileAttachment2,
36
+ "text/lua": lineFilesFileAttachment2,
37
+ "text/haskell": lineFilesFileAttachment2,
38
+ "text/sql": lineFilesFileAttachment2,
39
+ "text/tab-separated-values": lineFilesFileAttachment2,
40
+ "text/css": lineFilesFileAttachment2,
41
+ "text/uri-list": lineFilesFileAttachment2,
42
+ "image/svg+xml": lineImagesImage,
43
+ "image/png": lineImagesImage,
44
+ "application/json": lineFilesFileAttachment2,
45
+ "application/zip": lineFilesFileAttachment2,
46
+ "video/webm": lineImagesImage,
47
+ "image/jpeg": lineImagesImage,
48
+ "video/mp4": lineImagesImage,
49
+ "application/vnd.allure.image.diff": lineImagesImage,
50
+ "application/vnd.allure.playwright-trace": playwrightLogo,
51
+ };
52
+
53
+ export const TrAttachment: FunctionComponent<{
54
+ item: AttachmentTestStepResult;
55
+ stepIndex?: number;
56
+ className?: string;
57
+ }> = ({ item, stepIndex }) => {
58
+ const [isOpened, setIsOpen] = useState(false);
59
+ const { link } = item;
60
+ const { missed } = link;
61
+ const componentType = attachmentType(link.contentType);
62
+ const isValidComponentType = !["archive", null].includes(componentType.type as string);
63
+
64
+ const expandAttachment = (event: Event) => {
65
+ event.stopPropagation();
66
+ if (componentType.type !== "image") {
67
+ return;
68
+ }
69
+ openModal({
70
+ data: item,
71
+ component: <Attachment item={item} previewable={true} />,
72
+ });
73
+ };
74
+
75
+ return (
76
+ <div data-testid={"test-result-attachment"} className={styles["test-result-step"]}>
77
+ <div
78
+ data-testid={"test-result-attachment-header"}
79
+ className={cx(styles["test-result-attachment-header"], {
80
+ [styles.empty]: !isValidComponentType,
81
+ })}
82
+ onClick={(e) => {
83
+ e.stopPropagation();
84
+ setIsOpen((prev) => !prev);
85
+ }}
86
+ >
87
+ {isValidComponentType ? <ArrowButton isOpened={isOpened} /> : <div className={styles["test-result-strut"]} />}
88
+ <div className={styles["test-result-attachment-icon"]}>
89
+ <SvgIcon size="s" id={iconMap[link.contentType] ?? lineFilesFileAttachment2} />
90
+ </div>
91
+
92
+ <Code size="s" className={styles["test-result-step-number"]}>
93
+ {stepIndex}
94
+ </Code>
95
+ <Text className={styles["test-result-attachment-text"]}>{link.name || link.originalFileName}</Text>
96
+ {missed && (
97
+ <Text
98
+ size={"s"}
99
+ className={styles["test-result-attachment-missed"]}
100
+ data-testid={"test-result-attachment-missed"}
101
+ >
102
+ missed
103
+ </Text>
104
+ )}
105
+ <div>
106
+ <TrAttachmentInfo item={item} shouldExpand={isValidComponentType} />
107
+ </div>
108
+ </div>
109
+ {isOpened && isValidComponentType && (
110
+ <div className={styles["test-result-attachment-content-wrapper"]}>
111
+ <div className={styles["test-result-attachment-content"]} role={"button"} onClick={expandAttachment}>
112
+ <Attachment item={item} />
113
+ </div>
114
+ </div>
115
+ )}
116
+ </div>
117
+ );
118
+ };
@@ -1,25 +1,23 @@
1
1
  import type { AttachmentTestStepResult } from "@allurereport/core-api";
2
- import { IconButton, Text, TooltipWrapper, allureIcons } from "@allurereport/web-components";
2
+ import { downloadAttachment } from "@allurereport/web-commons";
3
+ import { Attachment, IconButton, Text, TooltipWrapper, allureIcons } from "@allurereport/web-components";
3
4
  import { filesize } from "filesize";
4
5
  import type { FunctionalComponent } from "preact";
5
6
  import { useEffect } from "preact/hooks";
6
- import { isModalOpen, openModal } from "@/components/Modal";
7
- import { Attachment } from "@/components/TestResult/TestResultSteps/attachment";
8
- import * as styles from "@/components/TestResult/TestResultSteps/styles.scss";
7
+ import { PwTraceButton } from "@/components/TestResult/TrPwTraces/PwTraceButton";
8
+ import * as styles from "@/components/TestResult/TrSteps/styles.scss";
9
9
  import { useI18n } from "@/stores";
10
- import { downloadAttachment } from "@/utils/attachments";
10
+ import { isModalOpen, openModal } from "@/stores/modal";
11
11
 
12
- interface TestResultAttachmentInfoProps {
12
+ interface TrAttachmentInfo {
13
13
  item?: AttachmentTestStepResult;
14
14
  shouldExpand?: boolean;
15
15
  }
16
16
 
17
- export const TestResultAttachmentInfo: FunctionalComponent<TestResultAttachmentInfoProps> = ({
18
- item,
19
- shouldExpand,
20
- }) => {
21
- const { id, ext, contentType } = item.link;
17
+ export const TrAttachmentInfo: FunctionalComponent<TrAttachmentInfo> = ({ item, shouldExpand }) => {
22
18
  const { t: tooltip } = useI18n("controls");
19
+ const { id, ext, contentType } = item.link;
20
+ const isPwTrace = contentType === "application/vnd.allure.playwright-trace";
23
21
  const contentLength = item.link.missed === false ? item.link.contentLength : undefined;
24
22
  const contentSize = contentLength
25
23
  ? filesize(contentLength, {
@@ -39,6 +37,7 @@ export const TestResultAttachmentInfo: FunctionalComponent<TestResultAttachmentI
39
37
  useEffect(() => {
40
38
  if (isModalOpen.value) {
41
39
  openModal({
40
+ isModalOpen: true,
42
41
  data: item,
43
42
  component: <Attachment item={item} />,
44
43
  });
@@ -55,6 +54,7 @@ export const TestResultAttachmentInfo: FunctionalComponent<TestResultAttachmentI
55
54
  {Boolean(contentType) && <Text size={"s"}>{contentType}</Text>}
56
55
  {Boolean(contentSize) && <Text size={"s"}>{contentSize}</Text>}
57
56
  <div className={styles["item-buttons"]}>
57
+ {isPwTrace && <PwTraceButton link={item.link} />}
58
58
  {shouldExpand && (
59
59
  <TooltipWrapper tooltipText={tooltip("expand")}>
60
60
  <IconButton
@@ -0,0 +1,98 @@
1
+ import type { DefaultTestStepResult, TestStatus, TestStepResult } from "@allurereport/core-api";
2
+ import { ArrowButton, Code, SvgIcon, Text, TreeItemIcon, allureIcons } from "@allurereport/web-components";
3
+ import type { FunctionComponent } from "preact";
4
+ import { useState } from "preact/hooks";
5
+ import { MetadataList } from "@/components/Metadata";
6
+ import { type MetadataItem } from "@/components/ReportMetadata";
7
+ import { TrError } from "@/components/TestResult/TrError";
8
+ import { TrAttachment } from "@/components/TestResult/TrSteps/TrAttachment";
9
+ import { TrStepInfo } from "@/components/TestResult/TrSteps/TrStepInfo";
10
+ import * as styles from "@/components/TestResult/TrSteps/styles.scss";
11
+ import { collapsedTrees, toggleTree } from "@/stores/tree";
12
+
13
+ export const TrStepParameters = (props: { parameters: DefaultTestStepResult["parameters"] }) => {
14
+ const { parameters } = props;
15
+
16
+ return (
17
+ <div className={styles["test-result-parameters"]}>
18
+ <MetadataList size={"s"} envInfo={parameters as unknown as MetadataItem[]} columns={1} />
19
+ </div>
20
+ );
21
+ };
22
+
23
+ export const TrStepsContent = (props: { item: DefaultTestStepResult }) => {
24
+ const { item } = props;
25
+
26
+ return (
27
+ <div data-testid={"test-result-step-content"} className={styles["test-result-step-content"]}>
28
+ {Boolean(item?.parameters?.length) && <TrStepParameters parameters={item.parameters} />}
29
+ {Boolean(item?.message && item?.trace && !item?.hasSimilarErrorInSubSteps) && <TrError {...item} />}
30
+ {Boolean(item?.steps?.length) && (
31
+ <>
32
+ {item.steps?.map((subItem, key) => {
33
+ if (subItem.type === "step") {
34
+ return <TrStep stepIndex={key + 1} key={key} item={subItem} />;
35
+ }
36
+
37
+ if (subItem.type === "attachment") {
38
+ return <TrAttachment stepIndex={key + 1} key={key} item={subItem} />;
39
+ }
40
+
41
+ return null;
42
+ })}
43
+ </>
44
+ )}
45
+ </div>
46
+ );
47
+ };
48
+
49
+ const hasFailedStep = (step: TestStepResult): boolean => {
50
+ if (step.type !== "step") {
51
+ return false;
52
+ }
53
+
54
+ return step.status !== "passed" || step.steps.some(hasFailedStep);
55
+ };
56
+
57
+ export const TrStep: FunctionComponent<{
58
+ item: DefaultTestStepResult;
59
+ stepIndex?: number;
60
+ className?: string;
61
+ }> = ({ item, stepIndex }) => {
62
+ const haveFailedSteps = hasFailedStep(item);
63
+ const isEarlyOpened = collapsedTrees.value.has(item.stepId) ? false : Boolean(haveFailedSteps);
64
+ const [isOpened, setIsOpen] = useState(isEarlyOpened || false);
65
+ const hasContent = Boolean(item?.steps?.length || item?.parameters?.length || item?.message || item?.trace);
66
+
67
+ const handleClick = () => {
68
+ setIsOpen(!isOpened);
69
+ toggleTree(item.stepId);
70
+ };
71
+
72
+ return (
73
+ <div data-testid={"test-result-step"} className={styles["test-result-step"]}>
74
+ <div className={styles["test-result-step-header"]} onClick={handleClick}>
75
+ {!hasContent ? (
76
+ <div className={styles["test-result-strut"]} />
77
+ ) : (
78
+ <ArrowButton
79
+ isOpened={isOpened}
80
+ icon={allureIcons.arrowsChevronDown}
81
+ iconSize={"xs"}
82
+ className={!hasContent ? styles["test-result-visibility-hidden"] : ""}
83
+ data-testid={"test-result-step-arrow-button"}
84
+ />
85
+ )}
86
+ <TreeItemIcon status={item.status} />
87
+ <Code size={"s"} className={styles["test-result-step-number"]}>
88
+ {stepIndex}
89
+ </Code>
90
+ <Text data-testid={"test-result-step-title"} className={styles["test-result-header-text"]}>
91
+ {item.name}
92
+ </Text>
93
+ <TrStepInfo item={item} />
94
+ </div>
95
+ {hasContent && isOpened && <TrStepsContent item={item} />}
96
+ </div>
97
+ );
98
+ };
@@ -0,0 +1,90 @@
1
+ import {
2
+ type DefaultTestStepResult,
3
+ type TestStatus,
4
+ type TestStepResult,
5
+ formatDuration,
6
+ } from "@allurereport/core-api";
7
+ import { SvgIcon, Text, allureIcons } from "@allurereport/web-components";
8
+ import clsx from "clsx";
9
+ import * as styles from "@/components/TestResult/TrSteps/styles.scss";
10
+
11
+ const countErrorStatuses = (step: TestStepResult): Record<string, number> => {
12
+ if (step.type !== "step") {
13
+ return;
14
+ }
15
+ const result: Record<string, number> = {};
16
+
17
+ const collectFromSteps = (currentStep: TestStepResult) => {
18
+ if (currentStep.type !== "step") {
19
+ return;
20
+ }
21
+ if (currentStep.status !== "passed") {
22
+ result[currentStep.status] = (result[currentStep.status] || 0) + 1;
23
+ }
24
+ currentStep.steps?.forEach(collectFromSteps);
25
+ };
26
+ step?.steps?.forEach(collectFromSteps);
27
+
28
+ return result;
29
+ };
30
+
31
+ const {
32
+ lineGeneralCheckCircle,
33
+ lineGeneralHelpCircle,
34
+ lineGeneralMinusCircle,
35
+ lineGeneralXCircle,
36
+ lineGeneralInfoCircle,
37
+ } = allureIcons;
38
+
39
+ const icons = {
40
+ failed: lineGeneralXCircle,
41
+ broken: lineGeneralInfoCircle,
42
+ passed: lineGeneralCheckCircle,
43
+ skipped: lineGeneralMinusCircle,
44
+ unknown: lineGeneralHelpCircle,
45
+ };
46
+
47
+ export const TrStepInfo = (props: { item: DefaultTestStepResult }) => {
48
+ const { item } = props;
49
+ const formattedDuration = formatDuration(item?.duration as number);
50
+ const stepLength = item.steps?.length;
51
+ const attachmentLength = item.steps?.filter((step) => step.type === "attachment")?.length;
52
+
53
+ const failedStepsInTree = countErrorStatuses(item) || {};
54
+
55
+ const FailedSteps = () => (
56
+ <div className={styles["failed-steps"]}>
57
+ {Object.entries(failedStepsInTree).map(([status, count], index) => (
58
+ <div className={styles["item-status"]} key={index}>
59
+ <SvgIcon
60
+ size="s"
61
+ id={icons[status as TestStatus]}
62
+ className={clsx(styles["item-status-icon"], styles[`status-${status}`])}
63
+ />
64
+ {count && <Text size={"s"}>{count}</Text>}
65
+ </div>
66
+ ))}
67
+ </div>
68
+ );
69
+
70
+ return (
71
+ <div className={styles["item-info"]}>
72
+ <FailedSteps />
73
+ {Boolean(stepLength) && (
74
+ <div className={styles["item-info-step"]}>
75
+ <SvgIcon id={allureIcons.lineArrowsCornerDownRight} className={styles["item-info-step-icon"]} />
76
+ <Text size={"s"}>{stepLength}</Text>
77
+ </div>
78
+ )}
79
+ {Boolean(attachmentLength) && (
80
+ <div className={styles["item-info-step"]}>
81
+ <SvgIcon id={allureIcons.lineFilesFileAttachment2} className={styles["item-info-step-icon"]} />
82
+ <Text size={"s"}>{attachmentLength}</Text>
83
+ </div>
84
+ )}
85
+ <Text type="ui" size={"s"} className={styles["item-time"]}>
86
+ {formattedDuration}
87
+ </Text>
88
+ </div>
89
+ );
90
+ };
@@ -0,0 +1,58 @@
1
+ import { allureIcons } from "@allurereport/web-components";
2
+ import type { FunctionalComponent } from "preact";
3
+ import { useState } from "preact/hooks";
4
+ import type { AwesomeTestResult, AwesomeTestStepResult } from "types";
5
+ import { TrDropdown } from "@/components/TestResult/TrDropdown";
6
+ import { TrAttachment } from "@/components/TestResult/TrSteps/TrAttachment";
7
+ import { TrStep } from "@/components/TestResult/TrSteps/TrStep";
8
+ import { useI18n } from "@/stores/locale";
9
+ import { collapsedTrees, toggleTree } from "@/stores/tree";
10
+ import * as styles from "./styles.scss";
11
+
12
+ const typeMap = {
13
+ step: TrStep,
14
+ attachment: TrAttachment,
15
+ } as const;
16
+
17
+ export type TrStepsProps = {
18
+ steps: AwesomeTestResult["steps"];
19
+ id?: string;
20
+ };
21
+
22
+ type StepComponentProps = FunctionalComponent<{
23
+ item?: AwesomeTestStepResult;
24
+ stepIndex?: number;
25
+ }>;
26
+
27
+ export const TrSteps: FunctionalComponent<TrStepsProps> = ({ steps, id }) => {
28
+ const stepsId = `${id}-steps`;
29
+ const isEarlyCollapsed = Boolean(!collapsedTrees.value.has(stepsId));
30
+ const [isOpened, setIsOpen] = useState<boolean>(isEarlyCollapsed);
31
+
32
+ const handleClick = () => {
33
+ setIsOpen(!isOpened);
34
+ toggleTree(stepsId);
35
+ };
36
+
37
+ const { t } = useI18n("execution");
38
+ return (
39
+ <div className={styles["test-result-steps"]}>
40
+ <TrDropdown
41
+ icon={allureIcons.lineHelpersPlayCircle}
42
+ isOpened={isOpened}
43
+ setIsOpen={handleClick}
44
+ counter={steps?.length}
45
+ title={t("body")}
46
+ />
47
+ {isOpened && (
48
+ <div className={styles["test-result-steps-root"]}>
49
+ {steps?.map((item: AwesomeTestStepResult, index) => {
50
+ const { type } = item;
51
+ const StepComponent: StepComponentProps = typeMap[type];
52
+ return StepComponent ? <StepComponent item={item} stepIndex={index + 1} key={index} /> : null;
53
+ })}
54
+ </div>
55
+ )}
56
+ </div>
57
+ );
58
+ };
@@ -1,3 +1,5 @@
1
+ @import "~@allurereport/web-components/mixins.scss";
2
+
1
3
  .test-result-steps {
2
4
  padding-right: 24px;
3
5
 
@@ -23,16 +25,12 @@
23
25
  }
24
26
 
25
27
  .test-result-attachment-content {
26
- max-height: 450px;
27
- overflow-y: auto;
28
28
  border-top: 1px solid var(--on-border-muted);
29
29
  }
30
30
 
31
31
  .test-result-attachment-content-wrapper {
32
32
  padding-left: 16px;
33
33
  margin-left: 11px;
34
- max-height: 450px;
35
- overflow-y: auto;
36
34
  }
37
35
 
38
36
  .test-result-step-root {
@@ -41,10 +39,9 @@
41
39
 
42
40
  .test-result-step-header {
43
41
  display: flex;
44
- align-items: center;
42
+ align-items: flex-start;
45
43
  gap: 4px;
46
44
  transition: background-color 300ms;
47
- cursor: pointer;
48
45
  padding: 4px 8px 4px 6px;
49
46
  min-height: 32px;
50
47
 
@@ -56,6 +53,7 @@
56
53
  .test-result-header-text {
57
54
  padding-left: 4px;
58
55
  word-break: break-word;
56
+ margin-right: auto;
59
57
  }
60
58
 
61
59
  .test-result-step-button {
@@ -82,7 +80,6 @@
82
80
  }
83
81
 
84
82
  .item-info {
85
- margin-left: auto;
86
83
  display: flex;
87
84
  gap: 8px;
88
85
  color: var(--on-text-secondary);
@@ -95,7 +92,7 @@
95
92
  align-items: center;
96
93
  gap: 4px;
97
94
  color: var(--on-icon-secondary);
98
- min-width: 52px;
95
+ min-width: 56px;
99
96
  justify-content: flex-end;
100
97
  }
101
98
 
@@ -125,9 +122,12 @@
125
122
  align-items: center;
126
123
  gap: 4px;
127
124
  transition: background-color 300ms;
128
- cursor: pointer;
129
125
  padding: 4px 8px 4px 6px;
130
126
 
127
+ &:not(.empty) {
128
+ cursor: pointer;
129
+ }
130
+
131
131
  &:hover {
132
132
  background: var(--bg-control-flat-medium);
133
133
  }
@@ -151,6 +151,7 @@
151
151
  .test-result-attachment-text {
152
152
  padding-left: 4px;
153
153
  word-break: break-word;
154
+ margin-right: auto;
154
155
  }
155
156
 
156
157
  .test-result-attachment-image {
@@ -218,8 +219,46 @@
218
219
 
219
220
  .test-result-strut {
220
221
  width: 24px;
222
+ flex: none;
221
223
  }
222
224
 
223
225
  .html-attachment-preview {
224
226
  padding: 0 16px;
225
- }
227
+ }
228
+
229
+ .item-status {
230
+ display: flex;
231
+ align-items: center;
232
+ gap: 4px;
233
+ }
234
+
235
+ .item-status-icon {
236
+ &.status-passed {
237
+ color: var(--bg-support-castor);
238
+ }
239
+
240
+ &.status-failed {
241
+ color: var(--bg-support-capella);
242
+ }
243
+
244
+ &.status-broken {
245
+ color: var(--bg-support-atlas);
246
+ }
247
+
248
+ &.status-skipped {
249
+ color: var(--bg-support-rau);
250
+ }
251
+
252
+ &.status-unknown {
253
+ color: var(--bg-support-skat);
254
+ }
255
+ }
256
+
257
+ .failed-steps {
258
+ display: flex;
259
+ gap: 8px;
260
+ }
261
+
262
+ :global(.code-toolbar .toolbar) {
263
+ display: none;
264
+ }
@@ -1,4 +1,4 @@
1
- import * as styles from "@/components/TestResult/TestResultSteps/styles.scss";
1
+ import * as styles from "@/components/TestResult/TrSteps/styles.scss";
2
2
  import { useI18n } from "@/stores";
3
3
 
4
4
  export const EmptyComponent = () => {