@allurereport/web-awesome 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/multi/173.app-648d4a8e7d5405e104a1.js +1 -0
  2. package/dist/multi/174.app-648d4a8e7d5405e104a1.js +1 -0
  3. package/dist/multi/252.app-648d4a8e7d5405e104a1.js +1 -0
  4. package/dist/multi/282.app-648d4a8e7d5405e104a1.js +1 -0
  5. package/dist/multi/29.app-648d4a8e7d5405e104a1.js +1 -0
  6. package/dist/multi/310.app-648d4a8e7d5405e104a1.js +1 -0
  7. package/dist/multi/416.app-648d4a8e7d5405e104a1.js +1 -0
  8. package/dist/multi/507.app-648d4a8e7d5405e104a1.js +1 -0
  9. package/dist/multi/527.app-648d4a8e7d5405e104a1.js +1 -0
  10. package/dist/multi/600.app-648d4a8e7d5405e104a1.js +1 -0
  11. package/dist/multi/605.app-648d4a8e7d5405e104a1.js +1 -0
  12. package/dist/multi/638.app-648d4a8e7d5405e104a1.js +1 -0
  13. package/dist/multi/672.app-648d4a8e7d5405e104a1.js +1 -0
  14. package/dist/multi/686.app-648d4a8e7d5405e104a1.js +1 -0
  15. package/dist/multi/725.app-648d4a8e7d5405e104a1.js +1 -0
  16. package/dist/multi/741.app-648d4a8e7d5405e104a1.js +1 -0
  17. package/dist/multi/749.app-648d4a8e7d5405e104a1.js +1 -0
  18. package/dist/multi/755.app-648d4a8e7d5405e104a1.js +1 -0
  19. package/dist/multi/{894.app-8be6acc0a596a2197dbf.js → 894.app-648d4a8e7d5405e104a1.js} +1 -1
  20. package/dist/multi/943.app-648d4a8e7d5405e104a1.js +1 -0
  21. package/dist/multi/980.app-648d4a8e7d5405e104a1.js +1 -0
  22. package/dist/multi/app-648d4a8e7d5405e104a1.js +2 -0
  23. package/dist/multi/{app-8be6acc0a596a2197dbf.js.LICENSE.txt → app-648d4a8e7d5405e104a1.js.LICENSE.txt} +1 -1
  24. package/dist/multi/manifest.json +23 -21
  25. package/dist/multi/{styles-0b84e1ef76554ad2db9a.css → styles-b72a0161ddf41447b31c.css} +10 -10
  26. package/dist/single/app-ae966ad3dc27579d6c39.js +2 -0
  27. package/dist/single/{app-8221eb856e47b4ef50d6.js.LICENSE.txt → app-ae966ad3dc27579d6c39.js.LICENSE.txt} +1 -1
  28. package/dist/single/manifest.json +1 -1
  29. package/package.json +18 -36
  30. package/src/components/BaseLayout/index.tsx +2 -0
  31. package/src/components/Categories/CategoriesTree/index.tsx +2 -0
  32. package/src/components/Categories/CategoryHeaderItem/index.tsx +2 -0
  33. package/src/components/Categories/CategoryTreeItem/index.tsx +2 -0
  34. package/src/components/Categories/GroupTreeItem/index.tsx +2 -0
  35. package/src/components/Categories/HistoryTreeItem/index.tsx +2 -0
  36. package/src/components/Categories/LabelTreeItem/index.tsx +2 -0
  37. package/src/components/Categories/MessageTreeItem/index.tsx +2 -0
  38. package/src/components/Categories/SeverityTreeItem/index.tsx +2 -0
  39. package/src/components/Charts/index.tsx +3 -0
  40. package/src/components/EnvironmentPicker/index.tsx +78 -18
  41. package/src/components/EnvironmentPicker/styles.scss +19 -0
  42. package/src/components/Footer/FooterLogo.tsx +1 -0
  43. package/src/components/Footer/FooterVersion.tsx +2 -0
  44. package/src/components/Footer/index.tsx +3 -1
  45. package/src/components/Header/CiInfo/index.tsx +17 -3
  46. package/src/components/Header/index.tsx +3 -0
  47. package/src/components/Header/styles.scss +1 -0
  48. package/src/components/HeaderControls/index.tsx +1 -0
  49. package/src/components/MainReport/index.tsx +3 -0
  50. package/src/components/Metadata/index.tsx +2 -0
  51. package/src/components/MetadataButton/index.tsx +35 -8
  52. package/src/components/MetadataButton/styles.scss +20 -0
  53. package/src/components/Modal/index.tsx +2 -0
  54. package/src/components/NavTabs/index.tsx +2 -1
  55. package/src/components/ReportBody/HeaderActions.tsx +1 -0
  56. package/src/components/ReportBody/SortBy.tsx +2 -0
  57. package/src/components/ReportBody/index.tsx +4 -1
  58. package/src/components/ReportCategories/index.tsx +2 -0
  59. package/src/components/ReportFilters/BaseFilters.tsx +2 -0
  60. package/src/components/ReportFilters/CategoriesFilter.tsx +2 -0
  61. package/src/components/ReportFilters/RetryFlaky.tsx +2 -0
  62. package/src/components/ReportFilters/TagsFilter.tsx +2 -0
  63. package/src/components/ReportFilters/TransitionFilter.tsx +2 -0
  64. package/src/components/ReportFilters/index.tsx +3 -0
  65. package/src/components/ReportGlobalAttachments/index.tsx +3 -0
  66. package/src/components/ReportGlobalErrors/index.tsx +2 -0
  67. package/src/components/ReportHeader/ReportHeaderLabelList.tsx +1 -0
  68. package/src/components/ReportHeader/ReportHeaderLogo.tsx +3 -1
  69. package/src/components/ReportHeader/ReportHeaderPie.tsx +2 -0
  70. package/src/components/ReportHeader/index.tsx +2 -0
  71. package/src/components/ReportMetadata/MetadataItem.tsx +1 -0
  72. package/src/components/ReportMetadata/MetadataSummary.tsx +3 -1
  73. package/src/components/ReportMetadata/MetadataTestType.tsx +2 -0
  74. package/src/components/ReportMetadata/MetadataWithIcon.tsx +2 -0
  75. package/src/components/ReportMetadata/index.tsx +61 -17
  76. package/src/components/ReportQualityGateResults/index.tsx +6 -2
  77. package/src/components/ReportSearch/index.tsx +1 -0
  78. package/src/components/ReportTabs/index.tsx +3 -0
  79. package/src/components/SectionPicker/index.tsx +2 -0
  80. package/src/components/SectionSwitcher/index.tsx +3 -0
  81. package/src/components/SideBySide/index.tsx +1 -0
  82. package/src/components/SplitLayout/index.tsx +2 -0
  83. package/src/components/TestResult/TestStepsEmpty/index.tsx +2 -0
  84. package/src/components/TestResult/TrAttachmentsView/index.tsx +2 -0
  85. package/src/components/TestResult/TrDescription/index.tsx +16 -3
  86. package/src/components/TestResult/TrDropdown/index.tsx +1 -0
  87. package/src/components/TestResult/TrEmpty/index.tsx +3 -1
  88. package/src/components/TestResult/TrEnvironmentItem/index.tsx +3 -0
  89. package/src/components/TestResult/TrEnvironmentsView/index.tsx +8 -2
  90. package/src/components/TestResult/TrError/TrDiff.tsx +3 -1
  91. package/src/components/TestResult/TrError/index.tsx +20 -18
  92. package/src/components/TestResult/TrError/styles.scss +0 -25
  93. package/src/components/TestResult/TrHeader/TrBreadcrumbs.tsx +3 -1
  94. package/src/components/TestResult/TrHeader/index.tsx +2 -0
  95. package/src/components/TestResult/TrHeader/styles.scss +1 -0
  96. package/src/components/TestResult/TrHistory/TrHistoryItem.tsx +3 -1
  97. package/src/components/TestResult/TrHistory/index.tsx +2 -0
  98. package/src/components/TestResult/TrInfo/TrInfoStatuses.tsx +2 -0
  99. package/src/components/TestResult/TrInfo/index.tsx +2 -0
  100. package/src/components/TestResult/TrLinks/index.tsx +63 -11
  101. package/src/components/TestResult/TrMetadata/index.tsx +44 -5
  102. package/src/components/TestResult/TrNavigation/index.tsx +2 -0
  103. package/src/components/TestResult/TrOverview.tsx +20 -17
  104. package/src/components/TestResult/TrParameters/index.tsx +41 -7
  105. package/src/components/TestResult/TrPrevStatuses/index.tsx +2 -0
  106. package/src/components/TestResult/TrPwTraces/PwTraceButton.tsx +44 -9
  107. package/src/components/TestResult/TrPwTraces/index.tsx +5 -1
  108. package/src/components/TestResult/TrPwTraces/openPwTraceInNewTab.ts +29 -0
  109. package/src/components/TestResult/TrRetriesView/TrRetriesItem.tsx +3 -1
  110. package/src/components/TestResult/TrRetriesView/index.tsx +2 -0
  111. package/src/components/TestResult/TrSetup/index.tsx +3 -1
  112. package/src/components/TestResult/TrSeverity/index.tsx +2 -0
  113. package/src/components/TestResult/TrStatus/index.tsx +2 -0
  114. package/src/components/TestResult/TrSteps/TrAttachment.tsx +38 -6
  115. package/src/components/TestResult/TrSteps/TrAttachmentInfo.tsx +50 -2
  116. package/src/components/TestResult/TrSteps/TrBodyItems.tsx +42 -0
  117. package/src/components/TestResult/TrSteps/TrErrorStep.tsx +40 -0
  118. package/src/components/TestResult/TrSteps/TrStep.tsx +31 -65
  119. package/src/components/TestResult/TrSteps/TrStepHeader.tsx +50 -0
  120. package/src/components/TestResult/TrSteps/TrStepInfo.tsx +1 -0
  121. package/src/components/TestResult/TrSteps/index.tsx +12 -32
  122. package/src/components/TestResult/TrSteps/styles.scss +8 -0
  123. package/src/components/TestResult/TrSteps/wrongAttachment.tsx +2 -1
  124. package/src/components/TestResult/TrTabs/index.tsx +1 -0
  125. package/src/components/TestResult/TrTeardown/index.tsx +3 -1
  126. package/src/components/TestResult/bodyItems.ts +151 -0
  127. package/src/components/TestResult/index.tsx +2 -0
  128. package/src/components/Timeline/index.tsx +12 -2
  129. package/src/components/ToggleLayout/index.tsx +1 -0
  130. package/src/components/Tree/index.tsx +6 -2
  131. package/src/components/Tree/styles.scss +11 -0
  132. package/src/index.tsx +9 -3
  133. package/src/locales/ar.json +427 -0
  134. package/src/locales/az.json +43 -46
  135. package/src/locales/de.json +5 -0
  136. package/src/locales/en.json +5 -0
  137. package/src/locales/es.json +5 -0
  138. package/src/locales/fr.json +5 -0
  139. package/src/locales/he.json +5 -0
  140. package/src/locales/hy.json +5 -0
  141. package/src/locales/it.json +5 -0
  142. package/src/locales/ja.json +5 -0
  143. package/src/locales/ka.json +5 -0
  144. package/src/locales/kr.json +5 -0
  145. package/src/locales/nl.json +5 -0
  146. package/src/locales/pl.json +5 -0
  147. package/src/locales/pt.json +5 -0
  148. package/src/locales/ru.json +5 -0
  149. package/src/locales/sv.json +5 -0
  150. package/src/locales/tr.json +5 -0
  151. package/src/locales/uk.json +5 -0
  152. package/src/locales/zh-TW.json +432 -0
  153. package/src/locales/zh.json +5 -0
  154. package/src/stores/categories.ts +1 -0
  155. package/src/stores/chart.ts +2 -1
  156. package/src/stores/env.ts +14 -4
  157. package/src/stores/envInfo.ts +1 -0
  158. package/src/stores/globals.ts +1 -0
  159. package/src/stores/locale.ts +1 -0
  160. package/src/stores/qualityGate.ts +1 -0
  161. package/src/stores/sections.ts +1 -0
  162. package/src/stores/stats.ts +12 -6
  163. package/src/stores/testResult.ts +1 -0
  164. package/src/stores/testResults.ts +1 -0
  165. package/src/stores/timeline.ts +2 -0
  166. package/src/stores/tree.ts +2 -0
  167. package/src/stores/treeFilters/actions.ts +1 -0
  168. package/src/stores/treeFilters/store.ts +1 -0
  169. package/src/stores/treeFilters/utils.ts +1 -0
  170. package/src/stores/variables.ts +1 -0
  171. package/src/utils/time.ts +1 -0
  172. package/src/utils/treeFilters.ts +2 -0
  173. package/test/components/EnvironmentPicker.test.tsx +133 -0
  174. package/test/components/Header/CiInfo.test.tsx +15 -0
  175. package/test/components/Header.test.tsx +1 -0
  176. package/test/components/TestResult/PwTraceButton.test.tsx +104 -0
  177. package/test/components/TestResult/TrErrorStep.test.tsx +127 -0
  178. package/test/components/TestResult/TrOverview.test.tsx +114 -0
  179. package/test/components/TestResult/bodyItems.test.ts +194 -0
  180. package/test/components/TestResult/openPwTraceInNewTab.test.ts +65 -0
  181. package/test/components/Timeline.test.tsx +104 -0
  182. package/test/stores/treeFilters/actions.test.ts +82 -0
  183. package/test/utils/ownerAddress.test.ts +1 -0
  184. package/test/utils/treeFilters.test.ts +1 -0
  185. package/tsconfig.json +1 -2
  186. package/tsconfig.node.json +2 -1
  187. package/types.d.ts +2 -0
  188. package/.eslintrc.cjs +0 -18
  189. package/dist/multi/173.app-8be6acc0a596a2197dbf.js +0 -1
  190. package/dist/multi/174.app-8be6acc0a596a2197dbf.js +0 -1
  191. package/dist/multi/252.app-8be6acc0a596a2197dbf.js +0 -1
  192. package/dist/multi/282.app-8be6acc0a596a2197dbf.js +0 -1
  193. package/dist/multi/29.app-8be6acc0a596a2197dbf.js +0 -1
  194. package/dist/multi/416.app-8be6acc0a596a2197dbf.js +0 -1
  195. package/dist/multi/527.app-8be6acc0a596a2197dbf.js +0 -1
  196. package/dist/multi/600.app-8be6acc0a596a2197dbf.js +0 -1
  197. package/dist/multi/605.app-8be6acc0a596a2197dbf.js +0 -1
  198. package/dist/multi/638.app-8be6acc0a596a2197dbf.js +0 -1
  199. package/dist/multi/672.app-8be6acc0a596a2197dbf.js +0 -1
  200. package/dist/multi/686.app-8be6acc0a596a2197dbf.js +0 -1
  201. package/dist/multi/725.app-8be6acc0a596a2197dbf.js +0 -1
  202. package/dist/multi/741.app-8be6acc0a596a2197dbf.js +0 -1
  203. package/dist/multi/749.app-8be6acc0a596a2197dbf.js +0 -1
  204. package/dist/multi/755.app-8be6acc0a596a2197dbf.js +0 -1
  205. package/dist/multi/943.app-8be6acc0a596a2197dbf.js +0 -1
  206. package/dist/multi/980.app-8be6acc0a596a2197dbf.js +0 -1
  207. package/dist/multi/app-8be6acc0a596a2197dbf.js +0 -2
  208. package/dist/single/app-8221eb856e47b4ef50d6.js +0 -2
  209. package/src/components/TestResult/TrPwTraces/PwTrace.tsx +0 -34
