Make debug interface pretty

This commit is contained in:
Simon Stürz 2018-02-10 22:49:21 +01:00 committed by Michael Zanetti
parent ac4eb3d8b2
commit c8937b6924
5 changed files with 481 additions and 111 deletions

View File

@ -1,6 +1,7 @@
<RCC>
<qresource prefix="">
<file>logo.svg</file>
<file>warning.svg</file>
<file>styles.css</file>
</qresource>
</RCC>

View File

@ -14,7 +14,7 @@
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="guh-logo.svg"
sodipodi:docname="logo.svg"
inkscape:export-filename="/home/timon/guh/guh/guh/icons/guh-logo-512x512.png"
inkscape:export-xdpi="92.160004"
inkscape:export-ydpi="92.160004">
@ -252,15 +252,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="30.679884"
inkscape:cx="-124.12599"
inkscape:cy="202.52602"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="2880"
inkscape:window-height="1749"
inkscape:window-height="1752"
inkscape:window-x="0"
inkscape:window-y="51"
inkscape:window-y="48"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
@ -279,13 +279,6 @@
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-552.36215)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="rect4243"
width="500"
height="500"
x="0"
y="552.36218" />
<g
transform="matrix(2.2038606,0,0,2.2038606,-672.50331,283.61944)"
id="g41">

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -18,40 +18,162 @@
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
table {
display: table;
border-collapse: colapse;
border-spacing: 2px;
border-color: gray;
html,
body {
margin:0;
padding:0;
height:100%;
}
p {
color: #676767;
font-family: "Ubuntu", Helvetica, "Helvetica Neue", Arial, sans-serif;
font-size: 100%;
text-align: center;
}
h1, h2, h3, h4, h5, h6 {
margin: 0 0 20px 0;
font-family: "Ubuntu", Helvetica, "Helvetica Neue", Arial, sans-serif;
font-weight: normal;
color: #676767;
text-transform: none;
}
html {
th, td {
padding: 3px;
padding-left: 10px;
padding-right: 10px;
color: #676767;
font-family: "Ubuntu", Arial, Helvetica, sans-serif;
background: white;
font-family: "Ubuntu", Helvetica, "Helvetica Neue", Arial, sans-serif;
text-align: left;
}
footer {
position: fixed;
left: 0;
bottom: 0;
hr {
color: #efefef;
}
table {
display: table;
border-collapse: colapse;
border-color: #efefef;
width: 100%;
background-color: white;
}
button {
width: 100%;
}
.guh-main-logo {
left: 0;
height: 85px;
min-height: 85px;
max-height: 85px;
vertical-align: middle;
}
.warning {
background-color: #ed3146;
border-radius: 20px;
opacity: 0.8;
width: 80%;
margin-left: auto;
margin-right: auto;
}
.warning-message {
padding:30px;
margin-left: 60px;
opacity: 1;
color: white;
background-color: transparent;
font-family: "Ubuntu", Helvetica, "Helvetica Neue", Arial, sans-serif;
text-align: center;
float: none;
}
.warning-image {
padding:12px;
height: 60px;
min-height: 60px;
max-height: 60px;
float: left;
}
.warning:after {
content: "";
display: table;
clear: both;
}
.download-row {
width: 100%;
height: 100px;
left: 0;
right: 0;
}
.download-name-column {
float: left;
width: 30%;
padding: 10px;
}
.download-path-column {
float: left;
width: 40%;
padding: 10px;
}
.download-button-column {
float: left;
width: 20%;
padding: 10px;
}
.download-row: after {
content: "";
display: table;
clear: both;
}
.button {
background-color: #57baae;
border: none;
color: white;
padding: 15px 30px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
border-radius: 10px;
}
.container {
min-height:100%;
position:relative;
}
.header {
padding:10px;
background-color: #efefef;
text-align: center;
}
.body {
padding-left: 15%;
padding-right: 15%;
padding-bottom:120px;
}
.footer {
position:absolute;
bottom:0;
left:0;
right:0;
width:100%;
height:100px;
background-color: #efefef;
color: #676767;
text-align: center;
}

View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500"
height="500"
viewBox="0 0 500.00001 500.00001"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="warning.svg">
<title
id="title4161">warning icon</title>
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="28.015042"
inkscape:cy="289.6268"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="2880"
inkscape:window-height="1752"
inkscape:window-x="0"
inkscape:window-y="48"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>warning icon</dc:title>
<dc:date>10.02.2018</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>Simon Stürz</dc:title>
</cc:Agent>
</dc:creator>
<dc:publisher>
<cc:Agent>
<dc:title>guh GmbH</dc:title>
</cc:Agent>
</dc:publisher>
<dc:description>Warning icon for the debug interface</dc:description>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by/3.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by/3.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-552.36216)">
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:45.78516388;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 250,575.25149 -227.108841,454.21811 454.217681,0 z"
id="path4136"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:298.50747681px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="208.80597"
y="936.46436"
id="text4138"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4140"
x="208.80597"
y="936.46436">!</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -46,6 +46,7 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
writer.writeStartElement("html");
writer.writeAttribute("lang", GuhCore::instance()->configuration()->locale().name());
// Head
writer.writeStartElement("head");
writer.writeEmptyElement("meta");
@ -60,18 +61,46 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
writer.writeEndElement(); // head
writer.writeStartElement("body");
// Container
writer.writeStartElement("div");
writer.writeAttribute("class", "container");
// Header
writer.writeStartElement("div");
writer.writeAttribute("class", "header");
writer.writeStartElement("h1");
writer.writeEmptyElement("img");
writer.writeAttribute("src", "/debug/logo.svg");
writer.writeAttribute("class", "guh-main-logo");
writer.writeCharacters(QCoreApplication::translate("main", "nymea debug interface"));
writer.writeEndElement(); // h1
writer.writeEndElement(); // div header
// Body
writer.writeStartElement("div");
writer.writeAttribute("class", "body");
// Welcome section
writer.writeTextElement("h1", QCoreApplication::translate("main", "nymea debug interface"));
writer.writeEmptyElement("hr");
writer.writeTextElement("p", QCoreApplication::translate("main", "Welcome to the debug interface."));
writer.writeTextElement("p", QCoreApplication::translate("main", "This debug interface was designed to provide an easy possibility to get helpful information about the running nymea server."));
writer.writeEmptyElement("hr");
writer.writeTextElement("h3", QCoreApplication::translate("main", "Warning"));
writer.writeTextElement("p", QCoreApplication::translate("main", "Be aware that this debug interface is a security breach and offers access to the system log and therefore to possibly sensible data."));
writer.writeTextElement("p", QCoreApplication::translate("main", "If you are not using this debug tools, than you should disable it."));
// Warning
writer.writeStartElement("div");
writer.writeAttribute("class", "warning");
// Warning image
writer.writeStartElement("div");
writer.writeAttribute("class", "warning-image-area");
writer.writeEmptyElement("img");
writer.writeAttribute("class", "warning-image");
writer.writeAttribute("src", "/debug/warning.svg");
writer.writeEndElement(); // div warning image
// Warning message
writer.writeStartElement("div");
writer.writeAttribute("class", "warning-message");
writer.writeCharacters(QCoreApplication::translate("main", "Be aware that this debug interface is a security breach and could offer access to sensible data."));
writer.writeEndElement(); // div warning message
writer.writeEndElement(); // div warning
writer.writeEmptyElement("hr");
// System information section
@ -79,24 +108,10 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
writer.writeEmptyElement("hr");
writer.writeStartElement("table");
//writer.writeAttribute("width", "100%");
writer.writeAttribute("border", "1");
writer.writeStartElement("col");
writer.writeAttribute("align", "left");
writer.writeEndElement(); // col
writer.writeStartElement("col");
writer.writeAttribute("align", "left");
writer.writeEndElement(); // col
QString userName = qgetenv("USER");
if (userName.isEmpty())
userName = qgetenv("USERNAME");
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "User"));
writer.writeTextElement("td", userName);
writer.writeTextElement("td", qgetenv("USER"));
writer.writeEndElement(); // tr
writer.writeStartElement("tr");
@ -212,142 +227,244 @@ QByteArray DebugServerHandler::createDebugXmlDocument()
// Downloads section
writer.writeEmptyElement("hr");
writer.writeTextElement("h2", QCoreApplication::translate("main", "Downloads"));
writer.writeEmptyElement("hr");
// Logs download section
writer.writeEmptyElement("hr");
writer.writeTextElement("h3", QCoreApplication::translate("main", "Logs"));
writer.writeEmptyElement("hr");
writer.writeStartElement("table");
writer.writeAttribute("border", "1");
// Download row
writer.writeStartElement("div");
writer.writeAttribute("class", "download-row");
writer.writeStartElement("div");
writer.writeAttribute("class", "download-name-column");
writer.writeTextElement("p", QCoreApplication::translate("main", "Log database"));
writer.writeEndElement(); // div download-name-column
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Log database"));
writer.writeTextElement("td", GuhSettings::logPath());
writer.writeStartElement("td");
writer.writeStartElement("div");
writer.writeAttribute("class", "download-path-column");
writer.writeTextElement("p", GuhSettings::logPath());
writer.writeEndElement(); // div download-path-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-button-column");
writer.writeStartElement("form");
writer.writeAttribute("class", "download-button");
writer.writeAttribute("method", "get");
writer.writeAttribute("action", "/debug/logdb.sql");
writer.writeStartElement("button");
writer.writeAttribute("class", "button");
writer.writeAttribute("type", "submit");
writer.writeCharacters(QCoreApplication::translate("main", "Download"));
writer.writeEndElement(); // button
writer.writeEndElement(); // form
writer.writeEndElement(); // td
writer.writeEndElement(); // tr
writer.writeEndElement(); // div download-button-column
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "System logs"));
writer.writeTextElement("td", "/var/log/syslog");
writer.writeStartElement("td");
writer.writeEndElement(); // div download-row
// Download row
writer.writeStartElement("div");
writer.writeAttribute("class", "download-row");
writer.writeStartElement("div");
writer.writeAttribute("class", "download-name-column");
writer.writeTextElement("p", QCoreApplication::translate("main", "System logs"));
writer.writeEndElement(); // div download-name-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-path-column");
writer.writeTextElement("p", "/var/log/syslog");
writer.writeEndElement(); // div download-path-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-button-column");
writer.writeStartElement("form");
writer.writeAttribute("class", "download-button");
writer.writeAttribute("method", "get");
writer.writeAttribute("action", "/debug/syslog");
writer.writeStartElement("button");
writer.writeAttribute("class", "button");
writer.writeAttribute("type", "submit");
writer.writeCharacters(QCoreApplication::translate("main", "Download"));
writer.writeEndElement(); // button
writer.writeEndElement(); // form
writer.writeEndElement(); // td
writer.writeEndElement(); // tr
writer.writeEndElement(); // div download-button-column
// TODO: offer logfile download if specified in the command line options
writer.writeEndElement(); // table
writer.writeEndElement(); // div download-row
// Settings download section
writer.writeEmptyElement("hr");
writer.writeTextElement("h3", QCoreApplication::translate("main", "Settings"));
writer.writeEmptyElement("hr");
writer.writeStartElement("table");
writer.writeAttribute("border", "1");
// Download row
writer.writeStartElement("div");
writer.writeAttribute("class", "download-row");
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Guhd settings"));
writer.writeTextElement("td", GuhSettings(GuhSettings::SettingsRoleGlobal).fileName());
writer.writeStartElement("td");
writer.writeStartElement("div");
writer.writeAttribute("class", "download-name-column");
writer.writeTextElement("p", QCoreApplication::translate("main", "Guhd settings"));
writer.writeEndElement(); // div download-name-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-path-column");
writer.writeTextElement("p", GuhSettings(GuhSettings::SettingsRoleGlobal).fileName());
writer.writeEndElement(); // div download-path-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-button-column");
writer.writeStartElement("form");
writer.writeAttribute("class", "download-button");
writer.writeAttribute("method", "get");
writer.writeAttribute("action", "/debug/settings/guhd");
writer.writeStartElement("button");
writer.writeAttribute("class", "button");
writer.writeAttribute("type", "submit");
writer.writeCharacters(QCoreApplication::translate("main", "Download"));
writer.writeEndElement(); // button
writer.writeEndElement(); // form
writer.writeEndElement(); // td
writer.writeEndElement(); // tr
writer.writeEndElement(); // div download-button-column
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Device settings"));
writer.writeTextElement("td", GuhSettings(GuhSettings::SettingsRoleDevices).fileName());
writer.writeStartElement("td");
writer.writeEndElement(); // div download-row
// Download row
writer.writeStartElement("div");
writer.writeAttribute("class", "download-row");
writer.writeStartElement("div");
writer.writeAttribute("class", "download-name-column");
writer.writeTextElement("p", QCoreApplication::translate("main", "Device settings"));
writer.writeEndElement(); // div download-name-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-path-column");
writer.writeTextElement("p", GuhSettings(GuhSettings::SettingsRoleDevices).fileName());
writer.writeEndElement(); // div download-path-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-button-column");
writer.writeStartElement("form");
writer.writeAttribute("class", "download-button");
writer.writeAttribute("method", "get");
writer.writeAttribute("action", "/debug/settings/devices");
writer.writeStartElement("button");
writer.writeAttribute("class", "button");
writer.writeAttribute("type", "submit");
writer.writeCharacters(QCoreApplication::translate("main", "Download"));
writer.writeEndElement(); // button
writer.writeEndElement(); // form
writer.writeEndElement(); // td
writer.writeEndElement(); // tr
writer.writeEndElement(); // div download-button-column
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Device state settings"));
writer.writeTextElement("td", GuhSettings(GuhSettings::SettingsRoleDeviceStates).fileName());
writer.writeStartElement("td");
writer.writeEndElement(); // div download-row
// Download row
writer.writeStartElement("div");
writer.writeAttribute("class", "download-row");
writer.writeStartElement("div");
writer.writeAttribute("class", "download-name-column");
writer.writeTextElement("p", QCoreApplication::translate("main", "Device states settings"));
writer.writeEndElement(); // div download-name-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-path-column");
writer.writeTextElement("p", GuhSettings(GuhSettings::SettingsRoleDeviceStates).fileName());
writer.writeEndElement(); // div download-path-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-button-column");
writer.writeStartElement("form");
writer.writeAttribute("class", "download-button");
writer.writeAttribute("method", "get");
writer.writeAttribute("action", "/debug/settings/devicestates");
writer.writeStartElement("button");
writer.writeAttribute("class", "button");
writer.writeAttribute("type", "submit");
writer.writeCharacters(QCoreApplication::translate("main", "Download"));
writer.writeEndElement(); // button
writer.writeEndElement(); // form
writer.writeEndElement(); // td
writer.writeEndElement(); // tr
writer.writeEndElement(); // div download-button-column
writer.writeEndElement(); // div download-row
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Rules settings"));
writer.writeTextElement("td", GuhSettings(GuhSettings::SettingsRoleRules).fileName());
writer.writeStartElement("td");
// Download row
writer.writeStartElement("div");
writer.writeAttribute("class", "download-row");
writer.writeStartElement("div");
writer.writeAttribute("class", "download-name-column");
writer.writeTextElement("p", QCoreApplication::translate("main", "Rules settings"));
writer.writeEndElement(); // div download-name-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-path-column");
writer.writeTextElement("p", GuhSettings(GuhSettings::SettingsRoleRules).fileName());
writer.writeEndElement(); // div download-path-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-button-column");
writer.writeStartElement("form");
writer.writeAttribute("class", "download-button");
writer.writeAttribute("method", "get");
writer.writeAttribute("action", "/debug/settings/rules");
writer.writeStartElement("button");
writer.writeAttribute("class", "button");
writer.writeAttribute("type", "submit");
writer.writeCharacters(QCoreApplication::translate("main", "Download"));
writer.writeEndElement(); // button
writer.writeEndElement(); // form
writer.writeEndElement(); // td
writer.writeEndElement(); // tr
writer.writeEndElement(); // div download-button-column
writer.writeStartElement("tr");
writer.writeTextElement("th", QCoreApplication::translate("main", "Plugins settings"));
writer.writeTextElement("td", GuhSettings(GuhSettings::SettingsRolePlugins).fileName());
writer.writeStartElement("td");
writer.writeEndElement(); // div download-row
// Download row
writer.writeStartElement("div");
writer.writeAttribute("class", "download-row");
writer.writeStartElement("div");
writer.writeAttribute("class", "download-name-column");
writer.writeTextElement("p", QCoreApplication::translate("main", "Plugins settings"));
writer.writeEndElement(); // div download-name-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-path-column");
writer.writeTextElement("p", GuhSettings(GuhSettings::SettingsRolePlugins).fileName());
writer.writeEndElement(); // div download-path-column
writer.writeStartElement("div");
writer.writeAttribute("class", "download-button-column");
writer.writeStartElement("form");
writer.writeAttribute("class", "download-button");
writer.writeAttribute("method", "get");
writer.writeAttribute("action", "/debug/settings/plugins");
writer.writeStartElement("button");
writer.writeAttribute("class", "button");
writer.writeAttribute("type", "submit");
writer.writeCharacters(QCoreApplication::translate("main", "Download"));
writer.writeEndElement(); // button
writer.writeEndElement(); // form
writer.writeEndElement(); // td
writer.writeEndElement(); // tr
writer.writeEndElement(); // div download-button-column
writer.writeEndElement(); // table
writer.writeEndElement(); // div download-row
writer.writeEmptyElement("hr");
writer.writeEndElement(); // div body
writer.writeStartElement("footer");
// Footer
writer.writeStartElement("div");
writer.writeAttribute("class", "footer");
writer.writeTextElement("p", QString("Copyright %1 2018 guh GmbH.").arg(QChar(0xA9)));
writer.writeTextElement("p", QCoreApplication::translate("main", "Released under the GNU GENERAL PUBLIC LICENSE Version 2."));
writer.writeEndElement(); // footer
writer.writeEndElement(); // div footer
writer.writeEndElement(); // body
writer.writeEndElement(); // div container
writer.writeEndElement(); // html
@ -364,30 +481,63 @@ QByteArray DebugServerHandler::createErrorXmlDocument(HttpReply::HttpStatusCode
writer.writeStartElement("html");
writer.writeAttribute("lang", GuhCore::instance()->configuration()->locale().name());
// Head
writer.writeStartElement("head");
writer.writeEmptyElement("meta");
writer.writeAttribute("http-equiv", "Content-Type");
writer.writeAttribute("content", "text/html; charset=utf-8");
writer.writeEmptyElement("link");
writer.writeAttribute("rel", "stylesheet");
writer.writeAttribute("href", "/debug/styles.css");
writer.writeTextElement("title", QCoreApplication::translate("main", "Debug nymea"));
writer.writeEndElement(); // head
writer.writeStartElement("body");
// Container
writer.writeStartElement("div");
writer.writeAttribute("class", "container");
// Header
writer.writeStartElement("div");
writer.writeAttribute("class", "header");
writer.writeTextElement("p", " ");
writer.writeTextElement("h1", QCoreApplication::translate("main", "Error") + QString(" %1").arg(static_cast<int>(statusCode)));
writer.writeEmptyElement("hr");
writer.writeEndElement(); // div header
writer.writeTextElement("p", errorMessage);
// Body
writer.writeStartElement("div");
writer.writeAttribute("class", "body");
writer.writeEmptyElement("hr");
// Warning
writer.writeStartElement("div");
writer.writeAttribute("class", "warning");
// Warning image
writer.writeStartElement("div");
writer.writeAttribute("class", "warning-image-area");
writer.writeEmptyElement("img");
writer.writeAttribute("class", "warning-image");
writer.writeAttribute("src", "/debug/warning.svg");
writer.writeEndElement(); // div warning image
// Warning message
writer.writeStartElement("div");
writer.writeAttribute("class", "warning-message");
writer.writeCharacters(errorMessage);
writer.writeEndElement(); // div warning message
writer.writeEndElement(); // div warning
writer.writeStartElement("footer");
writer.writeEndElement(); // div body
// Footer
writer.writeStartElement("div");
writer.writeAttribute("class", "footer");
writer.writeTextElement("p", QString("Copyright %1 2018 guh GmbH.").arg(QChar(0xA9)));
writer.writeTextElement("p", QCoreApplication::translate("main", "Released under the GNU GENERAL PUBLIC LICENSE Version 2."));
writer.writeEndElement(); // footer
writer.writeEndElement(); // div footer
writer.writeEndElement(); // body
writer.writeEndElement(); // div container
writer.writeEndElement(); // html