odhin-reports-playwright 1.0.1

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 (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -0
  3. package/lib/generate.d.ts +56 -0
  4. package/lib/generate.js +969 -0
  5. package/lib/help.d.ts +46 -0
  6. package/lib/help.js +503 -0
  7. package/lib/html/assets/css/bootstrap.min.css +1 -0
  8. package/lib/html/assets/css/dark-theme.css +55 -0
  9. package/lib/html/assets/css/dark-theme.min.css +1 -0
  10. package/lib/html/assets/css/img-comparison-slider.css +50 -0
  11. package/lib/html/assets/css/img-comparison-slider.min.css +1 -0
  12. package/lib/html/assets/css/jquery.dataTables.min.css +1 -0
  13. package/lib/html/assets/css/light-theme.css +53 -0
  14. package/lib/html/assets/css/light-theme.min.css +1 -0
  15. package/lib/html/assets/css/prism.css +163 -0
  16. package/lib/html/assets/css/prism.min.css +1 -0
  17. package/lib/html/assets/css/style-colors.css +349 -0
  18. package/lib/html/assets/css/style-colors.min.css +1 -0
  19. package/lib/html/assets/css/style.css +586 -0
  20. package/lib/html/assets/css/style.min.css +1 -0
  21. package/lib/html/assets/js/bootstrap.min.js +1 -0
  22. package/lib/html/assets/js/chart.min.js +1 -0
  23. package/lib/html/assets/js/customTheme.js +40 -0
  24. package/lib/html/assets/js/customTheme.min.js +1 -0
  25. package/lib/html/assets/js/darkTheme.js +34 -0
  26. package/lib/html/assets/js/darkTheme.min.js +1 -0
  27. package/lib/html/assets/js/dataTables.js +4 -0
  28. package/lib/html/assets/js/dataTables.min.js +1 -0
  29. package/lib/html/assets/js/img-comparison-slider.min.js +2 -0
  30. package/lib/html/assets/js/jquery-3.5.1.min.js +1 -0
  31. package/lib/html/assets/js/jquery.dataTables.min.js +1 -0
  32. package/lib/html/assets/js/lightTheme.js +34 -0
  33. package/lib/html/assets/js/lightTheme.min.js +1 -0
  34. package/lib/html/assets/js/prism.min.js +1 -0
  35. package/lib/html/assets/js/script.js +61 -0
  36. package/lib/html/assets/js/script.min.js +1 -0
  37. package/lib/html/base.html +182 -0
  38. package/lib/html/chart.html +21 -0
  39. package/lib/html/chartFile.html +33 -0
  40. package/lib/html/chartInfo.html +5 -0
  41. package/lib/html/chartJs.html +133 -0
  42. package/lib/html/chartProject.html +33 -0
  43. package/lib/html/chartStatus.html +87 -0
  44. package/lib/html/content.html +30 -0
  45. package/lib/html/runInfo.html +47 -0
  46. package/lib/html/summary.html +20 -0
  47. package/lib/html/summaryRow.html +10 -0
  48. package/lib/html/testCase.html +12 -0
  49. package/lib/html/testCaseDetails.html +125 -0
  50. package/lib/index.d.ts +12 -0
  51. package/lib/index.js +48 -0
  52. package/lib/server.mjs +8 -0
  53. package/lib/types/execFileInfo.types.d.ts +13 -0
  54. package/lib/types/execFileInfo.types.js +2 -0
  55. package/lib/types/execInfo.types.d.ts +15 -0
  56. package/lib/types/execInfo.types.js +2 -0
  57. package/lib/types/execOptions.types.d.ts +17 -0
  58. package/lib/types/execOptions.types.js +2 -0
  59. package/lib/types/execProjectInfo.types.d.ts +13 -0
  60. package/lib/types/execProjectInfo.types.js +2 -0
  61. package/lib/types/execTestCase.types.d.ts +14 -0
  62. package/lib/types/execTestCase.types.js +2 -0
  63. package/lib/types/execTestResult.types.d.ts +43 -0
  64. package/lib/types/execTestResult.types.js +2 -0
  65. package/lib/types/onEnd.types.d.ts +12 -0
  66. package/lib/types/onEnd.types.js +2 -0
  67. package/lib/types/onProject.types.d.ts +53 -0
  68. package/lib/types/onProject.types.js +2 -0
  69. package/lib/types/onStdIO.types.d.ts +11 -0
  70. package/lib/types/onStdIO.types.js +2 -0
  71. package/lib/types/onStepBegin.types.d.ts +22 -0
  72. package/lib/types/onStepBegin.types.js +2 -0
  73. package/lib/types/onStepEnd.types.d.ts +25 -0
  74. package/lib/types/onStepEnd.types.js +2 -0
  75. package/lib/types/onTestBegin.types.d.ts +15 -0
  76. package/lib/types/onTestBegin.types.js +2 -0
  77. package/lib/types/onTestEnd.types.d.ts +37 -0
  78. package/lib/types/onTestEnd.types.js +2 -0
  79. package/lib/types/testReport.types.d.ts +6 -0
  80. package/lib/types/testReport.types.js +2 -0
  81. package/package.json +67 -0
@@ -0,0 +1,61 @@
1
+ function showHideScroll(action) {
2
+ let element = document.getElementById("body-content");
3
+
4
+ if (action === "show") {
5
+ if (element.classList.contains("hide-scroll")) {
6
+ element.classList.remove("hide-scroll");
7
+ }
8
+ } else if (action === "hide") {
9
+ if (!element.classList.contains("hide-scroll")) {
10
+ element.classList.add("hide-scroll");
11
+ }
12
+ }
13
+ }
14
+
15
+ /** LOADER **/
16
+ function hideLoader() {
17
+ document.getElementById("loading").style.visibility = "visibility";
18
+ document.getElementById("loading").style.opacity = "0";
19
+ document.getElementById("loading").style.transition = "all .3s linear";
20
+ document.getElementById("loading").style.zIndex = "0";
21
+ setTimeout(function () {
22
+ document.getElementById("loading").style.display = "none";
23
+ }, 1800);
24
+ }
25
+ if (window.addEventListener) {
26
+ window.addEventListener("load", hideLoader);
27
+ } else if (window.attachEvent) {
28
+ window.attachEvent("onload", hideLoader);
29
+ } else {
30
+ window.onload = hideLoader;
31
+ }
32
+
33
+
34
+
35
+ function openResultTab(evt, tabName, modalId) {
36
+ var i, tabcontent, tablinks;
37
+ tabcontent = document.getElementsByClassName("result-tabcontent-" + modalId);
38
+ for (i = 0; i < tabcontent.length; i++) {
39
+ tabcontent[i].style.display = "none";
40
+ }
41
+ tablinks = document.getElementsByClassName("result-tablinks-" + modalId);
42
+ for (i = 0; i < tablinks.length; i++) {
43
+ tablinks[i].className = tablinks[i].className.replace(" active", "");
44
+ }
45
+ document.getElementById(tabName).style.display = "block";
46
+ evt.currentTarget.className += " active";
47
+ }
48
+
49
+ function openMainTab(evt, tabName) {
50
+ var i, tabcontent, tablinks;
51
+ tabcontent = document.getElementsByClassName("main-tabcontent");
52
+ for (i = 0; i < tabcontent.length; i++) {
53
+ tabcontent[i].style.display = "none";
54
+ }
55
+ tablinks = document.getElementsByClassName("main-tablinks");
56
+ for (i = 0; i < tablinks.length; i++) {
57
+ tablinks[i].className = tablinks[i].className.replace(" active", "");
58
+ }
59
+ document.getElementById(tabName).style.display = "block";
60
+ evt.currentTarget.className += " active";
61
+ }
@@ -0,0 +1 @@
1
+ function showHideScroll(e){let t=document.getElementById("body-content");"show"===e?t.classList.contains("hide-scroll")&&t.classList.remove("hide-scroll"):"hide"===e&&(t.classList.contains("hide-scroll")||t.classList.add("hide-scroll"))}function hideLoader(){document.getElementById("loading").style.visibility="visibility",document.getElementById("loading").style.opacity="0",document.getElementById("loading").style.transition="all .3s linear",document.getElementById("loading").style.zIndex="0",setTimeout(function(){document.getElementById("loading").style.display="none"},1800)}function openResultTab(e,t,n){for(var l,a=document.getElementsByClassName("result-tabcontent-"+n),s=0;s<a.length;s++)a[s].style.display="none";for(l=document.getElementsByClassName("result-tablinks-"+n),s=0;s<l.length;s++)l[s].className=l[s].className.replace(" active","");document.getElementById(t).style.display="block",e.currentTarget.className+=" active"}function openMainTab(e,t){for(var n,l=document.getElementsByClassName("main-tabcontent"),a=0;a<l.length;a++)l[a].style.display="none";for(n=document.getElementsByClassName("main-tablinks"),a=0;a<n.length;a++)n[a].className=n[a].className.replace(" active","");document.getElementById(t).style.display="block",e.currentTarget.className+=" active"}window.addEventListener?window.addEventListener("load",hideLoader):window.attachEvent?window.attachEvent("onload",hideLoader):window.onload=hideLoader;
@@ -0,0 +1,182 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link
6
+ rel="shortcut icon"
7
+ href="data:image/png;base64,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"
8
+ />
9
+ <meta
10
+ name="viewport"
11
+ content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
12
+ />
13
+ <meta http-equiv="X-UA-Compatible" content="ie=edge" />
14
+ <title>{{.Title}}</title>
15
+ <link rel="preconnect" href="https://fonts.gstatic.com" />
16
+ {{.BootstrapCss}} {{.JQueryDataTablesCss}} {{.PrismCss}} {{.CssThemeDark}}
17
+ {{.CssThemeLight}} {{.CssThemeCustom}} {{.CssColors}} {{.Css}}
18
+ {{.ImgComparisonSliderJs}} {{.ImgComparisonSliderCss}}
19
+ </head>
20
+ <div id="loading">
21
+ <div class="ldio-45zk8dsdxop">
22
+ <div style="left: 38px; top: 38px; animation-delay: 0s"></div>
23
+ <div style="left: 80px; top: 38px; animation-delay: 0.125s"></div>
24
+ <div style="left: 122px; top: 38px; animation-delay: 0.25s"></div>
25
+ <div style="left: 38px; top: 80px; animation-delay: 0.875s"></div>
26
+ <div style="left: 122px; top: 80px; animation-delay: 0.375s"></div>
27
+ <div style="left: 38px; top: 122px; animation-delay: 0.75s"></div>
28
+ <div style="left: 80px; top: 122px; animation-delay: 0.625s"></div>
29
+ <div style="left: 122px; top: 122px; animation-delay: 0.5s"></div>
30
+ </div>
31
+ </div>
32
+ <body id="body-content">
33
+ <div class="container-fluid p-0 position-relative">
34
+ <div
35
+ class="container-fluid p-0 mb-1 text-white fw-bold odhin-bg sticky-top"
36
+ >
37
+ <div class="row m-0">
38
+ <div class="col-12 p-0 m-0">
39
+ <div id="theme-toggle" class="theme-toggle"></div>
40
+ <div
41
+ data-bs-toggle="modal"
42
+ data-bs-target="#modalInfo"
43
+ class="modal-info-btn"
44
+ onclick="showHideScroll('hide')"
45
+ ></div>
46
+ </div>
47
+ </div>
48
+ <div class="row m-0">
49
+ <div class="col-12 mt-3 mb-3">
50
+ <label class="ms-3 fs-5 report-title">{{.Title}}</label>
51
+ </div>
52
+ </div>
53
+ <div class="row m-0">
54
+ <div class="col-12 p-0">
55
+ <div class="tab">
56
+ <button
57
+ class="main-tablinks active"
58
+ onclick="openMainTab(event, 'TabDashboard')"
59
+ >
60
+ Dashboard
61
+ </button>
62
+ <button
63
+ class="main-tablinks"
64
+ onclick="openMainTab(event, 'TabTests')"
65
+ >
66
+ Tests
67
+ </button>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ </div>
72
+
73
+ <div id="TabDashboard" style="display: block" class="main-tabcontent">
74
+ <div class="container-fluid text-center mt-3 mb-5">
75
+ <div class="row ms-3 me-3">
76
+ <div class="col-12 col-xl-6">{{.RunInfo}}</div>
77
+ <div class="col-12 col-xl-6">{{.ChartStatus}}</div>
78
+ <div class="col-12 col-xl-6">{{.ChartFile}}</div>
79
+ <div class="col-12 col-xl-6">{{.ChartProject}}</div>
80
+ <div class="col-12">{{.SummaryFiles}}</div>
81
+ <div class="col-12">{{.SummaryProjects}}</div>
82
+ </div>
83
+ </div>
84
+ </div>
85
+
86
+ <div id="TabTests" style="display: none" class="main-tabcontent">
87
+ <div class="container-fluid mt-3 mb-5">
88
+ <div class="row ms-3 me-3">
89
+ <div class="col">{{.Content}}</div>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>
94
+
95
+ <div
96
+ class="modal fade"
97
+ id="modalInfo"
98
+ tabindex="-1"
99
+ aria-labelledby="modalInfoLabel"
100
+ aria-hidden="true"
101
+ >
102
+ <div class="modal-dialog modal-fullscreen modal-dialog-scrollable">
103
+ <div class="modal-content">
104
+ <div class="modal-header info-header">
105
+ <div class="header-col-left"></div>
106
+ <div class="header-col-right">
107
+ <span
108
+ type="button"
109
+ class="close-btn"
110
+ data-bs-dismiss="modal"
111
+ aria-label="Close"
112
+ onclick="showHideScroll('show')"
113
+ >X</span
114
+ >
115
+ </div>
116
+ </div>
117
+ <div class="modal-body odhin-bg odhin-text-2">
118
+ <div class="logo-modal">
119
+ <img src="data:image/png;base64,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"
120
+ />
121
+ </div>
122
+ <div class="version-modal odhin-text-1">
123
+ Version
124
+ <a
125
+ href="https://odhin-reports.gitlab.io/playwright/#/{{.Version}}/"
126
+ target="_Blank"
127
+ class="version-link"
128
+ >{{.Version}}</a
129
+ >
130
+ </div>
131
+ <div class="desc-modal odhin-text-1">
132
+ <div>
133
+ Created by <b><i>Rodrigo Odhin</i></b>
134
+ </div>
135
+ </div>
136
+ <div class="desc-modal odhin-text-1">
137
+ <div>
138
+ <a
139
+ href="https://odhin.io/"
140
+ target="_Blank"
141
+ class="text-decoration-none"
142
+ >
143
+ <span class="website-icon-bottom"></span>
144
+ </a>
145
+ </div>
146
+ <div>
147
+ <a
148
+ href="https://gitlab.com/rodrigoodhin/"
149
+ target="_Blank"
150
+ class="text-decoration-none"
151
+ >
152
+ <span class="gitlab-icon-bottom"></span>
153
+ </a>
154
+ </div>
155
+ <div>
156
+ <a
157
+ href="https://github.com/rodrigoodhin/"
158
+ target="_Blank"
159
+ class="text-decoration-none"
160
+ >
161
+ <span class="github-icon-bottom"></span>
162
+ </a>
163
+ </div>
164
+ <div>
165
+ <a
166
+ href="https://www.linkedin.com/in/rodrigocostacorrea/"
167
+ target="_Blank"
168
+ class="text-decoration-none"
169
+ >
170
+ <span class="linkedin-icon-bottom"></span>
171
+ </a>
172
+ </div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ </div>
177
+ </div>
178
+
179
+ {{.jQuery}} {{.JQueryDataTablesJs}} {{.DataTables}} {{.ChartJsLibrary}}
180
+ {{.ChartJs}} {{.BootstrapJs}} {{.PrismJs}} {{.Js}} {{.ThemeJs}}
181
+ </body>
182
+ </html>
@@ -0,0 +1,21 @@
1
+ <td rowspan="{{.RowSpan}}" class="chart value">
2
+ <div class="position-relative">
3
+ <div
4
+ class="position-absolute top-50 start-50 w-100 translate-middle odhin-text-2 ps-2 fs-5"
5
+ >
6
+ {{.TotalTests}}
7
+ </div>
8
+ <canvas
9
+ id="{{.ChartId}}"
10
+ style="
11
+ display: block;
12
+ box-sizing: border-box;
13
+ height: 160px;
14
+ width: 160px;
15
+ margin: 0px auto;
16
+ "
17
+ width="160"
18
+ height="160"
19
+ ></canvas>
20
+ </div>
21
+ </td>
@@ -0,0 +1,33 @@
1
+ <div class="mt-3 mb-3 odhin-thin-border dashboard-block">
2
+ <div class="info-box-header">
3
+ Files Summary
4
+ </div>
5
+ <div class="odhin-table">
6
+ <table class="table table-sm table-borderless mb-0">
7
+ <tr>
8
+ <td>
9
+ <table class="table table-sm table-borderless mb-0">
10
+ <tr>
11
+ <th class="odhin-text-2">Chart</th>
12
+ </tr>
13
+ <tr>
14
+ {{.Chart}}
15
+ </tr>
16
+ </table>
17
+ </td>
18
+ <td >
19
+ <div class="table-responsive tableFixHead ms-3">
20
+ <table class="table table-sm mb-0">
21
+ <thead>
22
+ <th class="odhin-text-2 px-2">Filename</th>
23
+ <th class="odhin-text-2 px-2">Tests</th>
24
+ <th class="odhin-text-2 px-2">Percentage</th>
25
+ </thead>
26
+ {{.ChartFile}}
27
+ </table>
28
+ </div></div>
29
+ </td>
30
+ </tr>
31
+ </table>
32
+ </div>
33
+ </div>
@@ -0,0 +1,5 @@
1
+ <tr>
2
+ <td class="text-secondary-emphasis fs-6 text-start"><label style="word-break: break-word;border-left: 10px {{.Color}} solid; padding-left: 10px">{{.Label}}</label></td>
3
+ <td class="text-secondary-emphasis">{{.Value}}</td>
4
+ <td class="text-secondary-emphasis fst-italic">{{.Percentage}}%</td>
5
+ </tr>
@@ -0,0 +1,133 @@
1
+ let options = {
2
+ segmentShowStroke: false,
3
+ responsive: false,
4
+ layout: {
5
+ padding: {
6
+ left: 0,
7
+ right: 0,
8
+ top: 10,
9
+ bottom: 0
10
+ }
11
+ },
12
+ scales: {
13
+ yAxes: [{
14
+ gridLines: {
15
+ display: false
16
+ },
17
+ ticks: {
18
+ display: false
19
+ },
20
+ scaleLabel: {
21
+ display: false
22
+ }
23
+ }],
24
+ xAxes: [{
25
+ gridLines: {
26
+ display: false
27
+ },
28
+ ticks: {
29
+ display: false
30
+ },
31
+ }]
32
+ },
33
+ legend: {
34
+ display: false,
35
+ },
36
+ animation: {
37
+ duration: 2200
38
+ },
39
+ tooltips: {
40
+ callbacks: {
41
+ label: function (tooltipItem, data) {
42
+ //get the concerned dataset
43
+ let dataset = data.datasets[tooltipItem.datasetIndex];
44
+ //calculate the total of this data set
45
+ let total = dataset.data.reduce(function (previousValue, currentValue, currentIndex, array) {
46
+ return previousValue + currentValue;
47
+ });
48
+ //get the current items value
49
+ let currentValue = dataset.data[tooltipItem.index];
50
+ //get the current items label
51
+ let currentLabel = data.labels[tooltipItem.index];
52
+ //calculate the percentage based on the total and current item, also this does a rough rounding to give a whole number
53
+ let percentage = Math.floor(((currentValue / total) * 100) + 0.5);
54
+
55
+ return " " + currentLabel + " " + percentage + "%";
56
+ }
57
+ }
58
+ },
59
+ title: {
60
+ display: false,
61
+ }
62
+ }
63
+
64
+ let statusPassed = "{{.PassedStatusChart}}"
65
+ let statusFailed = "{{.FailedStatusChart}}"
66
+ let statusTimedOut = "{{.TimedOutStatusChart}}"
67
+ let statusSkipped = "{{.SkippedStatusChart}}"
68
+ let statusInterrupted = "{{.InterruptedStatusChart}}"
69
+ let ctxStatus = document.getElementById('chart-status').getContext('2d');
70
+ let chartStatus = new Chart(ctxStatus, {
71
+ type: 'doughnut',
72
+ data: {
73
+ labels: [
74
+ 'Passed ({{.PassedStatusChart}})',
75
+ 'Failed ({{.FailedStatusChart}})',
76
+ 'TimedOut ({{.TimedOutStatusChart}})',
77
+ 'Skipped ({{.SkippedStatusChart}})',
78
+ 'Interrupted ({{.InterruptedStatusChart}})'
79
+ ],
80
+ datasets: [{
81
+ data: [
82
+ parseInt(statusPassed),
83
+ parseInt(statusFailed),
84
+ parseInt(statusTimedOut),
85
+ parseInt(statusSkipped),
86
+ parseInt(statusInterrupted)
87
+ ],
88
+ backgroundColor: [
89
+ '#2E7D31',
90
+ '#C62828',
91
+ '#fcd12a',
92
+ '#ff6f00',
93
+ '#01579b'
94
+ ],
95
+ borderColor: [
96
+ '#2E7D31',
97
+ '#C62828',
98
+ '#fcd12a',
99
+ '#ff6f00',
100
+ '#01579b'
101
+ ]
102
+ }]
103
+ },
104
+ options: options
105
+ });
106
+
107
+ let ctxFile = document.getElementById('chart-file').getContext('2d');
108
+ let chartFile = new Chart(ctxFile, {
109
+ type: 'doughnut',
110
+ data: {
111
+ labels: [ {{.FilesChartLabels}} ],
112
+ datasets: [{
113
+ data: [ {{.FilesChartData}} ],
114
+ backgroundColor: [ {{.FilesChartDataColor}} ],
115
+ borderColor: [ {{.FilesChartDataColor}} ]
116
+ }]
117
+ },
118
+ options: options
119
+ });
120
+
121
+ let ctxProject = document.getElementById('chart-project').getContext('2d');
122
+ let chartProject = new Chart(ctxProject, {
123
+ type: 'doughnut',
124
+ data: {
125
+ labels: [ {{.ProjectsChartLabels}} ],
126
+ datasets: [{
127
+ data: [ {{.ProjectsChartData}} ],
128
+ backgroundColor: [ {{.ProjectsChartDataColor}} ],
129
+ borderColor: [ {{.ProjectsChartDataColor}} ]
130
+ }]
131
+ },
132
+ options: options
133
+ });
@@ -0,0 +1,33 @@
1
+ <div class="mt-3 mb-3 odhin-thin-border dashboard-block">
2
+ <div class="info-box-header">
3
+ Projects Summary
4
+ </div>
5
+ <div class="odhin-table">
6
+ <table class="table table-sm table-borderless mb-0">
7
+ <tr>
8
+ <td>
9
+ <table class="table table-sm table-borderless mb-0">
10
+ <tr>
11
+ <th class="odhin-text-2">Chart</th>
12
+ </tr>
13
+ <tr>
14
+ {{.Chart}}
15
+ </tr>
16
+ </table>
17
+ </td>
18
+ <td>
19
+ <div class="table-responsive tableFixHead ms-3">
20
+ <table class="table table-sm mb-0">
21
+ <thead>
22
+ <th class="odhin-text-2 px-2">Project</th>
23
+ <th class="odhin-text-2 px-2">Tests</th>
24
+ <th class="odhin-text-2 px-2">Percentage</th>
25
+ </thead>
26
+ {{.ChartProject}}
27
+ </table>
28
+ </div>
29
+ </td>
30
+ </tr>
31
+ </table>
32
+ </div>
33
+ </div>
@@ -0,0 +1,87 @@
1
+ <div class="mt-3 mb-3 odhin-thin-border">
2
+ <div class="info-box-header">Global Summary</div>
3
+ <div class="odhin-table">
4
+ <div class="table-responsive">
5
+ <table class="table table-sm table-borderless mb-0">
6
+ <tr>
7
+ <td>
8
+ <table class="table table-sm table-borderless mb-0">
9
+ <tr>
10
+ <th class="odhin-text-2">Chart</th>
11
+ </tr>
12
+ <tr>
13
+ <td rowspan="5" class="chart value">
14
+ <div class="position-relative">
15
+ <div
16
+ class="position-absolute top-50 start-50 w-100 translate-middle odhin-text-2 ps-2 fs-5"
17
+ >
18
+ {{.TotalTests}}
19
+ </div>
20
+ <canvas
21
+ id="{{.ChartId}}"
22
+ style="
23
+ display: block;
24
+ box-sizing: border-box;
25
+ height: 160px;
26
+ width: 160px;
27
+ margin: 0px auto;
28
+ "
29
+ width="160"
30
+ height="160"
31
+ ></canvas>
32
+ </div>
33
+ </td>
34
+ </tr>
35
+ </table>
36
+ </td>
37
+ <td>
38
+ <table class="table table-sm mb-0">
39
+ <tr>
40
+ <th class="odhin-text-2 px-2">Status</th>
41
+ <th class="odhin-text-2 px-2">Tests</th>
42
+ <th class="odhin-text-2 px-2">Percentage</th>
43
+ </tr>
44
+ <tr>
45
+ <td class="chart-status-passed fs-6">Passed</td>
46
+ <td class="chart-status-passed-info">{{.TestPassedValue}}</td>
47
+ <td class="chart-status-passed-info fst-italic">
48
+ {{.TestPassedPercentage}}%
49
+ </td>
50
+ </tr>
51
+ <tr>
52
+ <td class="chart-status-failed fs-6">Failed</td>
53
+ <td class="chart-status-failed-info">{{.TestFailedValue}}</td>
54
+ <td class="chart-status-failed-info fst-italic">
55
+ {{.TestFailedPercentage}}%
56
+ </td>
57
+ </tr>
58
+ <tr>
59
+ <td class="chart-status-timedOut fs-6">Timed Out</td>
60
+ <td class="chart-status-timedOut-info">{{.TestTimedOutValue}}</td>
61
+ <td class="chart-status-timedOut-info fst-italic">
62
+ {{.TestTimedOutPercentage}}%
63
+ </td>
64
+ </tr>
65
+ <tr>
66
+ <td class="chart-status-skipped fs-6">Skipped</td>
67
+ <td class="chart-status-skipped-info">{{.TestSkippedValue}}</td>
68
+ <td class="chart-status-skipped-info fst-italic">
69
+ {{.TestSkippedPercentage}}%
70
+ </td>
71
+ </tr>
72
+ <tr>
73
+ <td class="chart-status-interrupted">Interrupted</td>
74
+ <td class="chart-status-interrupted-info">
75
+ {{.TestInterruptedValue}}
76
+ </td>
77
+ <td class="chart-status-interrupted-info fst-italic">
78
+ {{.TestInterruptedPercentage}}%
79
+ </td>
80
+ </tr>
81
+ </table>
82
+ </td>
83
+ </tr>
84
+ </table>
85
+ </div>
86
+ </div>
87
+ </div>
@@ -0,0 +1,30 @@
1
+ <div>
2
+ <div class="table-responsive">
3
+ <table id="test-list-table" class="table table-sm table-hover">
4
+ <thead>
5
+ <tr>
6
+ <th>Title</th>
7
+ <th>Status</th>
8
+ <th>File</th>
9
+ <th>Project</th>
10
+ <th>Duration</th>
11
+ {{.RetryColumn}}
12
+ </tr>
13
+ </thead>
14
+ <tbody>
15
+ {{.TestCases}}
16
+ </tbody>
17
+ <tfoot>
18
+ <tr>
19
+ <th>Title</th>
20
+ <th>Status</th>
21
+ <th>File</th>
22
+ <th>Project</th>
23
+ <th>Duration</th>
24
+ {{.RetryColumn}}
25
+ </tr>
26
+ </tfoot>
27
+ </table>
28
+ </div>
29
+ {{.TestCasesDetails}}
30
+ </div>