From 6946092269c6cd142bb470d8e16400b57f5e5f1f Mon Sep 17 00:00:00 2001 From: thomaswoehlke Date: Tue, 7 Apr 2020 19:20:11 +0200 Subject: [PATCH 01/66] Fixed #126 --- .../woehlke/simpleworklist/SmokeTests.java | 154 +++++++++++++++--- .../UserAccountTestDataServiceImpl.java | 1 + 2 files changed, 136 insertions(+), 19 deletions(-) diff --git a/src/test/java/org/woehlke/simpleworklist/SmokeTests.java b/src/test/java/org/woehlke/simpleworklist/SmokeTests.java index 77a79a1b..a1543af8 100644 --- a/src/test/java/org/woehlke/simpleworklist/SmokeTests.java +++ b/src/test/java/org/woehlke/simpleworklist/SmokeTests.java @@ -1,6 +1,7 @@ package org.woehlke.simpleworklist; import lombok.extern.slf4j.Slf4j; +import org.junit.Before; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -8,14 +9,19 @@ import org.springframework.boot.web.server.LocalServerPort; import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.MockMvc; -import org.woehlke.simpleworklist.config.FunctionalRequirements; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; import org.woehlke.simpleworklist.config.UserAccountTestDataService; import java.net.URL; import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -31,14 +37,14 @@ public class SmokeTests { @Autowired private ServletWebServerApplicationContext server; + @Autowired + private MockMvc mockMvc; + @LocalServerPort private int port; protected URL base; - @Autowired - private MockMvc mockMvc; - @Autowired private UserAccountTestDataService userAccountTestDataService; @@ -52,8 +58,7 @@ public void setUp() throws Exception { log.info(eyecatcherH1); log.info(" @BeforeEach setUp()"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/"); - log.info(" Server URL: "+this.base.toString()); + //userAccountTestDataService.setUp(); log.info(eyecatcherH1); } @@ -73,10 +78,13 @@ public void runBeforeTestClass() throws Exception { } @AfterAll - public void runAfterTestClass() { + public void runAfterTestClass() throws Exception { log.info(eyecatcherH1); log.info(" @AfterTestClass clearContext"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port + "/"); + log.info(" Server URL: "+this.base.toString()); + log.info(eyecatcherH2); SecurityContextHolder.clearContext(); log.info(eyecatcherH1); } @@ -85,10 +93,11 @@ public void runAfterTestClass() { @DisplayName(F001) @Order(1) @Test - public void testF001ServerStarts(){ + public void testF001ServerStarts() throws Exception{ log.info(eyecatcherH1); log.info("testF001ServerStarts"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port + "/"); log.info("Server URL: "+this.base.toString()); assertTrue(true); log.info(eyecatcherH2); @@ -101,11 +110,15 @@ public void testF002HomePageRendered() throws Exception { log.info(eyecatcherH1); log.info("testF002HomePageRendered"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port); + log.info("Server URL: "+this.base.toString()); this.mockMvc.perform(get( this.base.toString() )) .andDo(print()) .andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrl(this.base+"user/login")); - this.mockMvc.perform(get( this.base+"user/login" )) + .andExpect(redirectedUrl(this.base+"/user/login")); + this.base = new URL("http://localhost:" + port + "/user/login"); + log.info("Server URL: "+this.base.toString()); + this.mockMvc.perform(get( this.base.toString())) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string(containsString("SimpleWorklist"))); @@ -148,6 +161,7 @@ public void testF006PageAfterFirstSuccessfulLogin(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F007) @Order(7) @Test @@ -157,6 +171,7 @@ public void testF007AddFirstNewTaskToInbox(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F008) @Order(8) @Test @@ -166,6 +181,7 @@ public void testF008AddAnotherNewTaskToInbox(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F009) @Order(9) @Test @@ -175,6 +191,7 @@ public void testF009AddTaskToProjectRoot(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F010) @Order(10) @Test @@ -184,6 +201,7 @@ public void testF010AddSubProjectToProjectRoot(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F011) @Order(11) @Test @@ -193,6 +211,7 @@ public void testF011SetFocusOfTask(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F012) @Order(12) @Test @@ -202,87 +221,179 @@ public void testF012UnSetFocusOfTask(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F013) @Order(13) @Test - public void testF013ShowTaskstateInbox(){ + public void testF013ShowTaskstateInbox() throws Exception { log.info(eyecatcherH1); log.info("testF013ShowTaskstateInbox"); log.info(eyecatcherH2); + assertNotNull(this.base); + this.base = new URL("http://localhost:" + port + "/taskstate/inbox"); + log.info("Server URL: "+this.base.toString()); + assertNotNull(this.mockMvc); + try { + this.mockMvc.perform(get(this.base.toString())) + .andDo(print()) + .andExpect(status().isOk()); + //.andExpect(content().string(containsString("SimpleWorklist"))); + } catch (UsernameNotFoundException e) { + log.error("UsernameNotFoundException: "+e.getLocalizedMessage()); + } catch (NullPointerException npe){ + log.error("NullPointerException: "+npe.getLocalizedMessage()); + for(StackTraceElement e:npe.getStackTrace()){ + log.error(e.getClassName()+"."+e.getMethodName()+"in: "+e.getFileName()+" line: "+e.getLineNumber()); + } + } + log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F014) @Order(14) @Test - public void testF014ShowTaskstateToday(){ + public void testF014ShowTaskstateToday() throws Exception { log.info(eyecatcherH1); log.info("testF014ShowTaskstateToday"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port + "/taskstate/today"); + log.info("Server URL: "+this.base.toString()); + assertNotNull(this.mockMvc); + this.mockMvc.perform(get(this.base.toString())) + .andDo(print()) + .andExpect(status().isOk()); + //.andExpect(content().string(containsString("SimpleWorklist"))); + log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F015) @Order(15) @Test - public void testF015ShowTaskstateNext(){ + public void testF015ShowTaskstateNext() throws Exception { log.info(eyecatcherH1); log.info("testF015ShowTaskstateNext"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port + "/taskstate/next"); + log.info("Server URL: "+this.base.toString()); + assertNotNull(this.mockMvc); + this.mockMvc.perform(get(this.base.toString())) + .andDo(print()) + .andExpect(status().isOk()); + //.andExpect(content().string(containsString("SimpleWorklist"))); + log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F016) @Order(16) @Test - public void testF016ShowTaskstateWaiting(){ + public void testF016ShowTaskstateWaiting() throws Exception { log.info(eyecatcherH1); log.info("testF016ShowTaskstateWaiting"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port + "/taskstate/waiting"); + log.info("Server URL: "+this.base.toString()); + assertNotNull(this.mockMvc); + this.mockMvc.perform(get(this.base.toString())) + .andDo(print()) + .andExpect(status().isOk()); + //.andExpect(content().string(containsString("SimpleWorklist"))); + log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F017) @Order(17) @Test - public void testF017ShowTaskstateScheduled(){ + public void testF017ShowTaskstateScheduled() throws Exception { log.info(eyecatcherH1); log.info("testF017ShowTaskstateScheduled"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port + "/taskstate/scheduled"); + log.info("Server URL: "+this.base.toString()); + assertNotNull(this.mockMvc); + this.mockMvc.perform(get(this.base.toString())) + .andDo(print()) + .andExpect(status().isOk()); + //.andExpect(content().string(containsString("SimpleWorklist"))); + log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F018) @Order(18) @Test - public void testF018ShowTaskstateSomeday(){ + public void testF018ShowTaskstateSomeday() throws Exception { log.info(eyecatcherH1); log.info("testF018ShowTaskstateSomeday"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port + "/taskstate/someday"); + log.info("Server URL: "+this.base.toString()); + assertNotNull(this.mockMvc); + this.mockMvc.perform(get(this.base.toString())) + .andDo(print()) + .andExpect(status().isOk()); + //.andExpect(content().string(containsString("SimpleWorklist"))); + log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F019) @Order(19) @Test - public void testF019ShowTaskstateFocus(){ + public void testF019ShowTaskstateFocus() throws Exception { log.info(eyecatcherH1); log.info("testF019ShowTaskstateFocus"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port + "/taskstate/focus"); + log.info("Server URL: "+this.base.toString()); + assertNotNull(this.mockMvc); + this.mockMvc.perform(get(this.base.toString())) + .andDo(print()) + .andExpect(status().isOk()); + //.andExpect(content().string(containsString("SimpleWorklist"))); + log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F020) @Order(20) @Test - public void testF020ShowTaskstateCompleted(){ + public void testF020ShowTaskstateCompleted() throws Exception { log.info(eyecatcherH1); log.info("testF020ShowTaskstateCompleted"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port + "/taskstate/completed"); + log.info("Server URL: "+this.base.toString()); + assertNotNull(this.mockMvc); + this.mockMvc.perform(get(this.base.toString())) + .andDo(print()) + .andExpect(status().isOk()); + //.andExpect(content().string(containsString("SimpleWorklist"))); + log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F021) @Order(21) @Test - public void testF021ShowTaskstateTrash(){ + public void testF021ShowTaskstateTrash() throws Exception { log.info(eyecatcherH1); log.info("testF021ShowTaskstateTrash"); log.info(eyecatcherH2); + this.base = new URL("http://localhost:" + port + "/taskstate/trash"); + log.info("Server URL: "+this.base.toString()); + assertNotNull(this.mockMvc); + this.mockMvc.perform(get(this.base.toString())) + .andDo(print()) + .andExpect(status().isOk()); + //.andExpect(content().string(containsString("SimpleWorklist"))); + log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F022) @Order(22) @Test @@ -292,6 +403,7 @@ public void testF022TaskEdit(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F023) @Order(23) @Test @@ -301,6 +413,7 @@ public void testF023TaskEditFormChangeTaskstateViaDropDown(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F024) @Order(24) @Test @@ -310,6 +423,7 @@ public void testF024TaskComplete(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F025) @Order(25) @Test @@ -319,6 +433,7 @@ public void testF025TaskIncomplete(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F026) @Order(26) @Test @@ -328,6 +443,7 @@ public void testF026TaskDelete(){ log.info(eyecatcherH2); } + @WithMockUser(username="test01@test.de") @DisplayName(F027) @Order(27) @Test diff --git a/src/test/java/org/woehlke/simpleworklist/config/UserAccountTestDataServiceImpl.java b/src/test/java/org/woehlke/simpleworklist/config/UserAccountTestDataServiceImpl.java index 05388059..b807e8a9 100644 --- a/src/test/java/org/woehlke/simpleworklist/config/UserAccountTestDataServiceImpl.java +++ b/src/test/java/org/woehlke/simpleworklist/config/UserAccountTestDataServiceImpl.java @@ -68,6 +68,7 @@ public void setUp() { Context persistedContextPrivate = contextService.createNewContext(newContextPrivate, testUser[i]); Context persistedContextWork = contextService.createNewContext(newContextWork, testUser[i]); testUser[i].setDefaultContext(persistedContextPrivate); + persisted = userAccountService.saveAndFlush(testUser[i]); } } } From 1d44d0becf93f056c81a293cb9e4864302dcbb93 Mon Sep 17 00:00:00 2001 From: thomaswoehlke Date: Tue, 7 Apr 2020 21:16:00 +0200 Subject: [PATCH 02/66] Fixed #126 --- .../woehlke/simpleworklist/SmokeTests.java | 105 ++++++++++-------- src/test/resources/logback.xml | 1 + 2 files changed, 58 insertions(+), 48 deletions(-) diff --git a/src/test/java/org/woehlke/simpleworklist/SmokeTests.java b/src/test/java/org/woehlke/simpleworklist/SmokeTests.java index a1543af8..6709ce28 100644 --- a/src/test/java/org/woehlke/simpleworklist/SmokeTests.java +++ b/src/test/java/org/woehlke/simpleworklist/SmokeTests.java @@ -4,24 +4,31 @@ import org.junit.Before; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; +import org.springframework.context.annotation.Import; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; +import org.woehlke.simpleworklist.config.ApplicationProperties; import org.woehlke.simpleworklist.config.UserAccountTestDataService; +import org.woehlke.simpleworklist.config.di.WebMvcConfig; +import org.woehlke.simpleworklist.config.di.WebSecurityConfig; import java.net.URL; import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -32,6 +39,7 @@ @TestInstance(TestInstance.Lifecycle.PER_CLASS) @AutoConfigureMockMvc @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@Import(SimpleworklistApplication.class) public class SmokeTests { @Autowired @@ -43,8 +51,6 @@ public class SmokeTests { @LocalServerPort private int port; - protected URL base; - @Autowired private UserAccountTestDataService userAccountTestDataService; @@ -68,8 +74,8 @@ public void runBeforeTestClass() throws Exception { log.info(eyecatcherH1); log.info(" @BeforeTestClass runBeforeTestClass"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/"); - log.info(" Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/"); + log.info(" Server URL: "+ base.toString()); log.info(eyecatcherH2); userAccountTestDataService.setUp(); log.info(eyecatcherH2); @@ -82,8 +88,8 @@ public void runAfterTestClass() throws Exception { log.info(eyecatcherH1); log.info(" @AfterTestClass clearContext"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/"); - log.info(" Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/"); + log.info(" Server URL: "+ base.toString()); log.info(eyecatcherH2); SecurityContextHolder.clearContext(); log.info(eyecatcherH1); @@ -97,8 +103,8 @@ public void testF001ServerStarts() throws Exception{ log.info(eyecatcherH1); log.info("testF001ServerStarts"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/"); - log.info("Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/"); + log.info("Server URL: "+ base.toString()); assertTrue(true); log.info(eyecatcherH2); } @@ -110,15 +116,15 @@ public void testF002HomePageRendered() throws Exception { log.info(eyecatcherH1); log.info("testF002HomePageRendered"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port); - log.info("Server URL: "+this.base.toString()); - this.mockMvc.perform(get( this.base.toString() )) + URL base = new URL("http://localhost:" + port); + URL redirectedUrl = new URL("http://localhost:" + port+ "/user/login"); + log.info("Server URL: "+ base.toString()); + this.mockMvc.perform(get( base.toString() )) .andDo(print()) .andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrl(this.base+"/user/login")); - this.base = new URL("http://localhost:" + port + "/user/login"); - log.info("Server URL: "+this.base.toString()); - this.mockMvc.perform(get( this.base.toString())) + .andExpect(redirectedUrl(redirectedUrl.toString())); + log.info("Server URL: "+ redirectedUrl.toString()); + this.mockMvc.perform(get(redirectedUrl.toString())) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string(containsString("SimpleWorklist"))); @@ -229,13 +235,12 @@ public void testF013ShowTaskstateInbox() throws Exception { log.info(eyecatcherH1); log.info("testF013ShowTaskstateInbox"); log.info(eyecatcherH2); - assertNotNull(this.base); - this.base = new URL("http://localhost:" + port + "/taskstate/inbox"); - log.info("Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/taskstate/inbox"); + log.info("Server URL: "+ base.toString()); assertNotNull(this.mockMvc); try { - this.mockMvc.perform(get(this.base.toString())) - .andDo(print()) + this.mockMvc.perform(get(base.toString())) + //.andDo(print()) .andExpect(status().isOk()); //.andExpect(content().string(containsString("SimpleWorklist"))); } catch (UsernameNotFoundException e) { @@ -257,11 +262,11 @@ public void testF014ShowTaskstateToday() throws Exception { log.info(eyecatcherH1); log.info("testF014ShowTaskstateToday"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/taskstate/today"); - log.info("Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/taskstate/today"); + log.info("Server URL: "+ base.toString()); assertNotNull(this.mockMvc); - this.mockMvc.perform(get(this.base.toString())) - .andDo(print()) + this.mockMvc.perform(get(base.toString())) + //.andDo(print()) .andExpect(status().isOk()); //.andExpect(content().string(containsString("SimpleWorklist"))); log.info(eyecatcherH2); @@ -275,12 +280,16 @@ public void testF015ShowTaskstateNext() throws Exception { log.info(eyecatcherH1); log.info("testF015ShowTaskstateNext"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/taskstate/next"); - log.info("Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/taskstate/next"); + log.info("Server URL: "+ base.toString()); assertNotNull(this.mockMvc); - this.mockMvc.perform(get(this.base.toString())) - .andDo(print()) - .andExpect(status().isOk()); + MockHttpServletRequestBuilder a = get(base.toString()); + assertNotNull(a); + ResultActions x = this.mockMvc.perform(a); + assertNotNull(x); + ResultActions o = x.andDo(print()); + assertNotNull(o); + o.andExpect(status().isOk()); //.andExpect(content().string(containsString("SimpleWorklist"))); log.info(eyecatcherH2); } @@ -293,10 +302,10 @@ public void testF016ShowTaskstateWaiting() throws Exception { log.info(eyecatcherH1); log.info("testF016ShowTaskstateWaiting"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/taskstate/waiting"); - log.info("Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/taskstate/waiting"); + log.info("Server URL: "+ base.toString()); assertNotNull(this.mockMvc); - this.mockMvc.perform(get(this.base.toString())) + this.mockMvc.perform(get(base.toString())) .andDo(print()) .andExpect(status().isOk()); //.andExpect(content().string(containsString("SimpleWorklist"))); @@ -311,10 +320,10 @@ public void testF017ShowTaskstateScheduled() throws Exception { log.info(eyecatcherH1); log.info("testF017ShowTaskstateScheduled"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/taskstate/scheduled"); - log.info("Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/taskstate/scheduled"); + log.info("Server URL: "+ base.toString()); assertNotNull(this.mockMvc); - this.mockMvc.perform(get(this.base.toString())) + this.mockMvc.perform(get(base.toString())) .andDo(print()) .andExpect(status().isOk()); //.andExpect(content().string(containsString("SimpleWorklist"))); @@ -329,10 +338,10 @@ public void testF018ShowTaskstateSomeday() throws Exception { log.info(eyecatcherH1); log.info("testF018ShowTaskstateSomeday"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/taskstate/someday"); - log.info("Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/taskstate/someday"); + log.info("Server URL: "+base.toString()); assertNotNull(this.mockMvc); - this.mockMvc.perform(get(this.base.toString())) + this.mockMvc.perform(get(base.toString())) .andDo(print()) .andExpect(status().isOk()); //.andExpect(content().string(containsString("SimpleWorklist"))); @@ -347,10 +356,10 @@ public void testF019ShowTaskstateFocus() throws Exception { log.info(eyecatcherH1); log.info("testF019ShowTaskstateFocus"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/taskstate/focus"); - log.info("Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/taskstate/focus"); + log.info("Server URL: "+base.toString()); assertNotNull(this.mockMvc); - this.mockMvc.perform(get(this.base.toString())) + this.mockMvc.perform(get(base.toString())) .andDo(print()) .andExpect(status().isOk()); //.andExpect(content().string(containsString("SimpleWorklist"))); @@ -365,10 +374,10 @@ public void testF020ShowTaskstateCompleted() throws Exception { log.info(eyecatcherH1); log.info("testF020ShowTaskstateCompleted"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/taskstate/completed"); - log.info("Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/taskstate/completed"); + log.info("Server URL: "+base.toString()); assertNotNull(this.mockMvc); - this.mockMvc.perform(get(this.base.toString())) + this.mockMvc.perform(get(base.toString())) .andDo(print()) .andExpect(status().isOk()); //.andExpect(content().string(containsString("SimpleWorklist"))); @@ -383,10 +392,10 @@ public void testF021ShowTaskstateTrash() throws Exception { log.info(eyecatcherH1); log.info("testF021ShowTaskstateTrash"); log.info(eyecatcherH2); - this.base = new URL("http://localhost:" + port + "/taskstate/trash"); - log.info("Server URL: "+this.base.toString()); + URL base = new URL("http://localhost:" + port + "/taskstate/trash"); + log.info("Server URL: "+base.toString()); assertNotNull(this.mockMvc); - this.mockMvc.perform(get(this.base.toString())) + this.mockMvc.perform(get(base.toString())) .andDo(print()) .andExpect(status().isOk()); //.andExpect(content().string(containsString("SimpleWorklist"))); diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml index ef437351..61a64b6e 100644 --- a/src/test/resources/logback.xml +++ b/src/test/resources/logback.xml @@ -6,4 +6,5 @@ + From 0b67cc5ae18ea47224eee2d66654b210a32ae1a2 Mon Sep 17 00:00:00 2001 From: thomaswoehlke Date: Tue, 7 Apr 2020 21:31:05 +0200 Subject: [PATCH 03/66] Fixed #126 --- src/test/java/org/woehlke/simpleworklist/SmokeTests.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/java/org/woehlke/simpleworklist/SmokeTests.java b/src/test/java/org/woehlke/simpleworklist/SmokeTests.java index 6709ce28..f9dc4f69 100644 --- a/src/test/java/org/woehlke/simpleworklist/SmokeTests.java +++ b/src/test/java/org/woehlke/simpleworklist/SmokeTests.java @@ -3,6 +3,7 @@ import lombok.extern.slf4j.Slf4j; import org.junit.Before; import org.junit.jupiter.api.*; +import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -14,6 +15,7 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; @@ -38,6 +40,7 @@ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @TestInstance(TestInstance.Lifecycle.PER_CLASS) @AutoConfigureMockMvc +@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Import(SimpleworklistApplication.class) public class SmokeTests { From 8ea25e3ed1fc8d331151dc565e02297b9cce4af4 Mon Sep 17 00:00:00 2001 From: thomaswoehlke Date: Wed, 8 Apr 2020 15:00:21 +0200 Subject: [PATCH 04/66] Fixed #129, Fixed #126, working on 168 --- etc/TODO.md | 6 ++++-- pom.xml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/etc/TODO.md b/etc/TODO.md index 37048b1b..fb5e52ac 100644 --- a/etc/TODO.md +++ b/etc/TODO.md @@ -88,7 +88,9 @@ https://www.baeldung.com/maven-enforcer-plugin # 2.3.14 Fixed #122, Fixed #123, Fixed #127, Fixed #130, Fixed #152, Fixed #153, Fixed #154, Fixed #155, Fixed #156, Fixed #157, Fixed #158, Fixed #159, Fixed #160, Fixed #161, Fixed #162, Fixed #163, Fixed #164, Fixed #165, Fixed #166, Fixed #167 -Fixed #129 -Fixed #126 + https://developer.okta.com/blog/2019/03/28/test-java-spring-boot-junit5 + +# 2.3.15 +Fixed #129, Fixed #126 diff --git a/pom.xml b/pom.xml index ffd7d508..1eb31282 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.woehlke simpleworklist - 2.3.14-SNAPSHOT + 2.3.15-SNAPSHOT jar org.springframework.boot From 8ac5aaeead5a5f692402f3569440c4734892a871 Mon Sep 17 00:00:00 2001 From: thomaswoehlke Date: Wed, 8 Apr 2020 15:22:23 +0200 Subject: [PATCH 05/66] Fixed #129, Fixed #126, working on 168 --- .../common/AbstractController.java | 11 + .../simpleworklist/taskstate/TaskState.java | 17 + src/main/resources/messages_de.properties | 525 +++++++++--------- .../templates/taskstate/task/edit.html | 16 + 4 files changed, 307 insertions(+), 262 deletions(-) diff --git a/src/main/java/org/woehlke/simpleworklist/common/AbstractController.java b/src/main/java/org/woehlke/simpleworklist/common/AbstractController.java index 0cee5874..b41c3b70 100644 --- a/src/main/java/org/woehlke/simpleworklist/common/AbstractController.java +++ b/src/main/java/org/woehlke/simpleworklist/common/AbstractController.java @@ -9,6 +9,7 @@ import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.project.Project; import org.woehlke.simpleworklist.task.TaskService; +import org.woehlke.simpleworklist.taskstate.TaskState; import org.woehlke.simpleworklist.user.account.UserAccount; import org.woehlke.simpleworklist.task.TaskEnergy; import org.woehlke.simpleworklist.task.TaskTime; @@ -22,6 +23,7 @@ import org.woehlke.simpleworklist.user.account.UserAccountAccessService; import org.woehlke.simpleworklist.user.login.UserAccountLoginSuccessService; +import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -96,6 +98,15 @@ public final List getContexts(){ return contextService.getAllForUser(user); } + @ModelAttribute("listTaskState") + public final List getTaskStates(){ + List listTaskState = new ArrayList<>(TaskState.values().length); + for(TaskState taskState:TaskState.values()){ + listTaskState.add(taskState); + } + return listTaskState; + } + @ModelAttribute("context") public final String getCurrentArea(@ModelAttribute("userSession") UserSessionBean userSession, Locale locale){ diff --git a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskState.java b/src/main/java/org/woehlke/simpleworklist/taskstate/TaskState.java index 852622ee..bf07ca6d 100644 --- a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskState.java +++ b/src/main/java/org/woehlke/simpleworklist/taskstate/TaskState.java @@ -1,8 +1,12 @@ package org.woehlke.simpleworklist.taskstate; +import org.woehlke.simpleworklist.task.TaskEnergy; + import javax.persistence.Enumerated; import javax.persistence.Transient; import java.io.Serializable; +import java.util.Arrays; +import java.util.List; /** * Created by tw on 21.02.16. @@ -40,6 +44,14 @@ public enum TaskState implements Serializable { this.icon=icon; } + public int getId(){ + return this.ordinal(); + } + + public String getValue(){ + return this.name(); + } + public String getCode() { return "layout.page."+this.name().toLowerCase(); } @@ -48,6 +60,11 @@ public String getUrl() { return "/taskstate/"+this.name().toLowerCase(); } + public static List list() { + return Arrays.asList(values()); + } + + public String getIcon() { return icon; } diff --git a/src/main/resources/messages_de.properties b/src/main/resources/messages_de.properties index d8525f5a..60b58594 100644 --- a/src/main/resources/messages_de.properties +++ b/src/main/resources/messages_de.properties @@ -1,262 +1,263 @@ -navbar.brand.name=SimpleWorklist -layout.page.login=Anmelden -layout.page.passwordForgotten=Passwort vergessen? -layout.page.register=Registration als neuer Benutzer -pages.users.h1 = Nachrichten und Registrierte Benutzer -user.loginForm.github=Quellcode bei Github\: -user.loginForm.gtd.copyright=GTD® und Getting Things Done® sind eingetragene Warenzeichen der David Allen Company. SimpleWorklist ist nicht verbunden mit oder empfohlen von der David Allen Company. -user.loginForm.h1=Willkommen bei SimpleWorklist -user.loginForm.h2=Ihre Todo-Liste für Getting Things Done® -user.loginForm.login=Bitte melden Sie sich hier an oder -user.loginForm.loginButton=Anmelden -user.loginForm.loginError=Ihre Anmeldung war nicht erfolgreich, bitte versuchen Sie es noch einmal. -user.loginForm.loginError.caused=Ursache\: -user.loginForm.moreInformation=Für weitere Informationen besuchen Sie diese Seiten\: -user.loginForm.myBlog=Mein Blog\: -user.loginForm.password=Passwort -user.loginForm.passwordReset=Passwort vergessen? -user.loginForm.projectPage=Die Projekt Seite\: -user.loginForm.register=registrieren Sie sich als neuer Benutzer -user.registerNotConfirmed.h1=Registration als neuer Benutzer -user.registerForm.button=Registrieren -user.registerForm.h1=Registration als neuer Benutzer -user.registerSentMail.h1=Registration als neuer Benutzer -user.registerSentMail.text=Zur Verifikation Ihrer Email-Adresse haben wir Ihnen eine Email gesendet. Bitte schauen Sie in Ihr Email-Postfach. -user.resetPasswordConfirmed.button=Neues Passwort speichern -user.resetPasswordConfirmed.h1=Passwort zurück setzen -user.resetPasswordConfirmed.password=Neues Passwort -user.resetPasswordConfirmed.passwordAgain=Neues Passwort wiederholen -user.resetPasswordDone.h1=Passwort zurück setzen -user.resetPasswordDone.text1=Ihr Passwort ist jetzt geändert. Anmelden können Sie sich -user.resetPasswordDone.text2=hier -user.resetPasswordForm.button=Passwort zurück setzen -user.resetPasswordForm.h1=Passwort zurücksetzen -user.resetPasswordNotConfirmed.h1=Password zurück setzen -user.resetPasswordNotConfirmed.text=Tut uns leid. Für Ihre Anfrage haben wir nichts vermerkt. -user.resetPasswordSentMail.h1=Passwort zurück setzen -user.resetPasswordSentMail.text=Wir haben eine Email an Ihre Email-Adresse gesendet. Darin finden Sie weitere Informationen zum Zurück setzen Ihres Passworts. Bitte schauen Sie in Ihren Mail-Eingang. -user.registerNotConfirmed.text=Tut uns leid. Für Ihre Anfrage ist uns keine Registration bekannt. -user.registerDone.h1=Registration als neuer Benutzer -user.registerDone.text1=Sie sind nun registriert. -user.registerDone.text2=Bitte melden Sie sich hier an -user.registerConfirmed.userFullname=Name -user.registerConfirmed.userPassword=Passwort -user.registerConfirmed.userPasswordConfirmation=Password wiederholen -user.registerConfirmed.button=Registration abschliessen -user.registerConfirmed.h1=Registration als neuer Benutzer -pages.users.messages=Nachrichten -pages.users.lastLogin=Letzte Anmeldung -pages.users.dateOfRegistration=Datum der Registrierung -pages.user.profile=User Selfservice -pages.user.profile.change.name=Namen ändern -pages.user.profile.change.password=Password ändern -pages.user.profile.change.contexts=Kontexte ändern -pages.user.profile.add.context=Weiteren Kontext hinzufügen -pages.user.profile.edit.context=Kontext ändern -pages.user.profile.delete.context=Kontext löschen -pages.user.profile.change.language=Sprache einstellen -pages.user.user2user.messages=Dialog mit anderen Benutzern -pages.search=Search Results -pages.user2UserMessages.h1=Ihr Dialog mit -pages.user2UserMessages.newMessage=Neue Nachricht\: -pages.user2UserMessages.newUserMessageButton=Sende Nachricht -pages.user2UserMessages.showAllText1=Zeige alle Nachrichten -pages.user2UserMessages.showAllText2=(hier werden nur die letzten 20 Angezeigt) -project.add.h1=Neues Projekt -project.add.description=Beschreibung -project.add.button=Neues Projekt speichern -project.edit.h1=Projekt ändern -project.edit.description=Beschreibung -project.edit.button=Projekt speichern -project.show.h1=Projekt -project.show.description=Beschreibung -project.show.edit=Projekt ändern -project.show.delete=Projekt löschen -project.show.addTask=Neue Aufgabe -project.show.title=Aufgabe -project.show.text=Text -project.show.dueDate=Fälligkeitsdatum -project.show.taskState=Status -project.show.state.inbox=Eingang -project.show.state.today=Heute -project.show.state.next=als Nächstes -project.show.state.waiting=Warten -project.show.state.scheduled=Eingeplant -project.show.state.someday=Später -project.show.state.completed=Erledigte Aufgaben -project.show.state.trash=Papierkorb -project.show.nothingToDo=Es gibt keine Aufgaben in diesem Projekt. -layout.page.newContent=Neuer Inhalt -layout.page.addProject=Neues Projekt -layout.page.addTask=Neue Aufgabe -layout.page.createTestData=Erzeuge Test-Daten -layout.page.showUsers=Benutzer -layout.page.logout=Abmelden -layout.page.inbox=Eingang -layout.page.today=Heute -layout.page.next=Als Nächstes -layout.page.waiting=Warten -layout.page.scheduled=Eingeplant -layout.page.someday=Später -layout.page.focus=Fokus -layout.page.completed=Erledigt -layout.page.trash=Papierkorb -layout.page.all=Alle Aufgaben -search.resultlist.h1=Suchergebnis für -search.resultlist.h2.noTasks=Keine Aufgaben gefunden -search.resultlist.h2.tasks=Aufgaben -search.resultlist.tasks.title=Aufgabe -search.resultlist.tasks.text=Text -search.resultlist.tasks.dueDate=Fälligkeitsdatum -search.resultlist.tasks.state=Status -search.resultlist.tasks.project=Projekt -search.resultlist.tasks.inbox=Eingang -search.resultlist.tasks.today=Heute -search.resultlist.tasks.next=Als Nächstes -search.resultlist.tasks.waiting=Warten -search.resultlist.tasks.scheduled=Eingeplant -search.resultlist.tasks.someday=Später -search.resultlist.tasks.completed=Erledigte Aufgaben -search.resultlist.tasks.trash=Papierkorb -search.resultlist.projects.h2.noProjects=Keine Projekte gefunden -search.resultlist.projects.h2.projects=Projekte -search.resultlist.projects.name=Name -search.resultlist.projects.description=Beschreibung -task.add.h1=Neue Aufgabe -task.add.title=Aufgabe -task.add.dueDate=Fälligkeitsdatum -task.add.text=Text -task.add.taskEnergy=Energie -task.add.taskTime=Zeit -task.add.button=Neue Aufgabe speichern -layout.page.signedInUser=Angemeldet als -task.show.title=Aufgabe -task.show.dueDate=Fälligkeitsdatum -task.show.text=Beschreibung -task.show.taskEnergy=Energie -task.show.taskTime=Zeit -task.show.button=Aufgabe speichern -task.show.transform=Wandle um in ein Projekt -task.show.button.edit= Aufgabe berarbeiten -task.show.button.close=zurück -right.nav.projects=Projekte -tasks.completed.h1=Erledigte Aufgaben -tasks.completed.delete=Lösche alle erledigten Aufgaben -tasks.completed.title=Aufgabe -tasks.completed.text=Text -tasks.completed.project=Projekt -tasks.completed.noTasks=Sie haben keine erledigten Aufgaben -tasks.focus.h1=Fokus -tasks.focus.title=Aufgabe -tasks.focus.text=Text -tasks.focus.dueDate=Fälligkeitsdatum -tasks.focus.taskState=Status -tasks.focus.project=Projekt -tasks.focus.noTasks=Sie haben keine Aufgaben im Fokus -tasks.inbox.h1=Eingang -tasks.inbox.title=Aufgabe -tasks.inbox.text=Text -tasks.inbox.project=Projekt -tasks.inbox.noTasks=Sie haben keine Aufgaben in Ihrem Eingang -tasks.next.h1=Als Nächstes -tasks.next.title=Aufgabe -tasks.next.text=Text -tasks.next.project=Projekt -tasks.next.noTasks=Sie haben keine Aufgaben als Nächstes -tasks.scheduled.h1=Eingeplant -tasks.scheduled.title=Aufgabe -tasks.scheduled.text=Text -tasks.scheduled.dueDate=Fälligkeitsdatum -tasks.scheduled.project=Projekt -tasks.scheduled.noTasks=Sie haben keine eingeplanten Aufgaben -tasks.someday.h1=Später -tasks.someday.title=Aufgabe -tasks.someday.text=Text -tasks.someday.project=Projekt -tasks.someday.noTasks=Sie haben keine Aufgaben für später -tasks.today.h1=Heute -tasks.today.title=Aufgabe -tasks.today.text=Text -tasks.today.project=Projekt -tasks.today.noTasks=Sie haben keine Aufgaben für Heute -tasks.trash.h1=Papierkorb -tasks.trash.empty=Papierkorb leeren -tasks.trash.title=Aufgabe -tasks.trash.text=Text -tasks.trash.project=Projekt -tasks.trash.noTasks=Sie haben keine Aufgaben im Papierkorb -tasks.waiting.h1=Warten -tasks.waiting.title=Aufgabe -tasks.waiting.text=Text -tasks.waiting.project=Projekt -tasks.waiting.noTasks=Sie warten nicht auf andere -tasks.focus.inbox=Eingang -tasks.focus.today=Heute -tasks.focus.next=Nächstes -tasks.focus.waiting=Warten -tasks.focus.scheduled=Eingeplant -tasks.focus.someday=Später -tasks.focus.completed=Erledigte Aufgaben -tasks.focus.trash=Papierkorb -tasks.inbox.addTask=Neue Aufgabe -enum.taskenergy.low=niedrig -enum.taskenergy.medium=mittel -enum.taskenergy.high=hoch -enum.taskenergy.none=keine -enum.tasktime.min5=5 min -enum.tasktime.min10=10 min -enum.tasktime.min15=15 min -enum.tasktime.min30=30 min -enum.tasktime.min45=45 min -enum.tasktime.hour1=1 Stunde -enum.tasktime.hour2=2 Stunden -enum.tasktime.hour3=3 Stunden -enum.tasktime.hour4=4 Stunden -enum.tasktime.hour6=6 Stunden -enum.tasktime.hour8=8 Stunden -enum.tasktime.more=mehr -enum.tasktime.none=keine -layout.page.contexts=Kontext -user.selfservice.profile.h1=Benutzer Profil -user.selfservice.profile.userEmail=Benutzer Email\: -user.selfservice.profile.name=Name ändern\: -user.selfservice.profile.changePassword=Passwort ändern -user.selfservice.profile.changeContexts=Kontexte ändern -user.selfservice.profile.changeLanguage=Sprache einstellen -button.back= zurück -user.selfservice.name.button=Benutzernamen speichern -user.resetPasswordConfirmed.oldUserPassword=Bestehendes Passwort -user.selfservice.language.button=Setze Sprache -enum.language.de=Deutsch -enum.language.en=Englisch -user.selfservice.language.defaultLanguage=Sprache -user.selfservice.forUser=für Benutzer\: -user.selfservice.contexts.add.button=Neuen Kontext hinzufügen -user.selfservice.contexts.edit=Kontext ändern -user.selfservice.contexts.edit.button=Kontext speichern -user.selfservice.context.default=Setze voreingestellten Kontext -user.selfservice.context.default.button=Voreingestellten Kontext speichern -task.show.context=Kontext ändern -project.edit.context=Kontext -tasks.all.h1=Alle Aufgaben -tasks.all.noTasks=Sie haben keine Aufgaben -tasks.all.context=Kontext -task.col.twtooltip.infoicons.finish.task=Hier können Sie die Aufgabe als erledigt markieren -task.col.twtooltip.infoicons.unfinish.task=Hier können Sie die Aufgabe als doch noch unerledigt markieren -task.col.twtooltip.infoicons.trash=TODO -task.col.twtooltip.infoicons.unsetfocus=Hier können Sie die Aufgabe aus dem Fokus nehmen -task.col.twtooltip.infoicons.setfocus=Hier können Sie die Aufgabe in den Fokus nehmen -task.col.twtooltip.show.details=Hier können Sie sich alle Informationen zu dieser Aufgabe anzeigen lassen -task.col.twtooltip.duedate=Fälligkeitsdatum -task.col.twtooltip.taskstate=Status -task.col.twtooltip.project=Projekt -task.col.twtooltip.badge.taskEnergy=Energie Aufwand -task.col.twtooltip.badge.taskTime=Zeit Aufwand -task.col.twtooltip.context=Kontext -tasks.col.info.icons=  -tasks.col.title=Title -tasks.col.dueDate=Fälligkeitsdatum -tasks.col.taskState=Status -tasks.col.project=Projekt -tasks.col.energyandtime=  -tasks.col.context=Kontext \ No newline at end of file +navbar.brand.name=SimpleWorklist +layout.page.login=Anmelden +layout.page.passwordForgotten=Passwort vergessen? +layout.page.register=Registration als neuer Benutzer +pages.users.h1 = Nachrichten und Registrierte Benutzer +user.loginForm.github=Quellcode bei Github\: +user.loginForm.gtd.copyright=GTD® und Getting Things Done® sind eingetragene Warenzeichen der David Allen Company. SimpleWorklist ist nicht verbunden mit oder empfohlen von der David Allen Company. +user.loginForm.h1=Willkommen bei SimpleWorklist +user.loginForm.h2=Ihre Todo-Liste f�r Getting Things Done® +user.loginForm.login=Bitte melden Sie sich hier an oder +user.loginForm.loginButton=Anmelden +user.loginForm.loginError=Ihre Anmeldung war nicht erfolgreich, bitte versuchen Sie es noch einmal. +user.loginForm.loginError.caused=Ursache\: +user.loginForm.moreInformation=F�r weitere Informationen besuchen Sie diese Seiten\: +user.loginForm.myBlog=Mein Blog\: +user.loginForm.password=Passwort +user.loginForm.passwordReset=Passwort vergessen? +user.loginForm.projectPage=Die Projekt Seite\: +user.loginForm.register=registrieren Sie sich als neuer Benutzer +user.registerNotConfirmed.h1=Registration als neuer Benutzer +user.registerForm.button=Registrieren +user.registerForm.h1=Registration als neuer Benutzer +user.registerSentMail.h1=Registration als neuer Benutzer +user.registerSentMail.text=Zur Verifikation Ihrer Email-Adresse haben wir Ihnen eine Email gesendet. Bitte schauen Sie in Ihr Email-Postfach. +user.resetPasswordConfirmed.button=Neues Passwort speichern +user.resetPasswordConfirmed.h1=Passwort zur�ck setzen +user.resetPasswordConfirmed.password=Neues Passwort +user.resetPasswordConfirmed.passwordAgain=Neues Passwort wiederholen +user.resetPasswordDone.h1=Passwort zur�ck setzen +user.resetPasswordDone.text1=Ihr Passwort ist jetzt ge�ndert. Anmelden k�nnen Sie sich +user.resetPasswordDone.text2=hier +user.resetPasswordForm.button=Passwort zur�ck setzen +user.resetPasswordForm.h1=Passwort zur�cksetzen +user.resetPasswordNotConfirmed.h1=Password zur�ck setzen +user.resetPasswordNotConfirmed.text=Tut uns leid. F�r Ihre Anfrage haben wir nichts vermerkt. +user.resetPasswordSentMail.h1=Passwort zur�ck setzen +user.resetPasswordSentMail.text=Wir haben eine Email an Ihre Email-Adresse gesendet. Darin finden Sie weitere Informationen zum Zur�ck setzen Ihres Passworts. Bitte schauen Sie in Ihren Mail-Eingang. +user.registerNotConfirmed.text=Tut uns leid. F�r Ihre Anfrage ist uns keine Registration bekannt. +user.registerDone.h1=Registration als neuer Benutzer +user.registerDone.text1=Sie sind nun registriert. +user.registerDone.text2=Bitte melden Sie sich hier an +user.registerConfirmed.userFullname=Name +user.registerConfirmed.userPassword=Passwort +user.registerConfirmed.userPasswordConfirmation=Password wiederholen +user.registerConfirmed.button=Registration abschliessen +user.registerConfirmed.h1=Registration als neuer Benutzer +pages.users.messages=Nachrichten +pages.users.lastLogin=Letzte Anmeldung +pages.users.dateOfRegistration=Datum der Registrierung +pages.user.profile=User Selfservice +pages.user.profile.change.name=Namen �ndern +pages.user.profile.change.password=Password �ndern +pages.user.profile.change.contexts=Kontexte �ndern +pages.user.profile.add.context=Weiteren Kontext hinzuf�gen +pages.user.profile.edit.context=Kontext �ndern +pages.user.profile.delete.context=Kontext l�schen +pages.user.profile.change.language=Sprache einstellen +pages.user.user2user.messages=Dialog mit anderen Benutzern +pages.search=Search Results +pages.user2UserMessages.h1=Ihr Dialog mit +pages.user2UserMessages.newMessage=Neue Nachricht\: +pages.user2UserMessages.newUserMessageButton=Sende Nachricht +pages.user2UserMessages.showAllText1=Zeige alle Nachrichten +pages.user2UserMessages.showAllText2=(hier werden nur die letzten 20 Angezeigt) +project.add.h1=Neues Projekt +project.add.description=Beschreibung +project.add.button=Neues Projekt speichern +project.edit.h1=Projekt �ndern +project.edit.description=Beschreibung +project.edit.button=Projekt speichern +project.show.h1=Projekt +project.show.description=Beschreibung +project.show.edit=Projekt �ndern +project.show.delete=Projekt l�schen +project.show.addTask=Neue Aufgabe +project.show.title=Aufgabe +project.show.text=Text +project.show.dueDate=F�lligkeitsdatum +project.show.taskState=Status +project.show.state.inbox=Eingang +project.show.state.today=Heute +project.show.state.next=als N�chstes +project.show.state.waiting=Warten +project.show.state.scheduled=Eingeplant +project.show.state.someday=Sp�ter +project.show.state.completed=Erledigte Aufgaben +project.show.state.trash=Papierkorb +project.show.nothingToDo=Es gibt keine Aufgaben in diesem Projekt. +layout.page.newContent=Neuer Inhalt +layout.page.addProject=Neues Projekt +layout.page.addTask=Neue Aufgabe +layout.page.createTestData=Erzeuge Test-Daten +layout.page.showUsers=Benutzer +layout.page.logout=Abmelden +layout.page.inbox=Eingang +layout.page.today=Heute +layout.page.next=Als N�chstes +layout.page.waiting=Warten +layout.page.scheduled=Eingeplant +layout.page.someday=Sp�ter +layout.page.focus=Fokus +layout.page.completed=Erledigt +layout.page.trash=Papierkorb +layout.page.all=Alle Aufgaben +search.resultlist.h1=Suchergebnis f�r +search.resultlist.h2.noTasks=Keine Aufgaben gefunden +search.resultlist.h2.tasks=Aufgaben +search.resultlist.tasks.title=Aufgabe +search.resultlist.tasks.text=Text +search.resultlist.tasks.dueDate=F�lligkeitsdatum +search.resultlist.tasks.state=Status +search.resultlist.tasks.project=Projekt +search.resultlist.tasks.inbox=Eingang +search.resultlist.tasks.today=Heute +search.resultlist.tasks.next=Als N�chstes +search.resultlist.tasks.waiting=Warten +search.resultlist.tasks.scheduled=Eingeplant +search.resultlist.tasks.someday=Sp�ter +search.resultlist.tasks.completed=Erledigte Aufgaben +search.resultlist.tasks.trash=Papierkorb +search.resultlist.projects.h2.noProjects=Keine Projekte gefunden +search.resultlist.projects.h2.projects=Projekte +search.resultlist.projects.name=Name +search.resultlist.projects.description=Beschreibung +task.add.h1=Neue Aufgabe +task.add.title=Aufgabe +task.add.dueDate=F�lligkeitsdatum +task.add.text=Text +task.add.taskEnergy=Energie +task.add.taskTime=Zeit +task.add.button=Neue Aufgabe speichern +layout.page.signedInUser=Angemeldet als +task.show.title=Aufgabe +task.show.dueDate=F�lligkeitsdatum +task.show.text=Beschreibung +task.show.taskState=Status +task.show.taskEnergy=Energie +task.show.taskTime=Zeit +task.show.button=Aufgabe speichern +task.show.transform=Wandle um in ein Projekt +task.show.button.edit= Aufgabe berarbeiten +task.show.button.close=zur�ck +right.nav.projects=Projekte +tasks.completed.h1=Erledigte Aufgaben +tasks.completed.delete=L�sche alle erledigten Aufgaben +tasks.completed.title=Aufgabe +tasks.completed.text=Text +tasks.completed.project=Projekt +tasks.completed.noTasks=Sie haben keine erledigten Aufgaben +tasks.focus.h1=Fokus +tasks.focus.title=Aufgabe +tasks.focus.text=Text +tasks.focus.dueDate=F�lligkeitsdatum +tasks.focus.taskState=Status +tasks.focus.project=Projekt +tasks.focus.noTasks=Sie haben keine Aufgaben im Fokus +tasks.inbox.h1=Eingang +tasks.inbox.title=Aufgabe +tasks.inbox.text=Text +tasks.inbox.project=Projekt +tasks.inbox.noTasks=Sie haben keine Aufgaben in Ihrem Eingang +tasks.next.h1=Als N�chstes +tasks.next.title=Aufgabe +tasks.next.text=Text +tasks.next.project=Projekt +tasks.next.noTasks=Sie haben keine Aufgaben als N�chstes +tasks.scheduled.h1=Eingeplant +tasks.scheduled.title=Aufgabe +tasks.scheduled.text=Text +tasks.scheduled.dueDate=F�lligkeitsdatum +tasks.scheduled.project=Projekt +tasks.scheduled.noTasks=Sie haben keine eingeplanten Aufgaben +tasks.someday.h1=Sp�ter +tasks.someday.title=Aufgabe +tasks.someday.text=Text +tasks.someday.project=Projekt +tasks.someday.noTasks=Sie haben keine Aufgaben f�r sp�ter +tasks.today.h1=Heute +tasks.today.title=Aufgabe +tasks.today.text=Text +tasks.today.project=Projekt +tasks.today.noTasks=Sie haben keine Aufgaben f�r Heute +tasks.trash.h1=Papierkorb +tasks.trash.empty=Papierkorb leeren +tasks.trash.title=Aufgabe +tasks.trash.text=Text +tasks.trash.project=Projekt +tasks.trash.noTasks=Sie haben keine Aufgaben im Papierkorb +tasks.waiting.h1=Warten +tasks.waiting.title=Aufgabe +tasks.waiting.text=Text +tasks.waiting.project=Projekt +tasks.waiting.noTasks=Sie warten nicht auf andere +tasks.focus.inbox=Eingang +tasks.focus.today=Heute +tasks.focus.next=N�chstes +tasks.focus.waiting=Warten +tasks.focus.scheduled=Eingeplant +tasks.focus.someday=Sp�ter +tasks.focus.completed=Erledigte Aufgaben +tasks.focus.trash=Papierkorb +tasks.inbox.addTask=Neue Aufgabe +enum.taskenergy.low=niedrig +enum.taskenergy.medium=mittel +enum.taskenergy.high=hoch +enum.taskenergy.none=keine +enum.tasktime.min5=5 min +enum.tasktime.min10=10 min +enum.tasktime.min15=15 min +enum.tasktime.min30=30 min +enum.tasktime.min45=45 min +enum.tasktime.hour1=1 Stunde +enum.tasktime.hour2=2 Stunden +enum.tasktime.hour3=3 Stunden +enum.tasktime.hour4=4 Stunden +enum.tasktime.hour6=6 Stunden +enum.tasktime.hour8=8 Stunden +enum.tasktime.more=mehr +enum.tasktime.none=keine +layout.page.contexts=Kontext +user.selfservice.profile.h1=Benutzer Profil +user.selfservice.profile.userEmail=Benutzer Email\: +user.selfservice.profile.name=Name �ndern\: +user.selfservice.profile.changePassword=Passwort �ndern +user.selfservice.profile.changeContexts=Kontexte �ndern +user.selfservice.profile.changeLanguage=Sprache einstellen +button.back= zur�ck +user.selfservice.name.button=Benutzernamen speichern +user.resetPasswordConfirmed.oldUserPassword=Bestehendes Passwort +user.selfservice.language.button=Setze Sprache +enum.language.de=Deutsch +enum.language.en=Englisch +user.selfservice.language.defaultLanguage=Sprache +user.selfservice.forUser=f�r Benutzer\: +user.selfservice.contexts.add.button=Neuen Kontext hinzuf�gen +user.selfservice.contexts.edit=Kontext �ndern +user.selfservice.contexts.edit.button=Kontext speichern +user.selfservice.context.default=Setze voreingestellten Kontext +user.selfservice.context.default.button=Voreingestellten Kontext speichern +task.show.context=Kontext �ndern +project.edit.context=Kontext +tasks.all.h1=Alle Aufgaben +tasks.all.noTasks=Sie haben keine Aufgaben +tasks.all.context=Kontext +task.col.twtooltip.infoicons.finish.task=Hier k�nnen Sie die Aufgabe als erledigt markieren +task.col.twtooltip.infoicons.unfinish.task=Hier k�nnen Sie die Aufgabe als doch noch unerledigt markieren +task.col.twtooltip.infoicons.trash=TODO +task.col.twtooltip.infoicons.unsetfocus=Hier k�nnen Sie die Aufgabe aus dem Fokus nehmen +task.col.twtooltip.infoicons.setfocus=Hier k�nnen Sie die Aufgabe in den Fokus nehmen +task.col.twtooltip.show.details=Hier k�nnen Sie sich alle Informationen zu dieser Aufgabe anzeigen lassen +task.col.twtooltip.duedate=F�lligkeitsdatum +task.col.twtooltip.taskstate=Status +task.col.twtooltip.project=Projekt +task.col.twtooltip.badge.taskEnergy=Energie Aufwand +task.col.twtooltip.badge.taskTime=Zeit Aufwand +task.col.twtooltip.context=Kontext +tasks.col.info.icons=  +tasks.col.title=Title +tasks.col.dueDate=F�lligkeitsdatum +tasks.col.taskState=Status +tasks.col.project=Projekt +tasks.col.energyandtime=  +tasks.col.context=Kontext diff --git a/src/main/resources/templates/taskstate/task/edit.html b/src/main/resources/templates/taskstate/task/edit.html index 80163b8f..dc58a2a2 100644 --- a/src/main/resources/templates/taskstate/task/edit.html +++ b/src/main/resources/templates/taskstate/task/edit.html @@ -55,6 +55,22 @@

