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.
- package/LICENSE +21 -0
- package/README.md +35 -0
- package/lib/generate.d.ts +56 -0
- package/lib/generate.js +969 -0
- package/lib/help.d.ts +46 -0
- package/lib/help.js +503 -0
- package/lib/html/assets/css/bootstrap.min.css +1 -0
- package/lib/html/assets/css/dark-theme.css +55 -0
- package/lib/html/assets/css/dark-theme.min.css +1 -0
- package/lib/html/assets/css/img-comparison-slider.css +50 -0
- package/lib/html/assets/css/img-comparison-slider.min.css +1 -0
- package/lib/html/assets/css/jquery.dataTables.min.css +1 -0
- package/lib/html/assets/css/light-theme.css +53 -0
- package/lib/html/assets/css/light-theme.min.css +1 -0
- package/lib/html/assets/css/prism.css +163 -0
- package/lib/html/assets/css/prism.min.css +1 -0
- package/lib/html/assets/css/style-colors.css +349 -0
- package/lib/html/assets/css/style-colors.min.css +1 -0
- package/lib/html/assets/css/style.css +586 -0
- package/lib/html/assets/css/style.min.css +1 -0
- package/lib/html/assets/js/bootstrap.min.js +1 -0
- package/lib/html/assets/js/chart.min.js +1 -0
- package/lib/html/assets/js/customTheme.js +40 -0
- package/lib/html/assets/js/customTheme.min.js +1 -0
- package/lib/html/assets/js/darkTheme.js +34 -0
- package/lib/html/assets/js/darkTheme.min.js +1 -0
- package/lib/html/assets/js/dataTables.js +4 -0
- package/lib/html/assets/js/dataTables.min.js +1 -0
- package/lib/html/assets/js/img-comparison-slider.min.js +2 -0
- package/lib/html/assets/js/jquery-3.5.1.min.js +1 -0
- package/lib/html/assets/js/jquery.dataTables.min.js +1 -0
- package/lib/html/assets/js/lightTheme.js +34 -0
- package/lib/html/assets/js/lightTheme.min.js +1 -0
- package/lib/html/assets/js/prism.min.js +1 -0
- package/lib/html/assets/js/script.js +61 -0
- package/lib/html/assets/js/script.min.js +1 -0
- package/lib/html/base.html +182 -0
- package/lib/html/chart.html +21 -0
- package/lib/html/chartFile.html +33 -0
- package/lib/html/chartInfo.html +5 -0
- package/lib/html/chartJs.html +133 -0
- package/lib/html/chartProject.html +33 -0
- package/lib/html/chartStatus.html +87 -0
- package/lib/html/content.html +30 -0
- package/lib/html/runInfo.html +47 -0
- package/lib/html/summary.html +20 -0
- package/lib/html/summaryRow.html +10 -0
- package/lib/html/testCase.html +12 -0
- package/lib/html/testCaseDetails.html +125 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.js +48 -0
- package/lib/server.mjs +8 -0
- package/lib/types/execFileInfo.types.d.ts +13 -0
- package/lib/types/execFileInfo.types.js +2 -0
- package/lib/types/execInfo.types.d.ts +15 -0
- package/lib/types/execInfo.types.js +2 -0
- package/lib/types/execOptions.types.d.ts +17 -0
- package/lib/types/execOptions.types.js +2 -0
- package/lib/types/execProjectInfo.types.d.ts +13 -0
- package/lib/types/execProjectInfo.types.js +2 -0
- package/lib/types/execTestCase.types.d.ts +14 -0
- package/lib/types/execTestCase.types.js +2 -0
- package/lib/types/execTestResult.types.d.ts +43 -0
- package/lib/types/execTestResult.types.js +2 -0
- package/lib/types/onEnd.types.d.ts +12 -0
- package/lib/types/onEnd.types.js +2 -0
- package/lib/types/onProject.types.d.ts +53 -0
- package/lib/types/onProject.types.js +2 -0
- package/lib/types/onStdIO.types.d.ts +11 -0
- package/lib/types/onStdIO.types.js +2 -0
- package/lib/types/onStepBegin.types.d.ts +22 -0
- package/lib/types/onStepBegin.types.js +2 -0
- package/lib/types/onStepEnd.types.d.ts +25 -0
- package/lib/types/onStepEnd.types.js +2 -0
- package/lib/types/onTestBegin.types.d.ts +15 -0
- package/lib/types/onTestBegin.types.js +2 -0
- package/lib/types/onTestEnd.types.d.ts +37 -0
- package/lib/types/onTestEnd.types.js +2 -0
- package/lib/types/testReport.types.d.ts +6 -0
- package/lib/types/testReport.types.js +2 -0
- 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>
|