com.przemo.projectmanagementweb.pages.TaskPage.java Source code

Java tutorial

Introduction

Here is the source code for com.przemo.projectmanagementweb.pages.TaskPage.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.przemo.projectmanagementweb.pages;

import com.przemo.projectmanagementweb.controls.CommentsItemControl;
import com.przemo.projectmanagementweb.controls.TimeLogViewControl;
import com.przemo.projectmanagementweb.domain.Projects;
import com.przemo.projectmanagementweb.domain.Sprint;
import com.przemo.projectmanagementweb.domain.Status;
import com.przemo.projectmanagementweb.domain.Task;
import com.przemo.projectmanagementweb.domain.TaskComments;
import com.przemo.projectmanagementweb.domain.TaskType;
import com.przemo.projectmanagementweb.domain.TimeLog;
import com.przemo.projectmanagementweb.services.CommentsService;
import com.przemo.projectmanagementweb.services.ProjectService;
import com.przemo.projectmanagementweb.services.SprintService;
import com.przemo.projectmanagementweb.services.TaskService;
import com.przemo.projectmanagementweb.services.TimeLogService;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.visit.IVisit;

/**
 *
 * @author Przemo
 */
public class TaskPage extends PMPage {

    @SpringBean
    private TaskService taskService;

    @SpringBean
    private CommentsService commentsService;

    @SpringBean
    private SprintService sprintService;

    @SpringBean
    private ProjectService projectsService;

    @SpringBean
    private TimeLogService timeLogService;

    public TaskPage(IModel<Task> model) {
        super(model);

        Duration timeLogged = timeLogService.getTimeLoggedForTask(model.getObject().getId());
        long minutes = timeLogged.toMinutes() - timeLogged.toHours() * 60;
        Form form = new Form("form") {
            @Override
            protected void onSubmit() {
                if (taskService.saveTask(model.getObject()) == 0) {
                    success("Task saved.");
                } else {
                    error("Task could not be saved.");
                }
            }
        };
        form.add(new TextField("title"));
        form.add(new TextArea("description"));
        form.add(new TextField("estimatedTime"));
        form.add(new Label("summaryTime", Model.of(timeLogged.toHours() + " hours, " + minutes + " minutes.")));
        form.add(new TextField("users.email"));
        form.add(new DropDownChoice("taskType", taskService.getTaskTypes(), new ChoiceRenderer<TaskType>() {
            @Override
            public Object getDisplayValue(TaskType object) {
                return object.getName();
            }

            @Override
            public String getIdValue(TaskType object, int index) {
                return String.valueOf(object.getId());
            }

        }).setEnabled(!ticketIsClosed(model.getObject())));

        List<Sprint> sprintOptions = new ArrayList<>();
        sprintOptions.add(null);
        sprintOptions.addAll(sprintService.retrieveAllSprints());
        form.add(new DropDownChoice<>("sprint", sprintOptions, new ChoiceRenderer<Sprint>() {
            @Override
            public Object getDisplayValue(Sprint object) {
                if (object == null) {
                    return "No Sprint";
                }
                return object.getName();
            }

            @Override
            public String getIdValue(Sprint object, int index) {
                if (object != null) {
                    return String.valueOf(object.getId());
                } else {
                    return "";
                }
            }
        }).setEnabled(!ticketIsClosed(model.getObject())));
        form.add(new DropDownChoice("status", taskService.getAvailableStatuses(), new ChoiceRenderer<Status>() {
            @Override
            public Object getDisplayValue(Status object) {
                return object.getName();
            }

            @Override
            public String getIdValue(Status object, int index) {
                return String.valueOf(object.getId());
            }
        }));
        form.add(new DropDownChoice("projects", projectsService.getAllProjects(), new ChoiceRenderer<Projects>() {
            @Override
            public Object getDisplayValue(Projects object) {
                return object.getName();
            }

            @Override
            public String getIdValue(Projects object, int index) {
                return String.valueOf(object.getId());
            }
        }).setEnabled(!ticketIsClosed(model.getObject())));

        RepeatingView view = new RepeatingView("taskCommentses");
        commentsService.getCommentsForTask(model.getObject().getId()).stream().forEach((tc) -> {
            view.add(new CommentsItemControl(view.newChildId(), new CompoundPropertyModel<>(tc)));
        });
        add(view);

        RepeatingView timeView = new RepeatingView("timelog_entry");
        timeLogService.getTimeLogs(model.getObject().getId()).stream().forEach((tl -> timeView
                .add(new TimeLogViewControl(timeView.newChildId(), new CompoundPropertyModel<>(tl)))));
        add(timeView);

        add(new Link("newentrylink") {
            @Override
            public void onClick() {
                setResponsePage(new TimeLogEntryPage(new CompoundPropertyModel<>(new TimeLog()),
                        model.getObject().getId()));
            }

        });

        add(new Link("newcommentslink") {
            @Override
            public void onClick() {
                TaskComments tc = new TaskComments();
                tc.setTask(model.getObject().getId());
                tc.setUsers(getCurrentUser());
                tc.setDate(new Date());
                setResponsePage(new CommentEditPage(new CompoundPropertyModel<>(tc)));
            }
        });

        add(form);
        add(new Label("id",
                Model.of(model.getObject().getId() > 0 ? "Task No. " + model.getObject().getId() : "")));
        //Form should be disabled if closed
        if (ticketIsClosed(model.getObject())) {
            disableTaskForm(form, model);
        }
    }

    private boolean ticketIsClosed(Task t) {
        return t.getStatus() != null && t.getStatus().getName().equals("Closed");
    }

    private void disableTaskForm(Form form, IModel<Task> model) {
        form.visitFormComponents((Object t, IVisit ivisit) -> {
            if (t instanceof TextField || t instanceof TextArea) {
                ((Component) t).setEnabled(false);
            }
        });
    }

    @Override
    protected Class getCurrentMenuClass() {
        return TasksPage.class;
    }

}