@@ -0,0 +1,432 @@
1
+ {
2
+ "statuses": {
3
+ "passed": "通過",
4
+ "failed": "失敗",
5
+ "broken": "損壞",
6
+ "skipped": "跳過",
7
+ "unknown": "未知",
8
+ "total": "總計",
9
+ "flakyTests": "不穩定",
10
+ "newTests": "新的",
11
+ "retryTests": "重試"
12
+ },
13
+ "testSummary": {
14
+ "total": "總計",
15
+ "flaky": "不穩定的測試",
16
+ "retries": "重跑測試",
17
+ "new": "新的測試"
18
+ },
19
+ "tabs": {
20
+ "total": "全部",
21
+ "results": "結果",
22
+ "globalAttachments": "全域附件",
23
+ "globalErrors": "全域錯誤",
24
+ "qualityGates": "品質卡點",
25
+ "categories": "分類"
26
+ },
27
+ "search": {
28
+ "search": "搜尋",
29
+ "search-placeholder": "名稱或 ID"
30
+ },
31
+ "filters": {
32
+ "flaky": "不穩定",
33
+ "nonFlaky": "穩定",
34
+ "retry": "重試",
35
+ "new": "新的",
36
+ "fixed": "已修復",
37
+ "regressed": "已回歸",
38
+ "malfunctioned": "已損壞",
39
+ "transition": "狀態變化",
40
+ "status": "狀態",
41
+ "severity": "嚴重程度",
42
+ "owner": "負責人",
43
+ "layer": "層",
44
+ "tags": "標籤",
45
+ "categories": "分類",
46
+ "goto_filter": "前往篩選器",
47
+ "errors": {
48
+ "max_values_one": "僅使用前 {{count}} 個值進行篩選。\n其他值將被忽略",
49
+ "max_values_other": "僅使用前 {{count}} 個值進行篩選。\n其他值將被忽略"
50
+ },
51
+ "description": {
52
+ "flaky": "顯示不穩定的測試",
53
+ "retry": "顯示重新執行的測試結果",
54
+ "new": "顯示在此報告中首次出現的測試結果",
55
+ "fixed": "顯示現在通過但之前「失敗」或「損壞」的測試",
56
+ "regressed": "顯示從「通過」或「損壞」狀態變為「失敗」狀態的測試結果",
57
+ "malfunctioned": "顯示從「通過」或「失敗」狀態變為「損壞」狀態的測試結果",
58
+ "tags": "顯示具有指定標籤的測試結果",
59
+ "categories": "顯示具有指定分類的測試結果"
60
+ }
61
+ },
62
+ "sort-by": {
63
+ "sort-by-text": "排序依據:",
64
+ "sort-by-category": "排序類別",
65
+ "direction-category": "方向"
66
+ },
67
+ "sort-by.values": {
68
+ "order": "順序",
69
+ "alphabet": "字母",
70
+ "duration": "持續時間",
71
+ "status": "狀態"
72
+ },
73
+ "sort-by.directions": {
74
+ "order-desc": "最新 – 最舊",
75
+ "order-asc": "最舊 – 最新",
76
+ "order-asc-short": "最舊",
77
+ "order-desc-short": "最新",
78
+ "alphabet-asc": "A – Z",
79
+ "alphabet-desc": "Z – A",
80
+ "alphabet-asc-short": "A – Z",
81
+ "alphabet-desc-short": "Z – A",
82
+ "duration-asc": "1 – 9",
83
+ "duration-desc": "9 – 1",
84
+ "duration-asc-short": "1 – 9",
85
+ "duration-desc-short": "9 – 1",
86
+ "status-asc": "按照篩選清單",
87
+ "status-desc": "反轉",
88
+ "status-asc-short": "正常",
89
+ "status-desc-short": "反轉"
90
+ },
91
+ "empty": {
92
+ "no-results": "沒有結果",
93
+ "no-value": "無值",
94
+ "no-value-for": "無值:{{entity}}",
95
+ "no-transition": "無狀態變化",
96
+ "no-layer": "無分層",
97
+ "no-owner": "無負責人",
98
+ "no-severity": "無嚴重程度",
99
+ "no-status": "無狀態",
100
+ "no-environment": "無環境",
101
+ "no-flaky": "無不穩定",
102
+ "empty-value": "空",
103
+ "no-tests-found": "未找到結果",
104
+ "no-message-provided": "未提供訊息",
105
+ "clear-filters": "清除篩選器",
106
+ "no-attachments-results": "沒有附件資訊",
107
+ "no-global-errors-results": "沒有全域錯誤資訊",
108
+ "no-quality-gate-results": "沒有品質卡點結果",
109
+ "no-history-results": "沒有歷史資訊",
110
+ "no-retries-results": "沒有重試資訊",
111
+ "no-test-steps-results": "沒有可用的測試步驟資訊",
112
+ "no-test-case-results": "沒有測試案例結果",
113
+ "no-environments-results": "沒有環境資訊",
114
+ "no-categories-results": "暫無可用的分類結果"
115
+ },
116
+ "severity": {
117
+ "blocker": "阻礙",
118
+ "critical": "嚴重",
119
+ "normal": "正常",
120
+ "minor": "次要",
121
+ "trivial": "輕微"
122
+ },
123
+ "execution": {
124
+ "name": "執行",
125
+ "body": "測試內容",
126
+ "setup": "前置作業",
127
+ "teardown": "後置作業"
128
+ },
129
+ "environments": {
130
+ "environment_one": "環境",
131
+ "environment_other": "環境",
132
+ "all": "全部"
133
+ },
134
+ "ui": {
135
+ "labels": "標籤",
136
+ "metadata": "中繼資料",
137
+ "parameters": "參數",
138
+ "category": "分類",
139
+ "description": "描述",
140
+ "links": "連結",
141
+ "overview": "概覽",
142
+ "history": "歷史",
143
+ "attachments": "附件",
144
+ "retries": "重試",
145
+ "environments": "環境",
146
+ "error": "錯誤",
147
+ "goToStep": "跳轉到步驟",
148
+ "showLess": "顯示更少",
149
+ "showMore": "顯示更多",
150
+ "copy": "複製",
151
+ "copy-email": "複製電子郵件",
152
+ "attempt": "第 {{attempt}} 次嘗試,共 {{total}} 次",
153
+ "at": "於",
154
+ "variables": "變數",
155
+ "openPwTrace": "開啟 Playwright Trace",
156
+ "pwTracePopupBlocked": "瀏覽器封鎖了開啟 Playwright Trace Viewer。",
157
+ "pwTracePopupBlockedHint": "請允許彈出視窗後重試。",
158
+ "finishedAtOriginal": "{{formattedCreatedAt}},結束代碼 {{original}}",
159
+ "finishedAtBoth": "{{formattedCreatedAt}},結束代號 {{actual}}(原始 {{original}})"
160
+ },
161
+ "controls": {
162
+ "newTabAttachment": "在新分頁中開啟附件",
163
+ "nextTR": "下一個測試結果",
164
+ "prevTR": "上一個測試結果",
165
+ "downloadAttachment": "下載附件",
166
+ "previewAttachment": "預覽",
167
+ "viewCode": "查看程式碼",
168
+ "syntaxHighlight": "語法醒目提示",
169
+ "backto": "返回",
170
+ "clipboard": "複製到剪貼簿",
171
+ "clipboardError": "無法複製到剪貼簿。可能是瀏覽器不支援此功能",
172
+ "clipboardSuccess": "複製成功",
173
+ "collapse": "折疊",
174
+ "expand": "展開",
175
+ "fullscreen": "全螢幕",
176
+ "language": "更改語言",
177
+ "openInNewTab": "在新分頁中開啟",
178
+ "openPreview": "開啟預覽",
179
+ "noSelectedTR": "沒有選取的測試結果",
180
+ "comparison": "對比",
181
+ "showDiff": "顯示差異",
182
+ "viewMode": "查看模式",
183
+ "unified": "統一",
184
+ "side-by-side": "並排",
185
+ "compareBy": "比較方式",
186
+ "chars": "字元",
187
+ "words": "單詞",
188
+ "lines": "行",
189
+ "actual": "實際",
190
+ "expected": "預期"
191
+ },
192
+ "errors": {
193
+ "missedAttachment": "未找到附件"
194
+ },
195
+ "sections": {
196
+ "report": "報告",
197
+ "charts": "統計圖表",
198
+ "timeline": "時間軸"
199
+ },
200
+ "timeline": {
201
+ "empty": "無資料",
202
+ "empty_host": "{{ host }} 無資料",
203
+ "selected_one": "已選擇 {{ count }} 個測試({{ percentage }}%),持續時間大於 {{ minDuration }} 且小於 {{ maxDuration }}",
204
+ "selected_other": "已選擇 {{ count }} 個測試({{ percentage }}%),持續時間大於 {{ minDuration }} 且小於 {{ maxDuration }}",
205
+ "host": "主機: {{ host }}"
206
+ },
207
+ "charts": {
208
+ "trend": {
209
+ "title": "趨勢圖表: {{type}}",
210
+ "type": {
211
+ "status": "狀態",
212
+ "severity": "嚴重程度"
213
+ }
214
+ },
215
+ "currentStatus": {
216
+ "title": "當前狀態",
217
+ "status": {
218
+ "passed": "$t(statuses:passed, capitalize)",
219
+ "failed": "$t(statuses:failed, capitalize)",
220
+ "broken": "$t(statuses:broken, capitalize)",
221
+ "skipped": "$t(statuses:skipped, capitalize)",
222
+ "unknown": "$t(statuses:unknown, capitalize)"
223
+ },
224
+ "percentage": "{{percentage}}%",
225
+ "of": "共 {{total}}",
226
+ "total": "總計",
227
+ "tests": {
228
+ "new_zero": "沒有新的測試",
229
+ "new_one": "{{count}} 個新的測試",
230
+ "new_other": "{{count}} 個新的測試",
231
+ "flaky_zero": "沒有不穩定的測試",
232
+ "flaky_one": "{{count}} 個不穩定的測試",
233
+ "flaky_other": "{{count}} 個不穩定的測試",
234
+ "retries_zero": "沒有重跑的測試",
235
+ "retries_one": "{{count}} 個重跑的測試",
236
+ "retries_other": "{{count}} 個重跑的測試"
237
+ }
238
+ },
239
+ "statusDynamics": {
240
+ "title": "狀態趨勢",
241
+ "status": {
242
+ "passed": "$t(statuses:passed, capitalize)",
243
+ "failed": "$t(statuses:failed, capitalize)",
244
+ "broken": "$t(statuses:broken, capitalize)",
245
+ "skipped": "$t(statuses:skipped, capitalize)",
246
+ "unknown": "$t(statuses:unknown, capitalize)"
247
+ },
248
+ "no-history": "$t(empty:no-history-results)",
249
+ "no-results": "$t(empty:no-results)",
250
+ "tooltips": {
251
+ "current": "最新報告 ({{timestamp, timestamp_long_no_seconds}})",
252
+ "history": "{{timestamp, timestamp_long_no_seconds}} 的報告"
253
+ },
254
+ "ticks": {
255
+ "current": "最新",
256
+ "history": "{{timestamp, timestamp_date}}"
257
+ }
258
+ },
259
+ "statusTransitions": {
260
+ "title": "狀態轉變",
261
+ "legend": {
262
+ "trend": "修復率"
263
+ },
264
+ "transitions": {
265
+ "new": "$t(transitions:new, capitalize)",
266
+ "fixed": "$t(transitions:fixed, capitalize)",
267
+ "regressed": "$t(transitions:regressed, capitalize)",
268
+ "malfunctioned": "$t(transitions:malfunctioned, capitalize)"
269
+ },
270
+ "no-history": "$t(empty:no-history-results)",
271
+ "no-results": "$t(empty:no-results)",
272
+ "tooltips": {
273
+ "current": "最新報告 ({{timestamp, timestamp_long_no_seconds}})",
274
+ "history": "{{timestamp, timestamp_long_no_seconds}} 的報告"
275
+ },
276
+ "ticks": {
277
+ "current": "最新",
278
+ "history": "{{timestamp, timestamp_date}}"
279
+ }
280
+ },
281
+ "durations": {
282
+ "title": "按{{groupBy}}的持續時間直方圖",
283
+ "title_none": "持續時間直方圖",
284
+ "no-results": "$t(empty:no-results)",
285
+ "groupBy": {
286
+ "none": "無",
287
+ "layer": "層"
288
+ },
289
+ "ticks": {
290
+ "durationRange": "{{from, format_duration}} - {{to, format_duration}}"
291
+ },
292
+ "tooltips": {
293
+ "durationRange": "{{from, format_duration}} - {{to, format_duration}}"
294
+ },
295
+ "legend": {
296
+ "value": "{{value}}",
297
+ "total": "測試數量"
298
+ }
299
+ },
300
+ "stabilityDistribution": {
301
+ "title": "穩定性分佈",
302
+ "no-results": "$t(empty:no-results)",
303
+ "legend": {
304
+ "stabilityRate": "穩定率"
305
+ }
306
+ },
307
+ "testBaseGrowthDynamics": {
308
+ "title": "測試增長趨勢",
309
+ "status": {
310
+ "newpassed": "新增 $t(statuses:passed)",
311
+ "newfailed": "新增 $t(statuses:failed)",
312
+ "newbroken": "新增 $t(statuses:broken)",
313
+ "newskipped": "新增 $t(statuses:skipped)",
314
+ "newunknown": "新增 $t(statuses:unknown)",
315
+ "removedpassed": "移除 $t(statuses:passed)",
316
+ "removedfailed": "移除 $t(statuses:failed)",
317
+ "removedbroken": "移除 $t(statuses:broken)",
318
+ "removedskipped": "移除 $t(statuses:skipped)",
319
+ "removedunknown": "移除 $t(statuses:unknown)"
320
+ },
321
+ "legend": {
322
+ "trend": "增長趨勢"
323
+ },
324
+ "no-history": "$t(empty:no-history-results)",
325
+ "no-results": "$t(empty:no-results)",
326
+ "tooltips": {
327
+ "current": "最新報告 ({{timestamp, timestamp_long_no_seconds}})",
328
+ "history": "報告來自 {{timestamp, timestamp_long_no_seconds}}"
329
+ },
330
+ "ticks": {
331
+ "current": "最新",
332
+ "history": "{{timestamp, timestamp_date}}"
333
+ }
334
+ },
335
+ "statusAgePyramid": {
336
+ "title": "狀態分布金字塔",
337
+ "status": {
338
+ "passed": "$t(statuses:passed, capitalize)",
339
+ "failed": "$t(statuses:failed, capitalize)",
340
+ "broken": "$t(statuses:broken, capitalize)",
341
+ "skipped": "$t(statuses:skipped, capitalize)",
342
+ "unknown": "$t(statuses:unknown, capitalize)"
343
+ },
344
+ "no-history": "$t(empty:no-history-results)",
345
+ "no-results": "$t(empty:no-results)",
346
+ "tooltips": {
347
+ "current": "最新報告 ({{timestamp, timestamp_long_no_seconds}})",
348
+ "history": "報告來自 {{timestamp, timestamp_long_no_seconds}}"
349
+ },
350
+ "ticks": {
351
+ "current": "最新",
352
+ "history": "{{timestamp, timestamp_date}}"
353
+ }
354
+ },
355
+ "trSeverities": {
356
+ "title": "按嚴重程度的測試結果",
357
+ "no-results": "$t(empty:no-results)",
358
+ "status": {
359
+ "passed": "$t(statuses:passed, capitalize)",
360
+ "failed": "$t(statuses:failed, capitalize)",
361
+ "broken": "$t(statuses:broken, capitalize)",
362
+ "skipped": "$t(statuses:skipped, capitalize)",
363
+ "unknown": "$t(statuses:unknown, capitalize)"
364
+ },
365
+ "severity": {
366
+ "blocker": "$t(severity:blocker, capitalize)",
367
+ "critical": "$t(severity:critical, capitalize)",
368
+ "normal": "$t(severity:normal, capitalize)",
369
+ "minor": "$t(severity:minor, capitalize)",
370
+ "trivial": "$t(severity:trivial, capitalize)",
371
+ "unset": "無嚴重程度"
372
+ }
373
+ },
374
+ "durationDynamics": {
375
+ "title": "執行時間趨勢",
376
+ "durations": {
377
+ "sequential": "順序持續時間",
378
+ "duration": "測試持續時間",
379
+ "speedup": "加速"
380
+ },
381
+ "no-results": "$t(empty:no-results)",
382
+ "tooltips": {
383
+ "current": "最新報告 ({{timestamp, timestamp_long_no_seconds}})",
384
+ "history": "{{timestamp, timestamp_long_no_seconds}} 的報告"
385
+ },
386
+ "ticks": {
387
+ "current": "最新",
388
+ "history": "{{timestamp, timestamp_date}}"
389
+ },
390
+ "legend": {
391
+ "duration": "{{duration, format_duration}}",
392
+ "speedup": "{{speedup}}x"
393
+ }
394
+ }
395
+ },
396
+ "transitions": {
397
+ "description": {
398
+ "new": "此測試結果在報告中的首次出現",
399
+ "fixed": "之前「失敗」或「損壞」的測試現在「通過」了",
400
+ "regressed": "之前「通過」或「損壞」的測試現在「失敗」了",
401
+ "malfunctioned": "之前「通過」或「失敗」的測試現在「損壞」了",
402
+ "retries": "{{count}} 次重試",
403
+ "flaky": "多次執行結果不一致"
404
+ },
405
+ "new": "新的",
406
+ "fixed": "已修復",
407
+ "regressed": "已回歸",
408
+ "malfunctioned": "已損壞"
409
+ },
410
+ "trHistory": {
411
+ "unknown-date": "未知日期"
412
+ },
413
+ "attachments": {
414
+ "imageDiff": {
415
+ "mode": {
416
+ "diff": "差異",
417
+ "actual": "實際",
418
+ "expected": "預期",
419
+ "side-by-side": "並排",
420
+ "overlay": "疊加"
421
+ },
422
+ "empty": {
423
+ "failed-to-load": "無法載入圖像對比"
424
+ },
425
+ "image": {
426
+ "diff": "差異",
427
+ "actual": "實際",
428
+ "expected": "預期"
429
+ }
430
+ }
431
+ }
432
+ }
@@ -153,6 +153,8 @@
153
153
  "at": "在",
