# HG changeset patch # User Mike Becker # Date 1603452573 -7200 # Node ID b0e83cab0bde1ce802b360db44a1dc19985ed658 # Parent 6d2d69fd1c12bfcd536d5ca09c8acedeb2666cdf adds issue detail view - fixes #24 diff -r 6d2d69fd1c12 -r b0e83cab0bde src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Fri Oct 23 12:38:20 2020 +0200 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Fri Oct 23 13:29:33 2020 +0200 @@ -422,16 +422,39 @@ private void configureIssueEditor(IssueEditView viewModel, Issue issue, DataAccessObjects dao) throws SQLException { final var project = viewModel.getProjectInfo().getProject(); - issue.setProject(project); + issue.setProject(project); // automatically set current project for new issues viewModel.setIssue(issue); viewModel.configureVersionSelectors(viewModel.getProjectInfo().getVersions()); viewModel.setUsers(dao.getUserDao().list()); viewModel.setComponents(dao.getComponentDao().list(project)); - if (issue.getId() >= 0) { - viewModel.setComments(dao.getIssueDao().listComments(issue)); - } } + @RequestMapping(requestPath = "$project/issues/$issue/view", method = HttpMethod.GET) + public ResponseType viewIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { + final var viewModel = new IssueDetailView(); + populate(viewModel, pathParameters, dao); + + final var projectInfo = viewModel.getProjectInfo(); + if (projectInfo == null) { + resp.sendError(HttpServletResponse.SC_NOT_FOUND); + return ResponseType.NONE; + } + + final var issueDao = dao.getIssueDao(); + final var issue = issueDao.find(Functions.parseIntOrZero(pathParameters.get("issue"))); + if (issue == null) { + resp.sendError(HttpServletResponse.SC_NOT_FOUND); + return ResponseType.NONE; + } + + issueDao.joinVersionInformation(issue); + viewModel.setIssue(issue); + viewModel.setComments(issueDao.listComments(issue)); + + return forwardView(req, viewModel, "issue-view"); + } + + // TODO: why should the issue editor be child of $project? @RequestMapping(requestPath = "$project/issues/$issue/edit", method = HttpMethod.GET) public ResponseType editIssue(HttpServletRequest req, HttpServletResponse resp, PathParameters pathParameters, DataAccessObjects dao) throws IOException, SQLException { final var viewModel = new IssueEditView(); @@ -522,8 +545,8 @@ dao.getIssueDao().saveOrUpdate(issue, issue.getProject()); - // TODO: fix issue #14 - setRedirectLocation(req, "./projects/" + issue.getProject().getNode() + "/all-components/all-versions/issues/"); + // TODO: fix redirect location + setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); return ResponseType.HTML; @@ -561,8 +584,8 @@ dao.getIssueDao().saveComment(issueComment); - // TODO: fix redirect location (e.g. after fixing #24) - setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/edit"); + // TODO: fix redirect location + setRedirectLocation(req, "./projects/" + issue.getProject().getNode()+"/issues/"+issue.getId()+"/view"); setContentPage(req, Constants.JSP_COMMIT_SUCCESSFUL); return ResponseType.HTML; diff -r 6d2d69fd1c12 -r b0e83cab0bde src/main/java/de/uapcore/lightpit/viewmodel/IssueDetailView.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/uapcore/lightpit/viewmodel/IssueDetailView.java Fri Oct 23 13:29:33 2020 +0200 @@ -0,0 +1,28 @@ +package de.uapcore.lightpit.viewmodel; + +import de.uapcore.lightpit.entities.Issue; +import de.uapcore.lightpit.entities.IssueComment; + +import java.util.List; + +public class IssueDetailView extends ProjectView { + private Issue issue; + + private List comments; + + public void setIssue(Issue issue) { + this.issue = issue; + } + + public Issue getIssue() { + return issue; + } + + public List getComments() { + return comments; + } + + public void setComments(List comments) { + this.comments = comments; + } +} diff -r 6d2d69fd1c12 -r b0e83cab0bde src/main/java/de/uapcore/lightpit/viewmodel/IssueEditView.java --- a/src/main/java/de/uapcore/lightpit/viewmodel/IssueEditView.java Fri Oct 23 12:38:20 2020 +0200 +++ b/src/main/java/de/uapcore/lightpit/viewmodel/IssueEditView.java Fri Oct 23 13:29:33 2020 +0200 @@ -4,23 +4,12 @@ import java.util.*; -public class IssueEditView extends ProjectView { - private Issue issue; - +public class IssueEditView extends IssueDetailView { private List projects = Collections.emptyList(); private Set versionsUpcoming = new HashSet<>(); private Set versionsRecent = new HashSet<>(); private List users; private List components; - private List comments; - - public void setIssue(Issue issue) { - this.issue = issue; - } - - public Issue getIssue() { - return issue; - } public List getProjects() { return projects; @@ -42,8 +31,8 @@ versionsRecent.clear(); versionsUpcoming.clear(); // keep the current selection, if any - versionsRecent.addAll(issue.getAffectedVersions()); - versionsUpcoming.addAll(issue.getResolvedVersions()); + versionsRecent.addAll(getIssue().getAffectedVersions()); + versionsUpcoming.addAll(getIssue().getResolvedVersions()); for (var v : versions) { if (v.getStatus().isReleased()) { if (!v.getStatus().equals(VersionStatus.Deprecated)) @@ -77,12 +66,4 @@ public IssueCategory[] getIssueCategory() { return IssueCategory.values(); } - - public List getComments() { - return comments; - } - - public void setComments(List comments) { - this.comments = comments; - } } diff -r 6d2d69fd1c12 -r b0e83cab0bde src/main/resources/localization/projects.properties --- a/src/main/resources/localization/projects.properties Fri Oct 23 12:38:20 2020 +0200 +++ b/src/main/resources/localization/projects.properties Fri Oct 23 13:29:33 2020 +0200 @@ -29,6 +29,7 @@ button.version.create=New Version button.version.edit=Edit Version button.issue.create=New Issue +button.issue.edit=Edit Issue button.issue.all=All Issues button.comment=Comment diff -r 6d2d69fd1c12 -r b0e83cab0bde src/main/resources/localization/projects_de.properties --- a/src/main/resources/localization/projects_de.properties Fri Oct 23 12:38:20 2020 +0200 +++ b/src/main/resources/localization/projects_de.properties Fri Oct 23 13:29:33 2020 +0200 @@ -29,6 +29,7 @@ button.version.create=Neue Version button.version.edit=Version Bearbeiten button.issue.create=Neuer Vorgang +button.issue.edit=Vorgang Bearbeiten button.issue.all=Alle Vorg\u00e4nge button.comment=Kommentieren diff -r 6d2d69fd1c12 -r b0e83cab0bde src/main/webapp/WEB-INF/jsp/issue-form.jsp --- a/src/main/webapp/WEB-INF/jsp/issue-form.jsp Fri Oct 23 12:38:20 2020 +0200 +++ b/src/main/webapp/WEB-INF/jsp/issue-form.jsp Fri Oct 23 13:29:33 2020 +0200 @@ -169,56 +169,20 @@ - <%-- TODO: fix #14 --%> - + + + + + <%-- TODO: fix #14 --%> + + + + -
-

