ortoni-report 2.0.5 → 2.0.6

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/changelog.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Change Log:
2
2
 
3
+
4
+ ## v2.0.6
5
+
6
+ #### 🐛 Fixes
7
+ - **Trace Path in Pipeline**: Resolved issue with incorrect trace file path in CI/CD pipeline, ensuring trace paths are properly resolved.
8
+
9
+ #### 👌 Improvements
10
+ - **Search Functionality**:
11
+ - **Removed from Navbar**: Search functionality has been removed from the navbar to enhance navigation simplicity.
12
+ - **Added to Test Panel**: Search functionality has been relocated to the test panel for more intuitive test filtering.
13
+
14
+ - **UI Enhancements**:
15
+ - Updated the overall UI with gradient color status indicators, making test status visuals more vibrant and user-friendly.
16
+
3
17
  ## v2.0.5
4
18
 
5
19
  ### 🚀 New Features
@@ -29209,13 +29209,14 @@ var HTMLGenerator = class {
29209
29209
  import_handlebars.default.registerHelper("joinWithSpace", (array) => array.join(" "));
29210
29210
  import_handlebars.default.registerHelper("json", (context) => safeStringify(context));
29211
29211
  import_handlebars.default.registerHelper("eq", (actualStatus, expectedStatus) => actualStatus === expectedStatus);
29212
+ import_handlebars.default.registerHelper("includes", (actualStatus, expectedStatus) => actualStatus.includes(expectedStatus));
29212
29213
  import_handlebars.default.registerHelper("gr", (count) => count > 0);
29213
29214
  import_handlebars.default.registerHelper("or", function(a, b) {
29214
29215
  return a || b;
29215
29216
  });
29216
29217
  }