154
154
  "variables": "变量",
155
155
  "openPwTrace": "打开 Playwright Trace",
156
+ "pwTracePopupBlocked": "浏览器阻止了打开 Playwright Trace Viewer。",
157
+ "pwTracePopupBlockedHint": "请允许弹出窗口后重试。",
156
158
  "finishedAtOriginal": "{{formattedCreatedAt}},退出代码 {{original}}",
157
159
  "finishedAtBoth": "{{formattedCreatedAt}},退出代码 {{actual}}(原始 {{original}})"
158
160
  },
@@ -161,6 +163,9 @@
161
163
  "nextTR": "下一个测试结果",
162
164
  "prevTR": "上一个测试结果",
163
165
  "downloadAttachment": "下载附件",
166
+ "previewAttachment": "预览",
167
+ "viewCode": "查看代码",
168
+ "syntaxHighlight": "语法高亮",
164
169
  "backto": "返回",
165
170
  "clipboard": "复制到剪贴板",
166
171
  "clipboardError": "无法复制到剪贴板。可能是浏览器不支持此功能",
@@ -1,6 +1,7 @@
1
1
  import type { TestCategories } from "@allurereport/core-api";
2
2
  import { fetchReportJsonData } from "@allurereport/web-commons";
3
3
  import { computed, signal } from "@preact/signals";