- -
- - - - - - - - - - - -
- - -
-
- -
-
- - - - - - -
-
- - - - -
-
- -
-
-
-
- diff -r 6d2d69fd1c12 -r b0e83cab0bde src/main/webapp/WEB-INF/jsp/issue-view.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/webapp/WEB-INF/jsp/issue-view.jsp Fri Oct 23 13:29:33 2020 +0200 @@ -0,0 +1,186 @@ +<%-- +DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + +Copyright 2018 Mike Becker. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--%> +<%@page pageEncoding="UTF-8" %> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
${issue.id}
+ +
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+ + + + + + +
+ + + +
+ + + +
+ <%-- TODO: fix #14 --%> + + + + + + +
+ +
+

+ +
+ + + + + + + + + + + +
+ + +
+
+ +
+
+ + + + + + +
+
+ + + + +
+
+ +
+
+
+
+ diff -r 6d2d69fd1c12 -r b0e83cab0bde src/main/webapp/WEB-INF/jspf/issue-list.jspf --- a/src/main/webapp/WEB-INF/jspf/issue-list.jspf Fri Oct 23 12:38:20 2020 +0200 +++ b/src/main/webapp/WEB-INF/jspf/issue-list.jspf Fri Oct 23 13:29:33 2020 +0200 @@ -17,7 +17,7 @@ - + #${issue.id} -  diff -r 6d2d69fd1c12 -r b0e83cab0bde src/main/webapp/lightpit.css --- a/src/main/webapp/lightpit.css Fri Oct 23 12:38:20 2020 +0200 +++ b/src/main/webapp/lightpit.css Fri Oct 23 13:29:33 2020 +0200 @@ -145,12 +145,12 @@ background: #f0f0ff; } -button[type=submit] { +button[type=submit], a.button.submit { background: #20a0ff; color: white; } -button[type=submit]:hover { +button[type=submit]:hover, a.button.submit:hover { background: #1090cf; }