Another set of UI improvements

This commit is contained in:
Šesták Vít
2017-03-21 16:54:20 +01:00
parent 134ec971a4
commit 10b3a3b6f1
5 changed files with 51 additions and 21 deletions

View File

@@ -203,6 +203,13 @@ h3.library-identification{
.dependencies-table .identifiers .explained{ .dependencies-table .identifiers .explained{
border-bottom: none; border-bottom: none;
} }
.dependencies-table .vulnerabilities-details > li{
display: block;
list-style-type: none;
padding-left: 0;
margin-left: 0;
}
.expandable:before{ .expandable:before{
font-family: 'Glyphicons Halflings'; font-family: 'Glyphicons Halflings';
content: "\e114"; content: "\e114";
@@ -212,4 +219,19 @@ h3.library-identification{
} }
.expandable.expandable-right.collapsed:before{ .expandable.expandable-right.collapsed:before{
content: "\e079"; content: "\e079";
} }
.cvss .tooltip-inner table {
margin-left: auto;
margin-right: auto;
margin-bottom: 10px;
}
.cvss .tooltip-inner {
max-width: 250px;
width: 250px;
}
.vulnerability-expandable{
margin-left: 15px;
}
.vulnerability-expandable .more{
margin: 10px;
}

View File

@@ -97,7 +97,7 @@ final case class TeamFilter(team: Team) extends Filter{
object NoFilter extends Filter{ object NoFilter extends Filter{
override def filters: Boolean = false override def filters: Boolean = false
override val descriptionHtml: Html = views.html.filters.all() override val descriptionHtml: Html = views.html.filters.all()
override def descriptionText: String = "no filter selected" override def descriptionText: String = "all projects"
override def subReports(r: Result): Option[Result] = Some(r) override def subReports(r: Result): Option[Result] = Some(r)
override def selector: Option[String] = None override def selector: Option[String] = None
} }

View File

@@ -20,7 +20,7 @@
<p> <p>
@for(line <- descriptionParagraphLines) { @for(line <- descriptionParagraphLines) {
@line<br> @line<br>
} }
</p> </p>
} }
</div> </div>
@@ -65,14 +65,13 @@
<h4 class="expandable" data-toggle="collapse" data-target="#@depPrefix-projects-details">Affected projects (@dep.projects.size)</h4> <h4 class="expandable" data-toggle="collapse" data-target="#@depPrefix-projects-details">Affected projects (@dep.projects.size)</h4>
<ul id="@depPrefix-projects-details" class="collapse in">@for(p <- dep.projects.toIndexedSeq.sorted){<li>@friendlyProjectName(p)</li>}</ul> <ul id="@depPrefix-projects-details" class="collapse in">@for(p <- dep.projects.toIndexedSeq.sorted){<li>@friendlyProjectName(p)</li>}</ul>
<h4 class="expandable" data-toggle="collapse" data-target="#@depPrefix-vulnerabilities-details">Vulnerabilities (@dep.vulnerabilities.size)</h4> <h4 class="expandable" data-toggle="collapse" data-target="#@depPrefix-vulnerabilities-details">Vulnerabilities (@dep.vulnerabilities.size)</h4>
<ul id="@depPrefix-vulnerabilities-details" class="collapse in"> <ul id="@depPrefix-vulnerabilities-details" class="collapse in vulnerabilities-details">
@for(vuln <- dep.vulnerabilities.toSeq.sortBy(_.cvssScore.map(-_)); vulnPrefix = s"$depPrefix-vulnerabilities-details-${vuln.name}"){ @for(vuln <- dep.vulnerabilities.toSeq.sortBy(_.cvssScore.map(-_)); vulnPrefix = s"$depPrefix-vulnerabilities-details-${vuln.name}"){
<li> <li>
<h5 data-toggle="collapse" data-target="#@vulnPrefix-details">@vuln.name <a href="@routes.Statistics.vulnerability(vuln.name, selectorOption)"><span class="glyphicon glyphicon-log-out"></span></a></h5> <h5 data-toggle="collapse" class="expandable collapsed" data-target="#@vulnPrefix-details">@vuln.name <a href="@routes.Statistics.vulnerability(vuln.name, selectorOption)" target="_blank" onclick="event.stopPropagation();"><span class="glyphicon glyphicon-new-window"></span></a></h5>
<div id="@vulnPrefix-details" class="collapse"> <div id="@vulnPrefix-details" class="collapse vulnerability-expandable">
@vulnerability("h6", depPrefix, vuln) @vulnerability("h6", depPrefix+"-"+vuln.name, vuln)
<h6 data-toggle="collapse" data-target="#@(s"$depPrefix-suppression-cve-${vuln.name}")">CVE suppression</h6> <p><a class="btn btn-primary more" target="_blank" href="@routes.Statistics.vulnerability(vuln.name, selectorOption)">Full details about this vulnerability</a></p>
<div id="@(s"$depPrefix-suppression-cve-${vuln.name}")" class="collapse">@SuppressionXml.forVuln(dep, vuln)</div>
</div> </div>
</li> </li>
} }

View File

@@ -1,3 +1,3 @@
@(idPrefix: String)(ht: String)(name: String, description: String)(content: Html) @(idPrefix: String)(ht: String)(name: String, description: String)(content: Html)
<@ht id="@idPrefix-@name-header" data-toggle="collapse" data-target="#@idPrefix-@name-details">@description</@ht> <@ht id="@idPrefix-@name-header" data-toggle="collapse" data-target="#@idPrefix-@name-details" class="expandable">@description</@ht>
<div id="@idPrefix-@name-details" class="collapse in">@content</div> <div id="@idPrefix-@name-details" class="collapse in">@content</div>

View File

@@ -7,18 +7,27 @@
</tr> </tr>
} }
} }
@severityTable(vuln: Vulnerability) = {
<p>Rating of severity on scale 010. The total score depends on following subscores:</p>
<table class="vuln-details">
@row("authentication")(vuln.cvss.authenticationr)
@row("availability impact")(vuln.cvss.availabilityImpact)
@row("access vector")(vuln.cvss.accessVector)
@row("integrity impact")(vuln.cvss.integrityImpact)
@row("access complexity")(vuln.cvss.accessComplexity)
@row("confidential impact")(vuln.cvss.confidentialImpact)
@row("total score")(vuln.cvss.score)
</table>
}
@section = @{views.html.genericSection(idPrefix)(ht) _} @section = @{views.html.genericSection(idPrefix)(ht) _}
<table class="vuln-details"> <p class="cvss"><label>CVSS vulnerability score:</label> <span class="explained" title="@severityTable(vuln).toString()" onmouseover="$(this).tooltip({html: true, placement: 'right'}).tooltip('show')">
@row("CWE")(vuln.cweOption) @vuln.cvss.score match{
@row("CVSS: score")(vuln.cvss.score) case None => {<i>unknown</i>}
@row("CVSS: authenticationr")(vuln.cvss.authenticationr) case Some(score) => {<b>@score</b>}
@row("CVSS: availability impact")(vuln.cvss.availabilityImpact) }
@row("CVSS: access vector")(vuln.cvss.accessVector) </span></p>
@row("CVSS: integrity impact")(vuln.cvss.integrityImpact) @vuln.cweOption.map{cwe =><p><label>Category:</label> <span class="explained" title="Vulnerability category according to Common Weakness Enumeration" onmouseover="$(this).tooltip({placement: 'right'}).tooltip('show')"><b>@cwe</b></span></p>}
@row("CVSS: access complexity")(vuln.cvss.accessComplexity) <label>Description:</label> @vuln.description
@row("CVSS: confidential impact")(vuln.cvss.confidentialImpact)
</table>
@vuln.description
@section("vuln-sw", "Vulnerable software"){ @section("vuln-sw", "Vulnerable software"){
<ul id="@idPrefix-details"> <ul id="@idPrefix-details">
@for(sw <- vuln.vulnerableSoftware){ @for(sw <- vuln.vulnerableSoftware){