4
+
4
5
  import type { StoreSignalState } from "@/stores/types";
5
6
 
6
7
  export const categoriesStore = signal<StoreSignalState<TestCategories>>({
@@ -1,8 +1,9 @@
1
1
  import type { PieChartValues } from "@allurereport/charts-api";
2
2
  import { type Statistic } from "@allurereport/core-api";
3
- import { createChartsWithEnvs, fetchReportJsonData, getPieChartValues } from "@allurereport/web-commons";
4
3
  import type { ChartsResponse, UIChartsDataWithEnvs } from "@allurereport/web-commons";
4
+ import { createChartsWithEnvs, fetchReportJsonData, getPieChartValues } from "@allurereport/web-commons";
5
5
  import { signal } from "@preact/signals";
6
+
6
7
  import type { StoreSignalState } from "@/stores/types";
7
8
 
8
9
  export const pieChartStore = signal<StoreSignalState<PieChartValues>>({
package/src/stores/env.ts CHANGED
@@ -1,10 +1,15 @@
1
- import { type TestEnvGroup } from "@allurereport/core-api";
2
- import { fetchReportJsonData } from "@allurereport/web-commons";
1
+ import { type EnvironmentIdentity, type TestEnvGroup } from "@allurereport/core-api";
2
+ import {
3
+ environmentNameById as resolveEnvironmentNameById,
4
+ fetchReportJsonData,
5
+ migrateStoredEnvironmentSelection,
6
+ } from "@allurereport/web-commons";
3
7
  import { effect, signal } from "@preact/signals";
8
+
4
9
  import type { StoreSignalState } from "@/stores/types";
5
10
  import { loadFromLocalStorage } from "@/utils/loadFromLocalStorage";
6
11
 
7
- export const environmentsStore = signal<StoreSignalState<string[]>>({
12
+ export const environmentsStore = signal<StoreSignalState<EnvironmentIdentity[]>>({
8
13
  loading: false,
9
14
  error: undefined,
10
15
  data: [],
@@ -24,6 +29,9 @@ export const setCurrentEnvironment = (env: string) => {
24
29
  currentEnvironment.value = env;
25
30
  };
26
31
 
32
+ export const environmentNameById = (environmentId: string) =>
33
+ resolveEnvironmentNameById(environmentsStore.peek().data, environmentId);
34
+
27
35
  export const fetchEnvironments = async () => {
28
36
  environmentsStore.value = {
29
37
  ...environmentsStore.peek(),
@@ -32,13 +40,15 @@ export const fetchEnvironments = async () => {
32
40
  };
33
41
 
34
42
  try {
35
- const res = await fetchReportJsonData<string[]>("widgets/environments.json", { bustCache: true });
43
+ const res = await fetchReportJsonData<EnvironmentIdentity[]>("widgets/environments.json", { bustCache: true });
36
44
 
37
45
  environmentsStore.value = {
38
46
  data: res,
39
47
  error: undefined,
40
48
  loading: false,
41
49
  };
50
+
51
+ currentEnvironment.value = migrateStoredEnvironmentSelection(currentEnvironment.value, res);
42
52
  } catch (e) {
43
53
  environmentsStore.value = {
44
54
  ...environmentsStore.peek(),
@@ -1,6 +1,7 @@
1
1
  import type { EnvironmentItem } from "@allurereport/core-api";
2
2
  import { fetchReportJsonData } from "@allurereport/web-commons";
3
3
  import { signal } from "@preact/signals";
4
+
4
5
  import type { StoreSignalState } from "@/stores/types";
5
6
 
6
7
  export const envInfoStore = signal<StoreSignalState<EnvironmentItem[]>>({
@@ -1,6 +1,7 @@
1
1
  import { type PluginGlobals } from "@allurereport/plugin-api";
2
2
  import { fetchReportJsonData } from "@allurereport/web-commons";
3
3
  import { signal } from "@preact/signals";
4
+
4
5
  import { type StoreSignalState } from "./types";
5
6
 
6
7
  export const globalsStore = signal<StoreSignalState<PluginGlobals>>({
@@ -157,4 +157,5 @@ export const setLocale = async (locale: LangLocale) => {
157
157
  await i18next.changeLanguage(locale as string);
158
158
  localStorage.setItem("currentLocale", locale as string);
159
159
  currentLocale.value = locale;
160
+ document.documentElement.dir = ["ar", "he", "fa"].includes(locale) ? "rtl" : "ltr";
160
161
  };
@@ -1,6 +1,7 @@
1
1
  import type { QualityGateValidationResult } from "@allurereport/plugin-api";
2
2
  import { fetchReportJsonData } from "@allurereport/web-commons";
3
3
  import { signal } from "@preact/signals";
4
+
4
5
  import { type StoreSignalState } from "./types";
5
6
 
6
7
  export const qualityGateStore = signal<StoreSignalState<Record<string, QualityGateValidationResult[]>>>({
@@ -1,5 +1,6 @@
1
1
  import { getReportOptions } from "@allurereport/web-commons";
2
2
  import { computed, effect } from "@preact/signals";
3
+
3
4
  import type { AwesomeReportOptions } from "../../types.js";
4
5
  import { navigateToRoot, navigateToSection, sectionRoute } from "./router";
5
6
 
@@ -1,7 +1,9 @@
1
1
  import type { Statistic } from "@allurereport/core-api";
2
2
  import { fetchReportJsonData } from "@allurereport/web-commons";
3
3
  import { signal } from "@preact/signals";
4
+
4
5
  import type { StoreSignalState } from "@/stores/types";
6
+
5
7
  import type { AwesomeTree } from "../../types";
6
8
 
7
9
  export const reportStatsStore = signal<StoreSignalState<Statistic>>({
@@ -60,14 +62,18 @@ export const fetchEnvStats = async (envs: string[]) => {
60
62
  const data = await Promise.all(
61
63
  envsToFetch.map((env) => fetchReportJsonData<AwesomeTree>(`widgets/${env}/statistic.json`, { bustCache: true })),
62
64
  );
65
+ const previous = statsByEnvStore.peek().data;
63
66
 
64
67
  statsByEnvStore.value = {
65
- data: envs.reduce((acc, env, index) => {
66
- return {
67
- ...acc,
68
- [env]: data[index],
69
- };
70
- }, {}),
68
+ data: envsToFetch.reduce(
69
+ (acc, env, index) => {
70
+ return {
71
+ ...acc,
72
+ [env]: data[index],
73
+ };
74
+ },
75
+ { ...previous },
76
+ ),
71
77
  loading: false,
72
78
  error: undefined,
73
79
  };
@@ -1,4 +1,5 @@
1
1
  import { computed } from "@preact/signals";
2
+
2
3
  import { rootTabRoute, testResultRoute } from "./router";
3
4
 
4
5
  const emptyRoute = { matches: false, params: {} as { testResultId?: string; tab?: string } };
@@ -1,5 +1,6 @@
1
1
  import { fetchReportJsonData } from "@allurereport/web-commons";
2
2
  import { signal } from "@preact/signals";
3
+
3
4
  import { type AwesomeTestResult } from "../../types";
4
5
  import { type StoreSignalState } from "./types";
5
6
 
@@ -1,12 +1,14 @@
1
1
  import type { TestResult } from "@allurereport/core-api";
2
2
  import { fetchReportJsonData } from "@allurereport/web-commons";
3
3
  import { signal } from "@preact/signals";
4
+
4
5
  import type { StoreSignalState } from "@/stores/types";
5
6
 
6
7
  export type TimlineTr = Pick<
7
8
  TestResult,
8
9
  "id" | "name" | "status" | "flaky" | "hidden" | "environment" | "start" | "duration"
9
10
  > & {
11
+ environmentName?: string;
10
12
  host: string;
11
13
  thread: string;
12
14
  };
@@ -2,9 +2,11 @@ import { buildFilterPredicate, fetchReportJsonData } from "@allurereport/web-com
2
2
  import type { RecursiveTree } from "@allurereport/web-components/global";
3
3
  import { computed, effect, signal } from "@preact/signals";
4
4
  import type { AwesomeTree, AwesomeTreeGroup } from "types";
5
+
5
6
  import type { StoreSignalState } from "@/stores/types";
6
7
  import { loadFromLocalStorage } from "@/utils/loadFromLocalStorage";
7
8
  import { createRecursiveTree, isRecursiveTreeEmpty } from "@/utils/treeFilters";
9
+
8
10
  import { treeFilters } from "./treeFilters/store";
9
11
  import { sortBy } from "./treeSort";
10
12
 
@@ -1,5 +1,6 @@
1
1
  import type { TestStatus, TestStatusTransition } from "@allurereport/core-api";
2
2
  import { ReportFetchError, fetchReportJsonData, setParams } from "@allurereport/web-commons";
3
+
3
4
  import { PARAMS } from "./constants";
4
5
  import type { TreeFiltersData } from "./model";
5
6
  import { treeCategories, treeTags } from "./store";
@@ -2,6 +2,7 @@ import type { TestStatus, TestStatusTransition } from "@allurereport/core-api";
2
2
  import { getParamValue, getParamValues } from "@allurereport/web-commons";
3
3
  import { computed, signal } from "@preact/signals";
4
4
  import type { AwesomeStatus } from "types";
5
+
5
6
  import {
6
7
  setCategoriesFilter,
7
8
  setFlakyFilter,
@@ -1,5 +1,6 @@
1
1
  import type { TestStatus, TestStatusTransition } from "@allurereport/core-api";
2
2
  import { MAX_ARRAY_FIELD_VALUES, getCurrentUrl } from "@allurereport/web-commons";
3
+
3
4
  import { PARAMS, STATUSES, TRANSITIONS } from "./constants";
4
5
  import type {
5
6
  AwesomeArrayFieldFilter,