+ + + + +
+
+
+
+
  +
+ + + +
+
+
+
+
- - - - -
-
-
-
-
  -
From 21039a5789b5563a90e58c9b455f27a46c982232 Mon Sep 17 00:00:00 2001 From: thomaswoehlke Date: Wed, 8 Apr 2020 16:59:57 +0200 Subject: [PATCH 08/66] Fixed #129, Fixed #126, working on 168 --- .../java/org/woehlke/simpleworklist/task/TaskController.java | 2 +- src/main/resources/templates/taskstate/task/edit.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskController.java b/src/main/java/org/woehlke/simpleworklist/task/TaskController.java index 8ec4178c..7688d684 100644 --- a/src/main/java/org/woehlke/simpleworklist/task/TaskController.java +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskController.java @@ -98,7 +98,7 @@ public final String editTaskPost( if(task.getDueDate()==null){ persistentTask.setDueDate(null); if(persistentTask.getTaskState().compareTo(TaskState.SCHEDULED)==0){ - persistentTask.setTaskState(TaskState.INBOX); + persistentTask.setTaskState(task.getTaskState()); } } else { persistentTask.setDueDate(task.getDueDate()); diff --git a/src/main/resources/templates/taskstate/task/edit.html b/src/main/resources/templates/taskstate/task/edit.html index 5c495157..f98f3755 100644 --- a/src/main/resources/templates/taskstate/task/edit.html +++ b/src/main/resources/templates/taskstate/task/edit.html @@ -36,7 +36,7 @@