29217
29218
  registerPartials() {
29218
- ["navbar", "testStatus", "testPanel", "summaryCard", "userInfo", "project"].forEach((partialName) => {
29219
+ ["navbar", "testPanel", "summaryCard", "userInfo", "project", "testStatus", "testIcons"].forEach((partialName) => {
29219
29220
  import_handlebars.default.registerPartial(partialName, import_fs2.default.readFileSync(
29220
29221
  import_path3.default.resolve(__dirname, "views", `${partialName}.hbs`),
29221
29222
  "utf-8"
@@ -29202,13 +29202,14 @@ var HTMLGenerator = class {
29202
29202
  import_handlebars.default.registerHelper("joinWithSpace", (array) => array.join(" "));
29203
29203
  import_handlebars.default.registerHelper("json", (context) => safeStringify(context));
29204
29204
  import_handlebars.default.registerHelper("eq", (actualStatus, expectedStatus) => actualStatus === expectedStatus);
29205
+ import_handlebars.default.registerHelper("includes", (actualStatus, expectedStatus) => actualStatus.includes(expectedStatus));
29205
29206
  import_handlebars.default.registerHelper("gr", (count) => count > 0);
29206
29207
  import_handlebars.default.registerHelper("or", function(a, b) {
29207
29208
  return a || b;
29208
29209
  });
29209
29210
  }
29210
29211
  registerPartials() {
29211
- ["navbar", "testStatus", "testPanel", "summaryCard", "userInfo", "project"].forEach((partialName) => {
29212
+ ["navbar", "testPanel", "summaryCard", "userInfo", "project", "testStatus", "testIcons"].forEach((partialName) => {
29212
29213
  import_handlebars.default.registerPartial(partialName, fs2.readFileSync(
29213
29214
  path3.resolve(__dirname, "views", `${partialName}.hbs`),
29214
29215
  "utf-8"
@@ -33,50 +33,11 @@
33
33
  background: #555;
34
34
  }
35
35
 
36
- div#testDetails {
37
- position: sticky;
38
- top: 0;
39
- z-index: 1;
40
- }
41
-
42
- .sidebar {
43
- overflow-y: auto;
44
- max-height: calc(100vh - 100px);
45
- }
46
-
47
- aside li {
48
- cursor: pointer;
49
- }
50
-
51
- details summary {
52
- cursor: pointer;
53
- display: flex;
54
- justify-content: space-between;
55
- align-items: center;
56
- }
57
-
58
- details summary::after {
59
- content: '';
60
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
61
- transform: rotate(-90deg);
62
- background-size: 1em;
63
- background-repeat: no-repeat;
64
- background-position: right-center;
65
- width: 1em;
66
- height: 1em;
67
- transition: transform 0.2s ease-in-out;
68
- }
69
-
70
- details[open]>summary::after {
71
- transform: rotate(0deg);
72
- }
73
-
74
36
  .logoimage {
75
37
  max-width: 100px;
76
38
  }
77
39
 
78
40
  .listselected {
79
- border-image: linear-gradient(45deg, var(--bulma-primary), #FF6B6B) 1;
80
41
  font-weight: bold;
81
42
  }
82
43
 
@@ -97,7 +58,7 @@
97
58
  .sticky-header {
98
59
  position: sticky;
99
60
  top: 0;
100
- z-index: 100;
61
+ z-index: 10;
101
62
  }
102
63
 
103
64
  .video-preview {
@@ -125,4 +86,9 @@
125
86
  .status-icon {
126
87
  font-size: 1.5rem;
127
88
  margin-right: 0.5rem;
89
+ }
90
+ .content-wrapper {
91
+ max-height: 60vh; /* Adjust height as needed */
92
+ overflow-y: auto;
93
+ padding: 0.5rem;
128
94
  }
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="description" content="Playwright HTML report by LetCode Koushik - V2.0.5">
6
+ <meta name="description" content="Playwright HTML report by LetCode Koushik - V2.0.6">
7
7
  <title>{{title}}</title>
8
8
  <link rel="icon" href="https://raw.githubusercontent.com/ortoniKC/ortoni-report/refs/heads/main/favicon.png"
9
9
  type="image/x-icon">
@@ -16,7 +16,7 @@
16
16
  </style>
17
17
  <body>
18
18
  {{> navbar }}
19
- <section class="section">
19
+ <section class="section mt-6">
20
20
  <main class="container">
21
21
  <div class="columns">
22
22
  <aside class="column is-two-fifths">
@@ -143,7 +143,7 @@
143
143
  testDetails.innerHTML = `
144
144
  <div class="sticky-header">
145
145
  <div class="card mb-3">
146
- <button class="button is-info is-light mb-3" id="back-to-summary" onclick="showSummary()">
146
+ <button class="button is-primary mb-3" id="back-to-summary" onclick="showSummary()">
147
147
  <span class="icon"><i class="fa fa-chevron-left" style="color: #63E6BE;"></i></span>
148
148
  <span>Back to Summary</span>
149
149
  </button>
@@ -237,12 +237,15 @@
237
237
  </div>
238
238
  ${test.tracePath ? `
239
239
  <div class="columns is-centered">
240
- <div class="column is-3">
241
- <a href="trace/index.html?trace=http://localhost:${test.port}/${test.tracePath}" target="_blank" class="button is-link is-fullwidth mt-3">
242
- <span class="icon"><i class="fa-solid fa-tv" style="color: #FFD43B;"></i></span>
243
- <span class="has-text-white pl-2">View Trace</span>
244
- </a>
245
- </div>
240
+ <div class="column is-3">
241
+ <button
242
+ data-trace="${test.tracePath}"
243
+ onclick="openTraceViewer(this)"
244
+ class="button is-link is-fullwidth mt-3">
245
+ <span class="icon"><i class="fa-solid fa-tv" style="color: #FFD43B;"></i></span>
246
+ <span class="has-text-white pl-2">View Trace</span>
247
+ </button>
248
+ </div>
246
249
  </div>
247
250
  ` : ''}
248
251
  </div>
@@ -379,12 +382,23 @@
379
382
  window.openVideo = openVideo;
380
383
  window.closeVideo = closeVideo;
381
384
  window.closeModal = closeModal;
385
+ window.openTraceViewer = openTraceViewer;
382
386
 
383
387
  document.addEventListener('keydown', (event) => {
384
388
  if (event.key === "Escape") {
385
389
  closeModal();
386
390
  }
387
391
  });
392
+ function openTraceViewer(button) {
393
+ const tracePath = button.getAttribute("data-trace");
394
+ try {
395
+ if (tracePath) {
396
+ const baseUrl = window.location.origin;
397
+ const traceViewerUrl = `${baseUrl}/trace/index.html?trace=${baseUrl}/${tracePath}`;
398
+ window.open(traceViewerUrl, "_blank");
399
+ }
400
+ } catch (error) { }
401
+ }
388
402
 
389
403
  function attachEventListeners() {
390
404
  const checkboxes = document.querySelectorAll('#select-filter input[type="checkbox"]');
@@ -432,7 +446,7 @@
432
446
  const detailsElements = document.querySelectorAll('.sidebar details');
433
447
  detailsElements.forEach(details => {
434
448
  let shouldShowDetails = false;
435
- const items = details.querySelectorAll('li[data-test-id]');
449
+ const items = details.querySelectorAll('div[data-test-id]');
436
450
  items.forEach(item => {
437
451
  const testTags = item.getAttribute('data-test-tags').trim().split(' ').filter(Boolean);
438
452
  const projectName = item.getAttribute('data-project-name').trim();
@@ -491,7 +505,7 @@
491
505
  testItems.forEach(item => {
492
506
  const testTitle = item.textContent.toLowerCase();
493
507
  if (testTitle.includes(searchTerm)) {
494
- item.style.display = 'block'; // Show matching test item
508
+ item.style.display = 'flex'; // Show matching test item
495
509
 
496
510
  let parent = item.parentElement;
497
511
  while (parent && parent.tagName !== 'ASIDE') {
@@ -506,7 +520,7 @@
506
520
  });
507
521
  } else {
508
522
  testItems.forEach(item => {
509
- item.style.display = 'block';
523
+ item.style.display = 'flex';
510
524
  });
511
525
  detailsElements.forEach(detail => {
512
526
  detail.open = false;
@@ -1,4 +1,4 @@
1
- <nav class="navbar is-primary" role="navigation" aria-label="main navigation">
1
+ <nav class="navbar is-primary is-fixed-top" role="navigation" aria-label="main navigation">
2
2
  <div class="navbar-brand">
3
3
  <a class="navbar-item">
4
4
  {{#if logo}}
@@ -16,16 +16,6 @@
16
16
  </div>
17
17
  <div class="navbar-menu">
18
18
  <div class="navbar-end">
19
- <div class="navbar-item">
20
- <span id="selected-filters"></span>
21
- </div>
22
- <div class="navbar-item">
23
- <div class="field">
24
- <p class="control">
25
- <input class="input" name="search" type="search" placeholder="Search by test">
26
- </p>
27
- </div>
28
- </div>
29
19
  <div class="navbar-item">
30
20
  <button id="toggle-theme" class="" data-theme-status="{{preferredTheme}}">
31
21
  <span class="icon">
@@ -1,131 +1,239 @@
1
+ <style>
2
+ :root {
3
+ --primary-gradient: linear-gradient(135deg, #3a6b6e 0%, #274754 100%);
4
+ --flaky-gradient: linear-gradient(135deg, #ffb70f 0%, #ffd65a 100%);
5
+ --retry-gradient: linear-gradient(135deg, #94a3b8 0%, #c0cad9 100%);
6
+ --skip-gradient: linear-gradient(135deg, #66d1ff 0%, #99e1ff 100%);
7
+ --success-gradient: linear-gradient(135deg, #34d399 0%, #059669 100%);
8
+ --error-gradient: linear-gradient(135deg, #dc2626 0%, #f87171 100%);
9
+ --glass-bg: rgba(255, 255, 255, 0.7);
10
+ --glass-border: rgba(255, 255, 255, 0.1);
11
+ --shadow-sm: 0 2px 4px -1px rgba(0, 0, 0, 0.1);
12
+ }
13
+
14
+ .sidebar {
15
+ height: 100%;
16
+ overflow-y: auto;
17
+ max-height: calc(100vh - 100px);
18
+ padding: 0px 10px 0px 0px;
19
+ }
20
+
21
+ .test-group {
22
+ margin-bottom: 0.5rem;
23
+ border-radius: 8px;
24
+ transition: all 0.2s ease;
25
+ }
26
+
27
+ .test-group summary {
28
+ padding: 0.5rem;
29
+ cursor: pointer;
30
+ user-select: none;
31
+ display: flex;
32
+ align-items: center;
33
+ gap: 0.5rem;
34
+ border-radius: 8px;
35
+ background: var(--primary-gradient);
36
+ color: white;
37
+ }
38
+
39
+ .test-suite {
40
+ margin: 0.35rem;
41
+ border-radius: 6px;
42
+ }
43
+
44
+ .test-suite summary {
45
+ padding: 0.35rem 0.5rem;
46
+ color: inherit;
47
+ background: transparent;
48
+ transition: background-color 0.2s ease;
49
+ }
50
+
51
+ .test-case {
52
+ margin: 0.35rem;
53
+ border-radius: 6px;
54
+ }
55
+
56
+ .test-case summary {
57
+ padding: 0.35rem 0.5rem;
58
+ color: inherit;
59
+ background: transparent;
60
+ transition: background-color 0.2s ease;
61
+ }
62
+
63
+ .test-item {
64
+ padding: 0.4rem 0.5rem;
65
+ margin: 0.35rem;
66
+ border-radius: 6px;
67
+ display: flex;
68
+ align-items: center;
69
+ gap: 0.5rem;
70
+ flex-wrap: wrap;
71
+ }
72
+
73
+ .test-item span {
74
+ overflow: hidden;
75
+ white-space: nowrap;
76
+ text-overflow: ellipsis;
77
+ max-width: 35ch;
78
+ }
79
+
80
+ .status-passed {
81
+ background: var(--success-gradient);
82
+ color: white;
83
+ }
84
+
85
+ .status-skipped {
86
+ background: var(--skip-gradient);
87
+ color: white;
88
+ }
89
+
90
+ .status-failed {
91
+ background: var(--error-gradient);
92
+ color: white;
93
+ }
94
+
95
+ .status-flaky {
96
+ background: var(--flaky-gradient);
97
+ color: white;
98
+ }
99
+
100
+ .icon-chevron {
101
+ transition: transform 0.2s ease;
102
+ width: 16px;
103
+ height: 16px;
104
+ }
105
+
106
+ details[open]>summary .icon-chevron {
107
+ transform: rotate(90deg);
108
+ }
109
+
110
+ .duration-tag {
111
+ font-size: 0.75rem;
112
+ padding: 0.25rem 0.5rem;
113
+ border-radius: 1rem;
114
+ margin-left: auto;
115
+ opacity: 0.8;
116
+ }
117
+
118
+ @keyframes slideIn {
119
+ from {
120
+ opacity: 0;
121
+ transform: translateX(-5px);
122
+ }
123
+
124
+ to {
125
+ opacity: 1;
126
+ transform: translateX(0);
127
+ }
128
+ }
129
+
130
+ details[open]>.test-content {
131
+ animation: slideIn 0.2s ease-out;
132
+ }
133
+ </style>
1
134
  <div class="content sidebar">
2
135
  {{#if showProject}}
3
136
  {{#each groupedResults}}
4
- <details class="box">
5
- <summary class="is-size-5 has-icon-right">
137
+ <details class="test-group">
138
+ <summary class="is-size-5">
6
139
  <div class="icon-text">
7
- <span class="icon has-text-info">
8
- <svg class="image is-16x16" height="512" viewBox="0 0 32 32" width="512"
9
- xmlns="http://www.w3.org/2000/svg">
10
- <g data-name="Layer 2">
11
- <path
12
- d="M11.612 30.945a3.986 3.986 0 01-2.829-1.17l-5.209-5.208a4.006 4.006 0 010-5.657l3.955-3.954a1 1 0 011.414 1.414l-3.955 3.954a2.003 2.003 0 000 2.829l5.21 5.208a2.004 2.004 0 002.828 0l7.235-7.234a2.003 2.003 0 000-2.828l-4.63-4.63a1 1 0 011.414-1.414l4.63 4.63a4.006 4.006 0 010 5.657l-7.235 7.233a3.988 3.988 0 01-2.828 1.17z"
13
- fill="#232323" />
14
- <path
15
- d="M15.662 20.038a.997.997 0 01-.707-.293l-4.63-4.63a4.006 4.006 0 010-5.656l7.235-7.234a4.004 4.004 0 015.657 0l5.209 5.208a4.006 4.006 0 010 5.657l-3.955 3.954a1 1 0 01-1.414-1.414l3.955-3.954a2.003 2.003 0 000-2.829l-5.21-5.208a2.002 2.002 0 00-2.828 0l-7.235 7.234a2.003 2.003 0 000 2.828l4.63 4.63a1 1 0 01-.707 1.707z"
16
- fill="#7fbde7" />
17
- </g>
140
+ <span class="icon">
141
+ <svg class="icon-chevron" width="16" height="16" viewBox="0 0 24 24" fill="none"
142
+ stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
143
+ <polyline points="9 18 15 12 9 6" />
18
144
  </svg>
19
145
  </span>
20
146
  <span>{{@key}}</span>
21
147
  </div>
22
148
  </summary>
23
- <ul class="mt-4 mb-4">
149
+ <div class="test-content">
24
150
  {{#each this}}
25
- <details class="mt-2 mb-2">
26
- <summary class="is-size-5 is-capitalized">
27
- <div class="icon-text">
28
- <span class="icon has-text-info">
29
- <svg class="image is-16x16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
30
- <path
31
- d="M181.344 42.656v394.671C181.344 478.562 214.781 512 256 512c41.25 0 74.672-33.438 74.672-74.673V42.656H181.344z"
32
- fill="#e6e9ed" />
151
+ <details class="test-suite">
152
+ <summary class="is-size-6 is-capitalized">
153
+ <span class="icon is-small">
154
+ <svg class="image is-16x16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
155
+ <path
156
+ d="M181.344 42.656v394.671C181.344 478.562 214.781 512 256 512c41.25 0 74.672-33.438 74.672-74.673V42.656H181.344z"
157
+ fill="#e6e9ed" />
158
+ <path
159
+ d="M352 32c0 17.672-14.312 32-32 32H192c-17.656 0-32-14.328-32-32s14.344-32 32-32h128c17.688 0 32 14.328 32 32z"
160
+ fill="#ccd1d9" />
161
+ <path
162
+ d="M181.344 192v245.327C181.344 478.562 214.781 512 256 512c41.25 0 74.672-33.438 74.672-74.673V192H181.344z"
163
+ fill="#a0d468" />
164
+ <g fill="#434a54">
33
165
  <path
34
- d="M352 32c0 17.672-14.312 32-32 32H192c-17.656 0-32-14.328-32-32s14.344-32 32-32h128c17.688 0 32 14.328 32 32z"
35
- fill="#ccd1d9" />
166
+ d="M245.344 266.655c0-5.89-4.781-10.655-10.672-10.655h-53.328v21.328h53.328c5.89 0 10.672-4.781 10.672-10.673zM234.672 319.999h-53.328v21.328h53.328c5.891 0 10.672-4.781 10.672-10.671s-4.782-10.657-10.672-10.657zM245.344 202.656c0-5.891-4.781-10.656-10.672-10.656h-53.328v21.328h53.328c5.89 0 10.672-4.781 10.672-10.672z" />
167
+ </g>
168
+ </svg>
169
+ </span>
170
+ <span>{{@key}}</span>
171
+ </summary>
172
+ {{#each this}}
173
+ <details class="test-case">
174
+ <summary>
175
+ <span class="icon is-small">
176
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor"
177
+ stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
36
178
  <path
37
- d="M181.344 192v245.327C181.344 478.562 214.781 512 256 512c41.25 0 74.672-33.438 74.672-74.673V192H181.344z"
38
- fill="#a0d468" />
39
- <g fill="#434a54">
40
- <path
41
- d="M245.344 266.655c0-5.89-4.781-10.655-10.672-10.655h-53.328v21.328h53.328c5.89 0 10.672-4.781 10.672-10.673zM234.672 319.999h-53.328v21.328h53.328c5.891 0 10.672-4.781 10.672-10.671s-4.782-10.657-10.672-10.657zM245.344 202.656c0-5.891-4.781-10.656-10.672-10.656h-53.328v21.328h53.328c5.89 0 10.672-4.781 10.672-10.672z" />
42
- </g>
179
+ d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z" />
43
180
  </svg>
44
181
  </span>
45
- <span>{{@key}}</span>
46
- </div>
47
- </summary>
48
- <ul class="mt-4 mb-4">
182
+ <span class="is-size-6">{{@key}}</span>
183
+ </summary>
49
184
  {{#each this}}
50
- <details class="mt-2 mb-2">
51
- <summary class="is-capitalized is-size-6">{{@key}}</summary>
52
- <ul class="mt-4 mb-4">
53
- {{#each this}}
54
- <li class="media {{#if (eq status 'skipped')}}is-hidden{{/if}}" data-suite-name="{{suite}}"
55
- data-test-duration="{{duration}}" data-test-tags="{{joinWithSpace testTags}}"
56
- data-project-name="{{projectName}}" data-test-id="{{index}}"
57
- data-test-status="{{status}} {{retry}}">
58
- {{> testStatus}}
59
- </li>
60
- {{/each}}
61
- </ul>
62
- </details>
185
+ {{> testStatus}}
63
186
  {{/each}}
64
- </ul>
187
+ </details>
188
+ {{/each}}
65
189
  </details>
66
190
  {{/each}}
67
- </ul>
191
+ </div>
68
192
  </details>
69
193
  {{/each}}
70
194
  {{else}}
71
195
  {{#each groupedResults}}
72
- <details class="box">
73
- <summary class="is-size-5 has-icon-right">
196
+ <details class="test-group">
197
+ <summary class="is-size-5">
74
198
  <div class="icon-text">
75
- <span class="icon has-text-info">
76
- <svg class="image is-16x16" height="512" viewBox="0 0 32 32" width="512"
77
- xmlns="http://www.w3.org/2000/svg">
78
- <g data-name="Layer 2">
79
- <path
80
- d="M11.612 30.945a3.986 3.986 0 01-2.829-1.17l-5.209-5.208a4.006 4.006 0 010-5.657l3.955-3.954a1 1 0 011.414 1.414l-3.955 3.954a2.003 2.003 0 000 2.829l5.21 5.208a2.004 2.004 0 002.828 0l7.235-7.234a2.003 2.003 0 000-2.828l-4.63-4.63a1 1 0 011.414-1.414l4.63 4.63a4.006 4.006 0 010 5.657l-7.235 7.233a3.988 3.988 0 01-2.828 1.17z"
81
- fill="#232323" />
82
- <path
83
- d="M15.662 20.038a.997.997 0 01-.707-.293l-4.63-4.63a4.006 4.006 0 010-5.656l7.235-7.234a4.004 4.004 0 015.657 0l5.209 5.208a4.006 4.006 0 010 5.657l-3.955 3.954a1 1 0 01-1.414-1.414l3.955-3.954a2.003 2.003 0 000-2.829l-5.21-5.208a2.002 2.002 0 00-2.828 0l-7.235 7.234a2.003 2.003 0 000 2.828l4.63 4.63a1 1 0 01-.707 1.707z"
84
- fill="#7fbde7" />
85
- </g>
199
+ <span class="icon">
200
+ <svg class="icon-chevron" width="16" height="16" viewBox="0 0 24 24" fill="none"
201
+ stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
202
+ <polyline points="9 18 15 12 9 6" />
86
203
  </svg>
87
204
  </span>
88
205
  <span>{{@key}}</span>
89
206
  </div>
90
207
  </summary>
91
- <ul class="mt-4 mb-4">
208
+ <div class="test-content">
92
209
  {{#each this}}
93
- <details class="mt-2 mb-2">
94
- <summary class="is-size-5 is-capitalized">
95
- <div class="icon-text">
96
- <span class="icon has-text-info">
97
- <svg class="image is-16x16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
98
- <path
99
- d="M181.344 42.656v394.671C181.344 478.562 214.781 512 256 512c41.25 0 74.672-33.438 74.672-74.673V42.656H181.344z"
100
- fill="#e6e9ed" />
101
- <path
102
- d="M352 32c0 17.672-14.312 32-32 32H192c-17.656 0-32-14.328-32-32s14.344-32 32-32h128c17.688 0 32 14.328 32 32z"
103
- fill="#ccd1d9" />
210
+ <details class="test-case">
211
+ <summary>
212
+ <span class="icon is-small">
213
+ <svg class="image is-16x16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
214
+ <path
215
+ d="M181.344 42.656v394.671C181.344 478.562 214.781 512 256 512c41.25 0 74.672-33.438 74.672-74.673V42.656H181.344z"
216
+ fill="#e6e9ed" />
217
+ <path
218
+ d="M352 32c0 17.672-14.312 32-32 32H192c-17.656 0-32-14.328-32-32s14.344-32 32-32h128c17.688 0 32 14.328 32 32z"
219
+ fill="#ccd1d9" />
220
+ <path
221
+ d="M181.344 192v245.327C181.344 478.562 214.781 512 256 512c41.25 0 74.672-33.438 74.672-74.673V192H181.344z"
222
+ fill="#a0d468" />
223
+ <g fill="#434a54">
104
224
  <path
105
- d="M181.344 192v245.327C181.344 478.562 214.781 512 256 512c41.25 0 74.672-33.438 74.672-74.673V192H181.344z"
106
- fill="#a0d468" />
107
- <g fill="#434a54">
108
- <path
109
- d="M245.344 266.655c0-5.89-4.781-10.655-10.672-10.655h-53.328v21.328h53.328c5.89 0 10.672-4.781 10.672-10.673zM234.672 319.999h-53.328v21.328h53.328c5.891 0 10.672-4.781 10.672-10.671s-4.782-10.657-10.672-10.657zM245.344 202.656c0-5.891-4.781-10.656-10.672-10.656h-53.328v21.328h53.328c5.89 0 10.672-4.781 10.672-10.672z" />
110
- </g>
111
- </svg>
112
- </span>
113
- <span>{{@key}}</span>
114
- </div>
225
+ d="M245.344 266.655c0-5.89-4.781-10.655-10.672-10.655h-53.328v21.328h53.328c5.89 0 10.672-4.781 10.672-10.673zM234.672 319.999h-53.328v21.328h53.328c5.891 0 10.672-4.781 10.672-10.671s-4.782-10.657-10.672-10.657zM245.344 202.656c0-5.891-4.781-10.656-10.672-10.656h-53.328v21.328h53.328c5.89 0 10.672-4.781 10.672-10.672z" />
226
+ </g>
227
+ </svg>
228
+ </span>
229
+ <span class="is-size-6">{{@key}}</span>
115
230
  </summary>
116
- <ul class="mt-4 mb-4">
117
- {{#each this}}
118
- <li class="media {{#if (eq status 'skipped')}}is-hidden{{/if}}" data-suite-name="{{suite}}"
119
- data-test-duration="{{duration}}" data-test-tags="{{joinWithSpace testTags}}"
120
- data-project-name="{{projectName}}" data-test-id="{{index}}"
121
- data-test-status="{{status}} {{retry}}">
122
- {{> testStatus}}
123
- </li>
124
- {{/each}}
125
- </ul>
231
+ {{#each this}}
232
+ {{> testStatus}}
233
+ {{/each}}
126
234
  </details>
127
235
  {{/each}}
128
- </ul>
236
+ </div>
129
237
  </details>
130
238
  {{/each}}
131
239
  {{/if}}
@@ -0,0 +1,163 @@
1
+ <div class="icon-text">
2
+ {{#if isRetry}}
3
+ <span class="icon has-text-info">
4
+ <svg class="image is-16x16" id="Layer_1" height="512" viewBox="0 0 512 512" width="512"
5
+ xmlns="http://www.w3.org/2000/svg" data-name="Layer 1">
6
+ <circle cx="256" cy="256" fill="#00ab5e" r="256" />
7
+ <path
8
+ d="m387.823 256.136c0 72.688-59.135 131.823-131.823 131.823s-131.824-59.135-131.824-131.823a132.14 132.14 0 0 1 77.501-120.136 16 16 0 1 1 13.2 29.15 99.852 99.852 0 1 0 103.749 13.25v25.833a16 16 0 0 1 -32 0v-64.192a16 16 0 0 1 16-16h64.192a16 16 0 0 1 0 32h-25.066a132.143 132.143 0 0 1 46.071 100.095z"
9
+ fill="#fff" />
10
+ </svg>
11
+ </span>
12
+ {{else}}
13
+ <span class="icon has-text-info">
14
+ {{#if (eq status "passed")}}
15
+ <svg class="image is-16x16" height="512" viewBox="0 0 520 520" width="512" xmlns="http://www.w3.org/2000/svg">
16
+ <g id="_15-Checked" data-name="15-Checked">
17
+ <circle cx="208.52" cy="288.5" fill="#b0ef8f" r="176.52" />
18
+ <path
19
+ d="m210.516 424.937-2.239-3.815c-34.2-58.27-125.082-181.928-126-183.17l-1.311-1.781 30.963-30.6 98.012 68.439c61.711-80.079 119.283-135.081 156.837-167.2 41.081-35.135 67.822-51.31 68.092-51.465l.608-.364h52.522l-5.017 4.468c-129.029 114.926-268.883 359.19-270.276 361.644z"
20
+ fill="#009045" />
21
+ </g>
22
+ </svg>
23
+ {{/if}}
24
+ {{#if (eq status "failed")}}
25
+ <svg class="image is-16x16" height="512pt" viewBox="0 0 512 512" width="512pt"
26
+ xmlns="http://www.w3.org/2000/svg">
27
+ <path
28
+ d="m256 0c-141.164062 0-256 114.835938-256 256s114.835938 256 256 256 256-114.835938 256-256-114.835938-256-256-256zm0 0"
29
+ fill="#f44336" />
30
+ <path
31
+ d="m350.273438 320.105469c8.339843 8.34375 8.339843 21.824219 0 30.167969-4.160157 4.160156-9.621094 6.25-15.085938 6.25-5.460938 0-10.921875-2.089844-15.082031-6.25l-64.105469-64.109376-64.105469 64.109376c-4.160156 4.160156-9.621093 6.25-15.082031 6.25-5.464844 0-10.925781-2.089844-15.085938-6.25-8.339843-8.34375-8.339843-21.824219 0-30.167969l64.109376-64.105469-64.109376-64.105469c-8.339843-8.34375-8.339843-21.824219 0-30.167969 8.34375-8.339843 21.824219-8.339843 30.167969 0l64.105469 64.109376 64.105469-64.109376c8.34375-8.339843 21.824219-8.339843 30.167969 0 8.339843 8.34375 8.339843 21.824219 0 30.167969l-64.109376 64.105469zm0 0"
32
+ fill="#fafafa" />
33
+ </svg>
34
+ {{/if}}
35
+ {{#if (eq status "skipped")}}
36
+ <svg class="image is-16x16" id="Layer_1" enable-background="new 0 0 512 512" height="512" viewBox="0 0 512 512"
37
+ width="512" xmlns="http://www.w3.org/2000/svg">
38
+ <g clip-rule="evenodd" fill-rule="evenodd">
39
+ <path d="m256 0c-141.2 0-256 114.8-256 256s114.8 256 256 256 256-114.8 256-256-114.8-256-256-256z"
40
+ fill="#fec006" />
41
+ <path
42
+ d="m379 244.8c6.3 6.3 6.3 16.4 0 22.7l-112.7 112.5c-3.1 3.1-7.2 4.7-11.3 4.7s-8.2-1.6-11.3-4.7c-6.3-6.3-6.3-16.4 0-22.6l101.3-101.3-101.3-101.3c-6.3-6.3-6.3-16.4 0-22.7s16.4-6.3 22.7 0zm-110.8 22.6-112.5 112.5c-3.1 3.1-7.2 4.7-11.3 4.7s-8.2-1.6-11.3-4.7c-6.2-6.2-6.2-16.4 0-22.6l101.1-101.2-101.2-101.2c-6.2-6.2-6.2-16.4 0-22.6 6.3-6.2 16.4-6.2 22.6 0l112.5 112.5c6.3 6.2 6.3 16.4.1 22.6z"
43
+ fill="#fff" />
44
+ </g>
45
+ </svg>
46
+ {{/if}}
47
+ {{#if (eq status "timedOut")}}
48
+ <svg class="image is-16x16" id="Date__x26__Time_-_Flat" enable-background="new 0 0 64 64" height="512"
49
+ viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg">
50
+ <g>
51
+ <g>
52
+ <g>
53
+ <path
54
+ d="m46.12 16.71h-.43c-1.427 0-2.769-.555-3.777-1.562-1.008-1.009-1.563-2.347-1.563-3.769 0-1.842-1.494-3.34-3.33-3.34h-.7c-1.836 0-3.33 1.498-3.33 3.34v3.33c0 .553-.447 1-1 1s-1-.447-1-1v-3.33c0-2.944 2.391-5.34 5.33-5.34h.699c2.939 0 5.33 2.396 5.33 5.34 0 .888.348 1.723.978 2.354.631.63 1.47.977 2.363.977h.43c1.842 0 3.34-1.494 3.34-3.33 0-.553.447-1 1-1s1 .447 1 1c0 2.939-2.396 5.33-5.34 5.33z"
55
+ fill="#565662" />
56
+ </g>
57
+ <g>
58
+ <path
59
+ d="m50.46 8.651c-.553 0-1-.447-1-1v-2.892c0-.553.447-1 1-1s1 .447 1 1v2.893c0 .552-.447.999-1 .999z"
60
+ fill="#fb7088" />
61
+ </g>
62
+ <g>
63
+ <path
64
+ d="m47.824 9.744c-.256 0-.512-.098-.707-.293l-2.046-2.046c-.391-.391-.391-1.023 0-1.414s1.023-.391 1.414 0l2.046 2.046c.391.391.391 1.023 0 1.414-.195.195-.451.293-.707.293z"
65
+ fill="#fb7088" />
66
+ </g>
67
+ <g>
68
+ <path
69
+ d="m55.142 17.062c-.256 0-.512-.098-.707-.293l-2.045-2.045c-.391-.391-.391-1.023 0-1.414s1.023-.391 1.414 0l2.045 2.045c.391.391.391 1.023 0 1.414-.196.195-.452.293-.707.293z"
70
+ fill="#fb7088" />
71
+ </g>
72
+ <g>
73
+ <path
74
+ d="m57.081 12.38h-2.893c-.553 0-1-.447-1-1s.447-1 1-1h2.893c.553 0 1 .447 1 1s-.447 1-1 1z"
75
+ fill="#fb7088" />
76
+ </g>
77
+ <g>
78
+ <path
79
+ d="m53.097 9.744c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.023 0-1.414l2.045-2.046c.391-.391 1.023-.391 1.414 0s.391 1.023 0 1.414l-2.045 2.046c-.196.195-.451.293-.707.293z"
80
+ fill="#fb7088" />
81
+ </g>
82
+ <path
83
+ d="m36.48 18.96v-4.25h-8.96v4.25c-9.04 2.03-15.79 10.11-15.79 19.76 0 11.2 9.08 20.27 20.27 20.27s20.27-9.07 20.27-20.27c0-9.65-6.75-17.73-15.79-19.76z"
84
+ fill="#565662" />
85
+ <path
86
+ d="m32 54.489c-8.694 0-15.767-7.073-15.767-15.767s7.073-15.767 15.767-15.767 15.767 7.073 15.767 15.767c0 8.693-7.073 15.767-15.767 15.767z"
87
+ fill="#faf8f9" />
88
+ <path
89
+ d="m18.233 40.721c0-8.694 7.073-15.767 15.767-15.767 3.839 0 7.359 1.382 10.096 3.671-2.895-3.462-7.241-5.671-12.096-5.671-8.694 0-15.767 7.073-15.767 15.767 0 4.855 2.209 9.201 5.671 12.096-2.289-2.737-3.671-6.257-3.671-10.096z"
90
+ fill="#e0cad6" />
91
+ <g>
92
+ <path
93
+ d="m31.991 26.758c-.553 0-1-.447-1-1v-3.999c0-.553.447-1 1-1s1 .447 1 1v3.999c0 .553-.447 1-1 1z"
94
+ fill="#565662" />
95
+ </g>
96
+ <g>
97
+ <path
98
+ d="m22.827 30.562c-.256 0-.512-.098-.707-.293l-2.828-2.828c-.391-.391-.391-1.023 0-1.414s1.023-.391 1.414 0l2.828 2.828c.391.391.391 1.023 0 1.414-.195.195-.451.293-.707.293z"
99
+ fill="#565662" />
100
+ </g>
101
+ <g>
102
+ <path
103
+ d="m19.036 39.73h-3.998c-.553 0-1-.447-1-1s.447-1 1-1h3.998c.553 0 1 .447 1 1s-.447 1-1 1z"
104
+ fill="#565662" />
105
+ </g>
106
+ <g>
107
+ <path
108
+ d="m20.012 51.722c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.023 0-1.414l2.828-2.827c.391-.391 1.023-.391 1.414 0s.391 1.023 0 1.414l-2.828 2.827c-.196.195-.451.293-.707.293z"
109
+ fill="#565662" />
110
+ </g>
111
+ <g>
112
+ <path
113
+ d="m32.009 56.684c-.553 0-1-.447-1-1v-3.999c0-.553.447-1 1-1s1 .447 1 1v3.999c0 .552-.447 1-1 1z"
114
+ fill="#565662" />
115
+ </g>
116
+ <g>
117
+ <path
118
+ d="m44.001 51.709c-.256 0-.512-.098-.707-.293l-2.828-2.827c-.391-.391-.391-1.023 0-1.414s1.023-.391 1.414 0l2.828 2.827c.391.391.391 1.023 0 1.414-.195.195-.451.293-.707.293z"
119
+ fill="#565662" />
120
+ </g>
121
+ <g>
122
+ <path
123
+ d="m48.962 39.712h-3.998c-.553 0-1-.447-1-1s.447-1 1-1h3.998c.553 0 1 .447 1 1s-.447 1-1 1z"
124
+ fill="#565662" />
125
+ </g>
126
+ <g>
127
+ <path
128
+ d="m41.16 30.549c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.023 0-1.414l2.828-2.828c.391-.391 1.023-.391 1.414 0s.391 1.023 0 1.414l-2.828 2.828c-.195.195-.451.293-.707.293z"
129
+ fill="#565662" />
130
+ </g>
131
+ <g>
132
+ <path
133
+ d="m32 38.228c-.553 0-1-.447-1-1v-7.819c0-.553.447-1 1-1s1 .447 1 1v7.819c0 .552-.447 1-1 1z"
134
+ fill="#565662" />
135
+ </g>
136
+ <g>
137
+ <path
138
+ d="m26.047 45.675c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.024 0-1.414l4.558-4.555c.391-.391 1.023-.391 1.414 0s.391 1.024 0 1.414l-4.558 4.555c-.195.195-.451.293-.707.293z"
139
+ fill="#565662" />
140
+ </g>
141
+ <circle cx="32" cy="38.721" fill="#ffc361" r="2.54" />
142
+ </g>
143
+ </g>
144
+ </svg>
145
+ {{/if}}
146
+ {{#if (eq status "flaky")}}
147
+ <svg class="image is-16x16" height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg">
148
+ <g id="Layer_35" data-name="Layer 35">
149
+ <path
150
+ d="m32 3.4a28.59 28.59 0 0 0 -28.6 28.6 28.59 28.59 0 0 0 28.6 28.6 28.59 28.59 0 0 0 28.6-28.6 28.59 28.59 0 0 0 -28.6-28.6zm0 49.2a4.32 4.32 0 1 1 4.31-4.31 4.32 4.32 0 0 1 -4.31 4.31zm5.23-35.6-1.63 22a.6.6 0 0 1 -.6.56h-6a.6.6 0 0 1 -.6-.56l-1.63-22a5.24 5.24 0 1 1 10.46 0z"
151
+ fill="#ffc048" />
152
+ </g>
153
+ </svg>
154
+ {{/if}}
155
+ </span>
156
+ {{/if}}
157
+ <span>{{title}}</span>
158
+ </div>
159
+ {{#if @root.showProject}}
160
+ <span class="tag duration-tag has-text-weight-medium">{{duration}}</span>
161
+ {{else}}
162
+ <span class="tag duration-tag has-text-weight-medium">{{projectName}}</span>
163
+ {{/if}}
@@ -1,31 +1,37 @@
1
- <div class="columns is-mobile is-vcentered">
1
+ <div class="columns is-mobile is-vcentered is-gapless">
2
2
  <div class="column">
3
- <h2 class="title is-4">Tests</h2>
3
+ <div class="control">
4
+ <input class="input" name="search" type="search" placeholder="Search by test" />
5
+ </div>
4
6
  </div>
5
- <div class="column">
7
+ <div class="column is-2 mr-3">
6
8
  <div id="project-filter" class="dropdown is-right is-hoverable is-pulled-right">
7
9
  <div class="dropdown-trigger">
8
- <button class="button" aria-haspopup="true" aria-controls="select-filter">
10
+ <button class="button is-primary" aria-haspopup="true" aria-controls="select-filter">
9
11
  <span>Filters</span>
10
12
  <span class="icon is-small">
11
- <i class="fas fa-angle-down" aria-hidden="true"></i>
13
+ <i class="fa-solid fa-filter" aria-hidden="true"></i>
12
14
  </span>
13
15
  </button>
14
16
  </div>
15
17
  <div class="dropdown-menu" id="select-filter" role="menu">
16
18
  <div class="dropdown-content">
19
+ <p class="dropdown-item has-text-weight-semibold has-text-primary">Projects</p>
17
20
  {{#each projects}}
18
21
  <div class="dropdown-item">
19
22
  <label class="checkbox is-capitalized">
20
- <input name="{{this}}" type="checkbox" data-filter-type="project" value="{{this}}"> {{this}}
23
+ <input name="{{this}}" type="checkbox" data-filter-type="project" value="{{this}}" />
24
+ {{this}}
21
25
  </label>
22
26
  </div>
23
27
  {{/each}}
24
28
  <hr class="dropdown-divider" />
29
+ <p class="dropdown-item has-text-weight-semibold has-text-primary">Tags</p>
25
30
  {{#each allTags}}
26
31
  <div class="dropdown-item">
27
32
  <label class="checkbox">
28
- <input name="{{this}}" type="checkbox" data-filter-type="test-tags" value="{{this}}"> {{this}}
33
+ <input name="{{this}}" type="checkbox" data-filter-type="test-tags" value="{{this}}" />
34
+ {{this}}
29
35
  </label>
30
36
  </div>
31
37
  {{/each}}
@@ -33,4 +39,7 @@
33
39
  </div>
34
40
  </div>
35
41
  </div>
42
+ </div>
43
+ <div class="content">
44
+ <span id="selected-filters"></span>
36
45
  </div>
@@ -1,33 +1,9 @@
1
- <div class="icon-text">
2
- {{#if isRetry}}
3
- <span class="icon has-text-info">
4
- <svg class="image is-16x16" id="Layer_1" height="512" viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg" data-name="Layer 1"><circle cx="256" cy="256" fill="#00ab5e" r="256"/><path d="m387.823 256.136c0 72.688-59.135 131.823-131.823 131.823s-131.824-59.135-131.824-131.823a132.14 132.14 0 0 1 77.501-120.136 16 16 0 1 1 13.2 29.15 99.852 99.852 0 1 0 103.749 13.25v25.833a16 16 0 0 1 -32 0v-64.192a16 16 0 0 1 16-16h64.192a16 16 0 0 1 0 32h-25.066a132.143 132.143 0 0 1 46.071 100.095z" fill="#fff"/></svg>
5
- </span>
6
- {{else}}
7
- <span class="icon has-text-info">
8
- {{#if (eq status "passed")}}
9
- <svg class="image is-16x16" height="512" viewBox="0 0 520 520" width="512" xmlns="http://www.w3.org/2000/svg">
10
- <g id="_15-Checked" data-name="15-Checked">
11
- <circle cx="208.52" cy="288.5" fill="#b0ef8f" r="176.52" />
12
- <path
13
- d="m210.516 424.937-2.239-3.815c-34.2-58.27-125.082-181.928-126-183.17l-1.311-1.781 30.963-30.6 98.012 68.439c61.711-80.079 119.283-135.081 156.837-167.2 41.081-35.135 67.822-51.31 68.092-51.465l.608-.364h52.522l-5.017 4.468c-129.029 114.926-268.883 359.19-270.276 361.644z"
14
- fill="#009045" />
15
- </g>
16
- </svg>
17
- {{/if}}
18
- {{#if (eq status "failed")}}
19
- <svg class="image is-16x16" height="512pt" viewBox="0 0 512 512" width="512pt" xmlns="http://www.w3.org/2000/svg"><path d="m256 0c-141.164062 0-256 114.835938-256 256s114.835938 256 256 256 256-114.835938 256-256-114.835938-256-256-256zm0 0" fill="#f44336"/><path d="m350.273438 320.105469c8.339843 8.34375 8.339843 21.824219 0 30.167969-4.160157 4.160156-9.621094 6.25-15.085938 6.25-5.460938 0-10.921875-2.089844-15.082031-6.25l-64.105469-64.109376-64.105469 64.109376c-4.160156 4.160156-9.621093 6.25-15.082031 6.25-5.464844 0-10.925781-2.089844-15.085938-6.25-8.339843-8.34375-8.339843-21.824219 0-30.167969l64.109376-64.105469-64.109376-64.105469c-8.339843-8.34375-8.339843-21.824219 0-30.167969 8.34375-8.339843 21.824219-8.339843 30.167969 0l64.105469 64.109376 64.105469-64.109376c8.34375-8.339843 21.824219-8.339843 30.167969 0 8.339843 8.34375 8.339843 21.824219 0 30.167969l-64.109376 64.105469zm0 0" fill="#fafafa"/></svg>
20
- {{/if}}
21
- {{#if (eq status "skipped")}}
22
- <svg class="image is-16x16" id="Layer_1" enable-background="new 0 0 512 512" height="512" viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg"><g clip-rule="evenodd" fill-rule="evenodd"><path d="m256 0c-141.2 0-256 114.8-256 256s114.8 256 256 256 256-114.8 256-256-114.8-256-256-256z" fill="#fec006"/><path d="m379 244.8c6.3 6.3 6.3 16.4 0 22.7l-112.7 112.5c-3.1 3.1-7.2 4.7-11.3 4.7s-8.2-1.6-11.3-4.7c-6.3-6.3-6.3-16.4 0-22.6l101.3-101.3-101.3-101.3c-6.3-6.3-6.3-16.4 0-22.7s16.4-6.3 22.7 0zm-110.8 22.6-112.5 112.5c-3.1 3.1-7.2 4.7-11.3 4.7s-8.2-1.6-11.3-4.7c-6.2-6.2-6.2-16.4 0-22.6l101.1-101.2-101.2-101.2c-6.2-6.2-6.2-16.4 0-22.6 6.3-6.2 16.4-6.2 22.6 0l112.5 112.5c6.3 6.2 6.3 16.4.1 22.6z" fill="#fff"/></g></svg>
23
- {{/if}}
24
- {{#if (eq status "timedOut")}}
25
- <svg class="image is-16x16" id="Date__x26__Time_-_Flat" enable-background="new 0 0 64 64" height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg"><g><g><g><path d="m46.12 16.71h-.43c-1.427 0-2.769-.555-3.777-1.562-1.008-1.009-1.563-2.347-1.563-3.769 0-1.842-1.494-3.34-3.33-3.34h-.7c-1.836 0-3.33 1.498-3.33 3.34v3.33c0 .553-.447 1-1 1s-1-.447-1-1v-3.33c0-2.944 2.391-5.34 5.33-5.34h.699c2.939 0 5.33 2.396 5.33 5.34 0 .888.348 1.723.978 2.354.631.63 1.47.977 2.363.977h.43c1.842 0 3.34-1.494 3.34-3.33 0-.553.447-1 1-1s1 .447 1 1c0 2.939-2.396 5.33-5.34 5.33z" fill="#565662"/></g><g><path d="m50.46 8.651c-.553 0-1-.447-1-1v-2.892c0-.553.447-1 1-1s1 .447 1 1v2.893c0 .552-.447.999-1 .999z" fill="#fb7088"/></g><g><path d="m47.824 9.744c-.256 0-.512-.098-.707-.293l-2.046-2.046c-.391-.391-.391-1.023 0-1.414s1.023-.391 1.414 0l2.046 2.046c.391.391.391 1.023 0 1.414-.195.195-.451.293-.707.293z" fill="#fb7088"/></g><g><path d="m55.142 17.062c-.256 0-.512-.098-.707-.293l-2.045-2.045c-.391-.391-.391-1.023 0-1.414s1.023-.391 1.414 0l2.045 2.045c.391.391.391 1.023 0 1.414-.196.195-.452.293-.707.293z" fill="#fb7088"/></g><g><path d="m57.081 12.38h-2.893c-.553 0-1-.447-1-1s.447-1 1-1h2.893c.553 0 1 .447 1 1s-.447 1-1 1z" fill="#fb7088"/></g><g><path d="m53.097 9.744c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.023 0-1.414l2.045-2.046c.391-.391 1.023-.391 1.414 0s.391 1.023 0 1.414l-2.045 2.046c-.196.195-.451.293-.707.293z" fill="#fb7088"/></g><path d="m36.48 18.96v-4.25h-8.96v4.25c-9.04 2.03-15.79 10.11-15.79 19.76 0 11.2 9.08 20.27 20.27 20.27s20.27-9.07 20.27-20.27c0-9.65-6.75-17.73-15.79-19.76z" fill="#565662"/><path d="m32 54.489c-8.694 0-15.767-7.073-15.767-15.767s7.073-15.767 15.767-15.767 15.767 7.073 15.767 15.767c0 8.693-7.073 15.767-15.767 15.767z" fill="#faf8f9"/><path d="m18.233 40.721c0-8.694 7.073-15.767 15.767-15.767 3.839 0 7.359 1.382 10.096 3.671-2.895-3.462-7.241-5.671-12.096-5.671-8.694 0-15.767 7.073-15.767 15.767 0 4.855 2.209 9.201 5.671 12.096-2.289-2.737-3.671-6.257-3.671-10.096z" fill="#e0cad6"/><g><path d="m31.991 26.758c-.553 0-1-.447-1-1v-3.999c0-.553.447-1 1-1s1 .447 1 1v3.999c0 .553-.447 1-1 1z" fill="#565662"/></g><g><path d="m22.827 30.562c-.256 0-.512-.098-.707-.293l-2.828-2.828c-.391-.391-.391-1.023 0-1.414s1.023-.391 1.414 0l2.828 2.828c.391.391.391 1.023 0 1.414-.195.195-.451.293-.707.293z" fill="#565662"/></g><g><path d="m19.036 39.73h-3.998c-.553 0-1-.447-1-1s.447-1 1-1h3.998c.553 0 1 .447 1 1s-.447 1-1 1z" fill="#565662"/></g><g><path d="m20.012 51.722c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.023 0-1.414l2.828-2.827c.391-.391 1.023-.391 1.414 0s.391 1.023 0 1.414l-2.828 2.827c-.196.195-.451.293-.707.293z" fill="#565662"/></g><g><path d="m32.009 56.684c-.553 0-1-.447-1-1v-3.999c0-.553.447-1 1-1s1 .447 1 1v3.999c0 .552-.447 1-1 1z" fill="#565662"/></g><g><path d="m44.001 51.709c-.256 0-.512-.098-.707-.293l-2.828-2.827c-.391-.391-.391-1.023 0-1.414s1.023-.391 1.414 0l2.828 2.827c.391.391.391 1.023 0 1.414-.195.195-.451.293-.707.293z" fill="#565662"/></g><g><path d="m48.962 39.712h-3.998c-.553 0-1-.447-1-1s.447-1 1-1h3.998c.553 0 1 .447 1 1s-.447 1-1 1z" fill="#565662"/></g><g><path d="m41.16 30.549c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.023 0-1.414l2.828-2.828c.391-.391 1.023-.391 1.414 0s.391 1.023 0 1.414l-2.828 2.828c-.195.195-.451.293-.707.293z" fill="#565662"/></g><g><path d="m32 38.228c-.553 0-1-.447-1-1v-7.819c0-.553.447-1 1-1s1 .447 1 1v7.819c0 .552-.447 1-1 1z" fill="#565662"/></g><g><path d="m26.047 45.675c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.024 0-1.414l4.558-4.555c.391-.391 1.023-.391 1.414 0s.391 1.024 0 1.414l-4.558 4.555c-.195.195-.451.293-.707.293z" fill="#565662"/></g><circle cx="32" cy="38.721" fill="#ffc361" r="2.54"/></g></g></svg>
26
- {{/if}}
27
- {{#if (eq status "flaky")}}
28
- <svg class="image is-16x16" height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg"><g id="Layer_35" data-name="Layer 35"><path d="m32 3.4a28.59 28.59 0 0 0 -28.6 28.6 28.59 28.59 0 0 0 28.6 28.6 28.59 28.59 0 0 0 28.6-28.6 28.59 28.59 0 0 0 -28.6-28.6zm0 49.2a4.32 4.32 0 1 1 4.31-4.31 4.32 4.32 0 0 1 -4.31 4.31zm5.23-35.6-1.63 22a.6.6 0 0 1 -.6.56h-6a.6.6 0 0 1 -.6-.56l-1.63-22a5.24 5.24 0 1 1 10.46 0z" fill="#ffc048"/></g></svg>
29
- {{/if}}
30
- </span>
31
- {{/if}}
32
- <span>{{title}}</span>
1
+ <div class="test-item
2
+ {{#if (eq status 'passed')}}status-passed
3
+ {{else if (or (eq status 'failed') (eq status 'timedOut'))}}status-failed
4
+ {{else if (includes status 'flaky')}}status-flaky
5
+ {{else if (eq status 'skipped')}}status-skipped is-hidden{{/if}}" data-suite-name="{{suite}}"
6
+ data-test-tags="{{joinWithSpace testTags}}" data-project-name="{{projectName}}" data-test-id="{{index}}"
7
+ data-test-status="{{status}} {{retry}}" data-test-duration="{{duration}}">
8
+ {{> testIcons}}
33
9
  </div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ortoni-report",
3
- "version": "2.0.5",
3
+ "version": "2.0.6",
4
4
  "description": "Playwright Report By LetCode with Koushik",
5
5
  "scripts": {
6
6
  "tsc": "tsc",
package/readme.md CHANGED
@@ -11,32 +11,40 @@ Welcome to **Ortoni Report**, a comprehensive and visually appealing HTML report
11
11
  ## Key Features
12
12
 
13
13
  1. **Hierarchical Grouping**
14
+
14
15
  - Tests are structured and grouped by filename, suite, and project, providing a clear and organized view of the entire test execution.
15
16
 
16
17
  2. **Detailed Breakdown**
18
+
17
19
  - Each suite displays tests categorized by project, with organized test results for better navigation.
18
20
 
19
21
  3. **Comprehensive Test Details**
22
+
20
23
  - Rich details include test status (passed, failed, skipped), duration, tags, errors, logs, annotations, screenshots, videos, and trace data.
21
24
  - Users can sort and filter tests by suite, project, or script for more focused insights.
22
25
 
23
26
  4. **Summary Statistics**
27
+
24
28
  - Overview displays total tests, passed, failed, skipped, and flaky tests, with a success rate calculation for each suite.
25
29
 
26
30
  5. **Chart Visualizations**
31
+
27
32
  - Visualize test result distributions using:
28
33
  - **Doughnut Chart**: Illustrates overall test result status (passed, failed, skipped, flaky).
29
34
  - **Doughnut & Bar Charts**: Breakdown of results per project (Chromium, Firefox, etc.) for easy comparison.
30
35
 
31
36
  6. **Advanced Search and Reset**
37
+
32
38
  - Search and filter tests quickly using specific keywords or criteria. Easily reset filters to display all tests again.
33
39
 
34
40
  7. **Customization & Themes**
41
+
35
42
  - Personalize reports with project details, author name, test type, and toggle between light and dark themes.
36
43
  - Flexibility to choose between Base64 images or file paths for screenshots.
37
44
  - Customize report filenames and folder paths.
38
45
 
39
46
  8. **Test Attachments**
47
+
40
48
  - Screenshots
41
49
  - Videos
42
50
  - Trace viewer
@@ -45,22 +53,28 @@ Welcome to **Ortoni Report**, a comprehensive and visually appealing HTML report
45
53
  - Console logs
46
54
 
47
55
  9. **Integration and Configuration**
56
+
48
57
  - Easily configure and integrate with Playwright using TypeScript/JavaScript.
49
58
  - Configure reporting preferences within the Playwright setup for quick customization.
50
59
 
51
60
  10. **Add Your Logo**
61
+
52
62
  - Include your branding by adding a relative or absolute path to the config for a custom logo in the report.
53
63
 
54
64
  11. **Share Reports**
65
+
55
66
  - Generated reports are self-contained and ready to share right away, making it easier to distribute and review.
56
67
 
57
68
  12. **Advanced Filtering**
69
+
58
70
  - Apply filters based on project, tags, and test status simultaneously for precise reporting. See only the relevant tests.
59
71
 
60
72
  13. **Colorful and Intuitive Dashboard**
73
+
61
74
  - Vibrant, intuitive color schemes enhance the dashboard’s visual appeal, improving clarity for quick test status assessment.
62
75
 
63
76
  14. **Selected Status Display**
77
+
64
78
  - The UI now clearly displays the selected status filter, helping users keep track of the current filter criteria.
65
79
 
66
80
  15. **Hide Skipped Tests by Default**
@@ -88,14 +102,14 @@ import { OrtoniReportConfig } from "ortoni-report";
88
102
 
89
103
  const reportConfig: OrtoniReportConfig = {
90
104
  port: 1994,
91
- open: "on-failure",
105
+ open: process.env.CI ? "never" : "always",
92
106
  folderPath: "report",
93
107
  filename: "index.html",
94
108
  logo: "logo.png",
95
109
  title: "Ortoni Test Report",
96
110
  showProject: false,
97
111
  projectName: "Ortoni-Report",
98
- testType: "Release - Oct 21, 2024",
112
+ testType: "Release - Oct 30, 2024",
99
113
  authorName: "Koushik (LetCode with Koushik)",
100
114
  preferredTheme: "light",
101
115
  base64Image: true,
@@ -106,13 +120,15 @@ export default defineConfig({
106
120
  // Other Playwright configurations
107
121
  });
108
122
  ```
123
+
109
124
  ### Configure in `playwright.config.js`
125
+
110
126
  ```javascript
111
127
  import { defineConfig } from "@playwright/test";
112
128
 
113
129
  const reportConfig = {
114
130
  port: 1994,
115
- open: "on-failure",
131
+ open: process.env.CI ? "never" : "always",D
116
132
  folderPath: "report",
117
133
  filename: "index.html",
118
134
  logo: "logo.png",
@@ -171,4 +187,4 @@ Thank you for using **Ortoni Report**! We’re committed to providing you with a
171
187
 
172
188
  **LetCode with Koushik**
173
189
 
174
- ---
190
+ ---