Wed, 18 Aug 2021 14:57:45 +0200
#159 adds release and eol dates
1.1 --- a/setup/postgres/psql_create_tables.sql Wed Aug 18 12:47:32 2021 +0200 1.2 +++ b/setup/postgres/psql_create_tables.sql Wed Aug 18 14:57:45 2021 +0200 1.3 @@ -36,7 +36,9 @@ 1.4 name text not null, 1.5 node text not null, 1.6 ordinal integer not null default 0, 1.7 - status version_status not null default 'Future' 1.8 + status version_status not null default 'Future', 1.9 + release date, 1.10 + eol date 1.11 ); 1.12 1.13 create unique index lpit_version_node_unique on lpit_version (project, node);
2.1 --- a/src/main/kotlin/de/uapcore/lightpit/RequestMapping.kt Wed Aug 18 12:47:32 2021 +0200 2.2 +++ b/src/main/kotlin/de/uapcore/lightpit/RequestMapping.kt Wed Aug 18 14:57:45 2021 +0200 2.3 @@ -33,6 +33,7 @@ 2.4 import javax.servlet.http.HttpServletResponse 2.5 import javax.servlet.http.HttpSession 2.6 import kotlin.math.min 2.7 +import java.sql.Date as SqlDate 2.8 2.9 typealias MappingMethod = (HttpRequest, DataAccessObject) -> Unit 2.10 typealias PathParameters = Map<String, String> 2.11 @@ -289,3 +290,18 @@ 2.12 } 2.13 } 2.14 2.15 +// <editor-fold desc="Validators"> 2.16 + 2.17 +fun dateOptValidator(input: String?): ValidationResult<SqlDate?> { 2.18 + return if (input.isNullOrBlank()) { 2.19 + ValidatedValue(null) 2.20 + } else { 2.21 + try { 2.22 + ValidatedValue(SqlDate.valueOf(input)) 2.23 + } catch (ignored: IllegalArgumentException) { 2.24 + ValidationError("validation.date.format") 2.25 + } 2.26 + } 2.27 +} 2.28 + 2.29 +// </editor-fold>
3.1 --- a/src/main/kotlin/de/uapcore/lightpit/dao/PostgresDataAccessObject.kt Wed Aug 18 12:47:32 2021 +0200 3.2 +++ b/src/main/kotlin/de/uapcore/lightpit/dao/PostgresDataAccessObject.kt Wed Aug 18 14:57:45 2021 +0200 3.3 @@ -129,17 +129,19 @@ 3.4 executeUpdate() 3.5 } 3.6 } 3.7 -//</editor-fold> 3.8 + //</editor-fold> 3.9 3.10 //<editor-fold desc="Version"> 3.11 //language=SQL 3.12 - private val versionQuery = "select versionid, project, name, node, ordinal, status from lpit_version" 3.13 + private val versionQuery = "select versionid, project, name, node, ordinal, status, release, eol from lpit_version" 3.14 3.15 private fun ResultSet.extractVersion() = 3.16 Version(getInt("versionid"), getInt("project")).apply { 3.17 name = getString("name") 3.18 node = getString("node") 3.19 ordinal = getInt("ordinal") 3.20 + release = getDate("release") 3.21 + eol = getDate("eol") 3.22 status = getEnum("status") 3.23 } 3.24 3.25 @@ -171,7 +173,7 @@ 3.26 from lpit_version v 3.27 left join issues using (versionid) 3.28 ) 3.29 - select v.versionid, project, name, node, ordinal, status, 3.30 + select v.versionid, project, name, node, ordinal, status, release, eol, 3.31 ro.total as resolved_open, ra.total as resolved_active, rd.total as resolved_done, 3.32 ao.total as affected_open, aa.total as affected_active, ad.total as affected_done 3.33 from lpit_version v 3.34 @@ -212,13 +214,15 @@ 3.35 } 3.36 3.37 override fun insertVersion(version: Version) { 3.38 - withStatement("insert into lpit_version (name, node, ordinal, status, project) values (?, ?, ?, ?::version_status, ?)") { 3.39 + withStatement("insert into lpit_version (name, node, ordinal, status, project, release, eol) values (?, ?, ?, ?::version_status, ?, ?, ?)") { 3.40 with(version) { 3.41 setStringSafe(1, name) 3.42 setStringSafe(2, node) 3.43 setInt(3, ordinal) 3.44 setEnum(4, status) 3.45 setInt(5, version.projectid) 3.46 + setDateOrNull(6, version.release) 3.47 + setDateOrNull(7, version.eol) 3.48 } 3.49 executeUpdate() 3.50 } 3.51 @@ -226,18 +230,20 @@ 3.52 } 3.53 3.54 override fun updateVersion(version: Version) { 3.55 - withStatement("update lpit_version set name = ?, node = ?, ordinal = ?, status = ?::version_status where versionid = ?") { 3.56 + withStatement("update lpit_version set name = ?, node = ?, ordinal = ?, status = ?::version_status, release=?,eol=? where versionid = ?") { 3.57 with(version) { 3.58 setStringSafe(1, name) 3.59 setStringSafe(2, node) 3.60 setInt(3, ordinal) 3.61 setEnum(4, status) 3.62 - setInt(5, id) 3.63 + setDateOrNull(5, version.release) 3.64 + setDateOrNull(6, version.eol) 3.65 + setInt(7, id) 3.66 } 3.67 executeUpdate() 3.68 } 3.69 } 3.70 -//</editor-fold> 3.71 + //</editor-fold> 3.72 3.73 //<editor-fold desc="Component"> 3.74 //language=SQL 3.75 @@ -347,9 +353,9 @@ 3.76 } 3.77 } 3.78 3.79 -//</editor-fold> 3.80 + //</editor-fold> 3.81 3.82 -//<editor-fold desc="Project"> 3.83 + //<editor-fold desc="Project"> 3.84 3.85 //language=SQL 3.86 private val projectQuery = 3.87 @@ -441,9 +447,9 @@ 3.88 } 3.89 } 3.90 3.91 -//</editor-fold> 3.92 + //</editor-fold> 3.93 3.94 -//<editor-fold desc="Issue"> 3.95 + //<editor-fold desc="Issue"> 3.96 3.97 //language=SQL 3.98 private val issueQuery = 3.99 @@ -485,19 +491,24 @@ 3.100 } 3.101 3.102 //language=SQL 3.103 - fun versionQuery(table: String) = 3.104 + val queryAffected = 3.105 """ 3.106 - select versionid, project, name, status, ordinal, node 3.107 - from lpit_version join $table using (versionid) 3.108 - where issueid = ? 3.109 - order by ordinal, name 3.110 + $versionQuery join lpit_issue_affected_version using (versionid) 3.111 + where issueid = ? order by ordinal, name 3.112 """.trimIndent() 3.113 3.114 - issue.affectedVersions = withStatement(versionQuery("lpit_issue_affected_version")) { 3.115 + //language=SQL 3.116 + val queryResolved = 3.117 + """ 3.118 + $versionQuery join lpit_issue_resolved_version using (versionid) 3.119 + where issueid = ? order by ordinal, name 3.120 + """.trimIndent() 3.121 + 3.122 + issue.affectedVersions = withStatement(queryAffected) { 3.123 setInt(1, issue.id) 3.124 queryAll { it.extractVersion() } 3.125 } 3.126 - issue.resolvedVersions = withStatement(versionQuery("lpit_issue_resolved_version")) { 3.127 + issue.resolvedVersions = withStatement(queryResolved) { 3.128 setInt(1, issue.id) 3.129 queryAll { it.extractVersion() } 3.130 } 3.131 @@ -640,9 +651,9 @@ 3.132 insertVersionInfo(issue.id, issue) 3.133 } 3.134 3.135 -//</editor-fold> 3.136 + //</editor-fold> 3.137 3.138 -//<editor-fold desc="IssueComment"> 3.139 + //<editor-fold desc="IssueComment"> 3.140 3.141 private fun ResultSet.extractIssueComment() = 3.142 IssueComment(getInt("commentid"), getInt("issueid")).apply { 3.143 @@ -693,5 +704,5 @@ 3.144 } 3.145 } 3.146 } 3.147 -//</editor-fold> 3.148 + //</editor-fold> 3.149 } 3.150 \ No newline at end of file
4.1 --- a/src/main/kotlin/de/uapcore/lightpit/entities/Version.kt Wed Aug 18 12:47:32 2021 +0200 4.2 +++ b/src/main/kotlin/de/uapcore/lightpit/entities/Version.kt Wed Aug 18 14:57:45 2021 +0200 4.3 @@ -26,12 +26,22 @@ 4.4 package de.uapcore.lightpit.entities 4.5 4.6 import de.uapcore.lightpit.types.VersionStatus 4.7 +import java.sql.Date 4.8 4.9 data class Version(override val id: Int, val projectid: Int) : Entity, HasNode, Comparable<Version> { 4.10 var name: String = "" 4.11 override var node = name 4.12 var ordinal = 0 4.13 var status = VersionStatus.Future 4.14 + var release: Date? = null 4.15 + var eol: Date? = null 4.16 + 4.17 + /** 4.18 + * If this version is deprecated, this gives the [eol] date, otherwise this gives the [release] date. 4.19 + * Note that a [release] date may be specified for the actual release in which case in should be 4.20 + * understood as the planned release date. 4.21 + */ 4.22 + val releaseOrEolDate: Date? get() = if (status.isEndOfLife) eol else release 4.23 4.24 override fun compareTo(other: Version): Int { 4.25 val ord = ordinal.compareTo(other.ordinal)
5.1 --- a/src/main/kotlin/de/uapcore/lightpit/servlet/ProjectServlet.kt Wed Aug 18 12:47:32 2021 +0200 5.2 +++ b/src/main/kotlin/de/uapcore/lightpit/servlet/ProjectServlet.kt Wed Aug 18 14:57:45 2021 +0200 5.3 @@ -28,6 +28,7 @@ 5.4 import de.uapcore.lightpit.AbstractServlet 5.5 import de.uapcore.lightpit.HttpRequest 5.6 import de.uapcore.lightpit.dao.DataAccessObject 5.7 +import de.uapcore.lightpit.dateOptValidator 5.8 import de.uapcore.lightpit.entities.* 5.9 import de.uapcore.lightpit.types.IssueCategory 5.10 import de.uapcore.lightpit.types.IssueStatus 5.11 @@ -329,12 +330,22 @@ 5.12 node = http.param("node") ?: "" 5.13 ordinal = http.param("ordinal")?.toIntOrNull() ?: 0 5.14 status = http.param("status")?.let(VersionStatus::valueOf) ?: VersionStatus.Future 5.15 + // TODO: process error messages 5.16 + eol = http.param("eol", ::dateOptValidator, null, mutableListOf()) 5.17 + release = http.param("release", ::dateOptValidator, null, mutableListOf()) 5.18 // intentional defaults 5.19 if (node.isBlank()) node = name 5.20 // sanitizing 5.21 node = sanitizeNode(node) 5.22 } 5.23 5.24 + // sanitize eol and release date 5.25 + if (version.status.isEndOfLife) { 5.26 + if (version.eol == null) version.eol = Date(System.currentTimeMillis()) 5.27 + } else if (version.status.isReleased) { 5.28 + if (version.release == null) version.release = Date(System.currentTimeMillis()) 5.29 + } 5.30 + 5.31 if (id < 0) { 5.32 dao.insertVersion(version) 5.33 } else { 5.34 @@ -548,7 +559,8 @@ 5.35 else -> dao.findUser(it) 5.36 } 5.37 } 5.38 - eta = http.param("eta")?.let { if (it.isBlank()) null else Date.valueOf(it) } 5.39 + // TODO: process error messages 5.40 + eta = http.param("eta", ::dateOptValidator, null, mutableListOf()) 5.41 5.42 affectedVersions = http.paramArray("affected") 5.43 .mapNotNull { param -> param.toIntOrNull()?.let { Version(it, project.id) } }
6.1 --- a/src/main/kotlin/de/uapcore/lightpit/types/VersionStatus.kt Wed Aug 18 12:47:32 2021 +0200 6.2 +++ b/src/main/kotlin/de/uapcore/lightpit/types/VersionStatus.kt Wed Aug 18 14:57:45 2021 +0200 6.3 @@ -29,4 +29,5 @@ 6.4 Future, Unreleased, Released, LTS, Deprecated; 6.5 6.6 val isReleased get() = this.ordinal >= Released.ordinal 6.7 + val isEndOfLife get() = this.ordinal >= Deprecated.ordinal 6.8 } 6.9 \ No newline at end of file
7.1 --- a/src/main/resources/localization/strings.properties Wed Aug 18 12:47:32 2021 +0200 7.2 +++ b/src/main/resources/localization/strings.properties Wed Aug 18 14:57:45 2021 +0200 7.3 @@ -130,10 +130,13 @@ 7.4 user.lastname=Last Name 7.5 user.mail=E-Mail 7.6 username=User Name 7.7 +validation.date.format=Illegal date format. 7.8 validation.username.null=Username is mandatory. 7.9 validation.username.unique=Username is already taken. 7.10 +version.eol=End of Life 7.11 version.latest=Latest Version 7.12 version.next=Next Version 7.13 +version.release=Release 7.14 version.status.Deprecated=Deprecated 7.15 version.status.Future=Future 7.16 version.status.LTS=LTS
8.1 --- a/src/main/resources/localization/strings_de.properties Wed Aug 18 12:47:32 2021 +0200 8.2 +++ b/src/main/resources/localization/strings_de.properties Wed Aug 18 14:57:45 2021 +0200 8.3 @@ -129,10 +129,13 @@ 8.4 user.lastname=Nachname 8.5 user.mail=E-Mail 8.6 username=Benutzername 8.7 +validation.date.format=Datumsformat wird nicht unterst\u00fctzt. 8.8 validation.username.null=Benutzername ist ein Pflichtfeld. 8.9 validation.username.unique=Der Benutzername wird bereits verwendet. 8.10 +version.eol=Supportende 8.11 version.latest=Neuste Version 8.12 version.next=N\u00e4chste Version 8.13 +version.release=Release 8.14 version.status.Deprecated=Veraltet 8.15 version.status.Future=Geplant 8.16 version.status.LTS=Langzeitsupport
9.1 --- a/src/main/webapp/WEB-INF/changelogs/changelog-de.jspf Wed Aug 18 12:47:32 2021 +0200 9.2 +++ b/src/main/webapp/WEB-INF/changelogs/changelog-de.jspf Wed Aug 18 14:57:45 2021 +0200 9.3 @@ -27,6 +27,7 @@ 9.4 <h3>Version 1.0 (Vorschau)</h3> 9.5 9.6 <ul> 9.7 + <li>Datum der Veröffentlichung und des Supportendes zu Versionen hinzugefügt.</li> 9.8 <li>Gesamtanzahl der Kommentare wird nun angezeigt.</li> 9.9 <li>Spalte für zugewiesener Entwickler zu den Vorgangstabellen hinzugefügt.</li> 9.10 <li>Installationsanweisungen hinzugefügt.</li>
10.1 --- a/src/main/webapp/WEB-INF/changelogs/changelog.jspf Wed Aug 18 12:47:32 2021 +0200 10.2 +++ b/src/main/webapp/WEB-INF/changelogs/changelog.jspf Wed Aug 18 14:57:45 2021 +0200 10.3 @@ -27,6 +27,7 @@ 10.4 <h3>Version 1.0 (snapshot)</h3> 10.5 10.6 <ul> 10.7 + <li>Adds release and end of life dates to versions.</li> 10.8 <li>Adds the total number of comments to the caption.</li> 10.9 <li>Adds assignee to the issue overview tables.</li> 10.10 <li>Adds install instructions.</li>
11.1 --- a/src/main/webapp/WEB-INF/jsp/project-details.jsp Wed Aug 18 12:47:32 2021 +0200 11.2 +++ b/src/main/webapp/WEB-INF/jsp/project-details.jsp Wed Aug 18 14:57:45 2021 +0200 11.3 @@ -69,6 +69,9 @@ 11.4 <c:set var="versionInfo" value="${viewmodel.versionInfo}"/> 11.5 <h2> 11.6 <fmt:message key="version" /> <c:out value="${versionInfo.version.name}" /> - <fmt:message key="version.status.${versionInfo.version.status}"/> 11.7 + <c:if test="${not empty versionInfo.version.releaseOrEolDate}"> 11.8 + (<fmt:formatDate type="date" value="${versionInfo.version.releaseOrEolDate}"/>) 11.9 + </c:if> 11.10 </h2> 11.11 11.12 <h3><fmt:message key="issues.resolved"/> </h3>
12.1 --- a/src/main/webapp/WEB-INF/jsp/site.jsp Wed Aug 18 12:47:32 2021 +0200 12.2 +++ b/src/main/webapp/WEB-INF/jsp/site.jsp Wed Aug 18 14:57:45 2021 +0200 12.3 @@ -31,7 +31,7 @@ 12.4 <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 12.5 12.6 <%-- Version suffix for forcing browsers to update the CSS / JS files --%> 12.7 -<c:set scope="page" var="versionSuffiuniversex" value="20210812"/> 12.8 +<c:set scope="page" var="versionSuffiuniversex" value="20210818"/> 12.9 12.10 <%-- Make the base href easily available at request scope --%> 12.11 <c:set scope="page" var="baseHref" value="${requestScope[Constants.REQ_ATTR_BASE_HREF]}"/>
13.1 --- a/src/main/webapp/WEB-INF/jsp/version-form.jsp Wed Aug 18 12:47:32 2021 +0200 13.2 +++ b/src/main/webapp/WEB-INF/jsp/version-form.jsp Wed Aug 18 14:57:45 2021 +0200 13.3 @@ -47,17 +47,17 @@ 13.4 </td> 13.5 </tr> 13.6 <tr> 13.7 - <th><fmt:message key="version"/></th> 13.8 - <td><input name="name" type="text" maxlength="20" required value="<c:out value="${version.name}"/>" /></td> 13.9 + <th><label for="version-name"><fmt:message key="version"/></label></th> 13.10 + <td><input id="version-name" name="name" type="text" maxlength="20" required value="<c:out value="${version.name}"/>" /></td> 13.11 </tr> 13.12 <tr title="<fmt:message key="node.tooltip"/>"> 13.13 - <th><fmt:message key="node"/></th> 13.14 - <td><input name="node" type="text" maxlength="20" value="<c:out value="${version.node}"/>" /></td> 13.15 + <th><label for="version-node"><fmt:message key="node"/></label></th> 13.16 + <td><input id="version-node" name="node" type="text" maxlength="20" value="<c:out value="${version.node}"/>" /></td> 13.17 </tr> 13.18 <tr> 13.19 - <th><fmt:message key="version.status"/></th> 13.20 + <th><label for="version-status"><fmt:message key="version.status"/></label></th> 13.21 <td> 13.22 - <select name="status" required> 13.23 + <select id="version-status" name="status" required> 13.24 <c:forEach var="elem" items="${viewmodel.versionStatus}"> 13.25 <option 13.26 <c:if test="${elem eq version.status}">selected</c:if> value="${elem}"><fmt:message 13.27 @@ -67,9 +67,21 @@ 13.28 </td> 13.29 </tr> 13.30 <tr title="<fmt:message key="ordinal.tooltip" />"> 13.31 - <th><fmt:message key="ordinal"/></th> 13.32 + <th><label for="version-ordinal"><fmt:message key="ordinal"/></label></th> 13.33 <td> 13.34 - <input name="ordinal" type="number" value="${version.ordinal}"/> 13.35 + <input id="version-ordinal" name="ordinal" type="number" value="${version.ordinal}"/> 13.36 + </td> 13.37 + </tr> 13.38 + <tr> 13.39 + <th><label for="version-release"><fmt:message key="version.release"/></label></th> 13.40 + <td> 13.41 + <input id="version-release" name="release" type="date" value="<fmt:formatDate value="${version.release}" pattern="YYYY-MM-dd" />"/> 13.42 + </td> 13.43 + </tr> 13.44 + <tr> 13.45 + <th><label for="version-eol"><fmt:message key="version.eol"/></label></th> 13.46 + <td> 13.47 + <input id="version-eol" name="eol" type="date" value="<fmt:formatDate value="${version.eol}" pattern="YYYY-MM-dd" />"/> 13.48 </td> 13.49 </tr> 13.50 </tbody>
14.1 --- a/src/main/webapp/WEB-INF/jsp/versions.jsp Wed Aug 18 12:47:32 2021 +0200 14.2 +++ b/src/main/webapp/WEB-INF/jsp/versions.jsp Wed Aug 18 14:57:45 2021 +0200 14.3 @@ -28,31 +28,31 @@ 14.4 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 14.5 <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 14.6 14.7 -<jsp:useBean id="viewmodel" type="de.uapcore.lightpit.viewmodel.VersionsView" scope="request" /> 14.8 +<jsp:useBean id="viewmodel" type="de.uapcore.lightpit.viewmodel.VersionsView" scope="request"/> 14.9 14.10 <c:set var="project" scope="page" value="${viewmodel.projectInfo.project}"/> 14.11 -<%@include file="../jspf/project-header.jspf"%> 14.12 +<%@include file="../jspf/project-header.jspf" %> 14.13 14.14 <div id="tool-area"> 14.15 <a href="./projects/${project.node}/versions/-/create" class="button"><fmt:message key="button.version.create"/></a> 14.16 <a href="./projects/${project.node}/issues/-/-/-/create" class="button"><fmt:message key="button.issue.create"/></a> 14.17 </div> 14.18 14.19 -<h2><fmt:message key="progress" /></h2> 14.20 +<h2><fmt:message key="progress"/></h2> 14.21 14.22 -<c:set var="summary" value="${viewmodel.projectInfo.issueSummary}" /> 14.23 -<%@include file="../jspf/issue-summary.jspf"%> 14.24 +<c:set var="summary" value="${viewmodel.projectInfo.issueSummary}"/> 14.25 +<%@include file="../jspf/issue-summary.jspf" %> 14.26 14.27 <table id="version-list" class="datatable medskip fullwidth"> 14.28 <colgroup> 14.29 <col> 14.30 - <col width="28%"> 14.31 - <col width="12%"> 14.32 - <col width="12%"> 14.33 - <col width="12%"> 14.34 - <col width="12%"> 14.35 - <col width="12%"> 14.36 - <col width="12%"> 14.37 + <col style="width: 28%"> 14.38 + <col style="width: 12%"> 14.39 + <col style="width: 12%"> 14.40 + <col style="width: 12%"> 14.41 + <col style="width: 12%"> 14.42 + <col style="width: 12%"> 14.43 + <col style="width: 12%"> 14.44 </colgroup> 14.45 <thead> 14.46 <tr> 14.47 @@ -67,23 +67,28 @@ 14.48 <tr> 14.49 <th></th> 14.50 <th><fmt:message key="version"/></th> 14.51 - <th class="hcenter"><fmt:message key="issues.open" /></th> 14.52 - <th class="hcenter"><fmt:message key="issues.active" /></th> 14.53 - <th class="hcenter"><fmt:message key="issues.done" /></th> 14.54 - <th class="hcenter"><fmt:message key="issues.open" /></th> 14.55 - <th class="hcenter"><fmt:message key="issues.active" /></th> 14.56 - <th class="hcenter"><fmt:message key="issues.done" /></th> 14.57 + <th class="hcenter"><fmt:message key="issues.open"/></th> 14.58 + <th class="hcenter"><fmt:message key="issues.active"/></th> 14.59 + <th class="hcenter"><fmt:message key="issues.done"/></th> 14.60 + <th class="hcenter"><fmt:message key="issues.open"/></th> 14.61 + <th class="hcenter"><fmt:message key="issues.active"/></th> 14.62 + <th class="hcenter"><fmt:message key="issues.done"/></th> 14.63 </tr> 14.64 </thead> 14.65 <tbody> 14.66 - <c:forEach var="versionInfo" items="${viewmodel.versionInfos}" > 14.67 + <c:forEach var="versionInfo" items="${viewmodel.versionInfos}"> 14.68 <tr> 14.69 - <td rowspan="2" style="width: 2em;"><a href="./projects/${project.node}/versions/${versionInfo.version.node}/edit">✎</a></td> 14.70 + <td rowspan="2" style="width: 2em;"><a 14.71 + href="./projects/${project.node}/versions/${versionInfo.version.node}/edit">✎</a></td> 14.72 <td rowspan="2"> 14.73 <a href="./projects/${project.node}/issues/${versionInfo.version.node}/-/"> 14.74 <c:out value="${versionInfo.version.name}"/> 14.75 </a> 14.76 - <div class="version-tag version-${versionInfo.version.status}"> 14.77 + <div class="version-tag version-${versionInfo.version.status}" 14.78 + <c:if test="${not empty versionInfo.version.releaseOrEolDate}"> 14.79 + title="<fmt:formatDate type="date" value="${versionInfo.version.releaseOrEolDate}"/>" 14.80 + </c:if> 14.81 + > 14.82 <fmt:message key="version.status.${versionInfo.version.status}"/> 14.83 </div> 14.84 </td> 14.85 @@ -104,6 +109,6 @@ 14.86 <%@include file="../jspf/issue-progress.jspf" %> 14.87 </td> 14.88 </tr> 14.89 - </c:forEach> 14.90 + </c:forEach> 14.91 </tbody> 14.92 </table> 14.93 \ No newline at end of file
15.1 --- a/src/main/webapp/lightpit.css Wed Aug 18 12:47:32 2021 +0200 15.2 +++ b/src/main/webapp/lightpit.css Wed Aug 18 14:57:45 2021 +0200 15.3 @@ -242,10 +242,6 @@ 15.4 box-sizing: border-box; 15.5 } 15.6 15.7 -table.formtable input[type=date] { 15.8 - width: auto; 15.9 -} 15.10 - 15.11 table.formtable tfoot td { 15.12 text-align: right; 15.13 }
16.1 --- a/src/main/webapp/projects.css Wed Aug 18 12:47:32 2021 +0200 16.2 +++ b/src/main/webapp/projects.css Wed Aug 18 14:57:45 2021 +0200 16.3 @@ -189,3 +189,7 @@ 16.4 table.issue-view th { 16.5 white-space: nowrap; 16.6 } 16.7 + 16.8 +#issue-eta { 16.9 + width: auto; 16.10 +}