diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 4b16f597..6f1b2757 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -9,4 +9,4 @@ community_bridge: # Replace with a single Community Bridge project-name e.g., cl liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] +custom: ["https://www.paypal.me/ThomasWoehlke"] diff --git a/etc/requirements/Requirements.md b/etc/requirements/Requirements.md index e2b6ef15..3b0f73ce 100644 --- a/etc/requirements/Requirements.md +++ b/etc/requirements/Requirements.md @@ -12,9 +12,23 @@ ## F006 Page after first successful Login -## F007 Add first new Task +## F007 Add first new Task from Inbox ## F008 Add first new Project +## F009 Add another new Task from Inbox +INBOX -> add new task -> Form -> save -> INBOX ( -> OK ) +-> add new task -> Form -> save -> Project (-> NOK ) + +BUG: after saving to db app should show Inbox, but shows ProjectView for RootProject + +URLpaths: +http://localhost:5000/taskstate/inbox +http://localhost:5000/task/addtoproject/0 +http://localhost:5000/project/0/?listTaskTime=MIN5&listTaskTime=MIN10&listTaskTime=MIN15&listTaskTime=MIN30&listTaskTime=MIN45&listTaskTime=HOUR1&listTaskTime=HOUR2&listTaskTime=HOUR3&listTaskTime=HOUR4&listTaskTime=HOUR6&listTaskTime=HOUR8&listTaskTime=MORE&listTaskTime=NONE&numberOfNewIncomingMessages=0&listTaskEnergy=LOW&listTaskEnergy=MEDIUM&listTaskEnergy=HIGH&listTaskEnergy=NONE&context=Work&refreshMessages=false + + + + diff --git a/etc/set_java13.cmd b/etc/set_java13.cmd new file mode 100644 index 00000000..7e846f70 --- /dev/null +++ b/etc/set_java13.cmd @@ -0,0 +1,2 @@ +subst /D J: +subst J: "C:\Program Files\Java\jdk-13.0.2" \ No newline at end of file diff --git a/etc/set_java1_8.cmd b/etc/set_java1_8.cmd new file mode 100644 index 00000000..cdbd3c7b --- /dev/null +++ b/etc/set_java1_8.cmd @@ -0,0 +1,2 @@ +subst /D J: +subst J: "C:\Program Files\Java\jdk1.8.0_241" \ No newline at end of file diff --git a/etc/uml/SimpleWorklist.mdzip b/etc/uml/SimpleWorklist.mdzip index c44bb044..fded3e75 100644 Binary files a/etc/uml/SimpleWorklist.mdzip and b/etc/uml/SimpleWorklist.mdzip differ diff --git a/etc/uml/SimpleWorklist.mdzip.bak b/etc/uml/SimpleWorklist.mdzip.bak new file mode 100644 index 00000000..828e6914 Binary files /dev/null and b/etc/uml/SimpleWorklist.mdzip.bak differ diff --git a/pom.xml b/pom.xml index f6510186..280cc0dd 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.woehlke simpleworklist - 2.3.12-SNAPSHOT + 2.3.14-SNAPSHOT jar org.springframework.boot diff --git a/run.sh b/run.sh index bd8cafd3..3c51c9c3 100755 --- a/run.sh +++ b/run.sh @@ -28,9 +28,9 @@ function runHerokuLocal() { function main() { runGithubTestBuild - #runDev #setupHeroku runHerokuLocal + #runDev } main diff --git a/src/main/java/org/woehlke/simpleworklist/common/AbstractController.java b/src/main/java/org/woehlke/simpleworklist/common/AbstractController.java index fc1382fa..0cee5874 100644 --- a/src/main/java/org/woehlke/simpleworklist/common/AbstractController.java +++ b/src/main/java/org/woehlke/simpleworklist/common/AbstractController.java @@ -8,6 +8,7 @@ import org.woehlke.simpleworklist.config.ApplicationProperties; import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.project.Project; +import org.woehlke.simpleworklist.task.TaskService; import org.woehlke.simpleworklist.user.account.UserAccount; import org.woehlke.simpleworklist.task.TaskEnergy; import org.woehlke.simpleworklist.task.TaskTime; @@ -36,6 +37,9 @@ public abstract class AbstractController { @Autowired protected ProjectService projectService; + @Autowired + protected TaskService taskService; + @Autowired protected UserAccountService userAccountService; diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectController.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectController.java index ff482530..c0a16e04 100644 --- a/src/main/java/org/woehlke/simpleworklist/project/ProjectController.java +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectController.java @@ -10,13 +10,11 @@ import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.*; import org.woehlke.simpleworklist.common.AbstractController; -import org.woehlke.simpleworklist.taskstate.TaskMoveService; import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.task.Task; import org.woehlke.simpleworklist.user.account.UserAccount; import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; import org.woehlke.simpleworklist.user.UserSessionBean; -import org.woehlke.simpleworklist.task.TaskService; import org.springframework.beans.factory.annotation.Autowired; import javax.validation.Valid; @@ -31,40 +29,11 @@ @RequestMapping(path = "/project") public class ProjectController extends AbstractController { - private final TaskService taskService; - private final TaskMoveService taskMoveService; - private final ProjectService projectService; - - private static final long rootProjectId = 0L; + private final ProjectControllerService projectControllerService; @Autowired - public ProjectController(TaskService taskService, TaskMoveService taskMoveService, ProjectService projectService) { - this.taskService = taskService; - this.taskMoveService = taskMoveService; - this.projectService = projectService; - } - - @RequestMapping(path = "/root", method = RequestMethod.GET) - public final String showRootProject( - @PageableDefault(sort = "orderIdProject") Pageable pageable, - @RequestParam(required = false) String message, - @RequestParam(required = false) boolean isDeleted, - @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, Model model) { - log.info("/project/root"); - Context context = super.getContext(userSession); - userSession.setLastProjectId(0L); - model.addAttribute("userSession",userSession); - Page taskPage = taskService.findByRootProject(context,pageable); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowRootProject(locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("taskPage", taskPage); - if(message != null){ - model.addAttribute("message",message); - model.addAttribute("isDeleted",isDeleted); - model.addAttribute("myTaskState","PROJECT"); - } - return "project/root"; + public ProjectController(ProjectControllerService projectControllerService) { + this.projectControllerService = projectControllerService; } @RequestMapping(path = "/{projectId}", method = RequestMethod.GET) @@ -102,29 +71,6 @@ public final String showProject( return "project/show"; } - @RequestMapping(path = "/add/new/project", method = RequestMethod.GET) - public final String addNewTopLevelProjectForm( - @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, Model model - ){ - log.info("/project/add/new/project (GET)"); - addNewProject(rootProjectId, userSession, locale, model); - return "project/addToplevel"; - } - - - @RequestMapping(path = "/add/new/project", method = {RequestMethod.POST, RequestMethod.PUT}) - public final String addNewTopLevelProjectSave( - @Valid Project project, - @ModelAttribute("userSession") UserSessionBean userSession, - BindingResult result, - Locale locale, Model model - ){ - log.info("/project/add/new/project (POST)"); - return addNewProjectPersist( rootProjectId, userSession, project, - result, locale, model, "project/addToplevel"); - } - @RequestMapping(path = "/{projectId}/add/new/project", method = RequestMethod.GET) public final String addNewSubProjectGet( @PathVariable long projectId, @@ -132,7 +78,8 @@ public final String addNewSubProjectGet( Locale locale, Model model ) { log.info("private addNewProjectGet (GET) projectId="+projectId); - addNewProject(projectId, userSession, locale, model); + Context context = super.getContext(userSession); + projectControllerService.addNewProject(projectId, userSession, context, locale, model); return "project/add"; } @@ -144,7 +91,8 @@ public final String addNewSubProjectPost( BindingResult result, Locale locale, Model model) { log.info("private addNewProjectPost (POST) projectId="+projectId+" "+project.toString()); - return addNewProjectPersist( projectId, userSession, project, + Context context = super.getContext(userSession); + return projectControllerService.addNewProjectPersist( projectId, userSession, project, context, result, locale, model ,"project/add"); } @@ -268,118 +216,4 @@ public final String deleteProject( return "redirect:/project/" + newProjectId; } - - private final void addNewProject( - long projectId, - UserSessionBean userSession, - Locale locale, - Model model - ) { - log.info("private addNewProject projectId="+projectId); - Context context = super.getContext(userSession); - UserAccount userAccount = context.getUserAccount(); - userSession.setLastProjectId(projectId); - model.addAttribute("userSession",userSession); - Project thisProject = null; - Project project = null; - if (projectId == 0) { - thisProject = new Project(); - thisProject.setId(0L); - project = Project.newRootProjectFactory(userAccount); - if(userSession.getContextId() == 0L){ - model.addAttribute("mustChooseArea", true); - project.setContext(userAccount.getDefaultContext()); - } else { - project.setContext(context); - } - } else { - thisProject = projectService.findByProjectId(projectId); - project = Project.newProjectFactory(thisProject); - } - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("thisProject", thisProject); - model.addAttribute("project", project); - } - - private String addNewProjectPersist( - long projectId, - UserSessionBean userSession, - Project project, - BindingResult result, - Locale locale, Model model, - String template - ){ - log.info("private addNewProjectPersist projectId="+projectId+" "+project.toString()); - Context context = super.getContext(userSession); - UserAccount userAccount = context.getUserAccount(); - userSession.setLastProjectId(projectId); - model.addAttribute("userSession",userSession); - if(result.hasErrors()){ - Project thisProject = null; - if (projectId == 0) { - thisProject = new Project(); - thisProject.setId(0L); - } else { - thisProject = projectService.findByProjectId(projectId); - } - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("thisProject", thisProject); - model.addAttribute("project", project); - return template; - } else { - if (projectId == 0) { - if(userSession.getContextId()>0) { - project.setContext(context); - } - project = projectService.saveAndFlush(project); - projectId = project.getId(); - } else { - Project thisProject = projectService.findByProjectId(projectId); - List children = thisProject.getChildren(); - children.add(project); - thisProject.setChildren(children); - project.setParent(thisProject); - project = projectService.saveAndFlush(project); - projectId = project.getId(); - log.info("project: "+ project.toString()); - log.info("thisProject: "+ thisProject.toString()); - } - return "redirect:/project/" + projectId; - } - } - - @RequestMapping(path = "/task/{sourceTaskId}/changeorderto/{destinationTaskId}", method = RequestMethod.GET) - public String changeTaskOrderIdWithinAProject( - @PathVariable("sourceTaskId") Task sourceTask, - @PathVariable("destinationTaskId") Task destinationTask, - @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, Model model - ){ - Context context = super.getContext(userSession); - if(!sourceTask.isInRootProject()){ - userSession.setLastProjectId(sourceTask.getProject().getId()); - } - model.addAttribute("userSession",userSession); - log.info("-------------------------------------------------"); - log.info(" changeTaskOrderIdWithinAProject"); - log.info("-------------------------------------------------"); - log.info(" source Task: "+sourceTask.toString()); - log.info("-------------------------------------------------"); - log.info(" destination Task: "+destinationTask.toString()); - log.info("-------------------------------------------------"); - String returnUrl = "redirect:/taskstate/inbox"; - boolean rootProject = sourceTask.isInRootProject(); - returnUrl = "redirect:/project/0"; - if(rootProject){ - taskMoveService.moveOrderIdRootProject(sourceTask, destinationTask); - } else { - taskMoveService.moveOrderIdProject(sourceTask, destinationTask); - log.info(" DONE: taskMoveService.moveOrderIdProject (2)"); - returnUrl = "redirect:/project/" + sourceTask.getProject().getId(); - } - log.info("-------------------------------------------------"); - return returnUrl; - } } diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerService.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerService.java new file mode 100644 index 00000000..37da8c39 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerService.java @@ -0,0 +1,37 @@ +package org.woehlke.simpleworklist.project; + +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.woehlke.simpleworklist.context.Context; +import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.user.account.UserAccount; + +import java.util.Locale; + +public interface ProjectControllerService { + + void addNewProject( + long projectId, + UserSessionBean userSession, + Context context, + Locale locale, + Model model + ); + + String addNewProjectPersist( + long projectId, + UserSessionBean userSession, + Project project, + Context context, + BindingResult result, + Locale locale, + Model model, + String template + ); + + Project getProject( + long projectId, + UserAccount userAccount, + UserSessionBean userSession + ); +} diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerServiceImpl.java new file mode 100644 index 00000000..292c5409 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerServiceImpl.java @@ -0,0 +1,131 @@ +package org.woehlke.simpleworklist.project; + +import lombok.experimental.Delegate; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; +import org.woehlke.simpleworklist.breadcrumb.BreadcrumbService; +import org.woehlke.simpleworklist.context.Context; +import org.woehlke.simpleworklist.context.ContextService; +import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.user.account.UserAccount; + +import java.util.List; +import java.util.Locale; + +@Slf4j +@Service +public class ProjectControllerServiceImpl implements ProjectControllerService { + + private final ProjectService projectService; + private final ContextService contextService; + private final BreadcrumbService breadcrumbService; + + @Autowired + public ProjectControllerServiceImpl(ProjectService projectService, ContextService contextService, BreadcrumbService breadcrumbService) { + this.projectService = projectService; + this.contextService = contextService; + this.breadcrumbService = breadcrumbService; + } + + public void addNewProject( + long projectId, + UserSessionBean userSession, + Context context, + Locale locale, + Model model + ) { + log.info("private addNewProject projectId="+projectId); + UserAccount userAccount = context.getUserAccount(); + userSession.setLastProjectId(projectId); + model.addAttribute("userSession",userSession); + Project thisProject = null; + Project project = null; + if (projectId == 0) { + thisProject = new Project(); + thisProject.setId(0L); + project = Project.newRootProjectFactory(userAccount); + if(userSession.getContextId() == 0L){ + model.addAttribute("mustChooseArea", true); + project.setContext(userAccount.getDefaultContext()); + } else { + project.setContext(context); + } + } else { + thisProject = projectService.findByProjectId(projectId); + project = Project.newProjectFactory(thisProject); + } + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("thisProject", thisProject); + model.addAttribute("project", project); + } + + public String addNewProjectPersist( + long projectId, + UserSessionBean userSession, + Project project, + Context context, + BindingResult result, + Locale locale, Model model, + String template + ){ + log.info("private addNewProjectPersist projectId="+projectId+" "+project.toString()); + UserAccount userAccount = context.getUserAccount(); + userSession.setLastProjectId(projectId); + model.addAttribute("userSession",userSession); + if(result.hasErrors()){ + Project thisProject = null; + if (projectId == 0) { + thisProject = new Project(); + thisProject.setId(0L); + } else { + thisProject = projectService.findByProjectId(projectId); + } + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("thisProject", thisProject); + model.addAttribute("project", project); + return template; + } else { + if (projectId == 0) { + if(userSession.getContextId()>0) { + project.setContext(context); + } + project = projectService.saveAndFlush(project); + projectId = project.getId(); + } else { + Project thisProject = projectService.findByProjectId(projectId); + List children = thisProject.getChildren(); + children.add(project); + thisProject.setChildren(children); + project.setParent(thisProject); + project = projectService.saveAndFlush(project); + projectId = project.getId(); + log.info("project: "+ project.toString()); + log.info("thisProject: "+ thisProject.toString()); + } + return "redirect:/project/" + projectId; + } + } + + public Project getProject(long projectId, UserAccount userAccount, UserSessionBean userSession){ + Project thisProject; + if (projectId == 0) { + thisProject = new Project(); + thisProject.setId(0L); + if(userSession.getContextId() == 0L){ + thisProject.setContext(userAccount.getDefaultContext()); + } else { + Context context = contextService.findByIdAndUserAccount(userSession.getContextId(), userAccount); + thisProject.setContext(context); + } + } else { + thisProject = projectService.findByProjectId(projectId); + } + return thisProject; + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectRootController.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectRootController.java new file mode 100644 index 00000000..69298264 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectRootController.java @@ -0,0 +1,84 @@ +package org.woehlke.simpleworklist.project; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; +import org.woehlke.simpleworklist.common.AbstractController; +import org.woehlke.simpleworklist.context.Context; +import org.woehlke.simpleworklist.task.Task; +import org.woehlke.simpleworklist.user.UserSessionBean; + +import javax.validation.Valid; +import java.util.Locale; + +@Slf4j +@Controller +@RequestMapping(path = "/project/root") +public class ProjectRootController extends AbstractController { + + private final ProjectControllerService projectControllerService; + + private static final long rootProjectId = 0L; + + @Autowired + public ProjectRootController(ProjectControllerService projectControllerService) { + this.projectControllerService = projectControllerService; + } + + @RequestMapping(path = "/", method = RequestMethod.GET) + public final String showRootProject( + @PageableDefault(sort = "orderIdProject") Pageable pageable, + @RequestParam(required = false) String message, + @RequestParam(required = false) boolean isDeleted, + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model) { + log.info("/project/root"); + Context context = super.getContext(userSession); + userSession.setLastProjectId(0L); + model.addAttribute("userSession",userSession); + Page taskPage = taskService.findByRootProject(context,pageable); + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowRootProject(locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("taskPage", taskPage); + if(message != null){ + model.addAttribute("message",message); + model.addAttribute("isDeleted",isDeleted); + model.addAttribute("myTaskState","PROJECT"); + } + return "project/root"; + } + + @RequestMapping(path = "/add/new/project", method = RequestMethod.GET) + public final String addNewTopLevelProjectForm( + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model + ){ + log.info("/project/add/new/project (GET)"); + Context context = super.getContext(userSession); + projectControllerService.addNewProject(rootProjectId, userSession, context, locale, model); + return "project/addToplevel"; + } + + @RequestMapping(path = "/add/new/project", method = {RequestMethod.POST, RequestMethod.PUT}) + public final String addNewTopLevelProjectSave( + @Valid Project project, + @ModelAttribute("userSession") UserSessionBean userSession, + BindingResult result, + Locale locale, Model model + ){ + log.info("/project/add/new/project (POST)"); + Context context = super.getContext(userSession); + return projectControllerService.addNewProjectPersist( rootProjectId, userSession, project, context, + result, locale, model, "project/addToplevel"); + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectTaskController.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectTaskController.java new file mode 100644 index 00000000..3f93aa3c --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectTaskController.java @@ -0,0 +1,193 @@ +package org.woehlke.simpleworklist.project; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; +import org.woehlke.simpleworklist.common.AbstractController; +import org.woehlke.simpleworklist.context.Context; +import org.woehlke.simpleworklist.task.Task; +import org.woehlke.simpleworklist.task.TaskEnergy; +import org.woehlke.simpleworklist.task.TaskState; +import org.woehlke.simpleworklist.task.TaskTime; +import org.woehlke.simpleworklist.taskstate.TaskMoveService; +import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.user.account.UserAccount; + +import javax.validation.Valid; +import java.util.Locale; + + +@Slf4j +@Controller +@RequestMapping(path = "/project/task") +public class ProjectTaskController extends AbstractController { + + private final TaskMoveService taskMoveService; + private final ProjectControllerService projectControllerService; + + @Autowired + public ProjectTaskController(TaskMoveService taskMoveService, ProjectControllerService projectControllerService) { + this.taskMoveService = taskMoveService; + this.projectControllerService = projectControllerService; + } + + @RequestMapping(path = "/{sourceTaskId}/changeorderto/{destinationTaskId}", method = RequestMethod.GET) + public String changeTaskOrderIdWithinAProject( + @PathVariable("sourceTaskId") Task sourceTask, + @PathVariable("destinationTaskId") Task destinationTask, + @ModelAttribute("userSession") UserSessionBean userSession, + Model model + ){ + if(!sourceTask.isInRootProject()){ + userSession.setLastProjectId(sourceTask.getProject().getId()); + } + model.addAttribute("userSession",userSession); + log.info("-------------------------------------------------"); + log.info(" changeTaskOrderIdWithinAProject"); + log.info("-------------------------------------------------"); + log.info(" source Task: "+sourceTask.toString()); + log.info("-------------------------------------------------"); + log.info(" destination Task: "+destinationTask.toString()); + log.info("-------------------------------------------------"); + String returnUrl = "redirect:/taskstate/inbox"; + boolean rootProject = sourceTask.isInRootProject(); + returnUrl = "redirect:/project/0"; + if(rootProject){ + taskMoveService.moveOrderIdRootProject(sourceTask, destinationTask); + } else { + taskMoveService.moveOrderIdProject(sourceTask, destinationTask); + log.info(" DONE: taskMoveService.moveOrderIdProject (2)"); + returnUrl = "redirect:/project/" + sourceTask.getProject().getId(); + } + log.info("-------------------------------------------------"); + return returnUrl; + } + + + @RequestMapping(path = "/addtorootproject/", method = RequestMethod.GET) + public final String addNewTaskToProjectGet( + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model + ) { + UserAccount userAccount = userAccountLoginSuccessService.retrieveCurrentUser(); + Task task = new Task(); + task.setTaskState(TaskState.INBOX); + task.setTaskEnergy(TaskEnergy.NONE); + task.setTaskTime(TaskTime.NONE); + Boolean mustChooseArea = false; + if(userSession.getContextId() == 0L){ + mustChooseArea = true; + task.setContext(userAccount.getDefaultContext()); + } else { + Context context = contextService.findByIdAndUserAccount(userSession.getContextId(), userAccount); + task.setContext(context); + } + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowRootProject(locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("mustChooseArea", mustChooseArea); + model.addAttribute("thisProjectId", 0L); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("task", task); + return "task/addToProject"; + } + + @RequestMapping(path = "/addtoproject/{projectId}", method = RequestMethod.GET) + public final String addNewTaskToProjectGet( + @PathVariable long projectId, + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model + ) { + Context context = super.getContext(userSession); + UserAccount userAccount = context.getUserAccount(); + Task task = new Task(); + task.setTaskState(TaskState.INBOX); + task.setTaskEnergy(TaskEnergy.NONE); + task.setTaskTime(TaskTime.NONE); + Project thisProject; + Boolean mustChooseArea = false; + if (projectId == 0) { + thisProject = new Project(); + thisProject.setId(0L); + if(userSession.getContextId() == 0L){ + mustChooseArea = true; + task.setContext(userAccount.getDefaultContext()); + thisProject.setContext(userAccount.getDefaultContext()); + } else { + task.setContext(context); + thisProject.setContext(context); + } + } else { + thisProject = projectService.findByProjectId(projectId); + task.setProject(thisProject); + task.setContext(thisProject.getContext()); + } + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("mustChooseArea", mustChooseArea); + model.addAttribute("thisProject", thisProject); + model.addAttribute("thisProjectId", thisProject.getId()); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("task", task); + return "task/addToProject"; + } + + @RequestMapping(path = "/addtoproject/{projectId}", method = RequestMethod.POST) + public final String addNewTaskToProjectPost( + @PathVariable long projectId, + @ModelAttribute("userSession") UserSessionBean userSession, + @Valid Task task, + BindingResult result, Locale locale, Model model) { + Context context = super.getContext(userSession); + UserAccount userAccount = context.getUserAccount(); + if (result.hasErrors()) { + for (ObjectError e : result.getAllErrors()) { + log.info(e.toString()); + } + Project thisProject = projectControllerService.getProject(projectId, userAccount, userSession); + Boolean mustChooseArea = false; + if (projectId == 0) { + task.setContext(context); + } else { + task.setProject(thisProject); + task.setContext(thisProject.getContext()); + } + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); + model.addAttribute("mustChooseArea", mustChooseArea); + model.addAttribute("thisProject", thisProject); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("task", task); + return "task/addToProject"; + } else { + if (projectId == 0) { + task.setProject(null); + } else { + Project thisProject = projectService.findByProjectId(projectId); + task.setProject(thisProject); + task.setContext(thisProject.getContext()); + } + if(task.getDueDate()==null){ + task.setTaskState(TaskState.INBOX); + } else { + task.setTaskState(TaskState.SCHEDULED); + } + task.setFocus(false); + task.setContext(context); + long maxOrderIdProject = taskMoveService.getMaxOrderIdProject(task.getProject(),context); + task.setOrderIdProject(++maxOrderIdProject); + long maxOrderIdTaskState = taskMoveService.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + task = taskService.saveAndFlush(task); + log.info(task.toString()); + return "redirect:/project/" + projectId + "/"; + } + } + +} diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskAddController.java b/src/main/java/org/woehlke/simpleworklist/task/TaskAddController.java new file mode 100644 index 00000000..d4df5c5d --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskAddController.java @@ -0,0 +1,98 @@ +package org.woehlke.simpleworklist.task; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; +import org.woehlke.simpleworklist.common.AbstractController; +import org.woehlke.simpleworklist.context.Context; +import org.woehlke.simpleworklist.taskstate.TaskMoveService; +import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.user.account.UserAccount; + +import javax.validation.Valid; +import java.util.Locale; + + +@Slf4j +@Controller +@RequestMapping(path = "/task") +public class TaskAddController extends AbstractController { + + private final TaskMoveService taskMoveService; + + @Autowired + public TaskAddController(TaskMoveService taskMoveService) { + this.taskMoveService = taskMoveService; + } + + @RequestMapping(path = "/add", method = RequestMethod.GET) + public final String addNewTaskToInboxGet( + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model + ) { + UserAccount userAccount = userAccountLoginSuccessService.retrieveCurrentUser(); + Task task = new Task(); + task.setTaskState(TaskState.INBOX); + task.setTaskEnergy(TaskEnergy.NONE); + task.setTaskTime(TaskTime.NONE); + Boolean mustChooseContext = false; + if(userSession.getContextId() == 0L){ + mustChooseContext = true; + task.setContext(userAccount.getDefaultContext()); + } else { + Context context = contextService.findByIdAndUserAccount(userSession.getContextId(), userAccount); + task.setContext(context); + } + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.INBOX,locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("mustChooseArea", mustChooseContext); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("task", task); + return "task/addToInbox"; + } + + @RequestMapping(path = "/add", method = RequestMethod.POST) + public final String addNewTaskToInboxPost( + @ModelAttribute("userSession") UserSessionBean userSession, + @Valid Task task, + BindingResult result, Locale locale, Model model) { + Context context = super.getContext(userSession); + if (result.hasErrors()) { + for (ObjectError e : result.getAllErrors()) { + log.info(e.toString()); + } + Boolean mustChooseArea = false; + task.setContext(context); + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.INBOX,locale); + model.addAttribute("mustChooseArea", mustChooseArea); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("task", task); + return "task/addToProject"; + } else { + task.setProject(null); + if(task.getDueDate()==null){ + task.setTaskState(TaskState.INBOX); + } else { + task.setTaskState(TaskState.SCHEDULED); + } + task.setFocus(false); + task.setContext(context); + //TODO: verify, that this is correct: + long maxOrderIdProject = taskMoveService.getMaxOrderIdProject(task.getProject(),context); + task.setOrderIdProject(++maxOrderIdProject); + // + long maxOrderIdTaskState = taskMoveService.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + task = taskService.saveAndFlush(task); + log.info(task.toString()); + return "redirect:/taskstate/" + task.getTaskState().name().toLowerCase(); + } + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskController.java b/src/main/java/org/woehlke/simpleworklist/task/TaskController.java index 662654bd..ba00cf36 100644 --- a/src/main/java/org/woehlke/simpleworklist/task/TaskController.java +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskController.java @@ -1,259 +1,17 @@ package org.woehlke.simpleworklist.task; -import java.util.List; -import java.util.Locale; +import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import javax.validation.Valid; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.validation.BindingResult; -import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.*; import org.woehlke.simpleworklist.common.AbstractController; -import org.woehlke.simpleworklist.taskstate.TaskMoveService; -import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.project.Project; -import org.woehlke.simpleworklist.user.account.UserAccount; -import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; -import org.woehlke.simpleworklist.user.UserSessionBean; +@Slf4j @Controller @RequestMapping(path = "/task") public class TaskController extends AbstractController { - private static final Logger LOGGER = LoggerFactory.getLogger(TaskController.class); - - private final TaskService taskService; - private final TaskMoveService taskMoveService; - - @Autowired - public TaskController(TaskService taskService, TaskMoveService taskMoveService) { - this.taskService = taskService; - this.taskMoveService = taskMoveService; - } - - @RequestMapping(path = "/{taskId}/edit", method = RequestMethod.GET) - public final String editTaskGet( - @PathVariable("taskId") Task task, - @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, Model model - ) { - UserAccount userAccount = userAccountLoginSuccessService.retrieveCurrentUser(); - List contexts = contextService.getAllForUser(userAccount); - if(task != null) { - Project thisProject = null; - if (task.getProject() == null) { - thisProject = new Project(); - thisProject.setId(0L); - } else { - thisProject = task.getProject(); - } - model.addAttribute("thisProject", thisProject); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("task", task); - model.addAttribute("areas", contexts); - return "task/edit"; - } else { - return "redirect:/taskstate/inbox"; - } - } - - @RequestMapping(path = "/{taskId}/edit", method = RequestMethod.POST) - public final String editTaskPost( - @PathVariable long taskId, - @Valid Task task, - @ModelAttribute("userSession") UserSessionBean userSession, - BindingResult result, Locale locale, Model model) { - Task persistentTask = taskService.findOne(taskId); - long projectId = 0; - Project thisProject; - if (persistentTask.getProject() == null) { - thisProject = new Project(); - thisProject.setId(0L); - } else { - thisProject = persistentTask.getProject(); - projectId = thisProject.getId(); - } - if (result.hasErrors()) { - for (ObjectError e : result.getAllErrors()) { - LOGGER.info(e.toString()); - } - model.addAttribute("thisProject", thisProject); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("task", task); - return "task/edit"; - } else { - persistentTask.setTitle(task.getTitle()); - persistentTask.setText(task.getText()); - if(task.getDueDate()==null){ - persistentTask.setDueDate(null); - if(persistentTask.getTaskState().compareTo(TaskState.SCHEDULED)==0){ - persistentTask.setTaskState(TaskState.INBOX); - } - } else { - persistentTask.setDueDate(task.getDueDate()); - persistentTask.setTaskState(TaskState.SCHEDULED); - } - persistentTask.setTaskTime(task.getTaskTime()); - persistentTask.setTaskEnergy(task.getTaskEnergy()); - boolean contextChanged = persistentTask.getContext().equalsById(task.getContext()); - if(contextChanged){ - persistentTask.setContext(task.getContext()); - if(thisProject.getId()==0L) { - persistentTask.setRootProject(); - } else if(thisProject.getContext().equalsById(task.getContext())){ - persistentTask.setProject(thisProject); - } - userSession.setContextId(task.getContext().getId()); - model.addAttribute("userSession", userSession); - return "redirect:/project/0/"; - } - taskService.saveAndFlush(persistentTask); - return "redirect:/project/" + projectId + "/"; - } - } - - private Project getProject(long projectId, UserAccount userAccount, UserSessionBean userSession){ - Project thisProject; - if (projectId == 0) { - thisProject = new Project(); - thisProject.setId(0L); - if(userSession.getContextId() == 0L){ - thisProject.setContext(userAccount.getDefaultContext()); - } else { - Context context = contextService.findByIdAndUserAccount(userSession.getContextId(), userAccount); - thisProject.setContext(context); - } - } else { - thisProject = projectService.findByProjectId(projectId); - } - return thisProject; - } - - @RequestMapping(path = "/addtorootproject/", method = RequestMethod.GET) - public final String addNewTaskToProjectGet( - @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, Model model - ) { - UserAccount userAccount = userAccountLoginSuccessService.retrieveCurrentUser(); - Task task = new Task(); - task.setTaskState(TaskState.INBOX); - task.setTaskEnergy(TaskEnergy.NONE); - task.setTaskTime(TaskTime.NONE); - Boolean mustChooseArea = false; - if(userSession.getContextId() == 0L){ - mustChooseArea = true; - task.setContext(userAccount.getDefaultContext()); - } else { - Context context = contextService.findByIdAndUserAccount(userSession.getContextId(), userAccount); - task.setContext(context); - } - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowRootProject(locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("mustChooseArea", mustChooseArea); - model.addAttribute("thisProjectId", 0L); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("task", task); - return "task/add"; - } - - @RequestMapping(path = "/addtoproject/{projectId}", method = RequestMethod.GET) - public final String addNewTaskToProjectGet( - @PathVariable long projectId, - @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, Model model - ) { - Context context = super.getContext(userSession); - UserAccount userAccount = context.getUserAccount(); - Task task = new Task(); - task.setTaskState(TaskState.INBOX); - task.setTaskEnergy(TaskEnergy.NONE); - task.setTaskTime(TaskTime.NONE); - Project thisProject; - Boolean mustChooseArea = false; - if (projectId == 0) { - thisProject = new Project(); - thisProject.setId(0L); - if(userSession.getContextId() == 0L){ - mustChooseArea = true; - task.setContext(userAccount.getDefaultContext()); - thisProject.setContext(userAccount.getDefaultContext()); - } else { - task.setContext(context); - thisProject.setContext(context); - } - } else { - thisProject = projectService.findByProjectId(projectId); - task.setProject(thisProject); - task.setContext(thisProject.getContext()); - } - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("mustChooseArea", mustChooseArea); - model.addAttribute("thisProject", thisProject); - model.addAttribute("thisProjectId", thisProject.getId()); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("task", task); - return "task/add"; - } - - @RequestMapping(path = "/addtoproject/{projectId}", method = RequestMethod.POST) - public final String addNewTaskToProjectPost( - @PathVariable long projectId, - @ModelAttribute("userSession") UserSessionBean userSession, - @Valid Task task, - BindingResult result, Locale locale, Model model) { - Context context = super.getContext(userSession); - UserAccount userAccount = context.getUserAccount(); - if (result.hasErrors()) { - for (ObjectError e : result.getAllErrors()) { - LOGGER.info(e.toString()); - } - Project thisProject = this.getProject(projectId, userAccount, userSession); - Boolean mustChooseArea = false; - if (projectId == 0) { - task.setContext(context); - } else { - task.setProject(thisProject); - task.setContext(thisProject.getContext()); - } - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); - model.addAttribute("mustChooseArea", mustChooseArea); - model.addAttribute("thisProject", thisProject); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("task", task); - return "task/add"; - } else { - if (projectId == 0) { - task.setProject(null); - } else { - Project thisProject = projectService.findByProjectId(projectId); - task.setProject(thisProject); - task.setContext(thisProject.getContext()); - } - if(task.getDueDate()==null){ - task.setTaskState(TaskState.INBOX); - } else { - task.setTaskState(TaskState.SCHEDULED); - } - task.setFocus(false); - task.setContext(context); - long maxOrderIdProject = taskMoveService.getMaxOrderIdProject(task.getProject(),context); - task.setOrderIdProject(++maxOrderIdProject); - long maxOrderIdTaskState = taskMoveService.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); - task.setOrderIdTaskState(++maxOrderIdTaskState); - task = taskService.saveAndFlush(task); - LOGGER.info(task.toString()); - return "redirect:/project/" + projectId + "/"; - } - } - @RequestMapping(path = "/delete/{taskId}", method = RequestMethod.GET) public final String deleteTaskGet(@PathVariable("taskId") Task task) { if(task!= null){ @@ -274,8 +32,8 @@ public final String undeleteTaskGet(@PathVariable("taskId") Task task) { @RequestMapping(path = "/transform/{taskId}", method = RequestMethod.GET) public final String transformTaskIntoProjectGet(@PathVariable("taskId") Task task) { - long projectId = 0; if(task != null) { + long projectId = 0; if (task.getProject() != null) { projectId = task.getProject().getId(); } @@ -289,97 +47,14 @@ public final String transformTaskIntoProjectGet(@PathVariable("taskId") Task tas thisProject = projectService.saveAndFlush(thisProject); taskService.delete(task); projectId = thisProject.getId(); - LOGGER.info("tried to transform Task " + task.getId() + " to new Project " + projectId); - } - return "redirect:/project/" + projectId + "/"; - } - - @RequestMapping(path = "/complete/{taskId}", method = RequestMethod.GET) - public final String completeTaskGet(@PathVariable("taskId") Task task) { - if(task != null){ - long maxOrderIdTaskState = taskMoveService.getMaxOrderIdTaskState(TaskState.COMPLETED,task.getContext()); - task.setOrderIdTaskState(++maxOrderIdTaskState); - taskService.complete(task); - } - return "redirect:/taskstate/completed"; - } - - @RequestMapping(path = "/incomplete/{taskId}", method = RequestMethod.GET) - public final String undoneTaskGet(@PathVariable("taskId") Task task) { - if(task !=null) { - taskService.incomplete(task); - long maxOrderIdTaskState = taskMoveService.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); - task.setOrderIdTaskState(++maxOrderIdTaskState); - taskService.saveAndFlush(task); - switch (task.getTaskState()) { - case TODAY: - return "redirect:/taskstate/today"; - case NEXT: - return "redirect:/taskstate/next"; - case WAITING: - return "redirect:/taskstate/waiting"; - case SCHEDULED: - return "redirect:/taskstate/scheduled"; - case SOMEDAY: - return "redirect:/taskstate/someday"; - case COMPLETED: - return "redirect:/taskstate/completed"; - case TRASH: - return "redirect:/taskstate/trash"; - default: - return "redirect:/taskstate/inbox"; - } - } else { - return "redirect:/taskstate/inbox"; - } - } - - private String getView(Task task,String back){ - if(back != null && back.contentEquals("project")){ - if(task.getProject() != null) { - return "redirect:/project/" + task.getProject().getId(); + log.info("tried to transform Task " + task.getId() + " to new Project " + projectId); + if(projectId == 0){ + return "redirect:/project/root/"; } else { - return "redirect:/project/0"; + return "redirect:/project/" + projectId + "/"; } } - switch (task.getTaskState()) { - case TODAY: - return "redirect:/taskstate/today"; - case NEXT: - return "redirect:/taskstate/next"; - case WAITING: - return "redirect:/taskstate/waiting"; - case SCHEDULED: - return "redirect:/taskstate/scheduled"; - case SOMEDAY: - return "redirect:/taskstate/someday"; - case COMPLETED: - return "redirect:/taskstate/completed"; - default: - return "redirect:/taskstate/inbox"; - } - } - - @RequestMapping(path = "/setfocus/{taskId}", method = RequestMethod.GET) - public final String setFocusGet(@PathVariable("taskId") Task task, - @RequestParam(required=false) String back){ - if(task !=null) { - taskService.setFocus(task); - return getView(task,back); - } else { - return "redirect:/taskstate/inbox"; - } - } - - @RequestMapping(path = "/unsetfocus/{taskId}", method = RequestMethod.GET) - public final String unsetFocusGet(@PathVariable("taskId") Task task, - @RequestParam(required=false) String back){ - if(task !=null) { - taskService.unsetFocus(task); - return getView(task,back); - } else { - return "redirect:/taskstate/inbox"; - } + return "redirect:/taskstate/inbox"; } } diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskControllerService.java b/src/main/java/org/woehlke/simpleworklist/task/TaskControllerService.java new file mode 100644 index 00000000..b56c1539 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskControllerService.java @@ -0,0 +1,23 @@ +package org.woehlke.simpleworklist.task; + +import org.springframework.data.domain.Page; +import org.springframework.ui.Model; +import org.woehlke.simpleworklist.user.UserSessionBean; + +import java.util.Locale; + +public interface TaskControllerService { + + String getView( + Task task, + String back + ); + + String getTaskStatePage( + TaskState taskState, + Page taskPage, + UserSessionBean userSession, + Locale locale, + Model model + ); +} diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskControllerServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/task/TaskControllerServiceImpl.java new file mode 100644 index 00000000..c47b7dac --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskControllerServiceImpl.java @@ -0,0 +1,52 @@ +package org.woehlke.simpleworklist.task; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; +import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; +import org.woehlke.simpleworklist.breadcrumb.BreadcrumbService; +import org.woehlke.simpleworklist.user.UserSessionBean; + +import java.util.Locale; + +@Slf4j +@Service +public class TaskControllerServiceImpl implements TaskControllerService { + + @Autowired + protected BreadcrumbService breadcrumbService; + + public String getTaskStatePage( + TaskState taskState, + Page taskPage, + UserSessionBean userSession, + Locale locale, + Model model + ){ + userSession.setLastTaskState(taskState); + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(taskState,locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("taskPage", taskPage); + model.addAttribute("taskstateType", taskState.name().toLowerCase()); + model.addAttribute("userSession", userSession); + return "taskstate/"+taskState.name().toLowerCase(); + } + + + //TODO: String back -> boolean project + public String getView(Task task, String back){ + if(back != null && back.contentEquals("project")){ + if(task.getProject() != null) { + return "redirect:/project/" + task.getProject().getId(); + } else { + //TODO: /project/0" -> /project/root" + return "redirect:/project/0"; + } + } else { + return "redirect:/taskstate/"+task.getTaskState().name().toLowerCase(); + } + } + +} diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskEditController.java b/src/main/java/org/woehlke/simpleworklist/task/TaskEditController.java new file mode 100644 index 00000000..3ff9103d --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskEditController.java @@ -0,0 +1,122 @@ +package org.woehlke.simpleworklist.task; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; +import org.woehlke.simpleworklist.common.AbstractController; +import org.woehlke.simpleworklist.context.Context; +import org.woehlke.simpleworklist.project.Project; +import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.user.account.UserAccount; + +import javax.validation.Valid; +import java.util.List; +import java.util.Locale; + + +@Slf4j +@Controller +@RequestMapping(path = "/task") +public class TaskEditController extends AbstractController { + + private final TaskControllerService taskControllerService; + + @Autowired + public TaskEditController(TaskControllerService taskControllerService) { + this.taskControllerService = taskControllerService; + } + + @RequestMapping(path = "/{taskId}/edit", method = RequestMethod.GET) + public final String editTaskGet( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model + ) { + UserAccount userAccount = userAccountLoginSuccessService.retrieveCurrentUser(); + List contexts = contextService.getAllForUser(userAccount); + if(task != null) { + Project thisProject = null; + if (task.getProject() == null) { + thisProject = new Project(); + thisProject.setId(0L); + } else { + thisProject = task.getProject(); + } + model.addAttribute("thisProject", thisProject); + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("task", task); + model.addAttribute("areas", contexts); + return "task/edit"; + } else { + return "redirect:/taskstate/inbox"; + } + } + + @RequestMapping(path = "/{taskId}/edit", method = RequestMethod.POST) + public final String editTaskPost( + @PathVariable long taskId, + @Valid Task task, + @ModelAttribute("userSession") UserSessionBean userSession, + BindingResult result, + Locale locale, + Model model + ) { + Task persistentTask = taskService.findOne(taskId); + long projectId = 0; + Project thisProject; + if (persistentTask.getProject() == null) { + thisProject = new Project(); + thisProject.setId(0L); + } else { + thisProject = persistentTask.getProject(); + projectId = thisProject.getId(); + } + if (result.hasErrors()) { + for (ObjectError e : result.getAllErrors()) { + log.info(e.toString()); + } + model.addAttribute("thisProject", thisProject); + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("task", task); + return "task/edit"; + } else { + persistentTask.setTitle(task.getTitle()); + persistentTask.setText(task.getText()); + if(task.getDueDate()==null){ + persistentTask.setDueDate(null); + if(persistentTask.getTaskState().compareTo(TaskState.SCHEDULED)==0){ + persistentTask.setTaskState(TaskState.INBOX); + } + } else { + persistentTask.setDueDate(task.getDueDate()); + persistentTask.setTaskState(TaskState.SCHEDULED); + } + persistentTask.setTaskTime(task.getTaskTime()); + persistentTask.setTaskEnergy(task.getTaskEnergy()); + boolean contextChanged = persistentTask.getContext().equalsById(task.getContext()); + if(contextChanged){ + persistentTask.setContext(task.getContext()); + if(thisProject.getId()==0L) { + persistentTask.setRootProject(); + } else if(thisProject.getContext().equalsById(task.getContext())){ + persistentTask.setProject(thisProject); + } + userSession.setContextId(task.getContext().getId()); + model.addAttribute("userSession", userSession); + return "redirect:/project/0/"; + } + taskService.saveAndFlush(persistentTask); + return "redirect:/project/" + projectId + "/"; + } + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/task/TaskServiceImpl.java index 055b0644..a055c69c 100644 --- a/src/main/java/org/woehlke/simpleworklist/task/TaskServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskServiceImpl.java @@ -1,5 +1,6 @@ package org.woehlke.simpleworklist.task; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.slf4j.Logger; @@ -15,12 +16,11 @@ import java.util.ArrayList; +@Slf4j @Service @Transactional(propagation = Propagation.REQUIRED, readOnly = true) public class TaskServiceImpl implements TaskService { - private static final Logger LOGGER = LoggerFactory.getLogger(TaskServiceImpl.class); - private final TaskRepository taskRepository; @Autowired @@ -32,7 +32,7 @@ public TaskServiceImpl(TaskRepository taskRepository) { @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) public Task saveAndFlush(Task entity) { entity = taskRepository.saveAndFlush(entity); - LOGGER.info("saved: " + entity.toString()); + log.info("saved: " + entity.toString()); return entity; } @@ -85,12 +85,12 @@ public void unsetFocus(Task task) { @Override public Page findByProject(Project thisProject, Context context, Pageable request) { - LOGGER.info("findByProject: "); - LOGGER.info("---------------------------------"); - LOGGER.info("thisProject: "+thisProject); - LOGGER.info("---------------------------------"); - LOGGER.info("context: "+ context); - LOGGER.info("---------------------------------"); + log.info("findByProject: "); + log.info("---------------------------------"); + log.info("thisProject: "+thisProject); + log.info("---------------------------------"); + log.info("context: "+ context); + log.info("---------------------------------"); if((thisProject == null)||(context ==null)){ return new PageImpl(new ArrayList()); } else { diff --git a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateController.java b/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateController.java index 7ea717cb..fcd74932 100644 --- a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateController.java +++ b/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateController.java @@ -1,7 +1,6 @@ package org.woehlke.simpleworklist.taskstate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -12,6 +11,7 @@ import org.woehlke.simpleworklist.common.AbstractController; import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.task.Task; +import org.woehlke.simpleworklist.task.TaskControllerService; import org.woehlke.simpleworklist.task.TaskState; import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; import org.woehlke.simpleworklist.user.UserSessionBean; @@ -24,182 +24,203 @@ /** * Created by tw on 21.02.16. */ +@Slf4j @Controller @RequestMapping(value = "/taskstate") public class TaskStateController extends AbstractController { - private static final Logger LOGGER = LoggerFactory.getLogger(TaskStateController.class); - private final TaskStateService taskStateService; - private final TaskMoveService taskMoveService; + private final TaskControllerService taskControllerService; @Autowired - public TaskStateController(TaskStateService taskStateService, TaskMoveService taskMoveService) { + public TaskStateController( + TaskStateService taskStateService, + TaskMoveService taskMoveService, + TaskControllerService taskControllerService + ) { this.taskStateService = taskStateService; this.taskMoveService = taskMoveService; + this.taskControllerService = taskControllerService; } @RequestMapping(value = "/inbox", method = RequestMethod.GET) public final String inbox( @PageableDefault(sort = "orderIdTaskState") Pageable pageable, - @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, + Model model ) { Context context = super.getContext(userSession); - userSession.setLastTaskState(TaskState.INBOX); Page taskPage = taskStateService.getInbox(context, pageable); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.INBOX,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("taskPage", taskPage); - model.addAttribute("taskstateType", "inbox"); - model.addAttribute("userSession", userSession); - return "taskstate/inbox"; + return taskControllerService.getTaskStatePage(TaskState.INBOX, taskPage, userSession, locale, model); } @RequestMapping(value = "/today", method = RequestMethod.GET) public final String today( @PageableDefault(sort = "orderIdTaskState", direction = Sort.Direction.DESC) Pageable pageable, - @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, + Model model ) { Context context = super.getContext(userSession); - userSession.setLastTaskState(TaskState.TODAY); Page taskPage = taskStateService.getToday(context, pageable); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.TODAY,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("taskPage", taskPage); - model.addAttribute("taskstateType", "today"); - model.addAttribute("userSession", userSession); - return "taskstate/today"; + return taskControllerService.getTaskStatePage(TaskState.TODAY, taskPage, userSession, locale, model); } @RequestMapping(value = "/next", method = RequestMethod.GET) public final String next( @PageableDefault(sort = "orderIdTaskState", direction = Sort.Direction.DESC) Pageable pageable, - @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, + Model model ) { Context context = super.getContext(userSession); - userSession.setLastTaskState(TaskState.NEXT); Page taskPage = taskStateService.getNext(context, pageable); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.NEXT,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("taskPage", taskPage); - model.addAttribute("taskstateType", "next"); - model.addAttribute("userSession", userSession); - return "taskstate/next"; + return taskControllerService.getTaskStatePage(TaskState.NEXT, taskPage, userSession, locale, model); } @RequestMapping(value = "/waiting", method = RequestMethod.GET) public final String waiting( @PageableDefault(sort = "orderIdTaskState", direction = Sort.Direction.DESC) Pageable pageable, - @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, + Model model ) { Context context = super.getContext(userSession); - userSession.setLastTaskState(TaskState.WAITING); Page taskPage = taskStateService.getWaiting(context, pageable); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.WAITING,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("taskPage", taskPage); - model.addAttribute("taskstateType", "waiting"); - model.addAttribute("userSession", userSession); - return "taskstate/waiting"; + return taskControllerService.getTaskStatePage(TaskState.WAITING, taskPage, userSession, locale, model); } @RequestMapping(value = "/scheduled", method = RequestMethod.GET) public final String scheduled( @PageableDefault(sort = "orderIdTaskState", direction = Sort.Direction.DESC) Pageable pageable, - @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, + Model model ) { Context context = super.getContext(userSession); - userSession.setLastTaskState(TaskState.SCHEDULED); Page taskPage = taskStateService.getScheduled(context, pageable); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.SCHEDULED,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("taskPage", taskPage); - model.addAttribute("taskstateType", "scheduled"); - model.addAttribute("userSession", userSession); - return "taskstate/scheduled"; + return taskControllerService.getTaskStatePage(TaskState.SCHEDULED, taskPage, userSession, locale, model); } @RequestMapping(value = "/someday", method = RequestMethod.GET) public final String someday( @PageableDefault(sort = "orderIdTaskState", direction = Sort.Direction.DESC) Pageable pageable, - @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, + Model model ) { Context context = super.getContext(userSession); - userSession.setLastTaskState(TaskState.SOMEDAY); Page taskPage = taskStateService.getSomeday(context, pageable); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.SOMEDAY,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("taskPage", taskPage); - model.addAttribute("taskstateType", "someday"); - model.addAttribute("userSession", userSession); - return "taskstate/someday"; + return taskControllerService.getTaskStatePage(TaskState.SOMEDAY, taskPage, userSession, locale, model); } @RequestMapping(value = "/completed", method = RequestMethod.GET) public final String completed( @PageableDefault(sort = "orderIdTaskState", direction = Sort.Direction.DESC) Pageable pageable, - @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, + Model model ) { Context context = super.getContext(userSession); - userSession.setLastTaskState(TaskState.COMPLETED); Page taskPage = taskStateService.getCompleted(context, pageable); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.COMPLETED,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("taskPage", taskPage); - model.addAttribute("taskstateType", "completed"); - model.addAttribute("userSession", userSession); - return "taskstate/completed"; + return taskControllerService.getTaskStatePage(TaskState.COMPLETED, taskPage, userSession, locale, model); } @RequestMapping(value = "/trash", method = RequestMethod.GET) public final String trash( @PageableDefault(sort = "orderIdTaskState", direction = Sort.Direction.DESC) Pageable pageable, - @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, + Model model ) { Context context = super.getContext(userSession); - userSession.setLastTaskState(TaskState.TRASH); Page taskPage = taskStateService.getTrash(context, pageable); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.TRASH,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("taskPage", taskPage); - model.addAttribute("taskstateType", "trash"); - model.addAttribute("userSession", userSession); - return "taskstate/trash"; + return taskControllerService.getTaskStatePage(TaskState.TRASH, taskPage, userSession, locale, model); } @RequestMapping(value = "/focus", method = RequestMethod.GET) public final String focus( @PageableDefault(sort = "orderIdTaskState", direction = Sort.Direction.DESC) Pageable pageable, - @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, + Model model ) { Context context = super.getContext(userSession); - userSession.setLastTaskState(TaskState.FOCUS); Page taskPage = taskStateService.getFocus(context, pageable); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.FOCUS,locale); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("taskPage", taskPage); - model.addAttribute("taskstateType", "focus"); - model.addAttribute("userSession", userSession); - return "taskstate/focus"; + return taskControllerService.getTaskStatePage(TaskState.FOCUS, taskPage, userSession, locale, model); } @RequestMapping(value = "/{sourceTaskId}/changeorderto/{destinationTaskId}", method = RequestMethod.GET) public String changeTaskOrderId( - @PathVariable("sourceTaskId") Task sourceTask, - @PathVariable("destinationTaskId") Task destinationTask, - @ModelAttribute("userSession") UserSessionBean userSession, Model model + @PathVariable("sourceTaskId") Task sourceTask, + @PathVariable("destinationTaskId") Task destinationTask, + @ModelAttribute("userSession") UserSessionBean userSession, + Model model ){ - Context context = super.getContext(userSession); userSession.setLastTaskState(sourceTask.getTaskState()); model.addAttribute("userSession", userSession); - LOGGER.info("------------- changeTaskOrderId -------------"); - LOGGER.info("source Task: "+sourceTask.toString()); - LOGGER.info("---------------------------------------------"); - LOGGER.info("destination Task: "+destinationTask.toString()); - LOGGER.info("---------------------------------------------"); + log.info("------------- changeTaskOrderId -------------"); + log.info("source Task: "+sourceTask.toString()); + log.info("---------------------------------------------"); + log.info("destination Task: "+destinationTask.toString()); + log.info("---------------------------------------------"); taskMoveService.moveOrderIdTaskState(sourceTask, destinationTask); return "redirect:/taskstate/" + sourceTask.getTaskState().name().toLowerCase(); } + @RequestMapping(path = "/complete/{taskId}", method = RequestMethod.GET) + public final String setDoneTaskGet( + @PathVariable("taskId") Task task + ) { + if(task != null){ + long maxOrderIdTaskState = taskMoveService.getMaxOrderIdTaskState(TaskState.COMPLETED,task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + taskService.complete(task); + } + return "redirect:/taskstate/completed"; + } + + @RequestMapping(path = "/incomplete/{taskId}", method = RequestMethod.GET) + public final String unsetDoneTaskGet( + @PathVariable("taskId") Task task + ) { + if(task !=null) { + taskService.incomplete(task); + long maxOrderIdTaskState = taskMoveService.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + taskService.saveAndFlush(task); + return "redirect:/taskstate/"+task.getTaskState().name().toLowerCase(); + } else { + return "redirect:/taskstate/inbox"; + } + } + + @RequestMapping(path = "/setfocus/{taskId}", method = RequestMethod.GET) + public final String setFocusGet( + @PathVariable("taskId") Task task, + @RequestParam(required=false) String back + ){ + if(task !=null) { + taskService.setFocus(task); + return taskControllerService.getView(task,back); + } else { + return "redirect:/taskstate/inbox"; + } + } + + @RequestMapping(path = "/unsetfocus/{taskId}", method = RequestMethod.GET) + public final String unsetFocusGet( + @PathVariable("taskId") Task task, + @RequestParam(required=false) String back + ){ + if(task !=null) { + taskService.unsetFocus(task); + return taskControllerService.getView(task,back); + } else { + return "redirect:/taskstate/inbox"; + } + } + } diff --git a/src/main/resources/templates/task/addToInbox.html b/src/main/resources/templates/task/addToInbox.html new file mode 100644 index 00000000..a3b9361c --- /dev/null +++ b/src/main/resources/templates/task/addToInbox.html @@ -0,0 +1,114 @@ + + + + Title + + + + + + + + Add Task + + + + + + + + + + + Title + + + + + + + + + + Due Date + + + + + + + + + + Text + + + + + + + + + + + Energy + + + Wireframe + + + + + + + + + Time + + + Wireframe + + + + + + + + + Area + + + Wireframe + + + + + + + + + + + Add Task + + + + + + + + diff --git a/src/main/resources/templates/task/add.html b/src/main/resources/templates/task/addToProject.html similarity index 100% rename from src/main/resources/templates/task/add.html rename to src/main/resources/templates/task/addToProject.html diff --git a/src/main/resources/templates/taskstate/inbox.html b/src/main/resources/templates/taskstate/inbox.html index 5fd38956..45aab642 100644 --- a/src/main/resources/templates/taskstate/inbox.html +++ b/src/main/resources/templates/taskstate/inbox.html @@ -1,40 +1,40 @@ - - - - Inbox - - - - - - - - Inbox - - - - - Add Task - - - - - - - - - - - - - - You have no Tasks in Your Inbox - - - - - \ No newline at end of file + + + + Inbox + + + + + + + + Inbox + + + + + Add Task + + + + + + + + + + + + + + You have no Tasks in Your Inbox + + + + +