#159 adds release and eol dates

Wed, 18 Aug 2021 14:57:45 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 18 Aug 2021 14:57:45 +0200
changeset 225
87328572e36f
parent 224
da975b1f188d
child 226
c8e1b5282f69

#159 adds release and eol dates

setup/postgres/psql_create_tables.sql file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/RequestMapping.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/dao/PostgresDataAccessObject.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/entities/Version.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/servlet/ProjectServlet.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/types/VersionStatus.kt file | annotate | diff | comparison | revisions
src/main/resources/localization/strings.properties file | annotate | diff | comparison | revisions
src/main/resources/localization/strings_de.properties file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/changelogs/changelog-de.jspf file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/changelogs/changelog.jspf file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/project-details.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/site.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/version-form.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/versions.jsp file | annotate | diff | comparison | revisions
src/main/webapp/lightpit.css file | annotate | diff | comparison | revisions
src/main/webapp/projects.css file | annotate | diff | comparison | revisions
     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">&#x270e;</a></td>
   14.70 +            <td rowspan="2" style="width: 2em;"><a
   14.71 +                    href="./projects/${project.node}/versions/${versionInfo.version.node}/edit">&#x270e;</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 +}

mercurial