From 01187d923f690034905a251430e2f38b287974ab Mon Sep 17 00:00:00 2001 From: thomaswoehlke Date: Wed, 8 Apr 2020 22:38:51 +0200 Subject: [PATCH 13/66] Fixed #129, Fixed #126, working on 168 --- .../woehlke/simpleworklist/common/AuditModel.java | 7 +++---- .../woehlke/simpleworklist/context/Context.java | 10 ++++++++-- .../java/org/woehlke/simpleworklist/task/Task.java | 9 ++++++++- .../taskstate/TaskStateMoveController.java | 4 +++- .../simpleworklist/user/account/UserAccount.java | 14 ++++++-------- .../user/account/UserAccountServiceImpl.java | 9 +++++---- .../resources/templates/taskstate/task/edit.html | 2 -- 7 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/woehlke/simpleworklist/common/AuditModel.java b/src/main/java/org/woehlke/simpleworklist/common/AuditModel.java index d5595678..e10e8205 100644 --- a/src/main/java/org/woehlke/simpleworklist/common/AuditModel.java +++ b/src/main/java/org/woehlke/simpleworklist/common/AuditModel.java @@ -1,17 +1,17 @@ package org.woehlke.simpleworklist.common; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.hibernate.id.UUIDGenerator; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; -import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.Date; import java.util.Objects; -import java.util.UUID; +; @MappedSuperclass @EntityListeners(AuditingEntityListener.class) @JsonIgnoreProperties( @@ -22,9 +22,8 @@ public class AuditModel implements Serializable { private static final long serialVersionUID = 4399373914714726911L; - @NotNull @Column(name="uuid", nullable = false) - protected String uuid = UUID.randomUUID().toString(); + protected String uuid; @Temporal(TemporalType.TIMESTAMP) @Column(name = "row_created_at", nullable = false, updatable = false) diff --git a/src/main/java/org/woehlke/simpleworklist/context/Context.java b/src/main/java/org/woehlke/simpleworklist/context/Context.java index 830a47b2..3b313c3c 100644 --- a/src/main/java/org/woehlke/simpleworklist/context/Context.java +++ b/src/main/java/org/woehlke/simpleworklist/context/Context.java @@ -1,7 +1,10 @@ package org.woehlke.simpleworklist.context; import lombok.*; +import org.hibernate.annotations.LazyToOne; import org.hibernate.validator.constraints.Length; + +import javax.validation.Valid; import javax.validation.constraints.NotBlank; import org.hibernate.validator.constraints.SafeHtml; import org.woehlke.simpleworklist.common.AuditModel; @@ -13,6 +16,8 @@ import java.io.Serializable; import java.util.Objects; +import static org.hibernate.annotations.LazyToOneOption.PROXY; + /** * Created by tw on 13.03.16. */ @@ -56,16 +61,17 @@ public class Context extends AuditModel implements Serializable, ComparableById< CascadeType.REFRESH }) @JoinColumn(name = "user_account_id") + @LazyToOne(PROXY) private UserAccount userAccount; @SafeHtml(whitelistType = SafeHtml.WhiteListType.NONE) - @NotBlank + //@NotBlank @Length(min = 1, max = 255) @Column(name = "name_de", nullable = false) private String nameDe; @SafeHtml(whitelistType = SafeHtml.WhiteListType.NONE) - @NotBlank + //@NotBlank @Length(min = 1, max = 255) @Column(name = "name_en", nullable = false) private String nameEn; diff --git a/src/main/java/org/woehlke/simpleworklist/task/Task.java b/src/main/java/org/woehlke/simpleworklist/task/Task.java index df9fbba6..bce14858 100644 --- a/src/main/java/org/woehlke/simpleworklist/task/Task.java +++ b/src/main/java/org/woehlke/simpleworklist/task/Task.java @@ -10,10 +10,15 @@ import lombok.Getter; import lombok.Setter; +import org.hibernate.annotations.LazyToOne; import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDeleteAction; import org.hibernate.validator.constraints.Length; + +import javax.validation.Valid; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + import org.hibernate.validator.constraints.SafeHtml; import org.springframework.format.annotation.DateTimeFormat; import org.woehlke.simpleworklist.context.Context; @@ -23,6 +28,8 @@ import org.woehlke.simpleworklist.common.AuditModel; import org.woehlke.simpleworklist.common.ComparableById; +import static org.hibernate.annotations.LazyToOneOption.PROXY; + @Entity @Table( name="task", @@ -83,10 +90,10 @@ public class Task extends AuditModel implements Serializable, ComparableById
- -