diff --git a/.gitignore b/.gitignore index ba593153..62a80353 100644 --- a/.gitignore +++ b/.gitignore @@ -32,7 +32,6 @@ setenv.cmd /etc/pom.xml /src/main/java/org/woehlke/simpleworklist/project/x.txt /src/main/java/org/woehlke/simpleworklist/task/x.txt -/src/main/java/org/woehlke/simpleworklist/taskstate/x.txt /src/main/java/org/woehlke/simpleworklist/context/x.txt /src/main/java/org/woehlke/simpleworklist/error/x.txt -/src/main/java/org/woehlke/simpleworklist/search/x.txt +/src/main/java/org/woehlke/simpleworklist/searchRequest/x.txt diff --git a/etc/TODO.md b/etc/TODO.md index 37048b1b..ab41c606 100644 --- a/etc/TODO.md +++ b/etc/TODO.md @@ -88,7 +88,13 @@ 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, Fixed #168 +https://github.com/thymeleaf/thymeleaf-testing + +# 2.3.16 +Fixed #169, Fixed #170, Fixed #171, Fixed #172, Fixed #183 diff --git a/etc/requirements/Requirements.md b/etc/requirements/Requirements.md index 5ab6fa09..e457edfb 100644 --- a/etc/requirements/Requirements.md +++ b/etc/requirements/Requirements.md @@ -1,55 +1,64 @@ # Functional Requirements ## F001 Server Starts - ## F002 Home Page rendered - ## F003 Registration - ## F004 Password Recovery - ## F005 Login - ## F006 Page after first successful Login -## F007 Add first new Task to Inbox - -## F008 Add another new Task to Inbox - -## F009 Add Task to Project/Root - -## F010 Add SubProject to Project/Root - -## F011 setFocus of a Task - -## F012 unSetFocus of a Task - -## F013 show /taskstate/inbox - -## F014 show /taskstate/today - -## F015 show /taskstate/next - -## F016 show /taskstate/waiting - -## F017 show /taskstate/scheduled - -## F018 show /taskstate/someday - -## F019 show /taskstate/focus - -## F020 show /taskstate/completed - -## F021 show /taskstate/trash - -## F022 Task Edit - -## F023 Task Edit Form -> change Taskstate via DropDown - -## F024 Task complete - -## F025 Task incomplete - -## F026 Task delete - -## F027 Task undelete +## F010 show /taskstate/inbox +## F011 show /taskstate/today +## F012 show /taskstate/next +## F013 show /taskstate/waiting +## F014 show /taskstate/scheduled +## F015 show /taskstate/someday +## F016 show /taskstate/focus +## F017 show /taskstate/completed +## F018 show /taskstate/trash + +## F020 Task move to /taskstate/inbox +## F021 Task move to /taskstate/today +## F022 Task move to /taskstate/next +## F023 Task move to /taskstate/waiting +## F024 Task move to /taskstate/scheduled +## F025 Task move to /taskstate/someday +## F026 Task move to /taskstate/focus +## F027 Task move to /taskstate/completed +## F028 Task move to /taskstate/trash + +## F030 Taskstate: Add Task to Inbox +## F031 Taskstate: Add Task to Inbox again +## F032 Taskstate: Task Edit +## F033 Taskstate: Task Edit Form -> change Taskstate via DropDown +## F034 Taskstate: Task Edit Form -> transform to Project +## F035 Taskstate: Task setFocus +## F036 Taskstate: Task unSetFocus +## F037 Taskstate: Task complete +## F038 Taskstate: Task incomplete +## F039 Taskstate: Task delete +## F040 Taskstate: Task undelete + +## F050 Project/Root: Add Task +## F051 Project/Root: Add SubProject +## F052 Project/Root: Task Edit +## F053 Project/Root: Task Edit Form -> change Taskstate via DropDown +## F054 Project/Root: Task Edit Form -> transform to Project +## F055 Project/Root: Task setFocus +## F056 Project/Root: Task unSetFocus +## F057 Project/Root: Task complete +## F058 Project/Root: Task incomplete +## F059 Project/Root: Task delete +## F060 Project/Root: Task undelete + +## F070 Project/id: Add Task +## F071 Project/id: Add SubProject +## F072 Project/id: Task Edit +## F073 Project/id: Task Edit Form -> change Taskstate via DropDown +## F074 Project/id: Task Edit Form -> transform to Project +## F075 Project/id: Task setFocus +## F076 Project/id: Task unSetFocus +## F077 Project/id: Task complete +## F078 Project/id: Task incomplete +## F079 Project/id: Task delete +## F080 Project/id: Task undelete diff --git a/etc/serialversions/classpath.txt b/etc/serialversions/classpath.txt index 3c4c83d3..e6cd7902 100644 --- a/etc/serialversions/classpath.txt +++ b/etc/serialversions/classpath.txt @@ -1 +1 @@ -C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-activemq\2.1.3.RELEASE\spring-boot-starter-activemq-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter\2.1.3.RELEASE\spring-boot-starter-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.1.3.RELEASE\spring-boot-starter-logging-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\tw\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\tw\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;C:\Users\tw\.m2\repository\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;C:\Users\tw\.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;C:\Users\tw\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\tw\.m2\repository\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;C:\Users\tw\.m2\repository\org\springframework\spring-jms\5.1.5.RELEASE\spring-jms-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-tx\5.1.5.RELEASE\spring-tx-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\apache\activemq\activemq-broker\5.15.8\activemq-broker-5.15.8.jar;C:\Users\tw\.m2\repository\org\apache\activemq\activemq-client\5.15.8\activemq-client-5.15.8.jar;C:\Users\tw\.m2\repository\org\fusesource\hawtbuf\hawtbuf\1.11\hawtbuf-1.11.jar;C:\Users\tw\.m2\repository\org\apache\geronimo\specs\geronimo-j2ee-management_1.1_spec\1.0.1\geronimo-j2ee-management_1.1_spec-1.0.1.jar;C:\Users\tw\.m2\repository\org\apache\activemq\activemq-openwire-legacy\5.15.8\activemq-openwire-legacy-5.15.8.jar;C:\Users\tw\.m2\repository\com\google\guava\guava\18.0\guava-18.0.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.8\jackson-databind-2.9.8.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.8\jackson-core-2.9.8.jar;C:\Users\tw\.m2\repository\javax\jms\javax.jms-api\2.0.1\javax.jms-api-2.0.1.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-actuator\2.1.3.RELEASE\spring-boot-starter-actuator-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.1.3.RELEASE\spring-boot-actuator-autoconfigure-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-actuator\2.1.3.RELEASE\spring-boot-actuator-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.8\jackson-datatype-jsr310-2.9.8.jar;C:\Users\tw\.m2\repository\io\micrometer\micrometer-core\1.1.3\micrometer-core-1.1.3.jar;C:\Users\tw\.m2\repository\org\hdrhistogram\HdrHistogram\2.1.9\HdrHistogram-2.1.9.jar;C:\Users\tw\.m2\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.1.3.RELEASE\spring-boot-starter-data-jpa-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.1.3.RELEASE\spring-boot-starter-aop-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\aspectj\aspectjweaver\1.9.2\aspectjweaver-1.9.2.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.1.3.RELEASE\spring-boot-starter-jdbc-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;C:\Users\tw\.m2\repository\javax\transaction\javax.transaction-api\1.3\javax.transaction-api-1.3.jar;C:\Users\tw\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\tw\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\tw\.m2\repository\org\hibernate\hibernate-core\5.3.7.Final\hibernate-core-5.3.7.Final.jar;C:\Users\tw\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\tw\.m2\repository\org\javassist\javassist\3.23.1-GA\javassist-3.23.1-GA.jar;C:\Users\tw\.m2\repository\net\bytebuddy\byte-buddy\1.9.10\byte-buddy-1.9.10.jar;C:\Users\tw\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\tw\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\tw\.m2\repository\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;C:\Users\tw\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\tw\.m2\repository\org\springframework\data\spring-data-jpa\2.1.5.RELEASE\spring-data-jpa-2.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-orm\5.1.5.RELEASE\spring-orm-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-aspects\5.1.5.RELEASE\spring-aspects-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-integration\2.1.3.RELEASE\spring-boot-starter-integration-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\integration\spring-integration-core\5.1.3.RELEASE\spring-integration-core-5.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\retry\spring-retry\1.2.4.RELEASE\spring-retry-1.2.4.RELEASE.jar;C:\Users\tw\.m2\repository\io\projectreactor\reactor-core\3.2.6.RELEASE\reactor-core-3.2.6.RELEASE.jar;C:\Users\tw\.m2\repository\org\reactivestreams\reactive-streams\1.0.2\reactive-streams-1.0.2.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-jersey\2.1.3.RELEASE\spring-boot-starter-jersey-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.1.3.RELEASE\spring-boot-starter-json-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.8\jackson-datatype-jdk8-2.9.8.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.8\jackson-module-parameter-names-2.9.8.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.1.3.RELEASE\spring-boot-starter-tomcat-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.16\tomcat-embed-core-9.0.16.jar;C:\Users\tw\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.16\tomcat-embed-websocket-9.0.16.jar;C:\Users\tw\.m2\repository\org\springframework\spring-web\5.1.5.RELEASE\spring-web-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\core\jersey-server\2.27\jersey-server-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\core\jersey-common\2.27\jersey-common-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\osgi-resource-locator\1.0.1\osgi-resource-locator-1.0.1.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\core\jersey-client\2.27\jersey-client-2.27.jar;C:\Users\tw\.m2\repository\javax\ws\rs\javax.ws.rs-api\2.1\javax.ws.rs-api-2.1.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\media\jersey-media-jaxb\2.27\jersey-media-jaxb-2.27.jar;C:\Users\tw\.m2\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\containers\jersey-container-servlet-core\2.27\jersey-container-servlet-core-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\containers\jersey-container-servlet\2.27\jersey-container-servlet-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\ext\jersey-bean-validation\2.27\jersey-bean-validation-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\ext\jersey-spring4\2.27\jersey-spring4-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\inject\jersey-hk2\2.27\jersey-hk2-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-locator\2.5.0-b42\hk2-locator-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\external\aopalliance-repackaged\2.5.0-b42\aopalliance-repackaged-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2\2.5.0-b42\hk2-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-utils\2.5.0-b42\hk2-utils-2.5.0-b42.jar;C:\Users\tw\.m2\repository\javax\inject\javax.inject\1\javax.inject-1.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-api\2.5.0-b42\hk2-api-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\config-types\2.5.0-b42\config-types-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-core\2.5.0-b42\hk2-core-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-config\2.5.0-b42\hk2-config-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-runlevel\2.5.0-b42\hk2-runlevel-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\class-model\2.5.0-b42\class-model-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\external\asm-all-repackaged\2.5.0-b42\asm-all-repackaged-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\spring-bridge\2.5.0-b42\spring-bridge-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\media\jersey-media-json-jackson\2.27\jersey-media-json-jackson-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\ext\jersey-entity-filtering\2.27\jersey-entity-filtering-2.27.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\module\jackson-module-jaxb-annotations\2.9.8\jackson-module-jaxb-annotations-2.9.8.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-mail\2.1.3.RELEASE\spring-boot-starter-mail-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-context-support\5.1.5.RELEASE\spring-context-support-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\com\sun\mail\javax.mail\1.6.2\javax.mail-1.6.2.jar;C:\Users\tw\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-security\2.1.3.RELEASE\spring-boot-starter-security-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-aop\5.1.5.RELEASE\spring-aop-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\security\spring-security-config\5.1.4.RELEASE\spring-security-config-5.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\security\spring-security-web\5.1.4.RELEASE\spring-security-web-5.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-thymeleaf\2.1.3.RELEASE\spring-boot-starter-thymeleaf-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-validation\2.1.3.RELEASE\spring-boot-starter-validation-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.16\tomcat-embed-el-9.0.16.jar;C:\Users\tw\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.14.Final\hibernate-validator-6.0.14.Final.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.1.3.RELEASE\spring-boot-starter-web-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-webmvc\5.1.5.RELEASE\spring-webmvc-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-websocket\2.1.3.RELEASE\spring-boot-starter-websocket-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-messaging\5.1.5.RELEASE\spring-messaging-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-websocket\5.1.5.RELEASE\spring-websocket-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-devtools\2.1.3.RELEASE\spring-boot-devtools-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot\2.1.3.RELEASE\spring-boot-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.1.3.RELEASE\spring-boot-autoconfigure-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\com\h2database\h2\1.4.197\h2-1.4.197.jar;C:\Users\tw\.m2\repository\mysql\mysql-connector-java\8.0.15\mysql-connector-java-8.0.15.jar;C:\Users\tw\.m2\repository\org\postgresql\postgresql\42.2.5\postgresql-42.2.5.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-configuration-processor\2.1.3.RELEASE\spring-boot-configuration-processor-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\projectlombok\lombok\1.18.6\lombok-1.18.6.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-test\2.1.3.RELEASE\spring-boot-starter-test-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-test\2.1.3.RELEASE\spring-boot-test-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\2.1.3.RELEASE\spring-boot-test-autoconfigure-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\com\jayway\jsonpath\json-path\2.4.0\json-path-2.4.0.jar;C:\Users\tw\.m2\repository\net\minidev\json-smart\2.3\json-smart-2.3.jar;C:\Users\tw\.m2\repository\net\minidev\accessors-smart\1.2\accessors-smart-1.2.jar;C:\Users\tw\.m2\repository\org\ow2\asm\asm\5.0.4\asm-5.0.4.jar;C:\Users\tw\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\tw\.m2\repository\org\assertj\assertj-core\3.11.1\assertj-core-3.11.1.jar;C:\Users\tw\.m2\repository\org\mockito\mockito-core\2.23.4\mockito-core-2.23.4.jar;C:\Users\tw\.m2\repository\net\bytebuddy\byte-buddy-agent\1.9.10\byte-buddy-agent-1.9.10.jar;C:\Users\tw\.m2\repository\org\objenesis\objenesis\2.6\objenesis-2.6.jar;C:\Users\tw\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\tw\.m2\repository\org\hamcrest\hamcrest-library\1.3\hamcrest-library-1.3.jar;C:\Users\tw\.m2\repository\org\skyscreamer\jsonassert\1.5.0\jsonassert-1.5.0.jar;C:\Users\tw\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\tw\.m2\repository\org\springframework\spring-core\5.1.5.RELEASE\spring-core-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-jcl\5.1.5.RELEASE\spring-jcl-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-test\5.1.5.RELEASE\spring-test-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\xmlunit\xmlunit-core\2.6.2\xmlunit-core-2.6.2.jar;C:\Users\tw\.m2\repository\org\springframework\security\spring-security-test\5.1.4.RELEASE\spring-security-test-5.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\hibernate\hibernate-search-orm\5.10.5.Final\hibernate-search-orm-5.10.5.Final.jar;C:\Users\tw\.m2\repository\org\hibernate\hibernate-search-engine\5.10.5.Final\hibernate-search-engine-5.10.5.Final.jar;C:\Users\tw\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.5.Final\hibernate-commons-annotations-5.0.5.Final.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-misc\5.5.5\lucene-misc-5.5.5.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-analyzers-common\5.5.5\lucene-analyzers-common-5.5.5.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-facet\5.5.5\lucene-facet-5.5.5.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-queries\5.5.5\lucene-queries-5.5.5.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-queryparser\5.5.5\lucene-queryparser-5.5.5.jar;C:\Users\tw\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-core\5.5.4\lucene-core-5.5.4.jar;C:\Users\tw\.m2\repository\org\webjars\font-awesome\5.8.1\font-awesome-5.8.1.jar;C:\Users\tw\.m2\repository\org\webjars\jquery-ui\1.12.1\jquery-ui-1.12.1.jar;C:\Users\tw\.m2\repository\org\webjars\jquery\3.3.1\jquery-3.3.1.jar;C:\Users\tw\.m2\repository\org\webjars\popper.js\1.14.7\popper.js-1.14.7.jar;C:\Users\tw\.m2\repository\org\webjars\bootstrap\4.3.1\bootstrap-4.3.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm\1.11.2\maven-scm-1.11.2.pom;C:\Users\tw\.m2\repository\org\codehaus\plexus\plexus-utils\3.1.0\plexus-utils-3.1.0.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-providers-git\1.11.2\maven-scm-providers-git-1.11.2.pom;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-api\1.11.2\maven-scm-api-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-providers-standard\1.11.2\maven-scm-providers-standard-1.11.2.pom;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-accurev\1.11.2\maven-scm-provider-accurev-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-bazaar\1.11.2\maven-scm-provider-bazaar-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-clearcase\1.11.2\maven-scm-provider-clearcase-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-cvsexe\1.11.2\maven-scm-provider-cvsexe-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-cvs-commons\1.11.2\maven-scm-provider-cvs-commons-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-cvsjava\1.11.2\maven-scm-provider-cvsjava-1.11.2.jar;C:\Users\tw\.m2\repository\org\netbeans\lib\cvsclient\20060125\cvsclient-20060125.jar;C:\Users\tw\.m2\repository\ch\ethz\ganymed\ganymed-ssh2\build210\ganymed-ssh2-build210.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-hg\1.11.2\maven-scm-provider-hg-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-perforce\1.11.2\maven-scm-provider-perforce-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-starteam\1.11.2\maven-scm-provider-starteam-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-svnexe\1.11.2\maven-scm-provider-svnexe-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-synergy\1.11.2\maven-scm-provider-synergy-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-vss\1.11.2\maven-scm-provider-vss-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-tfs\1.11.2\maven-scm-provider-tfs-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-integrity\1.11.2\maven-scm-provider-integrity-1.11.2.jar;C:\Users\tw\.m2\repository\com\mks\api\mksapi-jar\4.10.9049\mksapi-jar-4.10.9049.jar;C:\Users\tw\.m2\repository\org\codehaus\groovy\groovy-all\1.7.6\groovy-all-1.7.6.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-jazz\1.11.2\maven-scm-provider-jazz-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-providers\1.11.2\maven-scm-providers-1.11.2.pom;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-managers\1.11.2\maven-scm-managers-1.11.2.pom;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-local\1.11.2\maven-scm-provider-local-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-git-commons\1.11.2\maven-scm-provider-git-commons-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-gitexe\1.11.2\maven-scm-provider-gitexe-1.11.2.jar;C:\Users\tw\.m2\repository\commons-io\commons-io\2.6\commons-io-2.6.jar;C:\Users\tw\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;C:\Users\tw\.m2\repository\org\apache\maven\plugins\maven-scm-plugin\1.11.2\maven-scm-plugin-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-project\2.2.1\maven-project-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-profile\2.2.1\maven-profile-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-model\2.2.1\maven-model-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-artifact-manager\2.2.1\maven-artifact-manager-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-repository-metadata\2.2.1\maven-repository-metadata-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\wagon\wagon-provider-api\1.0-beta-6\wagon-provider-api-1.0-beta-6.jar;C:\Users\tw\.m2\repository\backport-util-concurrent\backport-util-concurrent\3.1\backport-util-concurrent-3.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-plugin-registry\2.2.1\maven-plugin-registry-2.2.1.jar;C:\Users\tw\.m2\repository\org\codehaus\plexus\plexus-interpolation\1.11\plexus-interpolation-1.11.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-artifact\2.2.1\maven-artifact-2.2.1.jar;C:\Users\tw\.m2\repository\org\codehaus\plexus\plexus-container-default\1.0-alpha-9-stable-1\plexus-container-default-1.0-alpha-9-stable-1.jar;C:\Users\tw\.m2\repository\classworlds\classworlds\1.1-alpha-2\classworlds-1.1-alpha-2.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-settings\2.2.1\maven-settings-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-plugin-api\2.2.1\maven-plugin-api-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-manager-plexus\1.11.2\maven-scm-manager-plexus-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-svn-commons\1.11.2\maven-scm-provider-svn-commons-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\shared\file-management\1.2.1\file-management-1.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\shared\maven-shared-io\1.1\maven-shared-io-1.1.jar;C:\Users\tw\.m2\repository\org\sonatype\plexus\plexus-sec-dispatcher\1.4\plexus-sec-dispatcher-1.4.jar;C:\Users\tw\.m2\repository\org\sonatype\plexus\plexus-cipher\1.4\plexus-cipher-1.4.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-client\1.11.2\maven-scm-client-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-jgit\1.11.2\maven-scm-provider-jgit-1.11.2.jar;C:\Users\tw\.m2\repository\org\eclipse\jgit\org.eclipse.jgit\4.5.4.201711221230-r\org.eclipse.jgit-4.5.4.201711221230-r.jar;C:\Users\tw\.m2\repository\com\jcraft\jsch\0.1.53\jsch-0.1.53.jar;C:\Users\tw\.m2\repository\com\googlecode\javaewah\JavaEWAH\0.7.9\JavaEWAH-0.7.9.jar;C:\Users\tw\.m2\repository\org\apache\httpcomponents\httpclient\4.5.7\httpclient-4.5.7.jar;C:\Users\tw\.m2\repository\org\apache\httpcomponents\httpcore\4.4.11\httpcore-4.4.11.jar;C:\Users\tw\.m2\repository\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;C:\Users\tw\.m2\repository\org\springframework\session\spring-session-jdbc\2.1.4.RELEASE\spring-session-jdbc-2.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\session\spring-session-core\2.1.4.RELEASE\spring-session-core-2.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-context\5.1.5.RELEASE\spring-context-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-jdbc\5.1.5.RELEASE\spring-jdbc-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\com\github\mxab\thymeleaf\extras\thymeleaf-extras-data-attribute\2.0.1\thymeleaf-extras-data-attribute-2.0.1.jar;C:\Users\tw\.m2\repository\org\thymeleaf\thymeleaf\3.0.11.RELEASE\thymeleaf-3.0.11.RELEASE.jar;C:\Users\tw\.m2\repository\ognl\ognl\3.1.12\ognl-3.1.12.jar;C:\Users\tw\.m2\repository\org\attoparser\attoparser\2.0.5.RELEASE\attoparser-2.0.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\unbescape\unbescape\1.1.6.RELEASE\unbescape-1.1.6.RELEASE.jar;C:\Users\tw\.m2\repository\org\thymeleaf\thymeleaf-spring5\3.0.11.RELEASE\thymeleaf-spring5-3.0.11.RELEASE.jar;C:\Users\tw\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\tw\.m2\repository\org\thymeleaf\extras\thymeleaf-extras-springsecurity5\3.0.4.RELEASE\thymeleaf-extras-springsecurity5-3.0.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\thymeleaf\extras\thymeleaf-extras-java8time\3.0.3.RELEASE\thymeleaf-extras-java8time-3.0.3.RELEASE.jar;C:\Users\tw\.m2\repository\io\github\jpenren\thymeleaf-spring-data-dialect\3.4.0\thymeleaf-spring-data-dialect-3.4.0.jar;C:\Users\tw\.m2\repository\org\springframework\data\spring-data-commons\2.1.5.RELEASE\spring-data-commons-2.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\jsoup\jsoup\1.8.3\jsoup-1.8.3.jar;C:\Users\tw\.m2\repository\org\springframework\security\spring-security-core\5.1.4.RELEASE\spring-security-core-5.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-beans\5.1.5.RELEASE\spring-beans-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-expression\5.1.5.RELEASE\spring-expression-5.1.5.RELEASE.jar \ No newline at end of file +C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-activemq\2.1.3.RELEASE\spring-boot-starter-activemq-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter\2.1.3.RELEASE\spring-boot-starter-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.1.3.RELEASE\spring-boot-starter-logging-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\tw\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\tw\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;C:\Users\tw\.m2\repository\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;C:\Users\tw\.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;C:\Users\tw\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\tw\.m2\repository\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;C:\Users\tw\.m2\repository\org\springframework\spring-jms\5.1.5.RELEASE\spring-jms-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-tx\5.1.5.RELEASE\spring-tx-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\apache\activemq\activemq-broker\5.15.8\activemq-broker-5.15.8.jar;C:\Users\tw\.m2\repository\org\apache\activemq\activemq-client\5.15.8\activemq-client-5.15.8.jar;C:\Users\tw\.m2\repository\org\fusesource\hawtbuf\hawtbuf\1.11\hawtbuf-1.11.jar;C:\Users\tw\.m2\repository\org\apache\geronimo\specs\geronimo-j2ee-management_1.1_spec\1.0.1\geronimo-j2ee-management_1.1_spec-1.0.1.jar;C:\Users\tw\.m2\repository\org\apache\activemq\activemq-openwire-legacy\5.15.8\activemq-openwire-legacy-5.15.8.jar;C:\Users\tw\.m2\repository\com\google\guava\guava\18.0\guava-18.0.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.8\jackson-databind-2.9.8.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.8\jackson-core-2.9.8.jar;C:\Users\tw\.m2\repository\javax\jms\javax.jms-api\2.0.1\javax.jms-api-2.0.1.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-actuator\2.1.3.RELEASE\spring-boot-starter-actuator-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.1.3.RELEASE\spring-boot-actuator-autoconfigure-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-actuator\2.1.3.RELEASE\spring-boot-actuator-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.8\jackson-datatype-jsr310-2.9.8.jar;C:\Users\tw\.m2\repository\io\micrometer\micrometer-core\1.1.3\micrometer-core-1.1.3.jar;C:\Users\tw\.m2\repository\org\hdrhistogram\HdrHistogram\2.1.9\HdrHistogram-2.1.9.jar;C:\Users\tw\.m2\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.1.3.RELEASE\spring-boot-starter-data-jpa-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.1.3.RELEASE\spring-boot-starter-aop-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\aspectj\aspectjweaver\1.9.2\aspectjweaver-1.9.2.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.1.3.RELEASE\spring-boot-starter-jdbc-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;C:\Users\tw\.m2\repository\javax\transaction\javax.transaction-api\1.3\javax.transaction-api-1.3.jar;C:\Users\tw\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;C:\Users\tw\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\tw\.m2\repository\org\hibernate\hibernate-core\5.3.7.Final\hibernate-core-5.3.7.Final.jar;C:\Users\tw\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\tw\.m2\repository\org\javassist\javassist\3.23.1-GA\javassist-3.23.1-GA.jar;C:\Users\tw\.m2\repository\net\bytebuddy\byte-buddy\1.9.10\byte-buddy-1.9.10.jar;C:\Users\tw\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\tw\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\tw\.m2\repository\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;C:\Users\tw\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\tw\.m2\repository\org\springframework\data\spring-data-jpa\2.1.5.RELEASE\spring-data-jpa-2.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-orm\5.1.5.RELEASE\spring-orm-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-aspects\5.1.5.RELEASE\spring-aspects-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-integration\2.1.3.RELEASE\spring-boot-starter-integration-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\integration\spring-integration-core\5.1.3.RELEASE\spring-integration-core-5.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\retry\spring-retry\1.2.4.RELEASE\spring-retry-1.2.4.RELEASE.jar;C:\Users\tw\.m2\repository\io\projectreactor\reactor-core\3.2.6.RELEASE\reactor-core-3.2.6.RELEASE.jar;C:\Users\tw\.m2\repository\org\reactivestreams\reactive-streams\1.0.2\reactive-streams-1.0.2.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-jersey\2.1.3.RELEASE\spring-boot-starter-jersey-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.1.3.RELEASE\spring-boot-starter-json-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.8\jackson-datatype-jdk8-2.9.8.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.8\jackson-module-parameter-names-2.9.8.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.1.3.RELEASE\spring-boot-starter-tomcat-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.16\tomcat-embed-core-9.0.16.jar;C:\Users\tw\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.16\tomcat-embed-websocket-9.0.16.jar;C:\Users\tw\.m2\repository\org\springframework\spring-web\5.1.5.RELEASE\spring-web-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\core\jersey-server\2.27\jersey-server-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\core\jersey-common\2.27\jersey-common-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\osgi-resource-locator\1.0.1\osgi-resource-locator-1.0.1.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\core\jersey-client\2.27\jersey-client-2.27.jar;C:\Users\tw\.m2\repository\javax\ws\rs\javax.ws.rs-api\2.1\javax.ws.rs-api-2.1.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\media\jersey-media-jaxb\2.27\jersey-media-jaxb-2.27.jar;C:\Users\tw\.m2\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\containers\jersey-container-servlet-core\2.27\jersey-container-servlet-core-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\containers\jersey-container-servlet\2.27\jersey-container-servlet-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\ext\jersey-bean-validation\2.27\jersey-bean-validation-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\ext\jersey-spring4\2.27\jersey-spring4-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\inject\jersey-hk2\2.27\jersey-hk2-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-locator\2.5.0-b42\hk2-locator-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\external\aopalliance-repackaged\2.5.0-b42\aopalliance-repackaged-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2\2.5.0-b42\hk2-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-utils\2.5.0-b42\hk2-utils-2.5.0-b42.jar;C:\Users\tw\.m2\repository\javax\inject\javax.inject\1\javax.inject-1.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-api\2.5.0-b42\hk2-api-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\config-types\2.5.0-b42\config-types-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-core\2.5.0-b42\hk2-core-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-config\2.5.0-b42\hk2-config-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\hk2-runlevel\2.5.0-b42\hk2-runlevel-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\class-model\2.5.0-b42\class-model-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\external\asm-all-repackaged\2.5.0-b42\asm-all-repackaged-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\hk2\spring-bridge\2.5.0-b42\spring-bridge-2.5.0-b42.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\media\jersey-media-json-jackson\2.27\jersey-media-json-jackson-2.27.jar;C:\Users\tw\.m2\repository\org\glassfish\jersey\ext\jersey-entity-filtering\2.27\jersey-entity-filtering-2.27.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\tw\.m2\repository\com\fasterxml\jackson\module\jackson-module-jaxb-annotations\2.9.8\jackson-module-jaxb-annotations-2.9.8.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-mail\2.1.3.RELEASE\spring-boot-starter-mail-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-context-support\5.1.5.RELEASE\spring-context-support-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\com\sun\mail\javax.mail\1.6.2\javax.mail-1.6.2.jar;C:\Users\tw\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-security\2.1.3.RELEASE\spring-boot-starter-security-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-aop\5.1.5.RELEASE\spring-aop-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\security\spring-security-config\5.1.4.RELEASE\spring-security-config-5.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\security\spring-security-web\5.1.4.RELEASE\spring-security-web-5.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-thymeleaf\2.1.3.RELEASE\spring-boot-starter-thymeleaf-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-validation\2.1.3.RELEASE\spring-boot-starter-validation-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.16\tomcat-embed-el-9.0.16.jar;C:\Users\tw\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.14.Final\hibernate-validator-6.0.14.Final.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.1.3.RELEASE\spring-boot-starter-web-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-webmvc\5.1.5.RELEASE\spring-webmvc-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-websocket\2.1.3.RELEASE\spring-boot-starter-websocket-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-messaging\5.1.5.RELEASE\spring-messaging-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-websocket\5.1.5.RELEASE\spring-websocket-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-devtools\2.1.3.RELEASE\spring-boot-devtools-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot\2.1.3.RELEASE\spring-boot-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.1.3.RELEASE\spring-boot-autoconfigure-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\com\h2database\h2\1.4.197\h2-1.4.197.jar;C:\Users\tw\.m2\repository\mysql\mysql-connector-java\8.0.15\mysql-connector-java-8.0.15.jar;C:\Users\tw\.m2\repository\org\postgresql\postgresql\42.2.5\postgresql-42.2.5.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-configuration-processor\2.1.3.RELEASE\spring-boot-configuration-processor-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\projectlombok\lombok\1.18.6\lombok-1.18.6.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-starter-test\2.1.3.RELEASE\spring-boot-starter-test-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-test\2.1.3.RELEASE\spring-boot-test-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\2.1.3.RELEASE\spring-boot-test-autoconfigure-2.1.3.RELEASE.jar;C:\Users\tw\.m2\repository\com\jayway\jsonpath\json-path\2.4.0\json-path-2.4.0.jar;C:\Users\tw\.m2\repository\net\minidev\json-smart\2.3\json-smart-2.3.jar;C:\Users\tw\.m2\repository\net\minidev\accessors-smart\1.2\accessors-smart-1.2.jar;C:\Users\tw\.m2\repository\org\ow2\asm\asm\5.0.4\asm-5.0.4.jar;C:\Users\tw\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\tw\.m2\repository\org\assertj\assertj-core\3.11.1\assertj-core-3.11.1.jar;C:\Users\tw\.m2\repository\org\mockito\mockito-core\2.23.4\mockito-core-2.23.4.jar;C:\Users\tw\.m2\repository\net\bytebuddy\byte-buddy-agent\1.9.10\byte-buddy-agent-1.9.10.jar;C:\Users\tw\.m2\repository\org\objenesis\objenesis\2.6\objenesis-2.6.jar;C:\Users\tw\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\tw\.m2\repository\org\hamcrest\hamcrest-library\1.3\hamcrest-library-1.3.jar;C:\Users\tw\.m2\repository\org\skyscreamer\jsonassert\1.5.0\jsonassert-1.5.0.jar;C:\Users\tw\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\tw\.m2\repository\org\springframework\spring-core\5.1.5.RELEASE\spring-core-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-jcl\5.1.5.RELEASE\spring-jcl-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-test\5.1.5.RELEASE\spring-test-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\xmlunit\xmlunit-core\2.6.2\xmlunit-core-2.6.2.jar;C:\Users\tw\.m2\repository\org\springframework\security\spring-security-test\5.1.4.RELEASE\spring-security-test-5.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\hibernate\hibernate-searchRequest-orm\5.10.5.Final\hibernate-searchRequest-orm-5.10.5.Final.jar;C:\Users\tw\.m2\repository\org\hibernate\hibernate-searchRequest-engine\5.10.5.Final\hibernate-searchRequest-engine-5.10.5.Final.jar;C:\Users\tw\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.5.Final\hibernate-commons-annotations-5.0.5.Final.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-misc\5.5.5\lucene-misc-5.5.5.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-analyzers-common\5.5.5\lucene-analyzers-common-5.5.5.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-facet\5.5.5\lucene-facet-5.5.5.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-queries\5.5.5\lucene-queries-5.5.5.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-queryparser\5.5.5\lucene-queryparser-5.5.5.jar;C:\Users\tw\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\tw\.m2\repository\org\apache\lucene\lucene-core\5.5.4\lucene-core-5.5.4.jar;C:\Users\tw\.m2\repository\org\webjars\font-awesome\5.8.1\font-awesome-5.8.1.jar;C:\Users\tw\.m2\repository\org\webjars\jquery-ui\1.12.1\jquery-ui-1.12.1.jar;C:\Users\tw\.m2\repository\org\webjars\jquery\3.3.1\jquery-3.3.1.jar;C:\Users\tw\.m2\repository\org\webjars\popper.js\1.14.7\popper.js-1.14.7.jar;C:\Users\tw\.m2\repository\org\webjars\bootstrap\4.3.1\bootstrap-4.3.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm\1.11.2\maven-scm-1.11.2.pom;C:\Users\tw\.m2\repository\org\codehaus\plexus\plexus-utils\3.1.0\plexus-utils-3.1.0.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-providers-git\1.11.2\maven-scm-providers-git-1.11.2.pom;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-api\1.11.2\maven-scm-api-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-providers-standard\1.11.2\maven-scm-providers-standard-1.11.2.pom;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-accurev\1.11.2\maven-scm-provider-accurev-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-bazaar\1.11.2\maven-scm-provider-bazaar-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-clearcase\1.11.2\maven-scm-provider-clearcase-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-cvsexe\1.11.2\maven-scm-provider-cvsexe-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-cvs-commons\1.11.2\maven-scm-provider-cvs-commons-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-cvsjava\1.11.2\maven-scm-provider-cvsjava-1.11.2.jar;C:\Users\tw\.m2\repository\org\netbeans\lib\cvsclient\20060125\cvsclient-20060125.jar;C:\Users\tw\.m2\repository\ch\ethz\ganymed\ganymed-ssh2\build210\ganymed-ssh2-build210.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-hg\1.11.2\maven-scm-provider-hg-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-perforce\1.11.2\maven-scm-provider-perforce-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-starteam\1.11.2\maven-scm-provider-starteam-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-svnexe\1.11.2\maven-scm-provider-svnexe-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-synergy\1.11.2\maven-scm-provider-synergy-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-vss\1.11.2\maven-scm-provider-vss-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-tfs\1.11.2\maven-scm-provider-tfs-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-integrity\1.11.2\maven-scm-provider-integrity-1.11.2.jar;C:\Users\tw\.m2\repository\com\mks\api\mksapi-jar\4.10.9049\mksapi-jar-4.10.9049.jar;C:\Users\tw\.m2\repository\org\codehaus\groovy\groovy-all\1.7.6\groovy-all-1.7.6.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-jazz\1.11.2\maven-scm-provider-jazz-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-providers\1.11.2\maven-scm-providers-1.11.2.pom;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-managers\1.11.2\maven-scm-managers-1.11.2.pom;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-local\1.11.2\maven-scm-provider-local-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-git-commons\1.11.2\maven-scm-provider-git-commons-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-gitexe\1.11.2\maven-scm-provider-gitexe-1.11.2.jar;C:\Users\tw\.m2\repository\commons-io\commons-io\2.6\commons-io-2.6.jar;C:\Users\tw\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;C:\Users\tw\.m2\repository\org\apache\maven\plugins\maven-scm-plugin\1.11.2\maven-scm-plugin-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-project\2.2.1\maven-project-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-profile\2.2.1\maven-profile-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-model\2.2.1\maven-model-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-artifact-manager\2.2.1\maven-artifact-manager-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-repository-metadata\2.2.1\maven-repository-metadata-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\wagon\wagon-provider-api\1.0-beta-6\wagon-provider-api-1.0-beta-6.jar;C:\Users\tw\.m2\repository\backport-util-concurrent\backport-util-concurrent\3.1\backport-util-concurrent-3.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-plugin-registry\2.2.1\maven-plugin-registry-2.2.1.jar;C:\Users\tw\.m2\repository\org\codehaus\plexus\plexus-interpolation\1.11\plexus-interpolation-1.11.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-artifact\2.2.1\maven-artifact-2.2.1.jar;C:\Users\tw\.m2\repository\org\codehaus\plexus\plexus-container-default\1.0-alpha-9-stable-1\plexus-container-default-1.0-alpha-9-stable-1.jar;C:\Users\tw\.m2\repository\classworlds\classworlds\1.1-alpha-2\classworlds-1.1-alpha-2.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-settings\2.2.1\maven-settings-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\maven-plugin-api\2.2.1\maven-plugin-api-2.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-manager-plexus\1.11.2\maven-scm-manager-plexus-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-svn-commons\1.11.2\maven-scm-provider-svn-commons-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\shared\file-management\1.2.1\file-management-1.2.1.jar;C:\Users\tw\.m2\repository\org\apache\maven\shared\maven-shared-io\1.1\maven-shared-io-1.1.jar;C:\Users\tw\.m2\repository\org\sonatype\plexus\plexus-sec-dispatcher\1.4\plexus-sec-dispatcher-1.4.jar;C:\Users\tw\.m2\repository\org\sonatype\plexus\plexus-cipher\1.4\plexus-cipher-1.4.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-client\1.11.2\maven-scm-client-1.11.2.jar;C:\Users\tw\.m2\repository\org\apache\maven\scm\maven-scm-provider-jgit\1.11.2\maven-scm-provider-jgit-1.11.2.jar;C:\Users\tw\.m2\repository\org\eclipse\jgit\org.eclipse.jgit\4.5.4.201711221230-r\org.eclipse.jgit-4.5.4.201711221230-r.jar;C:\Users\tw\.m2\repository\com\jcraft\jsch\0.1.53\jsch-0.1.53.jar;C:\Users\tw\.m2\repository\com\googlecode\javaewah\JavaEWAH\0.7.9\JavaEWAH-0.7.9.jar;C:\Users\tw\.m2\repository\org\apache\httpcomponents\httpclient\4.5.7\httpclient-4.5.7.jar;C:\Users\tw\.m2\repository\org\apache\httpcomponents\httpcore\4.4.11\httpcore-4.4.11.jar;C:\Users\tw\.m2\repository\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;C:\Users\tw\.m2\repository\org\springframework\session\spring-session-jdbc\2.1.4.RELEASE\spring-session-jdbc-2.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\session\spring-session-core\2.1.4.RELEASE\spring-session-core-2.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-context\5.1.5.RELEASE\spring-context-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-jdbc\5.1.5.RELEASE\spring-jdbc-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\com\github\mxab\thymeleaf\extras\thymeleaf-extras-data-attribute\2.0.1\thymeleaf-extras-data-attribute-2.0.1.jar;C:\Users\tw\.m2\repository\org\thymeleaf\thymeleaf\3.0.11.RELEASE\thymeleaf-3.0.11.RELEASE.jar;C:\Users\tw\.m2\repository\ognl\ognl\3.1.12\ognl-3.1.12.jar;C:\Users\tw\.m2\repository\org\attoparser\attoparser\2.0.5.RELEASE\attoparser-2.0.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\unbescape\unbescape\1.1.6.RELEASE\unbescape-1.1.6.RELEASE.jar;C:\Users\tw\.m2\repository\org\thymeleaf\thymeleaf-spring5\3.0.11.RELEASE\thymeleaf-spring5-3.0.11.RELEASE.jar;C:\Users\tw\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\tw\.m2\repository\org\thymeleaf\extras\thymeleaf-extras-springsecurity5\3.0.4.RELEASE\thymeleaf-extras-springsecurity5-3.0.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\thymeleaf\extras\thymeleaf-extras-java8time\3.0.3.RELEASE\thymeleaf-extras-java8time-3.0.3.RELEASE.jar;C:\Users\tw\.m2\repository\io\github\jpenren\thymeleaf-spring-data-dialect\3.4.0\thymeleaf-spring-data-dialect-3.4.0.jar;C:\Users\tw\.m2\repository\org\springframework\data\spring-data-commons\2.1.5.RELEASE\spring-data-commons-2.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\jsoup\jsoup\1.8.3\jsoup-1.8.3.jar;C:\Users\tw\.m2\repository\org\springframework\security\spring-security-core\5.1.4.RELEASE\spring-security-core-5.1.4.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-beans\5.1.5.RELEASE\spring-beans-5.1.5.RELEASE.jar;C:\Users\tw\.m2\repository\org\springframework\spring-expression\5.1.5.RELEASE\spring-expression-5.1.5.RELEASE.jar diff --git a/etc/serialversions/getserialversionid.cmd b/etc/serialversions/getserialversionid.cmd index c70bb9cc..f6356f93 100644 --- a/etc/serialversions/getserialversionid.cmd +++ b/etc/serialversions/getserialversionid.cmd @@ -17,7 +17,7 @@ echo %CLASSPATH% cd target\classes serialver org.woehlke.simpleworklist.language.Language > ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.task.TaskEnergy >> ..\..\etc\serialversions.txt -serialver org.woehlke.simpleworklist.taskstate.TaskState >> ..\..\etc\serialversions.txt +serialver org.woehlke.simpleworklist.task.TaskState >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.task.TaskTime >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.user.resetpassword.UserPasswordRecoveryStatus >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.user.register.UserRegistrationStatus >> ..\..\etc\serialversions.txt @@ -35,14 +35,14 @@ serialver org.woehlke.simpleworklist.breadcrumb.Breadcrumb >> ..\..\etc\serialv serialver org.woehlke.simpleworklist.user.login.LoginForm >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.context.NewContextForm >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.user.messages.User2UserMessageFormBean >> ..\..\etc\serialversions.txt -serialver org.woehlke.simpleworklist.search.SearchResult >> ..\..\etc\serialversions.txt +serialver org.woehlke.simpleworklist.searchRequest.SearchResult >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.user.account.UserAccountForm >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.context.UserChangeDefaultContextForm >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.language.UserChangeLanguageForm >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.user.selfservice.UserChangeNameForm >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.user.selfservice.UserChangePasswordForm >> ..\..\etc\serialversions.txt -@rem serialver org.woehlke.simpleworklist.user.UserDetailsBean >> ..\..\etc\serialversions.txt +@rem serialver org.woehlke.simpleworklist.user.account.UserDetailsBean >> ..\..\etc\serialversions.txt serialver org.woehlke.simpleworklist.user.register.UserRegistrationForm >> ..\..\etc\serialversions.txt -serialver org.woehlke.simpleworklist.user.UserSessionBean >> ..\..\etc\serialversions.txt +serialver org.woehlke.simpleworklist.session.UserSessionBean >> ..\..\etc\serialversions.txt cd ..\.. echo FINISHED diff --git a/etc/serialversions/getserialversionid.sh b/etc/serialversions/getserialversionid.sh index ade0db35..8699b90b 100644 --- a/etc/serialversions/getserialversionid.sh +++ b/etc/serialversions/getserialversionid.sh @@ -29,7 +29,7 @@ echo "CLASSPATH $CLASSPATH" cd $CLASSES_PATH serialver org.woehlke.simpleworklist.language.Language > $SERIALVERSIONS_FILE serialver org.woehlke.simpleworklist.task.TaskEnergy >> $SERIALVERSIONS_FILE -serialver org.woehlke.simpleworklist.taskstate.TaskState >> $SERIALVERSIONS_FILE +serialver org.woehlke.simpleworklist.task.TaskState >> $SERIALVERSIONS_FILE serialver org.woehlke.simpleworklist.task.TaskTime >> $SERIALVERSIONS_FILE serialver org.woehlke.simpleworklist.user.resetpassword.UserPasswordRecoveryStatus >> $SERIALVERSIONS_FILE serialver org.woehlke.simpleworklist.user.register.UserRegistrationStatus >> $SERIALVERSIONS_FILE @@ -53,7 +53,7 @@ serialver org.woehlke.simpleworklist.context.UserChangeDefaultContextForm >> $SE serialver org.woehlke.simpleworklist.language.UserChangeLanguageForm >> $SERIALVERSIONS_FILE serialver org.woehlke.simpleworklist.user.selfservice.UserChangeNameForm >> $SERIALVERSIONS_FILE serialver org.woehlke.simpleworklist.user.selfservice.UserChangePasswordForm >> $SERIALVERSIONS_FILE -#serialver org.woehlke.simpleworklist.user.UserDetailsBean >> $SERIALVERSIONS_FILE +#serialver org.woehlke.simpleworklist.user.account.UserDetailsBean >> $SERIALVERSIONS_FILE serialver org.woehlke.simpleworklist.user.register.UserRegistrationForm >> $SERIALVERSIONS_FILE serialver org.woehlke.simpleworklist.user.UserSessionBean >> $SERIALVERSIONS_FILE cd $PROJECT_PATH diff --git a/etc/serialversions/serialversions.txt b/etc/serialversions/serialversions.txt index 75c58f6b..14da4161 100644 --- a/etc/serialversions/serialversions.txt +++ b/etc/serialversions/serialversions.txt @@ -1,6 +1,6 @@ org.woehlke.simpleworklist.language.Language: private static final long serialVersionUID = 0L; org.woehlke.simpleworklist.task.TaskEnergy: private static final long serialVersionUID = 0L; -org.woehlke.simpleworklist.taskstate.TaskState: private static final long serialVersionUID = 0L; +org.woehlke.simpleworklist.task.TaskState: private static final long serialVersionUID = 0L; org.woehlke.simpleworklist.task.TaskTime: private static final long serialVersionUID = 0L; org.woehlke.simpleworklist.user.resetpassword.UserPasswordRecoveryStatus: private static final long serialVersionUID = 0L; org.woehlke.simpleworklist.user.register.UserRegistrationStatus: private static final long serialVersionUID = 0L; @@ -18,11 +18,11 @@ org.woehlke.simpleworklist.breadcrumb.Breadcrumb: private static final long s org.woehlke.simpleworklist.user.login.LoginForm: private static final long serialVersionUID = 5936886560348238355L; org.woehlke.simpleworklist.context.NewContextForm: private static final long serialVersionUID = -937143305653156981L; org.woehlke.simpleworklist.user.messages.User2UserMessageFormBean: private static final long serialVersionUID = 1576610181966480168L; -org.woehlke.simpleworklist.search.SearchResult: private static final long serialVersionUID = 1682809351146047764L; +org.woehlke.simpleworklist.searchRequest.SearchResult: private static final long serialVersionUID = 1682809351146047764L; org.woehlke.simpleworklist.user.account.UserAccountForm: private static final long serialVersionUID = 9180383385243540190L; org.woehlke.simpleworklist.context.UserChangeDefaultContextForm: private static final long serialVersionUID = -8592295563275083292L; org.woehlke.simpleworklist.language.UserChangeLanguageForm: private static final long serialVersionUID = 2201123162578113187L; org.woehlke.simpleworklist.user.selfservice.UserChangeNameForm: private static final long serialVersionUID = 5120488382888268418L; org.woehlke.simpleworklist.user.selfservice.UserChangePasswordForm: private static final long serialVersionUID = 9149342594823222054L; org.woehlke.simpleworklist.user.register.UserRegistrationForm: private static final long serialVersionUID = 6864871862706880939L; -org.woehlke.simpleworklist.user.UserSessionBean: private static final long serialVersionUID = -6649686058228455825L; +org.woehlke.simpleworklist.session.UserSessionBean: private static final long serialVersionUID = -6649686058228455825L; diff --git a/pom.xml b/pom.xml index ffd7d508..c1ac5d90 100644 --- a/pom.xml +++ b/pom.xml @@ -1,9 +1,10 @@ 4.0.0 + org.woehlke simpleworklist - 2.3.14-SNAPSHOT + 2.3.16-SNAPSHOT jar org.springframework.boot @@ -13,7 +14,7 @@ simpleworklist Your Todo-List for Getting Things Done - http://homepage.ruhr-uni-bochum.de/Thomas.Woehlke/p/simpleworklist + https://woehlke.org/p/simpleworklist 2012 @@ -71,7 +72,7 @@ 3.1.1 3.1.0 3.2.2 - 3.8.2 + 3.9.0 3.1.0 2.22.2 3.2.3 @@ -125,27 +126,29 @@ pom import - - org.springframework - spring-framework-bom - ${spring-framework.version} - pom - import - - - org.springframework.data - spring-data-releasetrain - ${spring-data-releasetrain.version} - pom - import - - - org.springframework.security - spring-security-bom - ${spring-security.version} - pom - import - + org.springframework.session spring-session-bom @@ -154,52 +157,56 @@ import - - org.webjars - font-awesome - 5.8.1 - org.webjars jquery - 3.3.1-2 + 3.4.1 org.webjars - popper.js - 1.14.7 + bootstrap + 4.4.1-1 org.webjars - bootstrap - 4.3.1 + font-awesome + 5.13.0 org.webjars ckeditor - 4.11.3 + 4.14.0 - + org.thymeleaf - thymeleaf-spring5 - ${thymeleaf.version} - - - org.thymeleaf.extras - thymeleaf-extras-java8time - ${thymeleaf-extras-java8time.version} - - - org.thymeleaf.extras - thymeleaf-extras-springsecurity5 - ${thymeleaf-extras-springsecurity.version} + thymeleaf-testing + 3.0.4.RELEASE + test + io.github.jpenren thymeleaf-spring-data-dialect @@ -284,7 +291,7 @@ org.apache.maven.plugins maven-site-plugin - 3.9.0 + ${maven-site-plugin.version} maven-plugin @@ -345,8 +352,8 @@ runtime - org.springframework.boot - spring-boot-starter-data-jpa + org.springframework.boot + spring-boot-starter-data-jpa org.springframework.boot @@ -364,10 +371,6 @@ org.springframework.boot spring-boot-starter-validation - - org.springframework.boot - spring-boot-starter-security - org.springframework.boot spring-boot-devtools @@ -394,6 +397,31 @@ spring-security-test test + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.security + spring-security-core + + + org.springframework.security + spring-security-config + + + org.springframework.security + spring-security-remoting + + + org.springframework.security + spring-security-web + + + org.springframework.security + spring-security-data + + org.postgresql postgresql @@ -417,10 +445,6 @@ org.webjars jquery - - org.webjars - popper.js - org.webjars bootstrap @@ -437,11 +461,6 @@ org.springframework.session spring-session-jdbc - - com.github.mxab.thymeleaf.extras - thymeleaf-extras-data-attribute - - org.thymeleaf thymeleaf @@ -458,10 +477,19 @@ org.thymeleaf.extras thymeleaf-extras-springsecurity5 + + com.github.mxab.thymeleaf.extras + thymeleaf-extras-data-attribute + io.github.jpenren thymeleaf-spring-data-dialect + + org.thymeleaf + thymeleaf-testing + test + org.jsoup @@ -563,6 +591,7 @@ ${project.artifactId} + clean dependency:list install spring-boot:run @@ -575,7 +604,6 @@ docker-compose-maven-plugin ${version.docker-compose-maven-plugin} - org.apache.maven.plugins maven-project-info-reports-plugin @@ -638,6 +666,17 @@ ${java.version} + @@ -674,6 +713,74 @@ true + + org.apache.maven.plugins + maven-clean-plugin + + + org.apache.maven.plugins + maven-install-plugin + + + org.apache.maven.plugins + maven-help-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + 1024m + ${java.version} + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + id-build-info + + build-info + + + + ${project.build.sourceEncoding} + ${project.reporting.outputEncoding} + ${maven.compiler.source} + ${maven.compiler.target} + + + + + org.apache.maven.plugins maven-dependency-plugin @@ -793,138 +900,37 @@ true + + org.apache.maven.plugins + maven-surefire-plugin + + ${skipTests} + + default + ${skipTests} + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + ${skipTests} + + default + ${skipTests} + + + - - - default - - true - - spring.profiles.active - default - - - - simpleworklist - clean dependency:list install spring-boot:run - - - org.springframework.boot - spring-boot-maven-plugin - - true - - default - - - - - pre-integration-test - - start - - - ${skipTests} - - - - post-integration-test - - stop - - - ${skipTests} - - - - id-build-info - - build-info - - - - ${project.build.sourceEncoding} - ${project.reporting.outputEncoding} - ${maven.compiler.source} - ${maven.compiler.target} - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - ${skipTests} - - default - ${skipTests} - - - - - org.apache.maven.plugins - maven-failsafe-plugin - - ${skipTests} - - default - ${skipTests} - - - - - - - - - testing - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - testing - - - - - pre-integration-test - - start - - - - post-integration-test - - stop - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - testing - - false - - - - - - - + + org.apache.maven.plugins + maven-enforcer-plugin + org.apache.maven.plugins maven-invoker-plugin @@ -939,9 +945,7 @@ org.springframework.boot spring-boot-maven-plugin - - default - + true @@ -989,16 +993,28 @@ org.apache.maven.plugins maven-jxr-plugin + + true + org.apache.maven.plugins maven-checkstyle-plugin + + true + true + true + false + false + com.github.spotbugs spotbugs-maven-plugin - - + + false + true + true @@ -1016,7 +1032,7 @@ org.apache.maven.plugins maven-surefire-plugin - false + ${skipTests} **/*Tests.java **/*Test.java @@ -1024,14 +1040,33 @@ **/Abstract*.java + + default + ${skipTests} + + + org.apache.maven.plugins + maven-failsafe-plugin + + ${skipTests} + + default + ${skipTests} + + + + + org.apache.maven.plugins + maven-site-plugin + org.apache.maven.plugins maven-surefire-report-plugin - true - true + ${skipTests} + ${skipTests} diff --git a/run.sh b/run.sh index 408600d5..711b04d3 100755 --- a/run.sh +++ b/run.sh @@ -20,7 +20,7 @@ function setupHeroku() { } function buildLikeHerokuWithSite() { - ./mvnw -DskipTests clean dependency:list install site site:deploy + ./mvnw -DskipTests=true clean dependency:list install site site:deploy } function buildLikeHeroku() { @@ -34,13 +34,29 @@ function runHerokuLocal() { heroku open } -function main() { - #runGithubTestBuild - #setupHeroku +function setup() { + setupHeroku +} + +function build() { + buildLikeHerokuWithSite #buildLikeHeroku + #runGithubTestBuild +} + +function testing() { + runTest +} + +function run() { #runHerokuLocal - #runDev - runTest + runDev +} + +function main() { + #build + run } main + diff --git a/src/main/java/org/woehlke/simpleworklist/breadcrumb/BreadcrumbService.java b/src/main/java/org/woehlke/simpleworklist/breadcrumb/BreadcrumbService.java index 1ba783b9..c9454993 100644 --- a/src/main/java/org/woehlke/simpleworklist/breadcrumb/BreadcrumbService.java +++ b/src/main/java/org/woehlke/simpleworklist/breadcrumb/BreadcrumbService.java @@ -3,7 +3,7 @@ import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.project.Project; import org.woehlke.simpleworklist.task.Task; -import org.woehlke.simpleworklist.taskstate.TaskState; +import org.woehlke.simpleworklist.task.TaskState; import java.util.Locale; diff --git a/src/main/java/org/woehlke/simpleworklist/breadcrumb/BreadcrumbServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/breadcrumb/BreadcrumbServiceImpl.java index 2212bbc8..d44b891d 100644 --- a/src/main/java/org/woehlke/simpleworklist/breadcrumb/BreadcrumbServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/breadcrumb/BreadcrumbServiceImpl.java @@ -9,7 +9,7 @@ import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.project.Project; import org.woehlke.simpleworklist.task.Task; -import org.woehlke.simpleworklist.taskstate.TaskState; +import org.woehlke.simpleworklist.task.TaskState; import java.util.Locale; import java.util.Stack; @@ -39,6 +39,9 @@ public Breadcrumb getBreadcrumbForShowOneProject(Project thisProject, Locale loc log.info("getBreadcrumbForShowOneProject"); Breadcrumb breadcrumb = new Breadcrumb(locale); breadcrumb.addProjectRoot(); + if(thisProject == null){ + return breadcrumb; + } else { if (thisProject.getId() > 0) { Stack stack = new Stack<>(); Project breadcrumbProject = thisProject; @@ -50,7 +53,8 @@ public Breadcrumb getBreadcrumbForShowOneProject(Project thisProject, Locale loc breadcrumb.addProject(stack.pop()); } } - return breadcrumb; + return breadcrumb; + } } @Override diff --git a/src/main/java/org/woehlke/simpleworklist/common/AbstractController.java b/src/main/java/org/woehlke/simpleworklist/common/AbstractController.java index 0cee5874..80db91ec 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.task.TaskState; import org.woehlke.simpleworklist.user.account.UserAccount; import org.woehlke.simpleworklist.task.TaskEnergy; import org.woehlke.simpleworklist.task.TaskTime; @@ -16,15 +17,18 @@ import org.woehlke.simpleworklist.project.ProjectService; import org.woehlke.simpleworklist.user.messages.User2UserMessageService; import org.woehlke.simpleworklist.user.account.UserAccountService; -import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.session.UserSessionBean; import org.springframework.beans.factory.annotation.Autowired; 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; +import static java.util.Locale.GERMAN; + /** * Created by tw on 14.02.16. */ @@ -58,17 +62,23 @@ public abstract class AbstractController { @Autowired protected BreadcrumbService breadcrumbService; + //TODO: rename allCategories to allProjects @ModelAttribute("allCategories") - public final List getAllCategories(@ModelAttribute("userSession") UserSessionBean userSession, - BindingResult result, Model model) { + public final List getAllCategories( + @ModelAttribute("userSession") UserSessionBean userSession, + BindingResult result, //TODO: remove + Model model //TODO: remove + ) { Context context = this.getContext(userSession); return projectService.findAllProjectsByContext(context); } + //TODO: rename rootCategories to rootProjects @ModelAttribute("rootCategories") public final List getRootCategories( - @ModelAttribute("userSession") UserSessionBean userSession, - BindingResult result, Model model + @ModelAttribute("userSession") UserSessionBean userSession, + BindingResult result, //TODO: remove + Model model //TODO: remove ) { Context context = this.getContext(userSession); return projectService.findRootProjectsByContext(context); @@ -96,11 +106,28 @@ 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){ - Context context = this.getContext(userSession); - if(locale == Locale.GERMAN){ + public final String getCurrentContext( + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale + ){ + if(userSession == null){ + userSession = new UserSessionBean(); + } + Context context = getContext(userSession); + if(locale == null){ + locale = Locale.ENGLISH; + } + if(locale == GERMAN){ return context.getNameDe(); } else { return context.getNameEn(); @@ -112,21 +139,21 @@ public final boolean refreshMessagePage(){ return false; } - protected UserAccount getUser(){ + protected UserAccount getUser() { return this.userAccountLoginSuccessService.retrieveCurrentUser(); } protected Context getContext(UserSessionBean userSession){ UserAccount thisUser = this.getUser(); - long defaultContextId = thisUser.getDefaultContext().getId(); if(userSession == null){ - userSession = new UserSessionBean(defaultContextId); - } - long contextId = userSession.getContextId(); - if(contextId == 0){ - userSession.setContextId(defaultContextId); + userSession = new UserSessionBean(); + long defaultContextId = thisUser.getDefaultContext().getId(); + userSession.setLastContextId(defaultContextId); } - return contextService.findByIdAndUserAccount(contextId, thisUser); + Context context = contextService.findByIdAndUserAccount(userSession.getLastContextId(), thisUser); + userSession.setLastContextId(context.getId()); + userSession.setUserAccountid(thisUser.getId()); + return context; } } diff --git a/src/main/java/org/woehlke/simpleworklist/common/AuditModel.java b/src/main/java/org/woehlke/simpleworklist/common/AuditModel.java index d5595678..2b1800de 100644 --- a/src/main/java/org/woehlke/simpleworklist/common/AuditModel.java +++ b/src/main/java/org/woehlke/simpleworklist/common/AuditModel.java @@ -1,39 +1,37 @@ 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( - value = {"rowCreatedAt", "rowUpdatedAt"}, - allowGetters = true + value = {"rowCreatedAt", "rowUpdatedAt"}, + allowGetters = true ) 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; + @CreatedDate @Temporal(TemporalType.TIMESTAMP) @Column(name = "row_created_at", nullable = false, updatable = false) - @CreatedDate protected Date rowCreatedAt; + @LastModifiedDate @Temporal(TemporalType.TIMESTAMP) @Column(name = "row_updated_at", nullable = false) - @LastModifiedDate protected Date rowUpdatedAt; public String getUuid() { @@ -79,8 +77,6 @@ public int hashCode() { public String toString() { return "AuditModel{" + "uuid='" + uuid + '\'' + - ", rowCreatedAt=" + rowCreatedAt + - ", rowUpdatedAt=" + rowUpdatedAt + '}'; } diff --git a/src/main/java/org/woehlke/simpleworklist/config/di/WebMvcConfig.java b/src/main/java/org/woehlke/simpleworklist/config/di/WebMvcConfig.java index 113fda38..c91475bd 100644 --- a/src/main/java/org/woehlke/simpleworklist/config/di/WebMvcConfig.java +++ b/src/main/java/org/woehlke/simpleworklist/config/di/WebMvcConfig.java @@ -1,7 +1,6 @@ package org.woehlke.simpleworklist.config.di; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; diff --git a/src/main/java/org/woehlke/simpleworklist/context/Context.java b/src/main/java/org/woehlke/simpleworklist/context/Context.java index 830a47b2..910e9f8a 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. */ @@ -33,8 +38,8 @@ @Getter @Setter @NoArgsConstructor -@EqualsAndHashCode -@ToString +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true, exclude = "userAccount") public class Context extends AuditModel implements Serializable, ComparableById { private static final long serialVersionUID = -5035732370606951871L; @@ -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/context/ContextController.java b/src/main/java/org/woehlke/simpleworklist/context/ContextController.java index b64d3003..d0a7cf2b 100644 --- a/src/main/java/org/woehlke/simpleworklist/context/ContextController.java +++ b/src/main/java/org/woehlke/simpleworklist/context/ContextController.java @@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.woehlke.simpleworklist.common.AbstractController; -import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.session.UserSessionBean; import org.springframework.beans.factory.annotation.Autowired; @@ -29,16 +29,18 @@ public ContextController(ContextService contextService) { @RequestMapping(path = "/choose/{newContextId}", method = RequestMethod.GET) public String switchContxt( - @PathVariable("newContextId") Context setContext, + @PathVariable("newContextId") Context newContext, @ModelAttribute("userSession") UserSessionBean userSession, Model model ){ log.info("switchContxt"); - Context isContext = super.getContext(userSession); - if (setContext != null) { - userSession.setContextId(setContext.getId()); + Context oldContext = super.getContext(userSession); + if (newContext != null) { + userSession.setLastContextId(newContext.getId()); + } else { + userSession.setLastContextId(oldContext.getId()); } - model.addAttribute("userSession",userSession); + model.addAttribute("userSession", userSession); return "redirect:/taskstate/inbox"; } } diff --git a/src/main/java/org/woehlke/simpleworklist/error/MyErrorController.java b/src/main/java/org/woehlke/simpleworklist/error/MyErrorController.java index bd887480..4e32762e 100644 --- a/src/main/java/org/woehlke/simpleworklist/error/MyErrorController.java +++ b/src/main/java/org/woehlke/simpleworklist/error/MyErrorController.java @@ -2,6 +2,9 @@ import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController; +import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; +import org.springframework.boot.web.servlet.error.ErrorAttributes; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; diff --git a/src/main/java/org/woehlke/simpleworklist/project/Project.java b/src/main/java/org/woehlke/simpleworklist/project/Project.java index 5fc245f2..4081de74 100644 --- a/src/main/java/org/woehlke/simpleworklist/project/Project.java +++ b/src/main/java/org/woehlke/simpleworklist/project/Project.java @@ -3,11 +3,14 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import javax.persistence.*; import javax.persistence.Index; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDeleteAction; import org.hibernate.validator.constraints.Length; @@ -31,9 +34,14 @@ @Index(name = "ix_project_row_created_at", columnList = "row_created_at") } ) +@Getter +@Setter +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true, exclude = "children") public class Project extends AuditModel implements Serializable, ComparableById { private static final long serialVersionUID = 4566653175832872422L; + public final static long rootProjectId = 0L; @Id @GeneratedValue(generator = "project_generator") @@ -45,44 +53,52 @@ public class Project extends AuditModel implements Serializable, ComparableById< private Long id; @ManyToOne( - fetch = FetchType.LAZY, - optional = true, - cascade = { - CascadeType.MERGE, - CascadeType.REFRESH - } + fetch = FetchType.LAZY, + optional = true, + cascade = { + CascadeType.MERGE, + CascadeType.REFRESH + } ) @JoinColumn(name = "parent_id") @OnDelete(action = OnDeleteAction.NO_ACTION) private Project parent; @ManyToOne( - fetch = FetchType.LAZY, - optional = false, - cascade = { - CascadeType.MERGE, - CascadeType.REFRESH - } + fetch = FetchType.LAZY, + optional = false, + cascade = { + CascadeType.MERGE, + CascadeType.REFRESH + } ) @JoinColumn(name = "context_id") @OnDelete(action = OnDeleteAction.NO_ACTION) private Context context; - @SafeHtml(whitelistType=SafeHtml.WhiteListType.NONE) + @SafeHtml(whitelistType = SafeHtml.WhiteListType.NONE) @NotBlank - @Length(min=1,max=255) - @Column(name="name",nullable = false) + @Length(min = 1, max = 255) + @Column(name = "name", nullable = false) private String name; //@SafeHtml(whitelistType= SafeHtml.WhiteListType.RELAXED) - @NotBlank - @Length(min=0,max=65535) - @Column(name="description", nullable = true, length = 65535, columnDefinition="text") + @Length(min = 0, max = 65535) + @Column(name = "description", nullable = true, length = 65535, columnDefinition = "text") private String description; - @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent", cascade = { CascadeType.ALL }) + @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent", cascade = {CascadeType.ALL}) private List children = new ArrayList<>(); + @Transient + public String getUrl() { + if (this.getId() == null || this.getId() == 0L) { + return "redirect:/project/root"; + } else { + return "redirect:/project/" + this.getId(); + } + } + @Transient public boolean hasNoChildren() { return this.children.size() == 0; @@ -108,7 +124,7 @@ public boolean equalsById(Project otherObject) { @Override public boolean equalsByUniqueConstraint(Project otherObject) { boolean okParent; - if(this.isRootProject()){ + if (this.isRootProject()) { okParent = (otherObject.isRootProject()); } else { okParent = this.getParent().equalsByUniqueConstraint(otherObject.getParent()); @@ -137,92 +153,19 @@ public static Project newRootProjectFactory(UserAccount userAccount) { return n; } - public static Project newRootProjectFactory(UserAccount userAccount,Context context) { + public static Project newRootProjectFactory(Context context) { Project n = new Project(); n.setParent(null); n.setContext(context); return n; } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Project getParent() { - return parent; - } - - public void setParent(Project parent) { - this.parent = parent; - } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public List getChildren() { - return children; - } - - public void setChildren(List children) { - this.children = children; - } - - public Context getContext() { - return context; - } - - public void setContext(Context context) { - this.context = context; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Project)) return false; - if (!super.equals(o)) return false; - Project project = (Project) o; - return Objects.equals(getId(), project.getId()) && - Objects.equals(getParent(), project.getParent()) && - getContext().equals(project.getContext()) && - getName().equals(project.getName()) && - getDescription().equals(project.getDescription()) && - getChildren().equals(project.getChildren()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getId(), getParent(), getContext(), getName(), getDescription(), getChildren()); - } - - @Override - public String toString() { - return "Project{" + - "id=" + id + - ", parent=" + parent + - ", context=" + context + - ", name='" + name + '\'' + - ", description='" + description + '\'' + - ", uuid='" + uuid + '\'' + - ", rowCreatedAt=" + rowCreatedAt + - ", rowUpdatedAt=" + rowUpdatedAt + - '}'; + //TODO: use newRootProjectFactory(Context context); + @Deprecated + public static Project newRootProjectFactory(UserAccount userAccount, Context context) { + return newRootProjectFactory(context); } } + diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectController.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectController.java index a43d68b4..510b393d 100644 --- a/src/main/java/org/woehlke/simpleworklist/project/ProjectController.java +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectController.java @@ -12,14 +12,10 @@ import org.springframework.web.bind.annotation.*; 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.TaskTime; -import org.woehlke.simpleworklist.taskstate.TaskMoveService; -import org.woehlke.simpleworklist.taskstate.TaskState; +import org.woehlke.simpleworklist.task.*; import org.woehlke.simpleworklist.user.account.UserAccount; import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; -import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.session.UserSessionBean; import org.springframework.beans.factory.annotation.Autowired; import javax.validation.Valid; @@ -31,128 +27,73 @@ */ @Slf4j @Controller -@RequestMapping(path = "/project") +@RequestMapping(path = "/project/{projectId}") public class ProjectController extends AbstractController { private final ProjectControllerService projectControllerService; - private final TaskMoveService taskMoveService; + private final TaskService taskService; @Autowired - public ProjectController(ProjectControllerService projectControllerService, TaskMoveService taskMoveService) { + public ProjectController(ProjectControllerService projectControllerService, TaskService taskService) { this.projectControllerService = projectControllerService; - this.taskMoveService = taskMoveService; + this.taskService = taskService; } - @RequestMapping(path="/root", method = RequestMethod.GET) - public final String showRootProject( - @PageableDefault(sort = "orderIdProject", direction = Sort.Direction.DESC) 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/show"; - } - - @RequestMapping(path = "/root/add/project", method = RequestMethod.GET) - public final String addNewTopLevelProjectForm( - @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, Model model - ){ - log.info("/project/root/add/project (GET)"); - Context context = super.getContext(userSession); - projectControllerService.addNewProjectToRoot(userSession, context, locale, model); - return "project/root/add/project"; - } - - @RequestMapping(path = "/root/add/project", method = RequestMethod.POST) - public final String addNewTopLevelProjectSave( - @Valid Project project, - @ModelAttribute("userSession") UserSessionBean userSession, - BindingResult result, - Locale locale, Model model - ){ - log.info("/project/root/add/project (POST)"); - Context context = super.getContext(userSession); - return projectControllerService.addNewProjectToRootPersist( - userSession, - project, - context, - result, - locale, - model, - "redirect:/project/" - ); - } - - @RequestMapping(path = "/root/add/task", method = RequestMethod.GET) - public final String addNewTaskToRootProjectGet( + @RequestMapping(path = "/task/add", method = RequestMethod.GET) + public final String projectTaskAddGet( + @PathVariable("projectId") Project thisProject, @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model ) { - log.info("/project/root/add/task (GET)"); - Context context = super.getContext(userSession); - UserAccount userAccount = context.getUserAccount(); + UserAccount userAccount = userAccountLoginSuccessService.retrieveCurrentUser(); Task task = new Task(); task.setTaskState(TaskState.INBOX); task.setTaskEnergy(TaskEnergy.NONE); task.setTaskTime(TaskTime.NONE); - Project thisProject; + task.setProject(thisProject); Boolean mustChooseArea = false; - thisProject = new Project(); - thisProject.setId(0L); - if(userSession.getContextId() == 0L){ + if(userSession.getLastContextId() == 0L){ mustChooseArea = true; task.setContext(userAccount.getDefaultContext()); - thisProject.setContext(userAccount.getDefaultContext()); } else { + Context context = contextService.findByIdAndUserAccount(userSession.getLastContextId(), userAccount); task.setContext(context); - thisProject.setContext(context); } - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowRootProject(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 "project/root/add/task"; + return "project/id/task/add"; } - @RequestMapping(path = "/root/add/task", method = RequestMethod.POST) - public final String addNewTaskToRootProjectPost( + @RequestMapping(path = "/task/add", method = RequestMethod.POST) + public final String projectTaskAddPost( + @PathVariable long projectId, @ModelAttribute("userSession") UserSessionBean userSession, @Valid Task task, - BindingResult result, Locale locale, Model model - ) { - log.info("/project/root/add/task (POST)"); + 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; - task.setContext(context); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(TaskState.INBOX,locale); + 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 "project/root/add/task"; + return "project/id/task/add"; } else { - task.setProject(null); + Project thisProject = projectService.findByProjectId(projectId); + task.setProject(thisProject); + task.setContext(thisProject.getContext()); if(task.getDueDate()==null){ task.setTaskState(TaskState.INBOX); } else { @@ -160,18 +101,18 @@ public final String addNewTaskToRootProjectPost( } task.setFocus(false); task.setContext(context); - long maxOrderIdProject = taskMoveService.getMaxOrderIdProject(task.getProject(),context); + long maxOrderIdProject = taskService.getMaxOrderIdProject(task.getProject(),context); task.setOrderIdProject(++maxOrderIdProject); - long maxOrderIdTaskState = taskMoveService.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); + long maxOrderIdTaskState = taskService.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); task.setOrderIdTaskState(++maxOrderIdTaskState); - task = taskService.saveAndFlush(task); + task = taskService.addToProject(task); log.info(task.toString()); - return "redirect:/project/root"; + return thisProject.getUrl(); } } - @RequestMapping(path = "/{projectId}", method = RequestMethod.GET) - public final String showProject( + @RequestMapping(path = "", method = RequestMethod.GET) + public final String project( @PathVariable long projectId, @PageableDefault(sort = "orderIdProject", direction = Sort.Direction.DESC) Pageable pageable, @RequestParam(required = false) String message, @@ -186,7 +127,7 @@ public final String showProject( Page taskPage = null; if (projectId != 0) { thisProject = projectService.findByProjectId(projectId); - taskPage = taskService.findByProject(thisProject, context, pageable); + taskPage = taskService.findByProject(thisProject, pageable); } else { thisProject = new Project(); thisProject.setId(0L); @@ -205,8 +146,8 @@ public final String showProject( return "project/id/show"; } - @RequestMapping(path = "/{projectId}/add/project", method = RequestMethod.GET) - public final String addNewSubProjectGet( + @RequestMapping(path = "/project/add", method = RequestMethod.GET) + public final String projectAddProjectGet( @PathVariable long projectId, @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model @@ -214,11 +155,11 @@ public final String addNewSubProjectGet( log.info("private addNewProjectGet (GET) projectId="+projectId); Context context = super.getContext(userSession); projectControllerService.addNewProject(projectId, userSession, context, locale, model); - return "project/id/add/project"; + return "project/id/project/add"; } - @RequestMapping(path = "/{projectId}/add/project", method = {RequestMethod.POST, RequestMethod.PUT}) - public final String addNewSubProjectPost( + @RequestMapping(path = "/project/add", method = {RequestMethod.POST}) + public final String projectAddProjectPost( @PathVariable long projectId, @ModelAttribute("userSession") UserSessionBean userSession, @Valid Project project, @@ -234,14 +175,14 @@ public final String addNewSubProjectPost( result, locale, model , - "/add/project" + "project/id/project/add" ); } - @RequestMapping(path = "/{thisProjectId}/move/to/project/{targetProjectId}", method = RequestMethod.GET) - public final String moveProject( - @PathVariable("thisProjectId") Project thisProject, + @RequestMapping(path = "/project/move/{targetProjectId}", method = RequestMethod.GET) + public final String projectMoveToProjectGet( + @PathVariable("projectId") Project thisProject, @PathVariable long targetProjectId, @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model @@ -250,12 +191,12 @@ public final String moveProject( userSession.setLastProjectId(thisProject.getId()); model.addAttribute("userSession",userSession); Project targetProject = projectService.findByProjectId(targetProjectId); - projectService.moveProjectToAnotherProject(thisProject, targetProject ); - return "redirect:/project/" + thisProject.getId(); + thisProject = projectService.moveProjectToAnotherProject(thisProject, targetProject ); + return thisProject.getUrl(); } - @RequestMapping(path = "/{projectId}/edit", method = RequestMethod.GET) - public final String editProjectGet( + @RequestMapping(path = "/edit", method = RequestMethod.GET) + public final String projectEditGet( @PathVariable("projectId") Project thisProject, @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model @@ -273,8 +214,8 @@ public final String editProjectGet( return "project/id/edit"; } - @RequestMapping(path = "/{projectId}/edit", method = RequestMethod.POST) - public final String editProjectPost( + @RequestMapping(path = "/edit", method = RequestMethod.POST) + public final String projectEditPost( @PathVariable long projectId, @Valid Project project, BindingResult result, @@ -283,189 +224,311 @@ public final String editProjectPost( ) { Context context = super.getContext(userSession); UserAccount thisUser = context.getUserAccount(); - userSession.setLastProjectId(projectId); - model.addAttribute("userSession",userSession); + model.addAttribute("userSession", userSession); + Project thisProject; if (result.hasErrors()) { for (ObjectError e : result.getAllErrors()) { log.info(e.toString()); } - Project thisProject = projectService.findByProjectId(projectId); + thisProject = projectService.findByProjectId(projectId); Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); model.addAttribute("breadcrumb", breadcrumb); return "project/id/edit"; } else { - Project thisProject = projectService.findByProjectId(project.getId()); + thisProject = projectService.findByProjectId(project.getId()); thisProject.setName(project.getName()); thisProject.setDescription(project.getDescription()); Context newContext = project.getContext(); - boolean areaChanged = (newContext.getId().longValue() != thisProject.getContext().getId().longValue()); - if(areaChanged){ - newContext = contextService.findByIdAndUserAccount(newContext.getId().longValue(), thisUser); - projectService.moveProjectToAnotherContext(thisProject, newContext); - model.addAttribute("userSession", new UserSessionBean(newContext.getId().longValue())); + boolean contextChanged = (newContext.getId().longValue() != thisProject.getContext().getId().longValue()); + if(contextChanged){ + long newContextId = newContext.getId(); + newContext = contextService.findByIdAndUserAccount(newContextId, thisUser); + thisProject = projectService.moveProjectToAnotherContext(thisProject, newContext); + userSession.setLastContextId(newContextId); } else { - projectService.saveAndFlush(thisProject); + thisProject = projectService.update(thisProject); } - return "redirect:/project/" + projectId; + userSession.setLastProjectId(thisProject.getId()); + model.addAttribute("userSession", userSession); + return thisProject.getUrl(); } } - @RequestMapping(path = "/{projectId}/delete", method = RequestMethod.GET) - public final String deleteProject( + @RequestMapping(path = "/delete", method = RequestMethod.GET) + public final String projectDeleteGet( @PathVariable("projectId") Project project, @PageableDefault(sort = "title", direction = Sort.Direction.DESC) Pageable request, @ModelAttribute("userSession") UserSessionBean userSession, Locale locale, Model model ) { - long newProjectId = project.getId(); - Context context = super.getContext(userSession); + //Context context = super.getContext(userSession); userSession.setLastProjectId(project.getId()); - model.addAttribute("userSession",userSession); - UserAccount userAccount = context.getUserAccount(); - if(project != null){ - boolean hasNoData = taskService.projectHasNoTasks(project); - boolean hasNoChildren = project.hasNoChildren(); - if (hasNoData && hasNoChildren) { - if (!project.isRootProject()) { - newProjectId = project.getParent().getId(); - } else { - newProjectId = 0; - } - projectService.delete(project); - String message = "Project is deleted. You see its parent project now."; - model.addAttribute("message",message); - model.addAttribute("isDeleted",true); + //model.addAttribute("userSession", userSession);//TODO: really? + boolean hasNoData = taskService.projectHasNoTasks(project); + boolean hasNoChildren = project.hasNoChildren(); + boolean delete = hasNoData && hasNoChildren; + if (delete) { + Project parent = projectService.delete(project); + String message = "Project is deleted. You see its parent project now."; //TODO: message to message_properties + //TODO: message to UserSessionBean userSession + model.addAttribute("message", message ); + //TODO: isDeleted as message to UserSessionBean userSession + model.addAttribute("isDeleted",true); + if(parent == null){ + return "redirect:/project/root"; } else { - StringBuilder s = new StringBuilder("Deletion rejected for this Project, because "); - log.info("Deletion rejected for Project " + project.getId()); - if (!hasNoData) { - log.warn("Project " + project.getId() + " has actionItem"); - s.append("Project has actionItems."); - } - if (!hasNoChildren) { - log.info("Project " + project.getId() + " has children"); - s.append("Project has child categories."); - } - model.addAttribute("message",s.toString()); - model.addAttribute("isDeleted",false); - Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(project,locale); - Page taskPage = taskService.findByProject(project, context, request); - model.addAttribute("taskPage", taskPage); - model.addAttribute("breadcrumb", breadcrumb); - model.addAttribute("thisProject", project); - return "project/id/show"; + return parent.getUrl(); } - } - if( newProjectId == 0){ - return "redirect:/project/root/tasks"; } else { - return "redirect:/project/" + newProjectId; + //TODO: message to message_properties + StringBuilder s = new StringBuilder("Deletion rejected for this Project, because "); + log.info("Deletion rejected for Project " + project.getId()); + if (!hasNoData) { + //TODO: message to message_properties + log.warn("Project " + project.getId() + " has actionItem"); + s.append("Project has actionItems."); + } + if (!hasNoChildren) { + //TODO: message to message_properties + log.info("Project " + project.getId() + " has children"); + s.append("Project has child categories."); + } + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(project,locale); + Page taskPage = taskService.findByProject(project, request); + model.addAttribute("message",s.toString()); + model.addAttribute("isDeleted",false); + model.addAttribute("taskPage", taskPage); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("thisProject", project); + return "project/id/show"; } } - @RequestMapping(path = "/{projectId}/task/{sourceTaskId}/changeorderto/{destinationTaskId}", method = RequestMethod.GET) - public String changeTaskOrderIdWithinAProject( + @RequestMapping(path = "/task/{taskId}/changeorderto/{destinationTaskId}", method = RequestMethod.GET) + public String projectTaskChangeOrderToTaskGet( @PathVariable("projectId") Project thisProject, - @PathVariable("sourceTaskId") Task sourceTask, + @PathVariable("taskId") Task sourceTask, @PathVariable("destinationTaskId") Task destinationTask, @ModelAttribute("userSession") UserSessionBean userSession, Model model ){ - if(!sourceTask.isInRootProject()){ - userSession.setLastProjectId(sourceTask.getProject().getId()); - } + userSession.setLastProjectId(thisProject.getId()); model.addAttribute("userSession",userSession); log.info("-------------------------------------------------"); - log.info(" changeTaskOrderIdWithinAProject"); + log.info(" projectTaskChangeOrderToTaskGet"); 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(); - } + taskService.moveOrderIdProject(sourceTask, destinationTask); + log.info(" DONE: taskMoveService.moveOrderIdProject"); log.info("-------------------------------------------------"); - return returnUrl; + return thisProject.getUrl(); } - @RequestMapping(path = "/{projectId}/add/task", method = RequestMethod.GET) - public final String addNewTaskToProjectGet( + @RequestMapping(path = "/task/completed/move/to/trash", method = RequestMethod.GET) + public final String moveAllCompletedToTrash( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + userSession.setLastProjectId(thisProject.getId()); + Context context = super.getContext(userSession); + taskService.moveAllCompletedToTrash(context); + return thisProject.getUrl(); + } + + @RequestMapping(path = "/task/trash/empty", method = RequestMethod.GET) + public final String emptyTrash( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + userSession.setLastProjectId(thisProject.getId()); + Context context = super.getContext(userSession); + taskService.emptyTrash(context); + return thisProject.getUrl(); + } + + + @RequestMapping(path = "/task/{taskId}/complete", method = RequestMethod.GET) + public final String setDoneTaskGet( + @PathVariable("projectId") Project thisProject, @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, Model model + @PathVariable("taskId") Task task ) { - 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()); + userSession.setLastProjectId(thisProject.getId()); + task.complete(); + long maxOrderIdTaskState = taskService.getMaxOrderIdTaskState(TaskState.COMPLETED,task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + task = taskService.updatedViaTaskstate(task); + return thisProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/incomplete", method = RequestMethod.GET) + public final String unsetDoneTaskGet( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession, + @PathVariable("taskId") Task task + ) { + userSession.setLastProjectId(thisProject.getId()); + task.incomplete(); + long maxOrderIdTaskState = taskService.getMaxOrderIdTaskState( task.getTaskState(), task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + task = taskService.updatedViaTaskstate(task); + return thisProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/setfocus", method = RequestMethod.GET) + public final String setFocusGet( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession, + @PathVariable("taskId") Task task, + @RequestParam(required=false) String back + ){ + if(task !=null) { + task.setFocus(); + task = taskService.updatedViaTaskstate(task); + return task.getUrl(); } else { - Context context = contextService.findByIdAndUserAccount(userSession.getContextId(), userAccount); - task.setContext(context); + return "redirect:/taskstate/inbox"; } - 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 "id/task/add"; } - @RequestMapping(path = "/{projectId}/add/task", method = RequestMethod.POST) - public final String addNewTaskToProjectPost( - @PathVariable long projectId, + @RequestMapping(path = "/task/{taskId}/unsetfocus", method = RequestMethod.GET) + public final String unsetFocusGet( + @PathVariable("projectId") Project thisProject, @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; - 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"; - return "id/task/add"; + @PathVariable("taskId") Task task, + @RequestParam(required=false) String back + ){ + if(task !=null) { + task.unsetFocus(); + task = taskService.updatedViaTaskstate(task); + return task.getUrl(); } 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 + "/"; + return "redirect:/taskstate/inbox"; } } + @RequestMapping(path = "/task/{taskId}/move/to/project/root", method = RequestMethod.GET) + public final String moveTaskToAnotherProject( + @PathVariable("projectId") Project thisProject, + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + task = taskService.moveTaskToRootProject(task); + return "redirect:/project/root"; + } + + @RequestMapping(path = "/task/{taskId}/move/to/project/{otherProjectId}", method = RequestMethod.GET) + public final String moveTaskToAnotherProject( + @PathVariable("projectId") Project thisProject, + @PathVariable("taskId") Task task, + @PathVariable("otherProjectId") Project otherProject, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + task = taskService.moveTaskToAnotherProject(task,otherProject); + return otherProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/inbox", method = RequestMethod.GET) + public final String moveTaskToInbox( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession, + @PathVariable("taskId") Task task + ) { + log.info("dragged and dropped "+task.getId()+" to inbox"); + task.moveToInbox(); + taskService.updatedViaTaskstate(task); + return thisProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/today", method = RequestMethod.GET) + public final String moveTaskToToday( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession, + @PathVariable("taskId") Task task + ) { + log.info("dragged and dropped "+task.getId()+" to today"); + task.moveToToday(); + taskService.updatedViaTaskstate(task); + return thisProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/next", method = RequestMethod.GET) + public final String moveTaskToNext( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession, + @PathVariable("taskId") Task task + ) { + log.info("dragged and dropped "+task.getId()+" to next"); + task.moveToNext(); + taskService.updatedViaTaskstate(task); + return thisProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/waiting", method = RequestMethod.GET) + public final String moveTaskToWaiting( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession, + @PathVariable("taskId") Task task + ) { + log.info("dragged and dropped "+task.getId()+" to waiting"); + task.moveToWaiting(); + taskService.updatedViaTaskstate(task); + return thisProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/someday", method = RequestMethod.GET) + public final String moveTaskToSomeday( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession, + @PathVariable("taskId") Task task + ) { + log.info("dragged and dropped "+task.getId()+" to someday"); + task.moveToSomeday(); + taskService.updatedViaTaskstate(task); + return thisProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/focus", method = RequestMethod.GET) + public final String moveTaskToFocus( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession, + @PathVariable("taskId") Task task + ) { + log.info("dragged and dropped "+task.getId()+" to focus"); + task.moveToFocus(); + taskService.updatedViaTaskstate(task); + return thisProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/completed", method = RequestMethod.GET) + public final String moveTaskToCompleted( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession, + @PathVariable("taskId") Task task + ) { + log.info("dragged and dropped "+task.getId()+" to completed"); + task.moveToCompletedTasks(); + taskService.updatedViaTaskstate(task); + return thisProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/move/to/trash", method = RequestMethod.GET) + public final String moveTaskToTrash( + @PathVariable("projectId") Project thisProject, + @ModelAttribute("userSession") UserSessionBean userSession, + @PathVariable("taskId") Task task + ) { + log.info("dragged and dropped "+task.getId()+" to trash"); + task.moveToTrash(); + task = taskService.updatedViaProject(task); + userSession.setLastProjectId(thisProject.getId()); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return thisProject.getUrl(); + } + } diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerRoot.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerRoot.java new file mode 100644 index 00000000..6b34f8b7 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerRoot.java @@ -0,0 +1,531 @@ +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.domain.Sort; +import org.springframework.data.web.PageableDefault; +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.breadcrumb.Breadcrumb; +import org.woehlke.simpleworklist.common.AbstractController; +import org.woehlke.simpleworklist.context.Context; +import org.woehlke.simpleworklist.task.*; +import org.woehlke.simpleworklist.session.UserSessionBean; +import org.woehlke.simpleworklist.user.account.UserAccount; + +import javax.validation.Valid; +import java.util.List; +import java.util.Locale; +import java.util.UUID; + +import static org.woehlke.simpleworklist.project.Project.rootProjectId; + +@Slf4j +@Controller +@RequestMapping(path = "/project/root") +public class ProjectControllerRoot extends AbstractController { + + public final static String rootProjectUrl = "redirect:/project/root"; + + private final ProjectControllerService projectControllerService; + private final TaskService taskService; + + @Autowired + public ProjectControllerRoot(ProjectControllerService projectControllerService, TaskService taskService) { + this.projectControllerService = projectControllerService; + this.taskService = taskService; + } + + @RequestMapping(path="", method = RequestMethod.GET) + public final String projectRoot( + @PageableDefault(sort = "orderIdProject", direction = Sort.Direction.DESC) 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/show"; + } + + @RequestMapping(path = "/project/add", method = RequestMethod.GET) + public final String projectRootAddProjectGet( + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model + ){ + log.info("/project/root/project/add (GET)"); + Context context = super.getContext(userSession); + projectControllerService.addNewProjectToRoot(userSession, context, locale, model); + return "project/root/project/add"; + } + + @RequestMapping(path = "/project/add", method = RequestMethod.POST) + public final String projectRootAddProjectPost( + @Valid Project project, + @ModelAttribute("userSession") UserSessionBean userSession, + BindingResult result, + Locale locale, Model model + ) { + log.info("/project/root/add/project (POST)"); + Context context = super.getContext(userSession); + if (result.hasErrors()) { + return "project/root/project/add"; + } else { + project.setUuid(UUID.randomUUID().toString()); + return projectControllerService.addNewProjectToRootPersist( + userSession, + project, + context, + result, + locale, + model + ); + } + } + + @RequestMapping(path = "/task/add", method = RequestMethod.GET) + public final String projectRootTaskAddGet( + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model + ) { + log.info("/project/root/add/task (GET)"); + 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); + task.unsetFocus(); + Project thisProject; + Boolean mustChooseContext = false; + thisProject = new Project(); + thisProject.setId(0L); + if(userSession.getLastContextId() == 0L){ + mustChooseContext = true; + task.setContext(userAccount.getDefaultContext()); + thisProject.setContext(userAccount.getDefaultContext()); + } else { + task.setContext(context); + thisProject.setContext(context); + } + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("mustChooseArea", mustChooseContext); //TODO: rename mustChooseArea -> mustChooseContext + model.addAttribute("thisProject", thisProject); + model.addAttribute("thisProjectId", thisProject.getId()); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("task", task); + return "project/root/task/add"; + } + + @RequestMapping(path = "/task/add", method = RequestMethod.POST) + public final String projectRootTaskAddPost( + @ModelAttribute("userSession") UserSessionBean userSession, + @Valid Task task, + BindingResult result, + Locale locale, + Model model + ) { + log.info("/project/root/task/add (POST)"); + 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 "project/root/task/add"; + } else { + task.setRootProject(); + /* + if(task.getDueDate()==null){ + task.setTaskState(TaskState.INBOX); + } else { + task.setTaskState(TaskState.SCHEDULED); + } + */ + task.unsetFocus(); + task.setContext(context); + long maxOrderIdProject = taskService.getMaxOrderIdRootProject(context); + task.setOrderIdProject(++maxOrderIdProject); + long maxOrderIdTaskState = taskService.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + task = taskService.addToRootProject(task); + log.info(task.toString()); + return rootProjectUrl; + } + } + + + @RequestMapping(path = "/task/{taskId}/edit", method = RequestMethod.GET) + public final String editTaskGet( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model + ) { + log.info("editTaskGet"); + UserAccount userAccount = userAccountLoginSuccessService.retrieveCurrentUser(); + List contexts = contextService.getAllForUser(userAccount); + Project thisProject; + if (task.getContext() == null) { + thisProject = new Project(); + thisProject.setId(0L); + } else { + thisProject = task.getProject(); + } + Context thisContext = task.getContext(); + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(task.getTaskState(),locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("thisProject", thisProject); //TODO: remove? + model.addAttribute("thisContext", thisContext); + model.addAttribute("task", task); + model.addAttribute("areas", contexts); + return "project/root/task/edit"; + } + + @RequestMapping(path = "/task/{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 + ) { + log.info("editTaskPost"); + if (result.hasErrors() ) { + log.warn("result.hasErrors"); + for (ObjectError e : result.getAllErrors()) { + log.error(e.toString()); + } + UserAccount userAccount = userAccountLoginSuccessService.retrieveCurrentUser(); + List contexts = contextService.getAllForUser(userAccount); + Task persistentTask = taskService.findOne(taskId); + persistentTask.merge(task); + task = persistentTask; + Context thisContext = task.getContext(); + Project thisProject = new Project(); + thisProject.setId(0L); + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("thisProject", thisProject); //TODO: remove? + model.addAttribute("thisContext", thisContext); + model.addAttribute("task", task); + model.addAttribute("areas", contexts); + userSession.setLastProjectId(thisProject.getId()); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + userSession.setLastContextId(thisContext.getId()); + return "project/root/task/edit"; + } else { + task.unsetFocus(); + task.setRootProject(); + Task persistentTask = taskService.findOne(task.getId()); + persistentTask.merge(task); + task = taskService.updatedViaProject(persistentTask); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return task.getTaskState().getUrl(); + } + } + + @RequestMapping(path = "/task/{taskId}/changeorderto/{destinationTaskId}", method = RequestMethod.GET) + public String changeTaskOrderId( + @PathVariable("taskId") Task sourceTask, + @PathVariable("destinationTaskId") Task destinationTask, + @ModelAttribute("userSession") UserSessionBean userSession, + Model model + ){ + model.addAttribute("userSession", userSession); + log.info("------------- changeTaskOrderId -------------"); + log.info("source Task: "+sourceTask.toString()); + log.info("---------------------------------------------"); + log.info("destination Task: "+destinationTask.toString()); + log.info("---------------------------------------------"); + taskService.moveOrderIdTaskState(sourceTask, destinationTask); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(sourceTask.getTaskState()); + userSession.setLastTaskId(sourceTask.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/move/to/project/root", method = RequestMethod.GET) + public final String moveTaskToProjectRoot( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + task = taskService.moveTaskToRootProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/move/to/project/{projectId}", method = RequestMethod.GET) + public final String moveTaskToProject( + @PathVariable("taskId") Task task, + @PathVariable("projectId") Project targetProject, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + task = taskService.moveTaskToAnotherProject(task,targetProject); + userSession.setLastProjectId(targetProject.getId()); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return targetProject.getUrl(); + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/inbox", method = RequestMethod.GET) + public final String moveTaskToInbox( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("dragged and dropped "+task.getId()+" to inbox"); + task.moveToInbox(); + taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/today", method = RequestMethod.GET) + public final String moveTaskToToday( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("dragged and dropped "+task.getId()+" to today"); + task.moveToToday(); + taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/next", method = RequestMethod.GET) + public final String moveTaskToNext( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("dragged and dropped "+task.getId()+" to next"); + task.moveToNext(); + taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/waiting", method = RequestMethod.GET) + public final String moveTaskToWaiting( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("dragged and dropped "+task.getId()+" to waiting"); + task.moveToWaiting(); + taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/someday", method = RequestMethod.GET) + public final String moveTaskToSomeday( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("dragged and dropped "+task.getId()+" to someday"); + task.moveToSomeday(); + taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/focus", method = RequestMethod.GET) + public final String moveTaskToFocus( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("dragged and dropped "+task.getId()+" to focus"); + task.moveToFocus(); + taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/move/to/taskstate/completed", method = RequestMethod.GET) + public final String moveTaskToCompleted( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("dragged and dropped "+task.getId()+" to completed"); + task.moveToCompletedTasks(); + taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/move/to/trash", method = RequestMethod.GET) + public final String moveTaskToTrash( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("dragged and dropped "+task.getId()+" to trash"); + task.moveToTrash(); + taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/completed/move/to/trash", method = RequestMethod.GET) + public final String moveAllCompletedToTrash( + @ModelAttribute("userSession") UserSessionBean userSession + ) { + Context context = super.getContext(userSession); + taskService.moveAllCompletedToTrash(context); + userSession.setLastContextId(context.getId()); + userSession.setLastProjectId(rootProjectId); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/trash/empty", method = RequestMethod.GET) + public final String emptyTrash( + @ModelAttribute("userSession") UserSessionBean userSession + ) { + Context context = super.getContext(userSession); + taskService.emptyTrash(context); + userSession.setLastContextId(context.getId()); + userSession.setLastProjectId(rootProjectId); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/delete", method = RequestMethod.GET) + public final String deleteTaskGet( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("deleteTaskGet"); + if(task!= null){ + task.delete(); + taskService.updatedViaProject(task); + } + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/undelete", method = RequestMethod.GET) + public final String undeleteTaskGet( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("undeleteTaskGet"); + task.undelete(); + taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/transform", method = RequestMethod.GET) + public final String transformTaskIntoProjectGet( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + log.info("transformTaskIntoProjectGet"); + //return transformTaskIntoProjectGet(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/complete", method = RequestMethod.GET) + public final String setDoneTaskGet( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + task.complete(); + long maxOrderIdTaskState = taskService.getMaxOrderIdTaskState(TaskState.COMPLETED,task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + task = taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/incomplete", method = RequestMethod.GET) + public final String unsetDoneTaskGet( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ) { + task.incomplete(); + long maxOrderIdTaskState = taskService.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + task = taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/setfocus", method = RequestMethod.GET) + public final String setFocusGet( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ){ + task.setFocus(); + task = taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } + + @RequestMapping(path = "/task/{taskId}/unsetfocus", method = RequestMethod.GET) + public final String unsetFocusGet( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession + ){ + task.unsetFocus(); + task = taskService.updatedViaProject(task); + userSession.setLastProjectId(rootProjectId); + userSession.setLastTaskState(task.getTaskState()); + userSession.setLastTaskId(task.getId()); + return rootProjectUrl; + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerService.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerService.java index 5ca2f214..c7cb4597 100644 --- a/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerService.java +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerService.java @@ -3,7 +3,7 @@ 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.session.UserSessionBean; import org.woehlke.simpleworklist.user.account.UserAccount; import java.util.Locale; @@ -48,7 +48,7 @@ String addNewProjectToRootPersist( Context context, BindingResult result, Locale locale, - Model model, - String s + Model model ); + } diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerServiceImpl.java index b916f687..b8b3e902 100644 --- a/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectControllerServiceImpl.java @@ -9,23 +9,29 @@ 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.task.Task; +import org.woehlke.simpleworklist.task.TaskService; +import org.woehlke.simpleworklist.session.UserSessionBean; import org.woehlke.simpleworklist.user.account.UserAccount; import java.util.List; import java.util.Locale; +import static org.woehlke.simpleworklist.project.Project.rootProjectId; + @Slf4j @Service public class ProjectControllerServiceImpl implements ProjectControllerService { private final ProjectService projectService; + private final TaskService taskService; private final ContextService contextService; private final BreadcrumbService breadcrumbService; @Autowired - public ProjectControllerServiceImpl(ProjectService projectService, ContextService contextService, BreadcrumbService breadcrumbService) { + public ProjectControllerServiceImpl(ProjectService projectService, TaskService taskService, ContextService contextService, BreadcrumbService breadcrumbService) { this.projectService = projectService; + this.taskService = taskService; this.contextService = contextService; this.breadcrumbService = breadcrumbService; } @@ -47,7 +53,7 @@ public void addNewProject( thisProject = new Project(); thisProject.setId(0L); project = Project.newRootProjectFactory(userAccount); - if(userSession.getContextId() == 0L){ + if(userSession.getLastContextId() == 0L){ model.addAttribute("mustChooseArea", true); project.setContext(userAccount.getDefaultContext()); } else { @@ -91,10 +97,10 @@ public String addNewProjectPersist( return template; } else { if (projectId == 0) { - if(userSession.getContextId()>0) { + if(userSession.getLastContextId()>0) { project.setContext(context); } - project = projectService.saveAndFlush(project); + project = projectService.add(project); projectId = project.getId(); } else { Project thisProject = projectService.findByProjectId(projectId); @@ -102,7 +108,7 @@ public String addNewProjectPersist( children.add(project); thisProject.setChildren(children); project.setParent(thisProject); - project = projectService.saveAndFlush(project); + project = projectService.add(project); projectId = project.getId(); log.info("project: "+ project.toString()); log.info("thisProject: "+ thisProject.toString()); @@ -117,10 +123,10 @@ public Project getProject(long projectId, UserAccount userAccount, UserSessionBe if (projectId == 0) { thisProject = new Project(); thisProject.setId(0L); - if(userSession.getContextId() == 0L){ + if(userSession.getLastContextId() == 0L){ thisProject.setContext(userAccount.getDefaultContext()); } else { - Context context = contextService.findByIdAndUserAccount(userSession.getContextId(), userAccount); + Context context = contextService.findByIdAndUserAccount(userSession.getLastContextId(), userAccount); thisProject.setContext(context); } } else { @@ -139,12 +145,13 @@ public void addNewProjectToRoot( log.info("addNewProjectToRoot"); Project project; project = new Project(); - project.setId(0L); + project.setId(rootProjectId); Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowRootProject(locale); model.addAttribute("breadcrumb", breadcrumb); model.addAttribute("project", project); model.addAttribute("thisProjectId", project.getId()); model.addAttribute("breadcrumb", breadcrumb); + userSession.setLastProjectId(rootProjectId); } @Override @@ -154,11 +161,11 @@ public String addNewProjectToRootPersist( Context context, BindingResult result, Locale locale, - Model model, - String s + Model model ) { log.info("addNewProjectToRootPersist"); - project = projectService.saveAndFlush(project); - return s + project.getId(); + project = projectService.add(project); + userSession.setLastProjectId(project.getId()); + return project.getUrl(); } } diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectRepository.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectRepository.java index de565195..ec3bf42d 100644 --- a/src/main/java/org/woehlke/simpleworklist/project/ProjectRepository.java +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectRepository.java @@ -5,7 +5,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import org.woehlke.simpleworklist.context.Context; -import org.woehlke.simpleworklist.project.Project; @Repository public interface ProjectRepository extends JpaRepository { diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectService.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectService.java index a829fbda..a2a49d29 100644 --- a/src/main/java/org/woehlke/simpleworklist/project/ProjectService.java +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectService.java @@ -3,7 +3,6 @@ import java.util.List; import org.woehlke.simpleworklist.context.Context; -//import org.woehlke.simpleworklist.user.account.UserAccount; public interface ProjectService { @@ -11,20 +10,16 @@ public interface ProjectService { List findAllProjectsByContext(Context context); - //@Deprecated - //List findRootProjectsByUserAccount(UserAccount userAccount); + Project moveProjectToAnotherProject(Project thisProject, Project targetProject); - //@Deprecated - //List findAllProjectsByUserAccount(UserAccount user); + Project findByProjectId(long projectId); - void moveProjectToAnotherProject(Project thisProject, Project targetProject); + Project add(Project project); - Project findByProjectId(long categoryId); + Project update(Project project); - Project saveAndFlush(Project project); + Project delete(Project project); - void delete(Project project); - - void moveProjectToAnotherContext(Project thisProject, Context newContext); + Project moveProjectToAnotherContext(Project thisProject, Context newContext); } diff --git a/src/main/java/org/woehlke/simpleworklist/project/ProjectServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/project/ProjectServiceImpl.java index 0d038f2c..d94ee484 100644 --- a/src/main/java/org/woehlke/simpleworklist/project/ProjectServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/project/ProjectServiceImpl.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.UUID; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -67,14 +68,22 @@ public Project findByProjectId(long projectId) { @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public Project saveAndFlush(Project entity) { + public Project add(Project entity) { log.info("saveAndFlush"); + entity.setUuid(UUID.randomUUID().toString()); return projectRepository.saveAndFlush(entity); } @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void delete(Project thisProject) { + public Project update(Project entity) { + log.info("saveAndFlush"); + return projectRepository.saveAndFlush(entity); + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Project delete(Project thisProject) { log.info("delete"); Project oldParent = thisProject.getParent(); if (oldParent != null) { @@ -82,28 +91,30 @@ public void delete(Project thisProject) { projectRepository.saveAndFlush(oldParent); } projectRepository.delete(thisProject); + return oldParent; } @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void moveProjectToAnotherContext(Project thisProject, Context newContext) { + public Project moveProjectToAnotherContext(Project thisProject, Context newContext) { log.info("----------------------------------------------------"); - log.info("moveProjectToAnotherContext: Project: "+thisProject.toString()); + log.info("moveProjectToAnotherContext: Project: "+ thisProject.toString()); log.info("----------------------------------------------------"); log.info("moveProjectToAnotherContext: newContext: "+ newContext.toString()); log.info("----------------------------------------------------"); thisProject.setParent(null); - projectRepository.saveAndFlush(thisProject); - List list = getAllChildrenOfProject(thisProject); - for(Project p : list){ - List tasks = taskRepository.findByProject(p); - for(Task t:tasks){ - t.setContext(newContext); + thisProject = projectRepository.saveAndFlush(thisProject); + List listProject = getAllChildrenOfProject(thisProject); + for(Project childProject : listProject){ + List tasksOfChildProject = taskRepository.findByProject(childProject); + for(Task task:tasksOfChildProject){ + task.setContext(newContext); } - taskRepository.saveAll(tasks); - p.setContext(newContext); - projectRepository.saveAndFlush(p); + childProject.setContext(newContext); + taskRepository.saveAll(tasksOfChildProject); + projectRepository.saveAndFlush(childProject); } + return thisProject; } private List getAllChildrenOfProject(Project thisProject) { @@ -119,7 +130,7 @@ private List getAllChildrenOfProject(Project thisProject) { @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void moveProjectToAnotherProject( + public Project moveProjectToAnotherProject( Project thisProject, Project targetProject ) { @@ -130,6 +141,6 @@ public void moveProjectToAnotherProject( projectRepository.saveAndFlush(oldParent); } thisProject.setParent(targetProject); - projectRepository.saveAndFlush(thisProject); + return projectRepository.saveAndFlush(thisProject); } } diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchController.java b/src/main/java/org/woehlke/simpleworklist/search/SearchController.java index 7bea38db..874a059c 100644 --- a/src/main/java/org/woehlke/simpleworklist/search/SearchController.java +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchController.java @@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.woehlke.simpleworklist.common.AbstractController; import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; -import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.session.UserSessionBean; import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.user.account.UserAccount; @@ -32,7 +32,7 @@ public SearchController(SearchService searchService) { this.searchService = searchService; } - @RequestMapping(path = "/", method = RequestMethod.GET) + @RequestMapping(path = "", method = RequestMethod.GET) public final String searchResults( @RequestParam String searchterm, @ModelAttribute("userSession") UserSessionBean userSession, @@ -40,14 +40,13 @@ public final String searchResults( ) { log.info("searchResults"); Context context = super.getContext(userSession); - UserAccount thisUser = context.getUserAccount(); userSession.setLastSearchterm(searchterm); - model.addAttribute("userSession",userSession); + model.addAttribute("userSession", userSession); log.info("Search: "+ searchterm); - SearchResult searchResult = searchService.search(searchterm, thisUser); + SearchResult searchResult = searchService.search(searchterm, context); log.info("found: "+ searchResult.toString()); - model.addAttribute("searchResult",searchResult); Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForSearchResults(locale); + model.addAttribute("searchResult",searchResult); model.addAttribute("breadcrumb",breadcrumb); return "search/resultlist"; } diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchDao.java b/src/main/java/org/woehlke/simpleworklist/search/SearchDao.java deleted file mode 100644 index f2451640..00000000 --- a/src/main/java/org/woehlke/simpleworklist/search/SearchDao.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.woehlke.simpleworklist.search; - -import org.woehlke.simpleworklist.user.account.UserAccount; - -/** - * Created by tw on 14.02.16. - */ -public interface SearchDao { - - SearchResult search(String searchterm, UserAccount userAccount); - - void resetSearchIndex(); - -} diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchDaoImpl.java b/src/main/java/org/woehlke/simpleworklist/search/SearchDaoImpl.java deleted file mode 100644 index 45f14e04..00000000 --- a/src/main/java/org/woehlke/simpleworklist/search/SearchDaoImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.woehlke.simpleworklist.search; - - -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; -import org.woehlke.simpleworklist.user.account.UserAccount; - -import javax.persistence.*; - -/** - * Created by tw on 14.02.16. - */ -@Slf4j -@Repository -public class SearchDaoImpl implements SearchDao { - - @PersistenceContext - private EntityManager em; - - @Override - public SearchResult search(String searchterm, UserAccount userAccount) { - log.info("search"); - return new SearchResult(); - } - - @Override - public void resetSearchIndex() { - log.info("resetSearchIndex"); - } -} diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchRequest.java b/src/main/java/org/woehlke/simpleworklist/search/SearchRequest.java new file mode 100644 index 00000000..cd0b7eb6 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchRequest.java @@ -0,0 +1,80 @@ +package org.woehlke.simpleworklist.search; + +import lombok.*; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import org.woehlke.simpleworklist.common.AuditModel; +import org.woehlke.simpleworklist.common.ComparableById; +import org.woehlke.simpleworklist.context.Context; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Entity +@Table( + name="search_request", + uniqueConstraints = { + @UniqueConstraint( + name = "ux_search_request", + columnNames = {"context_id", "searchterm"} + ) + }, + indexes = { + @Index(name = "ix_search_request_uuid", columnList = "uuid"), + @Index(name = "ix_search_request_row_created_at", columnList = "row_created_at") + } +) +@Getter +@Setter +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public class SearchRequest extends AuditModel implements Serializable, ComparableById { + + private static final long serialVersionUID = 7860692526488291439L; + + @Id + @GeneratedValue(generator = "search_request_generator") + @SequenceGenerator( + name = "search_request_generator", + sequenceName = "search_request_sequence", + initialValue = 1000 + ) + private Long id; + + @NotNull + @Column(name="searchterm", nullable = false) + private String searchterm = ""; + + @ManyToOne( + fetch = FetchType.LAZY, + optional = false, + cascade = { + CascadeType.MERGE, + CascadeType.REFRESH + } + ) + @JoinColumn(name = "context_id") + @OnDelete(action = OnDeleteAction.NO_ACTION) + private Context context; + + @Transient + @Override + public boolean equalsById(SearchRequest otherObject) { + return (this.getId().longValue() == otherObject.getId().longValue()); + } + + @Transient + @Override + public boolean equalsByUniqueConstraint(SearchRequest otherObject) { + return (this.getSearchterm().compareTo(otherObject.getSearchterm())==0); + } + + @Transient + @Override + public boolean equalsByUuid(SearchRequest otherObject) { + return super.equalsByMyUuid(otherObject); + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchRequestRepository.java b/src/main/java/org/woehlke/simpleworklist/search/SearchRequestRepository.java new file mode 100644 index 00000000..4c95c974 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchRequestRepository.java @@ -0,0 +1,8 @@ +package org.woehlke.simpleworklist.search; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SearchRequestRepository extends JpaRepository { +} diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchRequestService.java b/src/main/java/org/woehlke/simpleworklist/search/SearchRequestService.java new file mode 100644 index 00000000..cbdbe5e9 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchRequestService.java @@ -0,0 +1,8 @@ +package org.woehlke.simpleworklist.search; + +public interface SearchRequestService { + + SearchRequest add(SearchRequest searchRequest); + SearchRequest update(SearchRequest searchRequest); + +} diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchRequestServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/search/SearchRequestServiceImpl.java new file mode 100644 index 00000000..ecf9f41a --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchRequestServiceImpl.java @@ -0,0 +1,34 @@ +package org.woehlke.simpleworklist.search; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +@Slf4j +@Service +public class SearchRequestServiceImpl implements SearchRequestService { + + private final SearchRequestRepository searchRequestRepository; + + @Autowired + public SearchRequestServiceImpl(SearchRequestRepository searchRequestRepository) { + this.searchRequestRepository = searchRequestRepository; + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public SearchRequest add(SearchRequest searchRequest) { + searchRequest.setUuid(UUID.randomUUID().toString()); + return searchRequestRepository.saveAndFlush(searchRequest); + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public SearchRequest update(SearchRequest searchRequest) { + return searchRequestRepository.saveAndFlush(searchRequest); + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchResult.java b/src/main/java/org/woehlke/simpleworklist/search/SearchResult.java index 5985a90d..d778af4a 100644 --- a/src/main/java/org/woehlke/simpleworklist/search/SearchResult.java +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchResult.java @@ -1,75 +1,105 @@ package org.woehlke.simpleworklist.search; +import lombok.*; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import org.woehlke.simpleworklist.common.AuditModel; +import org.woehlke.simpleworklist.common.ComparableById; import org.woehlke.simpleworklist.task.Task; import org.woehlke.simpleworklist.project.Project; +import javax.persistence.*; import java.io.Serializable; -import java.util.ArrayList; import java.util.List; /** * Created by tw on 14.02.16. */ -public class SearchResult implements Serializable { - private static final long serialVersionUID = 1682809351146047764L; - - private String searchterm = ""; - private List taskList = new ArrayList<>(); - private List projectList = new ArrayList<>(); - - public String getSearchterm() { - return searchterm; - } - - public void setSearchterm(String searchterm) { - this.searchterm = searchterm; - } - - public List getTaskList() { - return taskList; - } - - public void setTaskList(List taskList) { - this.taskList = taskList; - } - - public List getProjectList() { - return projectList; +@Entity +@Table( + name="search_result", + uniqueConstraints = { + @UniqueConstraint( + name = "ux_search_result", + columnNames = {"search_request_id"} + ) + }, + indexes = { + @Index(name = "ix_search_result_uuid", columnList = "uuid"), + @Index(name = "ix_search_result_row_created_at", columnList = "row_created_at") } +) +@Getter +@Setter +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public class SearchResult extends AuditModel implements Serializable, ComparableById { - public void setProjectList(List projectList) { - this.projectList = projectList; - } + private static final long serialVersionUID = 1682809351146047764L; + @Id + @GeneratedValue(generator = "search_request_generator") + @SequenceGenerator( + name = "search_request_generator", + sequenceName = "search_request_sequence", + initialValue = 1000 + ) + private Long id; + + @ManyToOne( + fetch = FetchType.LAZY, + optional = false, + cascade = { + CascadeType.MERGE, + CascadeType.REFRESH + } + ) + @JoinColumn(name = "search_request_id") + @OnDelete(action = OnDeleteAction.NO_ACTION) + private SearchRequest searchRequest; + + @ManyToMany( + fetch = FetchType.LAZY, + cascade = { + CascadeType.MERGE, + CascadeType.REFRESH + } + ) + @JoinTable(name = "search_result2task") + @OnDelete(action = OnDeleteAction.NO_ACTION) + private List resultListTasks; + + @ManyToMany( + fetch = FetchType.LAZY, + cascade = { + CascadeType.MERGE, + CascadeType.REFRESH + } + ) + @JoinTable(name = "search_result2project") + @OnDelete(action = OnDeleteAction.NO_ACTION) + private List resultListProject; + + @Transient @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - SearchResult that = (SearchResult) o; - - if (searchterm != null ? !searchterm.equals(that.searchterm) : that.searchterm != null) return false; - if (taskList != null ? !taskList.equals(that.taskList) : that.taskList != null) - return false; - return projectList != null ? projectList.equals(that.projectList) : that.projectList == null; - + public boolean equalsById(SearchResult otherObject) { + return (this.getId().longValue() == otherObject.getId().longValue()); } + @Transient @Override - public int hashCode() { - int result = searchterm != null ? searchterm.hashCode() : 0; - result = 31 * result + (taskList != null ? taskList.hashCode() : 0); - result = 31 * result + (projectList != null ? projectList.hashCode() : 0); - return result; + public boolean equalsByUniqueConstraint(SearchResult otherObject) { + boolean okUuid = this.equalsByUuid(otherObject); + boolean contextId = searchRequest.getContext().equalsByUniqueConstraint(otherObject.getSearchRequest().getContext()); + return okUuid && contextId; } + @Transient @Override - public String toString() { - return "SearchResult{" + - "searchterm='" + searchterm + '\'' + - ", taskList=" + taskList + - ", projectList=" + projectList + - '}'; + public boolean equalsByUuid(SearchResult otherObject) { + return super.equalsByMyUuid(otherObject); } } diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchResultRepository.java b/src/main/java/org/woehlke/simpleworklist/search/SearchResultRepository.java new file mode 100644 index 00000000..4b912b8e --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchResultRepository.java @@ -0,0 +1,9 @@ +package org.woehlke.simpleworklist.search; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SearchResultRepository extends JpaRepository { + +} diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchResultService.java b/src/main/java/org/woehlke/simpleworklist/search/SearchResultService.java new file mode 100644 index 00000000..90118756 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchResultService.java @@ -0,0 +1,10 @@ +package org.woehlke.simpleworklist.search; + +public interface SearchResultService { + + void resetSearchIndex(); + + SearchResult add(SearchResult searchResult); + SearchResult update(SearchResult searchResult); + +} diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchResultServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/search/SearchResultServiceImpl.java new file mode 100644 index 00000000..733cdab9 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchResultServiceImpl.java @@ -0,0 +1,40 @@ +package org.woehlke.simpleworklist.search; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +@Slf4j +@Service +public class SearchResultServiceImpl implements SearchResultService { + + private final SearchResultRepository searchResultRepository; + + @Autowired + public SearchResultServiceImpl(SearchResultRepository searchResultRepository) { + this.searchResultRepository = searchResultRepository; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + public void resetSearchIndex() { + this.searchResultRepository.deleteAll(); + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public SearchResult add(SearchResult searchResult) { + searchResult.setUuid(UUID.randomUUID().toString()); + return searchResultRepository.saveAndFlush(searchResult); + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public SearchResult update(SearchResult searchResult) { + return searchResultRepository.saveAndFlush(searchResult); + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchService.java b/src/main/java/org/woehlke/simpleworklist/search/SearchService.java index 5bb0b6ab..202a1b41 100644 --- a/src/main/java/org/woehlke/simpleworklist/search/SearchService.java +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchService.java @@ -1,5 +1,6 @@ package org.woehlke.simpleworklist.search; +import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.user.account.UserAccount; /** @@ -7,7 +8,9 @@ */ public interface SearchService { - SearchResult search(String searchterm, UserAccount userAccount); + SearchResult search(SearchRequest searchRequest); + + SearchResult search(String searchterm, Context context); void resetSearchIndex(); diff --git a/src/main/java/org/woehlke/simpleworklist/search/SearchServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/search/SearchServiceImpl.java index b325928d..78ef8caf 100644 --- a/src/main/java/org/woehlke/simpleworklist/search/SearchServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/search/SearchServiceImpl.java @@ -4,36 +4,51 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import org.woehlke.simpleworklist.user.account.UserAccount; +import org.woehlke.simpleworklist.context.Context; -import org.springframework.beans.factory.annotation.Autowired; /** * Created by tw on 14.02.16. */ @Slf4j @Service -@Transactional(propagation = Propagation.REQUIRES_NEW) public class SearchServiceImpl implements SearchService { - private final SearchDao searchDao; + private final SearchRequestService searchRequestService; + private final SearchResultService searchResultService; - @Autowired - public SearchServiceImpl(SearchDao searchDao) { - this.searchDao = searchDao; + public SearchServiceImpl(SearchRequestService searchRequestService, SearchResultService searchResultService) { + this.searchRequestService = searchRequestService; + this.searchResultService = searchResultService; } @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = true) - public SearchResult search(String searchterm, UserAccount userAccount) { + public SearchResult search(SearchRequest searchRequest) { log.info("search"); - SearchResult searchResult = searchDao.search(searchterm, userAccount); - return searchResult; + searchRequest = searchRequestService.update(searchRequest); + SearchResult result = new SearchResult(); + result.setSearchRequest(searchRequest); + return result; } @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + public SearchResult search(String searchterm, Context context) { + log.info("search"); + SearchRequest searchRequest = new SearchRequest(); + searchRequest.setSearchterm(searchterm); + searchRequest.setContext(context); + searchRequest = searchRequestService.add(searchRequest); + SearchResult result = new SearchResult(); + result.setSearchRequest(searchRequest); + return result; + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW) public void resetSearchIndex() { log.info("resetSearchIndex"); - searchDao.resetSearchIndex(); + searchResultService.resetSearchIndex(); } } diff --git a/src/main/java/org/woehlke/simpleworklist/user/UserSessionBean.java b/src/main/java/org/woehlke/simpleworklist/session/UserSessionBean.java similarity index 52% rename from src/main/java/org/woehlke/simpleworklist/user/UserSessionBean.java rename to src/main/java/org/woehlke/simpleworklist/session/UserSessionBean.java index 08b77975..5ffd685c 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/UserSessionBean.java +++ b/src/main/java/org/woehlke/simpleworklist/session/UserSessionBean.java @@ -1,10 +1,10 @@ -package org.woehlke.simpleworklist.user; +package org.woehlke.simpleworklist.session; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import org.woehlke.simpleworklist.taskstate.TaskState; +import org.woehlke.simpleworklist.task.TaskState; import java.io.Serializable; @@ -19,23 +19,30 @@ public class UserSessionBean implements Serializable { private static final long serialVersionUID = -6649686058228455825L; - private Long contextId; - private TaskState lastTaskState; + private Long userAccountid; + private Long lastContextId; private Long lastProjectId; - private String lastSearchterm; + private Long lastTaskId; + private TaskState lastTaskState; + private String lastSearchterm; //TODO: Make SearchRequest to Entity public UserSessionBean(){ - lastSearchterm=""; + lastSearchterm=""; //TODO: Make SearchRequest to Entity lastTaskState=TaskState.INBOX; lastProjectId=0L; - contextId=0L; + lastContextId=0L; + lastTaskId=0L; + userAccountid=0L; } + @Deprecated public UserSessionBean(long contextId){ - lastSearchterm=""; + this.lastContextId = contextId; + lastSearchterm=""; //TODO: Make SearchRequest to Entity lastTaskState=TaskState.INBOX; lastProjectId=0L; - this.contextId = contextId; + lastTaskId=0L; + userAccountid=0L; } } diff --git a/src/main/java/org/woehlke/simpleworklist/task/Task.java b/src/main/java/org/woehlke/simpleworklist/task/Task.java index d5f72dc9..2856b42b 100644 --- a/src/main/java/org/woehlke/simpleworklist/task/Task.java +++ b/src/main/java/org/woehlke/simpleworklist/task/Task.java @@ -1,26 +1,38 @@ package org.woehlke.simpleworklist.task; import java.io.Serializable; +import java.util.ArrayList; import java.util.Date; -import java.util.Objects; import javax.persistence.*; import javax.persistence.Index; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.hibernate.annotations.LazyToOne; import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDeleteAction; import org.hibernate.validator.constraints.Length; + import javax.validation.constraints.NotBlank; + import org.hibernate.validator.constraints.SafeHtml; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; import org.springframework.format.annotation.DateTimeFormat; import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.project.Project; -import org.woehlke.simpleworklist.taskstate.TaskState; import org.woehlke.simpleworklist.user.account.UserAccount; import org.woehlke.simpleworklist.common.AuditModel; import org.woehlke.simpleworklist.common.ComparableById; +import static org.hibernate.annotations.LazyToOneOption.PROXY; + +//TODO: test all three UniqueConstraints @Entity @Table( name="task", @@ -35,7 +47,7 @@ ), @UniqueConstraint( name="ux_task_order_id_task_state", - columnNames = {"order_id_task_state", "task_state", "project_id", "context_id", "user_account_id"} + columnNames = {"order_id_task_state", "task_state", "context_id", "user_account_id"} )*/ }, indexes = { @@ -44,6 +56,10 @@ @Index(name = "ix_task_title", columnList = "title") } ) +@Getter +@Setter +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) public class Task extends AuditModel implements Serializable, ComparableById { private static final long serialVersionUID = 5247710652586269801L; @@ -79,9 +95,9 @@ public class Task extends AuditModel implements Serializable, ComparableById 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 "taskstate/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 - ) { - log.info("editTaskPost"); - 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 "taskstate/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/root"; - } - taskService.saveAndFlush(persistentTask); - return "redirect:/project/" + projectId; - } - } - - @RequestMapping(path = "/{taskId}/delete", method = RequestMethod.GET) - public final String deleteTaskGet(@PathVariable("taskId") Task task) { - log.info("deleteTaskGet"); - if(task!= null){ - taskService.delete(task); - } - return "redirect:/taskstate/trash"; - } - - @RequestMapping(path = "/{taskId}/undelete", method = RequestMethod.GET) - public final String undeleteTaskGet(@PathVariable("taskId") Task task) { - log.info("undeleteTaskGet"); - if(task!= null) { - taskService.undelete(task); - return "redirect:/taskstate/completed"; - } else { - return "redirect:/taskstate/trash"; - } - } - - @RequestMapping(path = "/{taskId}/transform", method = RequestMethod.GET) - public final String transformTaskIntoProjectGet(@PathVariable("taskId") Task task) { - log.info("transformTaskIntoProjectGet"); - if(task != null) { - long projectId = 0; - if (task.getProject() != null) { - projectId = task.getProject().getId(); - } - Project parentProject = projectService.findByProjectId(projectId); - Project thisProject = new Project(); - thisProject.setParent(parentProject); - thisProject.setName(task.getTitle()); - thisProject.setDescription(task.getText()); - thisProject.setUuid(task.getUuid()); - thisProject.setContext(task.getContext()); - thisProject = projectService.saveAndFlush(thisProject); - taskService.delete(task); - projectId = thisProject.getId(); - log.info("tried to transform Task " + task.getId() + " to new Project " + projectId); - if(projectId == 0){ - return "redirect:/project/root/"; - } else { - return "redirect:/project/" + projectId + "/"; - } - } - return "redirect:/taskstate/inbox"; - } - - @RequestMapping(path = "/{taskId}/complete", 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 = "/{taskId}/incomplete", 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 = "/{taskId}/setfocus", 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 = "/{taskId}/unsetfocus", 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/java/org/woehlke/simpleworklist/task/TaskControllerService.java b/src/main/java/org/woehlke/simpleworklist/task/TaskControllerService.java deleted file mode 100644 index 5a83ab75..00000000 --- a/src/main/java/org/woehlke/simpleworklist/task/TaskControllerService.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.woehlke.simpleworklist.task; - -import org.springframework.data.domain.Page; -import org.springframework.ui.Model; -import org.woehlke.simpleworklist.taskstate.TaskState; -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 deleted file mode 100644 index efb88141..00000000 --- a/src/main/java/org/woehlke/simpleworklist/task/TaskControllerServiceImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -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.taskstate.TaskState; -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 - ){ - log.info("getTaskStatePage"); - 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){ - log.info("getView"); - 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/TaskRepository.java b/src/main/java/org/woehlke/simpleworklist/task/TaskRepository.java index 4afb5dee..b8caf20a 100644 --- a/src/main/java/org/woehlke/simpleworklist/task/TaskRepository.java +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskRepository.java @@ -10,7 +10,6 @@ import org.springframework.stereotype.Repository; import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.project.Project; -import org.woehlke.simpleworklist.taskstate.TaskState; @Repository public interface TaskRepository extends JpaRepository { diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskService.java b/src/main/java/org/woehlke/simpleworklist/task/TaskService.java index 5ef435e8..2f67595e 100644 --- a/src/main/java/org/woehlke/simpleworklist/task/TaskService.java +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskService.java @@ -7,25 +7,33 @@ public interface TaskService { - Task saveAndFlush(Task persistentTask); - - void delete(Task task); - + Task findOne(long taskId); boolean projectHasNoTasks(Project project); - void undelete(Task task); + Page findbyTaskstate(TaskState taskState, Context context, Pageable request); - void complete(Task task); + Page findByProject(Project thisProject, Pageable request); + Page findByRootProject(Context context, Pageable request); - void incomplete(Task task); + long getMaxOrderIdTaskState(TaskState taskState, Context context); + long getMaxOrderIdRootProject(Context context); + long getMaxOrderIdProject(Project project, Context context); - void setFocus(Task task); - void unsetFocus(Task task); - Page findByProject(Project thisProject, Context context, Pageable request); + Task addToInbox(Task task); + Task addToRootProject(Task task); + Task addToProject(Task task); - Page findByRootProject(Context context,Pageable request); + Task updatedViaTaskstate(Task task); + Task updatedViaProject(Task task); - Task findOne(long taskId); + Task moveTaskToRootProject(Task task); + Task moveTaskToAnotherProject(Task task, Project project); + void moveAllCompletedToTrash(Context context); + void emptyTrash(Context context); + + void moveOrderIdTaskState(Task sourceTask, Task destinationTask); + void moveOrderIdProject(Task sourceTask, Task destinationTask); + void moveOrderIdRootProject(Task sourceTask, Task destinationTask); } diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/task/TaskServiceImpl.java index 4ca910c0..62757f08 100644 --- a/src/main/java/org/woehlke/simpleworklist/task/TaskServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskServiceImpl.java @@ -2,123 +2,506 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.project.Project; -import org.woehlke.simpleworklist.taskstate.TaskState; import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.UUID; @Slf4j @Service -@Transactional(propagation = Propagation.REQUIRED, readOnly = true) public class TaskServiceImpl implements TaskService { private final TaskRepository taskRepository; @Autowired - public TaskServiceImpl(TaskRepository taskRepository) { + public TaskServiceImpl(TaskRepository taskRepository ) { this.taskRepository = taskRepository; } + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + public boolean projectHasNoTasks(Project project) { + log.info("projectHasNoTasks"); + return taskRepository.findByProject(project).isEmpty(); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + public Page findbyTaskstate(TaskState taskState, Context context, Pageable request) { + if(taskState == TaskState.FOCUS){ + return taskRepository.findByFocusAndContext(true,context,request); + }else { + return taskRepository.findByTaskStateAndContext(taskState, context, request); + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + public Page findByProject(Project thisProject, Pageable request) { + log.info("findByProject: "); + log.info("---------------------------------"); + log.info("thisProject: "+thisProject); + log.info("---------------------------------"); + if(thisProject == null){ + return Task.getEmptyPage(request); + } else { + return taskRepository.findByProject(thisProject,request); + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + public Page findByRootProject(Context context, Pageable request) { + log.info("findByRootProject: "); + if(context == null){ + return Task.getEmptyPage(request); + } else { + return taskRepository.findByProjectIsNullAndContext(context, request); + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + public Task findOne(long taskId) { + log.info("findOne: "); + if(taskRepository.existsById(taskId)) { + return taskRepository.getOne(taskId); + } else { + return null; + } + } + @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public Task saveAndFlush(Task entity) { - log.info("saveAndFlush"); - entity = taskRepository.saveAndFlush(entity); - log.info("saved: " + entity.toString()); - return entity; + public Task updatedViaTaskstate(Task task) { + log.info("updatedViaTaskstate"); + task = taskRepository.saveAndFlush(task); + log.info("persisted: " + task.getId()); + return task; } @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void delete(Task task) { - log.info("delete"); - task.setTaskState(TaskState.TRASH); - taskRepository.saveAndFlush(task); + public Task updatedViaProject(Task task) { + log.info("updatedViaProject"); + task = taskRepository.saveAndFlush(task); + log.info("persisted: " + task.getId()); + return task; } @Override - public boolean projectHasNoTasks(Project project) { - log.info("projectHasNoTasks"); - return taskRepository.findByProject(project).isEmpty(); + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task addToProject(Task task) { + log.info("addToProject"); + task.setUuid(UUID.randomUUID().toString()); + task = taskRepository.saveAndFlush(task); + log.info("persisted: " + task.getId()); + return task; + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task addToRootProject(Task task) { + log.info("addToRootProject"); + task.setUuid(UUID.randomUUID().toString()); + task.unsetFocus(); + task = taskRepository.saveAndFlush(task); + log.info("persisted: " + task.getId()); + return task; } @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void undelete(Task task) { - log.info("undelete"); - task.switchToLastFocusType(); - taskRepository.saveAndFlush(task); + public Task moveTaskToRootProject(Task task) { + task.setRootProject(); + long maxOrderIdProject = this.getMaxOrderIdProject( + task.getProject(), task.getContext() + ); + task.setOrderIdProject(++maxOrderIdProject); + return taskRepository.saveAndFlush(task); } @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void complete(Task task) { - log.info("complete"); + public Task moveTaskToAnotherProject(Task task, Project project) { + boolean okContext = task.hasSameContextAs(project); + if(okContext) { + task.setProject(project); + long maxOrderIdProject = this.getMaxOrderIdProject( + task.getProject(), + task.getContext() + ); + task.setOrderIdProject(++maxOrderIdProject); + taskRepository.saveAndFlush(task); + } + return task; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task moveTaskToInbox(Task task) { + long newOrderIdTaskState = this.getMaxOrderIdTaskState( + TaskState.INBOX, + task.getContext() + ); + task.setTaskState(TaskState.INBOX); + task.setOrderIdTaskState(++newOrderIdTaskState); + task = taskRepository.saveAndFlush(task); + log.info("moved " + task.getId() + " to inbox: " + task.toString()); + return task; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task moveTaskToToday(Task task) { + Date now = new Date(); + long newOrderIdTaskState = this.getMaxOrderIdTaskState( + TaskState.TODAY, + task.getContext() + ); + task.setOrderIdTaskState(++newOrderIdTaskState); + task.setTaskState(TaskState.TODAY); + task.setDueDate(now); + task = taskRepository.saveAndFlush(task); + log.info("moved " + task.getId() + " to today: " + task.toString()); + return task; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task moveTaskToNext(Task task) { + long newOrderIdTaskState = this.getMaxOrderIdTaskState( + TaskState.NEXT, + task.getContext() + ); + task.setOrderIdTaskState(++newOrderIdTaskState); + task.setTaskState(TaskState.NEXT); + task = taskRepository.saveAndFlush(task); + log.info("moved " + task.getId() + " to next: " + task.toString()); + return task; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task moveTaskToWaiting(Task task) { + long newOrderIdTaskState = this.getMaxOrderIdTaskState( + TaskState.WAITING, + task.getContext() + ); + task.setOrderIdTaskState(++newOrderIdTaskState); + task.setTaskState(TaskState.WAITING); + task = taskRepository.saveAndFlush(task); + log.info("moved " + task.getId() + " to next: " + task.toString()); + return task; + } + + + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task moveTaskToSomeday(Task task) { + long newOrderIdTaskState = this.getMaxOrderIdTaskState( + TaskState.SOMEDAY, + task.getContext() + ); + task.setOrderIdTaskState(++newOrderIdTaskState); + task.setTaskState(TaskState.SOMEDAY); + task = taskRepository.saveAndFlush(task); + log.info("moved " + task.getId() + " to someday: " + task.toString()); + return task; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task moveTaskToFocus(Task task) { + long newOrderIdTaskState = this.getMaxOrderIdTaskState( + TaskState.FOCUS, + task.getContext() + ); + task.setOrderIdTaskState(++newOrderIdTaskState); + task.setFocus(true); + task = taskRepository.saveAndFlush(task); + log.info("moved " + task.getId() + " to focus: " + task.toString()); + return task; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task moveTaskToCompleted(Task task) { + long newOrderIdTaskState = this.getMaxOrderIdTaskState( + TaskState.COMPLETED, + task.getContext() + ); + task.setOrderIdTaskState(++newOrderIdTaskState); task.setTaskState(TaskState.COMPLETED); - taskRepository.saveAndFlush(task); + task = taskRepository.saveAndFlush(task); + log.debug("moved " + task.getId() + " to completed: " + task.toString()); + return task; + } + + + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task moveTaskToTrash(Task task) { + long newOrderIdTaskState = this.getMaxOrderIdTaskState( + TaskState.TRASH, + task.getContext() + ); + task.setOrderIdTaskState(++newOrderIdTaskState); + task.setTaskState(TaskState.TRASH); + task = taskRepository.saveAndFlush(task); + log.debug("moved " + task.getId() + " to trash: " + task.toString()); + return task; } @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void incomplete(Task task) { - log.info("incomplete"); - task.switchToLastFocusType(); - taskRepository.saveAndFlush(task); + public void moveAllCompletedToTrash(Context context) { + long maxOrderIdTaskState = this.getMaxOrderIdTaskStateFor( + TaskState.TRASH, + context + ); + long newOrderIdTaskState = maxOrderIdTaskState; + List taskListCompleted = taskRepository.findByTaskStateAndContextOrderByOrderIdTaskStateAsc( + TaskState.COMPLETED, + context + ); + for (Task task : taskListCompleted) { + newOrderIdTaskState++; + task.setOrderIdTaskState(newOrderIdTaskState); + task.moveToTrash(); + } + taskRepository.saveAll(taskListCompleted); } @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void setFocus(Task task) { - log.info("setFocus"); - task.setFocus(true); - taskRepository.saveAndFlush(task); + public void emptyTrash(Context context) { + List taskList = taskRepository.findByTaskStateAndContext( + TaskState.TRASH, + context + ); + List taskListChanged = new ArrayList<>(taskList.size()); + for(Task task: taskList){ + task.emptyTrash(); + taskListChanged.add(task); + } + taskRepository.saveAll(taskListChanged); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + public long getMaxOrderIdTaskState(TaskState taskState, Context context) { + Task task = taskRepository.findTopByTaskStateAndContextOrderByOrderIdTaskStateDesc( + taskState, + context + ); + return (task==null) ? 0 : task.getOrderIdTaskState(); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + public long getMaxOrderIdProject(Project project, Context context) { + Task task = taskRepository.findTopByProjectAndContextOrderByOrderIdProjectDesc( + project, + context + ); + return (task==null) ? 0 : task.getOrderIdProject(); } @Override @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void unsetFocus(Task task) { - log.info("unsetFocus"); - task.setFocus(false); - taskRepository.saveAndFlush(task); + public void moveOrderIdTaskState( Task sourceTask, Task destinationTask ) { + boolean notEqualsId = ! sourceTask.equalsById(destinationTask); + boolean notEquals = ! sourceTask.equalsByUniqueConstraint(destinationTask); + boolean sameContext = sourceTask.hasSameContextAs(destinationTask); + boolean sameTaskType = sourceTask.hasSameTaskTypetAs(destinationTask); + boolean srcIsBelowDestinationTask = sourceTask.isBelowByTaskState(destinationTask); + if ( + notEqualsId && notEquals && + sameContext && sameTaskType + ) { + if (srcIsBelowDestinationTask) { + this.moveTasksDownByTaskState( sourceTask, destinationTask ); + } else { + this.moveTasksUpByTaskState( sourceTask, destinationTask ); + } + } } @Override - public Page findByProject(Project thisProject, Context context, Pageable request) { - 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 { - return taskRepository.findByProject(thisProject,request); + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public void moveOrderIdRootProject( Task sourceTask, Task destinationTask ) { + boolean sourceTaskRoot = destinationTask.isInRootProject(); + boolean destinationTaskRoot = destinationTask.isInRootProject(); + boolean sameContext = sourceTask.hasSameContextAs(destinationTask); + boolean sameProject = sourceTask.hasSameProjectAs(destinationTask); + boolean srcIsBelowDestinationTask = sourceTask.isBelowByProject(destinationTask); + if (sameContext && sameProject && sourceTaskRoot && destinationTaskRoot) { + if (srcIsBelowDestinationTask) { + this.moveTasksDownByProject(sourceTask, destinationTask); + } else { + this.moveTasksUpByProject(sourceTask, destinationTask); + } } } @Override - public Page findByRootProject(Context context, Pageable request) { - log.info("findByRootProject: "); - return taskRepository.findByProjectIsNullAndContext(context,request); + @Transactional(propagation = Propagation.REQUIRED, readOnly = true) + public long getMaxOrderIdRootProject(Context context) { + Task task = taskRepository.findTopByProjectAndContextOrderByOrderIdProjectDesc( + null, + context + ); + return (task==null) ? 0 : task.getOrderIdProject(); } @Override - public Task findOne(long taskId) { - log.info("findOne: "); - if(taskRepository.existsById(taskId)) { - return taskRepository.getOne(taskId); - } else { - return null; + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public void moveOrderIdProject( Task sourceTask, Task destinationTask ) { + Project project = sourceTask.getProject(); + boolean okProject = destinationTask.hasProject(project); + boolean sameContext = sourceTask.hasSameContextAs(destinationTask); + boolean sameProject = sourceTask.hasSameProjectAs(destinationTask); + boolean srcIsBelowDestinationTask = sourceTask.isBelowByProject(destinationTask); + if (sameContext && sameProject && okProject) { + if (srcIsBelowDestinationTask) { + this.moveTasksDownByProject(sourceTask, destinationTask); + } else { + this.moveTasksUpByProject(sourceTask, destinationTask); + } + } + } + + /** + * Before: sourceTask is dragged from above down to destinationTask, so sourceTask is above destinationTask. + * After: sourceTask is placed to the position of destinationTask, all tasks between old position of sourceTask + * and destinationTask are moved one position up; destinationTask is the next Task above sourceTask. + * @param sourceTask + * @param destinationTask + */ + private void moveTasksUpByTaskState( Task sourceTask, Task destinationTask ) { + TaskState taskState = sourceTask.getTaskState(); + Context context = sourceTask.getContext(); + long lowerOrderIdTaskState = destinationTask.getOrderIdTaskState(); + long higherOrderIdTaskState = sourceTask.getOrderIdTaskState(); + List tasks = taskRepository.getTasksByOrderIdTaskStateBetweenLowerTaskAndHigherTask( + lowerOrderIdTaskState, + higherOrderIdTaskState, + taskState, + context + ); + for(Task task:tasks){ + task.moveUpByTaskState(); + } + sourceTask.setOrderIdTaskState( destinationTask.getOrderIdTaskState() ); + destinationTask.moveDownByTaskState(); + tasks.add(sourceTask); + tasks.add(destinationTask); + taskRepository.saveAll(tasks); + } + + + private long getMaxOrderIdTaskStateFor(TaskState taskState, Context context ){ + Task task = taskRepository.findTopByTaskStateAndContextOrderByOrderIdTaskStateDesc( + taskState, + context + ); + return (task == null) ? 0 : task.getOrderIdTaskState(); + } + + /** + * Before: sourceTask is dragged from below up to destinationTask, so sourceTask is below destinationTask. + * After: sourceTask is placed to the position of destinationTask, all tasks between old position of sourceTask + * are moved one position down; destinationTask is the next Task below sourceTask. + * @param sourceTask + * @param destinationTask + */ + private void moveTasksDownByTaskState( Task sourceTask, Task destinationTask ) { + TaskState taskState = sourceTask.getTaskState(); + Context context = sourceTask.getContext(); + long lowerOrderIdTaskState = sourceTask.getOrderIdTaskState(); + long higherOrderIdTaskState = destinationTask.getOrderIdTaskState(); + List tasks = taskRepository.getTasksByOrderIdTaskStateBetweenLowerTaskAndHigherTask( + lowerOrderIdTaskState, + higherOrderIdTaskState, + taskState, + context + ); + for(Task task:tasks){ + task.moveDownByTaskState(); } + sourceTask.setOrderIdTaskState(destinationTask.getOrderIdProject()); + destinationTask.moveDownByTaskState(); + tasks.add(sourceTask); + tasks.add(destinationTask); + taskRepository.saveAll(tasks); } + private void moveTasksUpByProject( Task sourceTask, Task destinationTask ) { + Context context = sourceTask.getContext(); + Project project = sourceTask.getProject(); + long lowerOrderIdProject = destinationTask.getOrderIdProject(); + long higherOrderIdProject = sourceTask.getOrderIdProject(); + List tasks = taskRepository.getTasksByOrderIdProjectBetweenLowerTaskAndHigherTask( + lowerOrderIdProject, + higherOrderIdProject, + project, + context + ); + for(Task task:tasks){ + task.moveUpByProject(); + } + sourceTask.setOrderIdProject(destinationTask.getOrderIdProject()); + destinationTask.moveUpByProject(); + tasks.add(sourceTask); + tasks.add(destinationTask); + taskRepository.saveAll(tasks); + } + + private void moveTasksDownByProject( Task sourceTask, Task destinationTask ) { + Context context = sourceTask.getContext(); + Project project = sourceTask.getProject(); + long lowerOrderIdProject = sourceTask.getOrderIdProject(); + long higherOrderIdProject = destinationTask.getOrderIdProject(); + List tasks = taskRepository.getTasksByOrderIdProjectBetweenLowerTaskAndHigherTask( + lowerOrderIdProject, + higherOrderIdProject, + project, + context + ); + for(Task task:tasks){ + task.moveDownByProject(); + } + sourceTask.setOrderIdProject(destinationTask.getOrderIdProject()); + destinationTask.moveDownByProject(); + tasks.add(sourceTask); + tasks.add(destinationTask); + taskRepository.saveAll(tasks); + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) + public Task addToInbox(Task task) { + log.info("addToInbox"); + task.setUuid(UUID.randomUUID().toString()); + task.setRootProject(); + task.unsetFocus(); + task.setTaskState(TaskState.INBOX); + /* + if(task.getDueDate()==null){ + task.setTaskState(TaskState.INBOX); + } else { + task.setTaskState(TaskState.SCHEDULED); + } + */ + //task.setFocus(false); + //task.setContext(context); + long maxOrderIdProject = this.getMaxOrderIdRootProject(task.getContext()); + task.setOrderIdProject(++maxOrderIdProject); + long maxOrderIdTaskState = this.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + task = taskRepository.saveAndFlush(task); + log.info("persisted: " + task.getId()); + return task; + } } diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskState.java b/src/main/java/org/woehlke/simpleworklist/task/TaskState.java new file mode 100644 index 00000000..fd1e5966 --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskState.java @@ -0,0 +1,63 @@ +package org.woehlke.simpleworklist.task; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.List; + +/** + * Created by tw on 21.02.16. + */ +public enum TaskState implements Serializable { + + + INBOX("fas fa-inbox"), + TODAY("fas fa-clock"), + NEXT("fas fa-cogs"), + WAITING("fas fa-hourglass-half"), + SCHEDULED("fas fa-calendar-alt"), + SOMEDAY("fas fa-road"), + FOCUS("fas fa-star"), + COMPLETED("fas fa-check-square"), + TRASH("fas fa-trash-alt"), + DELETED("fas fa-trash-alt"); + + private String icon; + + TaskState(final String icon){ + this.icon=icon; + } + + public String getIcon(){ + return icon; + } + + public int getId(){ + return this.ordinal(); + } + + public String getValue(){ + return this.name(); + } + + public String getCode(){ + return "layout.page."+this.name().toLowerCase(); + } + + public String getUrlPath(){ + return "/taskstate/"+this.name().toLowerCase(); + } + + public String getUrl(){ + return "redirect:/taskstate/"+this.name().toLowerCase(); + } + + public String getTemplate(){ + return "taskstate/"+this.name().toLowerCase(); + } + + public static List list() { + return Arrays.asList(values()); + } + + private static final long serialVersionUID = 0L; +} diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskStateControllerService.java b/src/main/java/org/woehlke/simpleworklist/task/TaskStateControllerService.java new file mode 100644 index 00000000..d4305e9f --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskStateControllerService.java @@ -0,0 +1,22 @@ +package org.woehlke.simpleworklist.task; + +import org.springframework.data.domain.Pageable; +import org.springframework.ui.Model; +import org.woehlke.simpleworklist.context.Context; +import org.woehlke.simpleworklist.session.UserSessionBean; + +import java.util.Locale; + +public interface TaskStateControllerService { + + String getTaskStatePage( + TaskState taskState, + Context context, + Pageable pageRequest, + UserSessionBean userSession, + Locale locale, + Model model + ); + + String transformTaskIntoProjectGet(Task task); +} diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskStateControllerServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/task/TaskStateControllerServiceImpl.java new file mode 100644 index 00000000..95d95e1a --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskStateControllerServiceImpl.java @@ -0,0 +1,76 @@ +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.data.domain.Pageable; +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.context.Context; +import org.woehlke.simpleworklist.project.Project; +import org.woehlke.simpleworklist.project.ProjectService; +import org.woehlke.simpleworklist.session.UserSessionBean; + +import java.util.Locale; + +@Slf4j +@Service +public class TaskStateControllerServiceImpl implements TaskStateControllerService { + + private final BreadcrumbService breadcrumbService; + private final TaskService taskService; + private final ProjectService projectService; + + @Autowired + public TaskStateControllerServiceImpl( + BreadcrumbService breadcrumbService, + TaskService taskService, + ProjectService projectService) { + this.breadcrumbService = breadcrumbService; + this.taskService = taskService; + this.projectService = projectService; + } + + @Override + public String getTaskStatePage( + TaskState taskState, + Context context, + Pageable pageRequest, + UserSessionBean userSession, + Locale locale, + Model model + ){ + log.info("getTaskStatePage"); + userSession.setLastTaskState(taskState); + Page taskPage = taskService.findbyTaskstate(taskState, context, pageRequest); + 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.getTemplate(); + } + + @Override + public String transformTaskIntoProjectGet(Task task) { + Project thisProject = new Project(); + thisProject.setName(task.getTitle()); + thisProject.setDescription(task.getText()); + thisProject.setUuid(task.getUuid()); + thisProject.setContext(task.getContext()); + if (task.getProject() != null) { + long projectId = task.getProject().getId(); + Project parentProject = projectService.findByProjectId(projectId); + thisProject.setParent(parentProject); + } + thisProject = projectService.add(thisProject); + task.setProject(null); + task.moveToTrash(); + task.emptyTrash(); + taskService.updatedViaTaskstate(task); + log.info("tried to transform Task " + task.getId() + " to new Project " + thisProject.getId()); + return thisProject.getUrl(); + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateController.java b/src/main/java/org/woehlke/simpleworklist/task/TaskStateTabController.java similarity index 64% rename from src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateController.java rename to src/main/java/org/woehlke/simpleworklist/task/TaskStateTabController.java index 1d75d70f..f0f5c186 100644 --- a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateController.java +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskStateTabController.java @@ -1,8 +1,7 @@ -package org.woehlke.simpleworklist.taskstate; +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.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.web.PageableDefault; @@ -13,25 +12,20 @@ import org.springframework.web.bind.annotation.RequestMethod; 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.user.UserSessionBean; +import org.woehlke.simpleworklist.session.UserSessionBean; import java.util.Locale; @Slf4j @Controller @RequestMapping(path = "/taskstate") -public class TaskStateController extends AbstractController { +public class TaskStateTabController extends AbstractController { - - private final TaskStateService taskStateService; - private final TaskControllerService taskControllerService; + private final TaskStateControllerService taskStateControllerService; @Autowired - public TaskStateController(TaskStateService taskStateService, TaskControllerService taskControllerService) { - this.taskStateService = taskStateService; - this.taskControllerService = taskControllerService; + public TaskStateTabController(TaskStateControllerService taskStateControllerService) { + this.taskStateControllerService = taskStateControllerService; } @RequestMapping(path = "/inbox", method = RequestMethod.GET) @@ -42,8 +36,7 @@ public final String inbox( Model model ) { Context context = super.getContext(userSession); - Page taskPage = taskStateService.getInbox(context, pageable); - return taskControllerService.getTaskStatePage(TaskState.INBOX, taskPage, userSession, locale, model); + return taskStateControllerService.getTaskStatePage(TaskState.INBOX, context, pageable, userSession, locale, model); } @RequestMapping(path = "/today", method = RequestMethod.GET) @@ -54,8 +47,7 @@ public final String today( Model model ) { Context context = super.getContext(userSession); - Page taskPage = taskStateService.getToday(context, pageable); - return taskControllerService.getTaskStatePage(TaskState.TODAY, taskPage, userSession, locale, model); + return taskStateControllerService.getTaskStatePage(TaskState.TODAY, context, pageable, userSession, locale, model); } @RequestMapping(path = "/next", method = RequestMethod.GET) @@ -66,8 +58,7 @@ public final String next( Model model ) { Context context = super.getContext(userSession); - Page taskPage = taskStateService.getNext(context, pageable); - return taskControllerService.getTaskStatePage(TaskState.NEXT, taskPage, userSession, locale, model); + return taskStateControllerService.getTaskStatePage(TaskState.NEXT, context, pageable, userSession, locale, model); } @RequestMapping(path = "/waiting", method = RequestMethod.GET) @@ -78,8 +69,7 @@ public final String waiting( Model model ) { Context context = super.getContext(userSession); - Page taskPage = taskStateService.getWaiting(context, pageable); - return taskControllerService.getTaskStatePage(TaskState.WAITING, taskPage, userSession, locale, model); + return taskStateControllerService.getTaskStatePage(TaskState.WAITING, context, pageable, userSession, locale, model); } @RequestMapping(path = "/scheduled", method = RequestMethod.GET) @@ -90,8 +80,7 @@ public final String scheduled( Model model ) { Context context = super.getContext(userSession); - Page taskPage = taskStateService.getScheduled(context, pageable); - return taskControllerService.getTaskStatePage(TaskState.SCHEDULED, taskPage, userSession, locale, model); + return taskStateControllerService.getTaskStatePage(TaskState.SCHEDULED, context, pageable, userSession, locale, model); } @RequestMapping(path = "/someday", method = RequestMethod.GET) @@ -102,8 +91,7 @@ public final String someday( Model model ) { Context context = super.getContext(userSession); - Page taskPage = taskStateService.getSomeday(context, pageable); - return taskControllerService.getTaskStatePage(TaskState.SOMEDAY, taskPage, userSession, locale, model); + return taskStateControllerService.getTaskStatePage(TaskState.SOMEDAY, context, pageable, userSession, locale, model); } @RequestMapping(path = "/completed", method = RequestMethod.GET) @@ -114,8 +102,7 @@ public final String completed( Model model ) { Context context = super.getContext(userSession); - Page taskPage = taskStateService.getCompleted(context, pageable); - return taskControllerService.getTaskStatePage(TaskState.COMPLETED, taskPage, userSession, locale, model); + return taskStateControllerService.getTaskStatePage(TaskState.COMPLETED, context, pageable, userSession, locale, model); } @RequestMapping(path = "/trash", method = RequestMethod.GET) @@ -126,8 +113,7 @@ public final String trash( Model model ) { Context context = super.getContext(userSession); - Page taskPage = taskStateService.getTrash(context, pageable); - return taskControllerService.getTaskStatePage(TaskState.TRASH, taskPage, userSession, locale, model); + return taskStateControllerService.getTaskStatePage(TaskState.TRASH, context, pageable, userSession, locale, model); } @RequestMapping(path = "/focus", method = RequestMethod.GET) @@ -138,7 +124,6 @@ public final String focus( Model model ) { Context context = super.getContext(userSession); - Page taskPage = taskStateService.getFocus(context, pageable); - return taskControllerService.getTaskStatePage(TaskState.FOCUS, taskPage, userSession, locale, model); + return taskStateControllerService.getTaskStatePage(TaskState.FOCUS, context, pageable, userSession, locale, model); } } diff --git a/src/main/java/org/woehlke/simpleworklist/task/TaskStateTaskController.java b/src/main/java/org/woehlke/simpleworklist/task/TaskStateTaskController.java new file mode 100644 index 00000000..537baa5c --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/task/TaskStateTaskController.java @@ -0,0 +1,371 @@ +package org.woehlke.simpleworklist.task; + +import lombok.extern.slf4j.Slf4j; +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.breadcrumb.Breadcrumb; +import org.woehlke.simpleworklist.common.AbstractController; +import org.woehlke.simpleworklist.context.Context; +import org.woehlke.simpleworklist.project.Project; +import org.woehlke.simpleworklist.session.UserSessionBean; + +import org.springframework.beans.factory.annotation.Autowired; +import org.woehlke.simpleworklist.user.account.UserAccount; + +import javax.validation.Valid; +import java.util.List; +import java.util.Locale; + +/** + * Created by tw on 21.02.16. + */ +@Slf4j +@Controller +@RequestMapping(path = "/taskstate/task") +public class TaskStateTaskController extends AbstractController { + + + private final TaskStateControllerService taskStateControllerService; + private final TaskService taskService; + + @Autowired + public TaskStateTaskController( + TaskStateControllerService taskStateControllerService, TaskService taskService + ) { + this.taskStateControllerService = taskStateControllerService; + this.taskService = taskService; + } + + @RequestMapping(path = "/add", method = RequestMethod.GET) + public final String addNewTaskToInboxGet( + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model + ) { + log.info("addNewTaskToInboxGet"); + 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.getLastContextId() == 0L){ + mustChooseContext = true; + task.setContext(userAccount.getDefaultContext()); + } else { + Context context = contextService.findByIdAndUserAccount(userSession.getLastContextId(), 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 "taskstate/task/add"; + } + + @RequestMapping(path = "/add", method = RequestMethod.POST) + public final String addNewTaskToInboxPost( + @ModelAttribute("userSession") UserSessionBean userSession, + @Valid Task task, + BindingResult result, + Locale locale, + Model model + ) { + log.info("addNewTaskToInboxPost"); + 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 "taskstate/task/add"; + } else { + task = taskService.addToInbox(task); + log.info(task.toString()); + return "redirect:/taskstate/" + task.getTaskState().name().toLowerCase(); + } + } + + @RequestMapping(path = "/{taskId}/edit", method = RequestMethod.GET) + public final String editTaskGet( + @PathVariable("taskId") Task task, + @ModelAttribute("userSession") UserSessionBean userSession, + Locale locale, Model model + ) { + log.info("editTaskGet"); + if(task != null) { + UserAccount userAccount = userAccountLoginSuccessService.retrieveCurrentUser(); + List contexts = contextService.getAllForUser(userAccount); + Project thisProject; + if (task.getContext() == null) { + thisProject = new Project(); + thisProject.setId(0L); + } else { + thisProject = task.getProject(); + } + Context thisContext = task.getContext(); + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForTaskstate(task.getTaskState(),locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("thisProject", thisProject); + model.addAttribute("thisContext", thisContext); + model.addAttribute("task", task); + model.addAttribute("areas", contexts); + return "taskstate/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 + ) { + log.info("editTaskPost"); + if (result.hasErrors() ) { + log.warn("result.hasErrors"); + for (ObjectError e : result.getAllErrors()) { + log.error(e.toString()); + } + Task persistentTask = taskService.findOne(taskId); + persistentTask.merge(task); + task = persistentTask; + UserAccount userAccount = userAccountLoginSuccessService.retrieveCurrentUser(); + List contexts = contextService.getAllForUser(userAccount); + Project thisProject; + if (task.getContext() == null) { + thisProject = new Project(); + thisProject.setId(0L); + } else { + thisProject = task.getProject(); + } + Context thisContext = task.getContext(); + Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForShowOneProject(thisProject,locale); + model.addAttribute("breadcrumb", breadcrumb); + model.addAttribute("thisProject", thisProject); + model.addAttribute("thisContext", thisContext); + model.addAttribute("task", task); + model.addAttribute("areas", contexts); + return "taskstate/task/edit"; + } else { + task.unsetFocus(); + task.setRootProject(); + Task persistentTask = taskService.findOne(task.getId()); + persistentTask.merge(task); + task = taskService.updatedViaTaskstate(persistentTask); + return task.getTaskState().getUrl(); + } + } + + @RequestMapping(path = "/{taskId}/changeorderto/{destinationTaskId}", method = RequestMethod.GET) + public String changeTaskOrderId( + @PathVariable("taskId") Task sourceTask, + @PathVariable("destinationTaskId") Task destinationTask, + @ModelAttribute("userSession") UserSessionBean userSession, + Model model + ){ + userSession.setLastTaskState(sourceTask.getTaskState()); + model.addAttribute("userSession", userSession); + log.info("------------- changeTaskOrderId -------------"); + log.info("source Task: "+sourceTask.toString()); + log.info("---------------------------------------------"); + log.info("destination Task: "+destinationTask.toString()); + log.info("---------------------------------------------"); + taskService.moveOrderIdTaskState(sourceTask, destinationTask); + return "redirect:/taskstate/" + sourceTask.getTaskState().name().toLowerCase(); + } + + @RequestMapping(path = "/{taskId}/move/to/project/{projectId}", method = RequestMethod.GET) + public final String moveTaskToAnotherProject( + @PathVariable("taskId") Task task, + @PathVariable long projectId + ) { + if(projectId == 0) { + task = taskService.moveTaskToRootProject(task); + } else { + Project project = projectService.findByProjectId(projectId); + task = taskService.moveTaskToAnotherProject(task,project); + } + return "redirect:/project/" + projectId + "/"; + } + + @RequestMapping(path = "/{taskId}/move/to/taskstate/inbox", method = RequestMethod.GET) + public final String moveTaskToInbox(@PathVariable("taskId") Task task) { + log.info("dragged and dropped "+task.getId()+" to inbox"); + task.moveToInbox(); + taskService.updatedViaTaskstate(task); + return "redirect:/taskstate/inbox"; + } + + @RequestMapping(path = "/{taskId}/move/to/taskstate/today", method = RequestMethod.GET) + public final String moveTaskToToday(@PathVariable("taskId") Task task) { + log.info("dragged and dropped "+task.getId()+" to today"); + task.moveToToday(); + taskService.updatedViaTaskstate(task); + return "redirect:/taskstate/today"; + } + + @RequestMapping(path = "/{taskId}/move/to/taskstate/next", method = RequestMethod.GET) + public final String moveTaskToNext(@PathVariable("taskId") Task task) { + log.info("dragged and dropped "+task.getId()+" to next"); + task.moveToNext(); + taskService.updatedViaTaskstate(task); + return "redirect:/taskstate/next"; + } + + @RequestMapping(path = "/{taskId}/move/to/taskstate/waiting", method = RequestMethod.GET) + public final String moveTaskToWaiting(@PathVariable("taskId") Task task) { + log.info("dragged and dropped "+task.getId()+" to waiting"); + task.moveToWaiting(); + taskService.updatedViaTaskstate(task); + return "redirect:/taskstate/waiting"; + } + + @RequestMapping(path = "/{taskId}/move/to/taskstate/someday", method = RequestMethod.GET) + public final String moveTaskToSomeday(@PathVariable("taskId") Task task) { + log.info("dragged and dropped "+task.getId()+" to someday"); + task.moveToSomeday(); + taskService.updatedViaTaskstate(task); + return "redirect:/taskstate/someday"; + } + + @RequestMapping(path = "/{taskId}/move/to/taskstate/focus", method = RequestMethod.GET) + public final String moveTaskToFocus(@PathVariable("taskId") Task task) { + log.info("dragged and dropped "+task.getId()+" to focus"); + task.moveToFocus(); + taskService.updatedViaTaskstate(task); + return "redirect:/taskstate/focus"; + } + + @RequestMapping(path = "/{taskId}/move/to/taskstate/completed", method = RequestMethod.GET) + public final String moveTaskToCompleted(@PathVariable("taskId") Task task) { + log.info("dragged and dropped "+task.getId()+" to completed"); + task.moveToCompletedTasks(); + taskService.updatedViaTaskstate(task); + return "redirect:/taskstate/completed"; + } + + @RequestMapping(path = "/{taskId}/move/to/trash", method = RequestMethod.GET) + public final String moveTaskToTrash(@PathVariable("taskId") Task task) { + log.info("dragged and dropped "+task.getId()+" to trash"); + task.moveToTrash(); + taskService.updatedViaTaskstate(task); + return "redirect:/taskstate/trash"; + } + + @RequestMapping(path = "/completed/move/to/trash", method = RequestMethod.GET) + public final String moveAllCompletedToTrash( + @ModelAttribute("userSession") UserSessionBean userSession + ) { + Context context = super.getContext(userSession); + taskService.moveAllCompletedToTrash(context); + return "redirect:/taskstate/trash"; + } + + @RequestMapping(path = "/trash/empty", method = RequestMethod.GET) + public final String emptyTrash( + @ModelAttribute("userSession") UserSessionBean userSession + ) { + Context context = super.getContext(userSession); + taskService.emptyTrash(context); + return "redirect:/taskstate/trash"; + } + + + @RequestMapping(path = "/{taskId}/delete", method = RequestMethod.GET) + public final String deleteTaskGet(@PathVariable("taskId") Task task) { + log.info("deleteTaskGet"); + if(task!= null){ + task.delete(); + taskService.updatedViaTaskstate(task); + } + return "redirect:/taskstate/trash"; + } + + @RequestMapping(path = "/{taskId}/undelete", method = RequestMethod.GET) + public final String undeleteTaskGet(@PathVariable("taskId") Task task) { + log.info("undeleteTaskGet"); + if(task!= null) { + task.undelete(); + taskService.updatedViaTaskstate(task); + return "redirect:/taskstate/completed"; + } else { + return "redirect:/taskstate/trash"; + } + } + + @RequestMapping(path = "/{taskId}/transform", method = RequestMethod.GET) + public final String transformTaskIntoProjectGet(@PathVariable("taskId") Task task) { + log.info("transformTaskIntoProjectGet"); + return taskStateControllerService.transformTaskIntoProjectGet(task); + } + + @RequestMapping(path = "/{taskId}/complete", method = RequestMethod.GET) + public final String setDoneTaskGet( + @PathVariable("taskId") Task task + ) { + if(task != null){ + task.complete(); + long maxOrderIdTaskState = taskService.getMaxOrderIdTaskState(TaskState.COMPLETED,task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + task = taskService.updatedViaTaskstate(task); + return task.getUrl(); + } + return "redirect:/taskstate/completed"; + } + + @RequestMapping(path = "/{taskId}/incomplete", method = RequestMethod.GET) + public final String unsetDoneTaskGet( + @PathVariable("taskId") Task task + ) { + if(task !=null) { + task.incomplete(); + long maxOrderIdTaskState = taskService.getMaxOrderIdTaskState(task.getTaskState(),task.getContext()); + task.setOrderIdTaskState(++maxOrderIdTaskState); + task = taskService.updatedViaTaskstate(task); + return task.getUrl(); + } else { + return "redirect:/taskstate/inbox"; + } + } + + @RequestMapping(path = "/{taskId}/setfocus", method = RequestMethod.GET) + public final String setFocusGet( + @PathVariable("taskId") Task task, + @RequestParam(required=false) String back + ){ + if(task !=null) { + task.setFocus(); + task = taskService.updatedViaTaskstate(task); + return task.getUrl(); + } else { + return "redirect:/taskstate/inbox"; + } + } + + @RequestMapping(path = "/{taskId}/unsetfocus", method = RequestMethod.GET) + public final String unsetFocusGet( + @PathVariable("taskId") Task task, + @RequestParam(required=false) String back + ){ + if(task !=null) { + task.unsetFocus(); + task = taskService.updatedViaTaskstate(task); + return task.getUrl(); + } else { + return "redirect:/taskstate/inbox"; + } + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskMoveService.java b/src/main/java/org/woehlke/simpleworklist/taskstate/TaskMoveService.java deleted file mode 100644 index 9c35cb6f..00000000 --- a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskMoveService.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.woehlke.simpleworklist.taskstate; - -import org.woehlke.simpleworklist.context.Context; -import org.woehlke.simpleworklist.project.Project; -import org.woehlke.simpleworklist.task.Task; - -public interface TaskMoveService { - - Task moveTaskToRootProject(Task task); - - Task moveTaskToAnotherProject(Task task, Project project); - - Task moveTaskToInbox(Task task); - - Task moveTaskToToday(Task task); - - Task moveTaskToNext(Task task); - - Task moveTaskToWaiting(Task task); - - Task moveTaskToSomeday(Task task); - - Task moveTaskToFocus(Task task); - - Task moveTaskToCompleted(Task task); - - Task moveTaskToTrash(Task task); - - void deleteAllCompleted(Context context); - - void emptyTrash(Context context); - - long getMaxOrderIdTaskState(TaskState taskState, Context context); - - long getMaxOrderIdProject(Project project, Context context); - - void moveOrderIdTaskState(Task sourceTask, Task destinationTask); - - void moveOrderIdProject(Task sourceTask, Task destinationTask); - - void moveOrderIdRootProject(Task sourceTask, Task destinationTask); -} diff --git a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskMoveServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/taskstate/TaskMoveServiceImpl.java deleted file mode 100644 index da2c991d..00000000 --- a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskMoveServiceImpl.java +++ /dev/null @@ -1,368 +0,0 @@ -package org.woehlke.simpleworklist.taskstate; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; -import org.woehlke.simpleworklist.context.Context; -import org.woehlke.simpleworklist.project.Project; -import org.woehlke.simpleworklist.task.Task; -import org.woehlke.simpleworklist.task.TaskRepository; - -import java.util.Date; -import java.util.List; - -@Slf4j -@Service -@Transactional(propagation = Propagation.REQUIRES_NEW) -public class TaskMoveServiceImpl implements TaskMoveService { - - private final TaskRepository taskRepository; - - @Autowired - public TaskMoveServiceImpl( TaskRepository taskRepository ) { - this.taskRepository = taskRepository; - } - - @Override - public Task moveTaskToRootProject(Task task) { - task.setRootProject(); - long maxOrderIdProject = this.getMaxOrderIdProject( - task.getProject(), task.getContext() - ); - task.setOrderIdProject(++maxOrderIdProject); - return taskRepository.saveAndFlush(task); - } - - @Override - public Task moveTaskToAnotherProject(Task task, Project project) { - boolean okContext = task.hasSameContextAs(project); - if(okContext) { - task.setProject(project); - long maxOrderIdProject = this.getMaxOrderIdProject( - task.getProject(), - task.getContext() - ); - task.setOrderIdProject(++maxOrderIdProject); - taskRepository.saveAndFlush(task); - } - return task; - } - - @Override - public Task moveTaskToInbox(Task task) { - long newOrderIdTaskState = this.getMaxOrderIdTaskState( - TaskState.INBOX, - task.getContext() - ); - task.setTaskState(TaskState.INBOX); - task.setOrderIdTaskState(++newOrderIdTaskState); - task = taskRepository.saveAndFlush(task); - log.info("moved " + task.getId() + " to inbox: " + task.toString()); - return task; - } - - @Override - public Task moveTaskToToday(Task task) { - Date now = new Date(); - long newOrderIdTaskState = this.getMaxOrderIdTaskState( - TaskState.TODAY, - task.getContext() - ); - task.setOrderIdTaskState(++newOrderIdTaskState); - task.setTaskState(TaskState.TODAY); - task.setDueDate(now); - task = taskRepository.saveAndFlush(task); - log.info("moved " + task.getId() + " to today: " + task.toString()); - return task; - } - - @Override - public Task moveTaskToNext(Task task) { - long newOrderIdTaskState = this.getMaxOrderIdTaskState( - TaskState.NEXT, - task.getContext() - ); - task.setOrderIdTaskState(++newOrderIdTaskState); - task.setTaskState(TaskState.NEXT); - task = taskRepository.saveAndFlush(task); - log.info("moved " + task.getId() + " to next: " + task.toString()); - return task; - } - - @Override - public Task moveTaskToWaiting(Task task) { - long newOrderIdTaskState = this.getMaxOrderIdTaskState( - TaskState.WAITING, - task.getContext() - ); - task.setOrderIdTaskState(++newOrderIdTaskState); - task.setTaskState(TaskState.WAITING); - task = taskRepository.saveAndFlush(task); - log.info("moved " + task.getId() + " to next: " + task.toString()); - return task; - } - - @Override - public Task moveTaskToSomeday(Task task) { - long newOrderIdTaskState = this.getMaxOrderIdTaskState( - TaskState.SOMEDAY, - task.getContext() - ); - task.setOrderIdTaskState(++newOrderIdTaskState); - task.setTaskState(TaskState.SOMEDAY); - task = taskRepository.saveAndFlush(task); - log.info("moved " + task.getId() + " to someday: " + task.toString()); - return task; - } - - @Override - public Task moveTaskToFocus(Task task) { - long newOrderIdTaskState = this.getMaxOrderIdTaskState( - TaskState.FOCUS, - task.getContext() - ); - task.setOrderIdTaskState(++newOrderIdTaskState); - task.setFocus(true); - task = taskRepository.saveAndFlush(task); - log.info("moved " + task.getId() + " to focus: " + task.toString()); - return task; - } - - @Override - public Task moveTaskToCompleted(Task task) { - long newOrderIdTaskState = this.getMaxOrderIdTaskState( - TaskState.COMPLETED, - task.getContext() - ); - task.setOrderIdTaskState(++newOrderIdTaskState); - task.setTaskState(TaskState.COMPLETED); - task = taskRepository.saveAndFlush(task); - log.debug("moved " + task.getId() + " to completed: " + task.toString()); - return task; - } - - @Override - public Task moveTaskToTrash(Task task) { - long newOrderIdTaskState = this.getMaxOrderIdTaskState( - TaskState.TRASH, - task.getContext() - ); - task.setOrderIdTaskState(++newOrderIdTaskState); - task.setTaskState(TaskState.TRASH); - task = taskRepository.saveAndFlush(task); - log.debug("moved " + task.getId() + " to trash: " + task.toString()); - return task; - } - - @Override - public void deleteAllCompleted(Context context) { - long maxOrderIdTaskState = this.getMaxOrderIdTaskStateFor( - TaskState.TRASH, - context - ); - long newOrderIdTaskState = maxOrderIdTaskState; - List taskListCompleted = taskRepository.findByTaskStateAndContextOrderByOrderIdTaskStateAsc( - TaskState.COMPLETED, - context - ); - for (Task task : taskListCompleted) { - newOrderIdTaskState++; - task.setOrderIdTaskState(newOrderIdTaskState); - task.setTaskState(TaskState.TRASH); - } - taskRepository.saveAll(taskListCompleted); - } - - @Override - public void emptyTrash(Context context) { - List taskList = taskRepository.findByTaskStateAndContext( - TaskState.TRASH, - context - ); - taskRepository.deleteInBatch(taskList); - } - - @Override - public long getMaxOrderIdTaskState(TaskState taskState, Context context) { - Task task = taskRepository.findTopByTaskStateAndContextOrderByOrderIdTaskStateDesc( - taskState, - context - ); - return (task==null) ? 0 : task.getOrderIdTaskState(); - } - - @Override - public long getMaxOrderIdProject(Project project, Context context) { - Task task = taskRepository.findTopByProjectAndContextOrderByOrderIdProjectDesc( - project, - context - ); - return (task==null) ? 0 : task.getOrderIdProject(); - } - - @Override - @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void moveOrderIdTaskState( Task sourceTask, Task destinationTask ) { - boolean notEqualsId = ! sourceTask.equalsById(destinationTask); - boolean notEquals = ! sourceTask.equalsByUniqueConstraint(destinationTask); - boolean sameContext = sourceTask.hasSameContextAs(destinationTask); - boolean sameTaskType = sourceTask.hasSameTaskTypetAs(destinationTask); - boolean srcIsBelowDestinationTask = sourceTask.isBelowByTaskState(destinationTask); - if ( - notEqualsId && notEquals && - sameContext && sameTaskType - ) { - if (srcIsBelowDestinationTask) { - this.moveTasksDownByTaskState( sourceTask, destinationTask ); - } else { - this.moveTasksUpByTaskState( sourceTask, destinationTask ); - } - } - } - - @Override - @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void moveOrderIdRootProject( Task sourceTask, Task destinationTask ) { - boolean sourceTaskRoot = destinationTask.isInRootProject(); - boolean destinationTaskRoot = destinationTask.isInRootProject(); - boolean sameContext = sourceTask.hasSameContextAs(destinationTask); - boolean sameProject = sourceTask.hasSameProjectAs(destinationTask); - boolean srcIsBelowDestinationTask = sourceTask.isBelowByProject(destinationTask); - if (sameContext && sameProject && sourceTaskRoot && destinationTaskRoot) { - if (srcIsBelowDestinationTask) { - this.moveTasksDownByProject(sourceTask, destinationTask); - } else { - this.moveTasksUpByProject(sourceTask, destinationTask); - } - } - } - - @Override - @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) - public void moveOrderIdProject( Task sourceTask, Task destinationTask ) { - Project project = sourceTask.getProject(); - boolean okProject = destinationTask.hasProject(project); - boolean sameContext = sourceTask.hasSameContextAs(destinationTask); - boolean sameProject = sourceTask.hasSameProjectAs(destinationTask); - boolean srcIsBelowDestinationTask = sourceTask.isBelowByProject(destinationTask); - if (sameContext && sameProject && okProject) { - if (srcIsBelowDestinationTask) { - this.moveTasksDownByProject(sourceTask, destinationTask); - } else { - this.moveTasksUpByProject(sourceTask, destinationTask); - } - } - } - - /** - * Before: sourceTask is dragged from above down to destinationTask, so sourceTask is above destinationTask. - * After: sourceTask is placed to the position of destinationTask, all tasks between old position of sourceTask - * and destinationTask are moved one position up; destinationTask is the next Task above sourceTask. - * @param sourceTask - * @param destinationTask - */ - private void moveTasksUpByTaskState( Task sourceTask, Task destinationTask ) { - TaskState taskState = sourceTask.getTaskState(); - Context context = sourceTask.getContext(); - long lowerOrderIdTaskState = destinationTask.getOrderIdTaskState(); - long higherOrderIdTaskState = sourceTask.getOrderIdTaskState(); - List tasks = taskRepository.getTasksByOrderIdTaskStateBetweenLowerTaskAndHigherTask( - lowerOrderIdTaskState, - higherOrderIdTaskState, - taskState, - context - ); - for(Task task:tasks){ - task.moveUpByTaskState(); - } - sourceTask.setOrderIdTaskState( destinationTask.getOrderIdTaskState() ); - destinationTask.moveDownByTaskState(); - tasks.add(sourceTask); - tasks.add(destinationTask); - taskRepository.saveAll(tasks); - } - - - - - private long getMaxOrderIdTaskStateFor(TaskState taskState, Context context ){ - Task task = taskRepository.findTopByTaskStateAndContextOrderByOrderIdTaskStateDesc( - taskState, - context - ); - return (task == null) ? 0 : task.getOrderIdTaskState(); - } - - /** - * Before: sourceTask is dragged from below up to destinationTask, so sourceTask is below destinationTask. - * After: sourceTask is placed to the position of destinationTask, all tasks between old position of sourceTask - * are moved one position down; destinationTask is the next Task below sourceTask. - * @param sourceTask - * @param destinationTask - */ - private void moveTasksDownByTaskState( Task sourceTask, Task destinationTask ) { - TaskState taskState = sourceTask.getTaskState(); - Context context = sourceTask.getContext(); - long lowerOrderIdTaskState = sourceTask.getOrderIdTaskState(); - long higherOrderIdTaskState = destinationTask.getOrderIdTaskState(); - List tasks = taskRepository.getTasksByOrderIdTaskStateBetweenLowerTaskAndHigherTask( - lowerOrderIdTaskState, - higherOrderIdTaskState, - taskState, - context - ); - for(Task task:tasks){ - task.moveDownByTaskState(); - } - sourceTask.setOrderIdTaskState(destinationTask); - destinationTask.moveDownByTaskState(); - tasks.add(sourceTask); - tasks.add(destinationTask); - taskRepository.saveAll(tasks); - } - - private void moveTasksUpByProject( Task sourceTask, Task destinationTask ) { - Context context = sourceTask.getContext(); - Project project = sourceTask.getProject(); - long lowerOrderIdProject = destinationTask.getOrderIdProject(); - long higherOrderIdProject = sourceTask.getOrderIdProject(); - List tasks = taskRepository.getTasksByOrderIdProjectBetweenLowerTaskAndHigherTask( - lowerOrderIdProject, - higherOrderIdProject, - project, - context - ); - for(Task task:tasks){ - task.moveUpByProject(); - } - sourceTask.setOrderIdProject(destinationTask); - destinationTask.moveUpByProject(); - tasks.add(sourceTask); - tasks.add(destinationTask); - taskRepository.saveAll(tasks); - } - - private void moveTasksDownByProject( Task sourceTask, Task destinationTask ) { - Context context = sourceTask.getContext(); - Project project = sourceTask.getProject(); - long lowerOrderIdProject = sourceTask.getOrderIdProject(); - long higherOrderIdProject = destinationTask.getOrderIdProject(); - List tasks = taskRepository.getTasksByOrderIdProjectBetweenLowerTaskAndHigherTask( - lowerOrderIdProject, - higherOrderIdProject, - project, - context - ); - for(Task task:tasks){ - task.moveDownByProject(); - } - sourceTask.setOrderIdProject(destinationTask); - destinationTask.moveDownByProject(); - tasks.add(sourceTask); - tasks.add(destinationTask); - taskRepository.saveAll(tasks); - } - -} diff --git a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskState.java b/src/main/java/org/woehlke/simpleworklist/taskstate/TaskState.java deleted file mode 100644 index 852622ee..00000000 --- a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskState.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.woehlke.simpleworklist.taskstate; - -import javax.persistence.Enumerated; -import javax.persistence.Transient; -import java.io.Serializable; - -/** - * Created by tw on 21.02.16. - */ -public enum TaskState implements Serializable { - - @Enumerated - INBOX("fas fa-inbox"), - - @Enumerated - TODAY("fas fa-clock"), - - @Enumerated - NEXT("fas fa-cogs"), - - @Enumerated - WAITING("fas fa-hourglass-half"), - - @Enumerated - SCHEDULED("fas fa-calendar-alt"), - - @Enumerated - SOMEDAY("fas fa-road"), - - @Enumerated - FOCUS("fas fa-star"), - - @Enumerated - COMPLETED("fas fa-check-square"), - - @Enumerated - TRASH("fas fa-trash-alt"); - - TaskState(final String icon) { - this.icon=icon; - } - - public String getCode() { - return "layout.page."+this.name().toLowerCase(); - } - - public String getUrl() { - return "/taskstate/"+this.name().toLowerCase(); - } - - public String getIcon() { - return icon; - } - - private String icon; - - private static final long serialVersionUID = 0L; -} diff --git a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateMoveController.java b/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateMoveController.java deleted file mode 100644 index 4f058f61..00000000 --- a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateMoveController.java +++ /dev/null @@ -1,214 +0,0 @@ -package org.woehlke.simpleworklist.taskstate; - -import lombok.extern.slf4j.Slf4j; -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.breadcrumb.Breadcrumb; -import org.woehlke.simpleworklist.common.AbstractController; -import org.woehlke.simpleworklist.context.Context; -import org.woehlke.simpleworklist.project.Project; -import org.woehlke.simpleworklist.task.Task; -import org.woehlke.simpleworklist.task.TaskEnergy; -import org.woehlke.simpleworklist.task.TaskTime; -import org.woehlke.simpleworklist.user.UserSessionBean; - -import org.springframework.beans.factory.annotation.Autowired; -import org.woehlke.simpleworklist.user.account.UserAccount; - -import javax.validation.Valid; -import java.util.Locale; - -/** - * Created by tw on 21.02.16. - */ -@Slf4j -@Controller -@RequestMapping(path = "/taskstate/task") -public class TaskStateMoveController extends AbstractController { - - private final TaskMoveService taskMoveService; - - @Autowired - public TaskStateMoveController( - TaskMoveService taskMoveService - ) { - this.taskMoveService = taskMoveService; - } - - @RequestMapping(path = "/add", method = RequestMethod.GET) - public final String addNewTaskToInboxGet( - @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, Model model - ) { - log.info("addNewTaskToInboxGet"); - 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 "taskstate/task/add"; - } - - @RequestMapping(path = "/add", method = RequestMethod.POST) - public final String addNewTaskToInboxPost( - @ModelAttribute("userSession") UserSessionBean userSession, - @Valid Task task, - BindingResult result, - Locale locale, - Model model - ) { - log.info("addNewTaskToInboxPost"); - 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 "taskstate/task/add"; - } else { - task.setProject(null); - 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:/taskstate/" + task.getTaskState().name().toLowerCase(); - } - } - - @RequestMapping(path = "/{sourceTaskId}/changeorderto/{destinationTaskId}", method = RequestMethod.GET) - public String changeTaskOrderId( - @PathVariable("sourceTaskId") Task sourceTask, - @PathVariable("destinationTaskId") Task destinationTask, - @ModelAttribute("userSession") UserSessionBean userSession, - Model model - ){ - userSession.setLastTaskState(sourceTask.getTaskState()); - model.addAttribute("userSession", userSession); - 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 = "/{taskId}/move/to/project/{projectId}", method = RequestMethod.GET) - public final String moveTaskToAnotherProject( - @PathVariable("taskId") Task task, - @PathVariable long projectId - ) { - if(projectId == 0) { - task = taskMoveService.moveTaskToRootProject(task); - } else { - Project project = projectService.findByProjectId(projectId); - task = taskMoveService.moveTaskToAnotherProject(task,project); - } - return "redirect:/project/" + projectId + "/"; - } - - @RequestMapping(path = "/{taskId}/move/to/taskstate/inbox", method = RequestMethod.GET) - public final String moveTaskToInbox(@PathVariable("taskId") Task task) { - log.info("dragged and dropped "+task.getId()+" to inbox"); - task = taskMoveService.moveTaskToInbox(task); - return "redirect:/taskstate/inbox"; - } - - @RequestMapping(path = "/{taskId}/move/to/taskstate/today", method = RequestMethod.GET) - public final String moveTaskToToday(@PathVariable("taskId") Task task) { - log.info("dragged and dropped "+task.getId()+" to today"); - task = taskMoveService.moveTaskToToday(task); - return "redirect:/taskstate/today"; - } - - @RequestMapping(path = "/{taskId}/move/to/taskstate/next", method = RequestMethod.GET) - public final String moveTaskToNext(@PathVariable("taskId") Task task) { - log.info("dragged and dropped "+task.getId()+" to next"); - task = taskMoveService.moveTaskToNext(task); - return "redirect:/taskstate/next"; - } - - @RequestMapping(path = "/{taskId}/move/to/taskstate/waiting", method = RequestMethod.GET) - public final String moveTaskToWaiting(@PathVariable("taskId") Task task) { - log.info("dragged and dropped "+task.getId()+" to waiting"); - task = taskMoveService.moveTaskToWaiting(task); - return "redirect:/taskstate/waiting"; - } - - @RequestMapping(path = "/{taskId}/move/to/taskstate/someday", method = RequestMethod.GET) - public final String moveTaskToSomeday(@PathVariable("taskId") Task task) { - log.info("dragged and dropped "+task.getId()+" to someday"); - task = taskMoveService.moveTaskToSomeday(task); - return "redirect:/taskstate/someday"; - } - - @RequestMapping(path = "/{taskId}/move/to/taskstate/focus", method = RequestMethod.GET) - public final String moveTaskToFocus(@PathVariable("taskId") Task task) { - log.info("dragged and dropped "+task.getId()+" to focus"); - task = taskMoveService.moveTaskToFocus(task); - return "redirect:/taskstate/focus"; - } - - @RequestMapping(path = "/{taskId}/move/to/taskstate/completed", method = RequestMethod.GET) - public final String moveTaskToCompleted(@PathVariable("taskId") Task task) { - log.info("dragged and dropped "+task.getId()+" to completed"); - task = taskMoveService.moveTaskToCompleted(task); - return "redirect:/taskstate/completed"; - } - - @RequestMapping(path = "/{taskId}/move/to/trash", method = RequestMethod.GET) - public final String moveTaskToTrash(@PathVariable("taskId") Task task) { - log.info("dragged and dropped "+task.getId()+" to trash"); - task = taskMoveService.moveTaskToTrash(task); - return "redirect:/taskstate/trash"; - } - - @RequestMapping(path = "/completed/move/to/trash", method = RequestMethod.GET) - public final String deleteallCompleted( - @ModelAttribute("userSession") UserSessionBean userSession - ) { - Context context = super.getContext(userSession); - taskMoveService.deleteAllCompleted(context); - return "redirect:/taskstate/trash"; - } - - @RequestMapping(path = "/trash/empty", method = RequestMethod.GET) - public final String emptyTrash( - @ModelAttribute("userSession") UserSessionBean userSession - ) { - Context context = super.getContext(userSession); - taskMoveService.emptyTrash(context); - return "redirect:/taskstate/trash"; - } - -} diff --git a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateService.java b/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateService.java deleted file mode 100644 index e69f1329..00000000 --- a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateService.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.woehlke.simpleworklist.taskstate; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.woehlke.simpleworklist.context.Context; -import org.woehlke.simpleworklist.task.Task; - -/** - * Created by tw on 21.02.16. - */ -public interface TaskStateService { - - Page getFocus(Context context, Pageable request); - - Page getInbox(Context context, Pageable request); - - Page getToday(Context context, Pageable request); - - Page getNext(Context context, Pageable request); - - Page getWaiting(Context context, Pageable request); - - Page getScheduled(Context context, Pageable request); - - Page getSomeday(Context context, Pageable request); - - Page getCompleted(Context context, Pageable request); - - Page getTrash(Context context, Pageable request); - -} diff --git a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateServiceImpl.java deleted file mode 100644 index cdb75395..00000000 --- a/src/main/java/org/woehlke/simpleworklist/taskstate/TaskStateServiceImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.woehlke.simpleworklist.taskstate; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; -import org.woehlke.simpleworklist.context.Context; -import org.woehlke.simpleworklist.task.Task; -import org.woehlke.simpleworklist.task.TaskRepository; - -import org.springframework.beans.factory.annotation.Autowired; - -/** - * Created by tw on 21.02.16. - */ -@Slf4j -@Service -@Transactional(propagation = Propagation.REQUIRED, readOnly = true) -public class TaskStateServiceImpl implements TaskStateService { - - private final TaskRepository taskRepository; - - @Autowired - public TaskStateServiceImpl(TaskRepository taskRepository) { - this.taskRepository = taskRepository; - } - - @Override - public Page getFocus(Context context, Pageable request) { - return taskRepository.findByFocusAndContext(true, context, request); - } - - @Override - public Page getInbox(Context context, Pageable request) { - return taskRepository.findByTaskStateAndContext(TaskState.INBOX, context, request); - } - - @Override - public Page getToday(Context context, Pageable request) { - return taskRepository.findByTaskStateAndContext(TaskState.TODAY, context, request); - } - - @Override - public Page getNext(Context context, Pageable request) { - return taskRepository.findByTaskStateAndContext(TaskState.NEXT, context, request); - } - - @Override - public Page getWaiting(Context context, Pageable request) { - return taskRepository.findByTaskStateAndContext(TaskState.WAITING, context, request); - } - - @Override - public Page getScheduled(Context context, Pageable request) { - return taskRepository.findByTaskStateAndContext(TaskState.SCHEDULED, context, request); - } - - @Override - public Page getSomeday(Context context, Pageable request) { - return taskRepository.findByTaskStateAndContext(TaskState.SOMEDAY, context, request); - } - - @Override - public Page getCompleted(Context context, Pageable request) { - return taskRepository.findByTaskStateAndContext(TaskState.COMPLETED, context, request); - } - - @Override - public Page getTrash( Context context, Pageable request) { - return taskRepository.findByTaskStateAndContext(TaskState.TRASH, context, request); - } - -} diff --git a/src/main/java/org/woehlke/simpleworklist/testdata/TestDataServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/testdata/TestDataServiceImpl.java index 0512e051..6a30653a 100644 --- a/src/main/java/org/woehlke/simpleworklist/testdata/TestDataServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/testdata/TestDataServiceImpl.java @@ -9,7 +9,7 @@ import org.woehlke.simpleworklist.project.Project; import org.woehlke.simpleworklist.task.Task; import org.woehlke.simpleworklist.task.TaskEnergy; -import org.woehlke.simpleworklist.taskstate.TaskState; +import org.woehlke.simpleworklist.task.TaskState; import org.woehlke.simpleworklist.user.account.UserAccount; import org.woehlke.simpleworklist.task.TaskTime; import org.woehlke.simpleworklist.context.ContextRepository; diff --git a/src/main/java/org/woehlke/simpleworklist/user/account/UserAccount.java b/src/main/java/org/woehlke/simpleworklist/user/account/UserAccount.java index e5f10434..1d8c6d3c 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/account/UserAccount.java +++ b/src/main/java/org/woehlke/simpleworklist/user/account/UserAccount.java @@ -1,6 +1,11 @@ package org.woehlke.simpleworklist.user.account; import javax.validation.constraints.Email; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.hibernate.validator.constraints.SafeHtml; import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.common.AuditModel; @@ -9,11 +14,10 @@ import java.io.Serializable; import java.util.Date; -import java.util.Objects; import javax.persistence.*; import javax.persistence.Index; -import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; @Entity @Table( @@ -28,6 +32,10 @@ @Index(name="ix_user_account_last_login_timestamp", columnList = "last_login_timestamp") } ) +@Getter +@Setter +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true, exclude = {"userPassword","defaultLanguage","defaultContext","lastLoginTimestamp"}) public class UserAccount extends AuditModel implements Serializable, ComparableById { private static final long serialVersionUID = 7860692526488291439L; @@ -42,14 +50,15 @@ public class UserAccount extends AuditModel implements Serializable, ComparableB private Long id; @Email + @NotBlank @Column(name="user_email", nullable = false) private String userEmail; - @SafeHtml(whitelistType= SafeHtml.WhiteListType.NONE) + @NotBlank @Column(name="user_password", nullable = false) private String userPassword; - @SafeHtml(whitelistType= SafeHtml.WhiteListType.NONE) + @NotBlank @Column(name="user_fullname", nullable = false) private String userFullname; @@ -57,37 +66,37 @@ public class UserAccount extends AuditModel implements Serializable, ComparableB @Enumerated(EnumType.STRING) private Language defaultLanguage; + //TODO: why nullable=true and optional = true? @OneToOne( fetch = FetchType.LAZY, optional = true, cascade = { - CascadeType.MERGE, - CascadeType.REFRESH + CascadeType.REFRESH } ) - @JoinColumn(name = "default_context_id",nullable=true) + @JoinColumn(name = "default_context_id", nullable=true) private Context defaultContext; - @NotNull + //@NotNull @Temporal(value = TemporalType.TIMESTAMP) @Column(name="last_login_timestamp", nullable = false) private Date lastLoginTimestamp; - @NotNull + //@NotNull @Column(name="account_non_expired", nullable = false) - private Boolean accountNonExpired=true; + private Boolean accountNonExpired = true; - @NotNull + //@NotNull @Column(name="account_non_locked", nullable = false) - private Boolean accountNonLocked=true; + private Boolean accountNonLocked = true; - @NotNull - @Column(name="credentials_non_expired", nullable = false) - private Boolean credentialsNonExpired=true; + //@NotNull + @Column(name="account_credentials_non_expired", nullable = false) + private Boolean credentialsNonExpired = true; - @NotNull - @Column(name="enabled", nullable = false) - private Boolean enabled=true; + //@NotNull + @Column(name="account_enabled", nullable = false) + private Boolean enabled = true; @Transient @Override @@ -107,135 +116,4 @@ public boolean equalsByUuid(UserAccount otherObject) { return super.equalsByMyUuid(otherObject); } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getUserEmail() { - return userEmail; - } - - public void setUserEmail(String userEmail) { - this.userEmail = userEmail; - } - - public String getUserPassword() { - return userPassword; - } - - public void setUserPassword(String userPassword) { - this.userPassword = userPassword; - } - - public String getUserFullname() { - return userFullname; - } - - public void setUserFullname(String userFullname) { - this.userFullname = userFullname; - } - - public Date getLastLoginTimestamp() { - return lastLoginTimestamp; - } - - public void setLastLoginTimestamp(Date lastLoginTimestamp) { - this.lastLoginTimestamp = lastLoginTimestamp; - } - - public Context getDefaultContext() { - return defaultContext; - } - - public void setDefaultContext(Context defaultContext) { - this.defaultContext = defaultContext; - } - - public Language getDefaultLanguage() { - return defaultLanguage; - } - - public void setDefaultLanguage(Language defaultLanguage) { - this.defaultLanguage = defaultLanguage; - } - - public Boolean getAccountNonExpired() { - return accountNonExpired; - } - - public void setAccountNonExpired(Boolean accountNonExpired) { - this.accountNonExpired = accountNonExpired; - } - - public Boolean getAccountNonLocked() { - return accountNonLocked; - } - - public void setAccountNonLocked(Boolean accountNonLocked) { - this.accountNonLocked = accountNonLocked; - } - - public Boolean getCredentialsNonExpired() { - return credentialsNonExpired; - } - - public void setCredentialsNonExpired(Boolean credentialsNonExpired) { - this.credentialsNonExpired = credentialsNonExpired; - } - - public Boolean getEnabled() { - return enabled; - } - - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof UserAccount)) return false; - if (!super.equals(o)) return false; - UserAccount that = (UserAccount) o; - return Objects.equals(getId(), that.getId()) && - getUserEmail().equals(that.getUserEmail()) && - getUserPassword().equals(that.getUserPassword()) && - getUserFullname().equals(that.getUserFullname()) && - getDefaultLanguage() == that.getDefaultLanguage() && - getDefaultContext().equals(that.getDefaultContext()) && - Objects.equals(getLastLoginTimestamp(), that.getLastLoginTimestamp()) && - getAccountNonExpired().equals(that.getAccountNonExpired()) && - getAccountNonLocked().equals(that.getAccountNonLocked()) && - getCredentialsNonExpired().equals(that.getCredentialsNonExpired()) && - getEnabled().equals(that.getEnabled()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getId(), getUserEmail(), getUserPassword(), getUserFullname(), getDefaultLanguage(), getDefaultContext(), getLastLoginTimestamp(), getAccountNonExpired(), getAccountNonLocked(), getCredentialsNonExpired(), getEnabled()); - } - - @Override - public String toString() { - return "UserAccount{" + - "id=" + id + - ", userEmail='" + userEmail + '\'' + - ", userPassword='" + userPassword + '\'' + - ", userFullname='" + userFullname + '\'' + - ", defaultLanguage=" + defaultLanguage + - ", lastLoginTimestamp=" + lastLoginTimestamp + - ", accountNonExpired=" + accountNonExpired + - ", accountNonLocked=" + accountNonLocked + - ", credentialsNonExpired=" + credentialsNonExpired + - ", enabled=" + enabled + - ", uuid='" + uuid + '\'' + - ", rowCreatedAt=" + rowCreatedAt + - ", rowUpdatedAt=" + rowUpdatedAt + - '}'; - } - } diff --git a/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountPassword.java b/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountPassword.java new file mode 100644 index 00000000..d09ef9ad --- /dev/null +++ b/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountPassword.java @@ -0,0 +1,70 @@ +package org.woehlke.simpleworklist.user.account; + +import lombok.Getter; +import lombok.Setter; +import org.woehlke.simpleworklist.common.AuditModel; +import org.woehlke.simpleworklist.common.ComparableById; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Entity +@Table( + name="user_account_password", + uniqueConstraints = { + @UniqueConstraint( + name="ux_user_account_password", + columnNames = {"user_account_id","user_password"} + ) + }, + indexes = { + @Index(name="ix_user_account_password_uuid", columnList = "uuid"), + @Index(name="ix_user_account_password_row_created_at", columnList = "row_created_at") + } +) +@Getter +@Setter +public class UserAccountPassword extends AuditModel implements Serializable, ComparableById { + + private static final long serialVersionUID = 7860692526488291439L; + + @Id + @GeneratedValue(generator = "user_account_password_generator") + @SequenceGenerator( + name = "user_account_password_generator", + sequenceName = "user_account_password_sequence", + initialValue = 1000 + ) + private Long id; + + @NotNull + @OneToOne( + fetch = FetchType.LAZY, + optional = false, + cascade = { + CascadeType.REFRESH + } + ) + @JoinColumn(name = "user_account_id",nullable=false) + private UserAccount userAccount; + + @NotNull + @Column(name="user_password", nullable = false) + private String userPassword; + + @Override + public boolean equalsById(UserAccountPassword otherObject) { + return this.getId().compareTo(otherObject.getId())==0; + } + + @Override + public boolean equalsByUniqueConstraint(UserAccountPassword otherObject) { + return equalsById(otherObject) && (this.getUserPassword().compareTo(otherObject.getUserPassword())==0); + } + + @Override + public boolean equalsByUuid(UserAccountPassword otherObject) { + return this.getUuid().compareTo(otherObject.getUuid())==0; + } +} diff --git a/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountSecurityServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountSecurityServiceImpl.java index 88e771d5..55ec1ebb 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountSecurityServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountSecurityServiceImpl.java @@ -7,7 +7,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import org.woehlke.simpleworklist.user.UserDetailsBean; @Slf4j @Service diff --git a/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountServiceImpl.java index 5257edbf..e9127806 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/user/account/UserAccountServiceImpl.java @@ -1,12 +1,10 @@ package org.woehlke.simpleworklist.user.account; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import lombok.extern.slf4j.Slf4j; +import org.hibernate.id.UUIDGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -49,6 +47,7 @@ public boolean isEmailAvailable(String email) { @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false) public void createUser(UserAccountForm userAccount) { UserAccount u = new UserAccount(); + u.setUuid(UUID.randomUUID().toString()); u.setUserEmail(userAccount.getUserEmail()); u.setUserFullname(userAccount.getUserFullname()); u.setUserPassword(encoder.encode(userAccount.getUserPassword())); @@ -63,6 +62,8 @@ public void createUser(UserAccountForm userAccount) { u = userAccountRepository.save(u); Context workContext = new Context("Arbeit","Work"); Context privContext = new Context("Privat","Private"); + workContext.setUuid(UUID.randomUUID().toString()); + privContext.setUuid(UUID.randomUUID().toString()); workContext.setUserAccount(u); privContext.setUserAccount(u); log.info("About to save " + workContext.toString()); diff --git a/src/main/java/org/woehlke/simpleworklist/user/UserDetailsBean.java b/src/main/java/org/woehlke/simpleworklist/user/account/UserDetailsBean.java similarity index 97% rename from src/main/java/org/woehlke/simpleworklist/user/UserDetailsBean.java rename to src/main/java/org/woehlke/simpleworklist/user/account/UserDetailsBean.java index 0246c205..44bd22f1 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/UserDetailsBean.java +++ b/src/main/java/org/woehlke/simpleworklist/user/account/UserDetailsBean.java @@ -1,4 +1,4 @@ -package org.woehlke.simpleworklist.user; +package org.woehlke.simpleworklist.user.account; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/org/woehlke/simpleworklist/user/messages/User2UserMessageController.java b/src/main/java/org/woehlke/simpleworklist/user/messages/User2UserMessageController.java index e0170ff0..a794bd2d 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/messages/User2UserMessageController.java +++ b/src/main/java/org/woehlke/simpleworklist/user/messages/User2UserMessageController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.woehlke.simpleworklist.common.AbstractController; import org.woehlke.simpleworklist.breadcrumb.Breadcrumb; -import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.session.UserSessionBean; import org.woehlke.simpleworklist.context.Context; import org.woehlke.simpleworklist.user.account.UserAccount; diff --git a/src/main/java/org/woehlke/simpleworklist/user/register/UserRegistrationController.java b/src/main/java/org/woehlke/simpleworklist/user/register/UserRegistrationController.java index a8723d26..c2f51c1b 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/register/UserRegistrationController.java +++ b/src/main/java/org/woehlke/simpleworklist/user/register/UserRegistrationController.java @@ -35,8 +35,9 @@ public UserRegistrationController(UserAccountService userAccountService, UserReg * @param model * @return Formular for entering Email-Address for Registration */ - @RequestMapping(path = "/", method = RequestMethod.GET) - public final String registerNewUserRequestForm(Model model) { + @RequestMapping(path = "", method = RequestMethod.GET) + public final String registerGet(Model model) { + log.info("registerGet"); UserRegistrationForm userRegistrationForm = new UserRegistrationForm(); model.addAttribute("userRegistrationForm", userRegistrationForm); return "user/register/registerForm"; @@ -50,12 +51,13 @@ public final String registerNewUserRequestForm(Model model) { * @param model * @return info page at success or return to form with error messages. */ - @RequestMapping(path = "/", method = RequestMethod.POST) - public final String registerNewUserRequestStoreAndSendEmailForVerification( + @RequestMapping(path = "", method = RequestMethod.POST) + public final String registerPost( @Valid UserRegistrationForm userRegistrationForm, BindingResult result, Model model ) { + log.info("registerPost"); if (result.hasErrors()) { return "user/register/registerForm"; } else { @@ -91,10 +93,11 @@ public final String registerNewUserRequestStoreAndSendEmailForVerification( * @return Formular for Entering Account Task or Error Messages. */ @RequestMapping(path = "/confirm/{confirmId}", method = RequestMethod.GET) - public final String registerNewUserCheckResponseAndRegistrationForm( + public final String registerConfirmGet( @PathVariable String confirmId, Model model ) { + log.info("registerConfirmGet"); log.info("GET /confirm/" + confirmId); UserRegistration o = userRegistrationService.findByToken(confirmId); if (o != null) { @@ -118,12 +121,13 @@ public final String registerNewUserCheckResponseAndRegistrationForm( * @return login page at success or page with error messages. */ @RequestMapping(path = "/confirm/{confirmId}", method = RequestMethod.POST) - public final String registerNewUserCheckResponseAndRegistrationStore( + public final String registerConfirmPost( @PathVariable String confirmId, @Valid UserAccountForm userAccountForm, BindingResult result, Model model ) { + log.info("registerConfirmPost"); log.info("POST /confirm/" + confirmId + " : " + userAccountForm.toString()); userRegistrationService.registrationCheckIfResponseIsInTime(userAccountForm.getUserEmail()); UserRegistration oUserRegistration = userRegistrationService.findByToken(confirmId); diff --git a/src/main/java/org/woehlke/simpleworklist/user/register/UserRegistrationServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/user/register/UserRegistrationServiceImpl.java index 46da0ea9..3184df87 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/register/UserRegistrationServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/user/register/UserRegistrationServiceImpl.java @@ -1,6 +1,7 @@ package org.woehlke.simpleworklist.user.register; import java.util.Date; +import java.util.UUID; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -59,6 +60,7 @@ public void registrationCheckIfResponseIsInTime(String email) { public void registrationSendEmailTo(String email) { UserRegistration earlierOptIn = userRegistrationRepository.findByEmail(email); UserRegistration o = new UserRegistration(); + o.setUuid(UUID.randomUUID().toString()); if (earlierOptIn != null) { o = earlierOptIn; o.increaseNumberOfRetries(); @@ -110,7 +112,7 @@ private void sendEmailToRegisterNewUser(UserRegistration o) { msg.setText( "Dear new User, " + "thank you for registring at Simple Worklist. \n" - + "Please validate your email and go to URL: \nhttp://" + urlHost + "/confirm/" + o.getToken() + + "Please validate your email and go to URL: \nhttp://" + urlHost + "/user/register/confirm/" + o.getToken() + "\n\nSincerely Yours, The Team"); msg.setSubject("Your Registration at Simple Worklist"); msg.setFrom(mailFrom); diff --git a/src/main/java/org/woehlke/simpleworklist/user/resetpassword/UserPasswordRecoveryController.java b/src/main/java/org/woehlke/simpleworklist/user/resetpassword/UserPasswordRecoveryController.java index 64858f7f..2aab5445 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/resetpassword/UserPasswordRecoveryController.java +++ b/src/main/java/org/woehlke/simpleworklist/user/resetpassword/UserPasswordRecoveryController.java @@ -20,7 +20,7 @@ @Slf4j @Controller -@RequestMapping(path = "/user/resetPassword") +@RequestMapping(path = "/user") public class UserPasswordRecoveryController { private final UserAccountService userAccountService; @@ -39,7 +39,7 @@ public UserPasswordRecoveryController(UserAccountService userAccountService, Use * @param model * @return a Formular for entering the email-adress. */ - @RequestMapping(method = RequestMethod.GET) + @RequestMapping(path="/resetPassword", method = RequestMethod.GET) public final String passwordForgottenForm(Model model) { UserRegistrationForm userRegistrationForm = new UserRegistrationForm(); model.addAttribute("userRegistrationForm", userRegistrationForm); @@ -54,7 +54,7 @@ public final String passwordForgottenForm(Model model) { * @param model * @return info page if without errors or formular again displaying error messages. */ - @RequestMapping(method = RequestMethod.POST) + @RequestMapping(path="/resetPassword", method = RequestMethod.POST) public final String passwordForgottenPost( @Valid UserRegistrationForm userRegistrationForm, BindingResult result, @@ -92,7 +92,7 @@ public final String passwordForgottenPost( * @param model * @return a Formular for entering the new Password. */ - @RequestMapping(path = "/confirm/{confirmId}", method = RequestMethod.GET) + @RequestMapping(path = "/resetPassword/confirm/{confirmId}", method = RequestMethod.GET) public final String enterNewPasswordFormular( @PathVariable String confirmId, Model model @@ -120,7 +120,7 @@ public final String enterNewPasswordFormular( * @param model * @return Info Page for success or back to formular with error messages. */ - @RequestMapping(path = "/confirm/{confirmId}", method = RequestMethod.POST) + @RequestMapping(path = "/resetPassword/confirm/{confirmId}", method = RequestMethod.POST) public final String enterNewPasswordPost( @Valid UserAccountForm userAccountForm, BindingResult result, diff --git a/src/main/java/org/woehlke/simpleworklist/user/selfservice/UserAccountSecurityPasswordServiceImpl.java b/src/main/java/org/woehlke/simpleworklist/user/selfservice/UserAccountSecurityPasswordServiceImpl.java index 89b516ea..42d712a5 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/selfservice/UserAccountSecurityPasswordServiceImpl.java +++ b/src/main/java/org/woehlke/simpleworklist/user/selfservice/UserAccountSecurityPasswordServiceImpl.java @@ -1,8 +1,6 @@ package org.woehlke.simpleworklist.user.selfservice; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -14,7 +12,7 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.woehlke.simpleworklist.user.account.UserAccount; -import org.woehlke.simpleworklist.user.UserDetailsBean; +import org.woehlke.simpleworklist.user.account.UserDetailsBean; import org.woehlke.simpleworklist.user.account.UserAccountRepository; @Slf4j diff --git a/src/main/java/org/woehlke/simpleworklist/user/selfservice/UserSelfserviceController.java b/src/main/java/org/woehlke/simpleworklist/user/selfservice/UserSelfserviceController.java index fe4d893b..9d9fd0c4 100644 --- a/src/main/java/org/woehlke/simpleworklist/user/selfservice/UserSelfserviceController.java +++ b/src/main/java/org/woehlke/simpleworklist/user/selfservice/UserSelfserviceController.java @@ -24,7 +24,7 @@ import org.woehlke.simpleworklist.user.account.UserAccount; import org.woehlke.simpleworklist.language.Language; import org.woehlke.simpleworklist.user.account.UserAccountAccessService; -import org.woehlke.simpleworklist.user.UserSessionBean; +import org.woehlke.simpleworklist.session.UserSessionBean; import javax.validation.Valid; import java.util.List; @@ -50,7 +50,7 @@ public UserSelfserviceController(UserAccountAccessService userAccountAccessServi public String userProfileAndMenu( @PageableDefault(sort = "userFullname", direction = Sort.Direction.DESC) Pageable request, @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userProfileAndMenu"); @@ -72,7 +72,7 @@ public String userProfileAndMenu( @RequestMapping(path = "/name", method = RequestMethod.GET) public String userNameForm( @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userNameForm"); @@ -91,7 +91,7 @@ public String userNameStore( @Valid UserChangeNameForm username, BindingResult result, @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userNameStore"); @@ -113,7 +113,7 @@ public String userNameStore( @RequestMapping(path = "/password", method = RequestMethod.GET) public String userPasswordForm( @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userPasswordForm"); @@ -132,7 +132,7 @@ public String userPasswordStore( @Valid UserChangePasswordForm userChangePasswordForm, BindingResult result, @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ) { log.info("userPasswordStore"); @@ -184,7 +184,7 @@ public String userPasswordStore( @RequestMapping(path = "/contexts", method = RequestMethod.GET) public String userAreasForm( @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userAreasForm"); @@ -206,7 +206,7 @@ public String userAreasSave( @Valid @ModelAttribute("thisUser") UserChangeDefaultContextForm thisUser, BindingResult result, @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userAreasSave"); @@ -235,7 +235,7 @@ public String userAreasSave( @RequestMapping(path = "/context/add", method = RequestMethod.GET) public String userNewAreaForm( @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userNewAreaForm"); @@ -254,7 +254,7 @@ public String userNewAreaStore( @Valid NewContextForm newContext, BindingResult result, @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userNewAreaStore"); @@ -279,7 +279,7 @@ public String userNewAreaStore( public String userEditAreaForm( @PathVariable("id") Context context, @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userEditAreaForm"); @@ -301,7 +301,7 @@ public String userEditAreaStore( @PathVariable("id") Context context, BindingResult result, @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userEditAreaStore"); @@ -327,7 +327,7 @@ public String userEditAreaStore( public String userDeleteArea( @PathVariable("id") Context context, @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userDeleteArea"); @@ -336,7 +336,7 @@ public String userDeleteArea( model.addAttribute("thisUser", thisUser); Breadcrumb breadcrumb = breadcrumbService.getBreadcrumbForUserContextDelete(locale,context); model.addAttribute("breadcrumb", breadcrumb); - if(userSession.getContextId() == context.getId()){ + if(userSession.getLastContextId() == context.getId()){ log.info("context is active in session: "+ context); } else { if(thisUser.getDefaultContext().getId() == context.getId()){ @@ -358,7 +358,7 @@ public String userDeleteArea( @RequestMapping(path = "/language", method = RequestMethod.GET) public String userLanguageForm( @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userLanguageForm"); @@ -376,7 +376,7 @@ public String userLanguageStore( @Valid UserChangeLanguageForm userChangeLanguageForm, BindingResult result, @ModelAttribute("userSession") UserSessionBean userSession, - Locale locale, + @ModelAttribute("locale") Locale locale, Model model ){ log.info("userLanguageStore"); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f3d1b472..aa7be9dd 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -75,8 +75,10 @@ org: - "/favicon.ico" - "/user/login*" - "/user/register*" + - "/user/register/**" - "/user/register/confirm/**" - "/user/resetPassword*" + - "/user/resetPassword/**" - "/user/resetPassword/confirm/**" - "/error*" strengthBCryptPasswordEncoder: 10 diff --git a/src/main/resources/messages_de.properties b/src/main/resources/messages_de.properties index d8525f5a..2647511e 100644 --- a/src/main/resources/messages_de.properties +++ b/src/main/resources/messages_de.properties @@ -1,262 +1,264 @@ -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.searchRequest=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 +searchRequest.resultlist.h1=Suchergebnis für +searchRequest.resultlist.h2.noTasks=Keine Aufgaben gefunden +searchRequest.resultlist.h2.tasks=Aufgaben +searchRequest.resultlist.tasks.title=Aufgabe +searchRequest.resultlist.tasks.text=Text +searchRequest.resultlist.tasks.dueDate=Fälligkeitsdatum +searchRequest.resultlist.tasks.state=Status +searchRequest.resultlist.tasks.project=Projekt +searchRequest.resultlist.tasks.inbox=Eingang +searchRequest.resultlist.tasks.today=Heute +searchRequest.resultlist.tasks.next=Als Nächstes +searchRequest.resultlist.tasks.waiting=Warten +searchRequest.resultlist.tasks.scheduled=Eingeplant +searchRequest.resultlist.tasks.someday=Später +searchRequest.resultlist.tasks.completed=Erledigte Aufgaben +searchRequest.resultlist.tasks.trash=Papierkorb +searchRequest.resultlist.projects.h2.noProjects=Keine Projekte gefunden +searchRequest.resultlist.projects.h2.projects=Projekte +searchRequest.resultlist.projects.name=Name +searchRequest.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 +task.show.h1=Aufgaben ändern +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.projectroot=Wurzel +tasks.col.energyandtime=  +tasks.col.context=Kontext diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index ed086112..a469bf68 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -1,263 +1,264 @@ -navbar.brand.name=SimpleWorklist -layout.page.login=Login -layout.page.passwordForgotten=Password forgotten? -layout.page.register=Register as New User -pages.users.h1 = Messages and List of registered Users -user.loginForm.github=Sourcecode at Github\: -user.loginForm.gtd.copyright=GTD® and Getting Things Done® are registered trademarks of the David Allen Company. SimpleWorklist is not affiliated with or endorsed by the David Allen Company. -user.loginForm.h1 = Welcome to SimpleWorklist -user.loginForm.h2=Your Todo-List for Getting Things Done® -user.loginForm.login=Please login or -user.loginForm.loginButton=Login -user.loginForm.loginError=Your login attempt was not successful, try again. -user.loginForm.loginError.caused=Caused\: -user.loginForm.moreInformation=For More Information please visit\: -user.loginForm.myBlog=My Blog\: -user.loginForm.password=Password -user.loginForm.passwordReset=Password forgotten? -user.loginForm.projectPage=The Project Page\: -user.loginForm.register=register as new user -user.registerNotConfirmed.h1=Register as new User -user.registerForm.button=Register -user.registerForm.h1=Register as new User -user.registerSentMail.h1=Register as new User -user.registerSentMail.text=Verification needed. Sent an email to the given address. Please check your Inbox. -user.resetPasswordConfirmed.button=Save New Password -user.resetPasswordConfirmed.h1=Password Reset -user.resetPasswordConfirmed.password=New Password -user.resetPasswordConfirmed.passwordAgain=New Password again -user.resetPasswordDone.h1=Password Reset -user.resetPasswordDone.text1=Your Password is changed now. Please log in -user.resetPasswordDone.text2=here -user.resetPasswordForm.button=Request Password Reset -user.resetPasswordForm.h1=Password Reset -user.resetPasswordNotConfirmed.h1=Password Reset -user.resetPasswordNotConfirmed.text=Sorry. There is nothing known for your Request. -user.resetPasswordSentMail.h1=Password Reset -user.resetPasswordSentMail.text=Sent an email with Instructions for Password Reset to the given address. Please check your Inbox. -user.registerNotConfirmed.text=Sorry. There is no registration known for your Request. -user.registerDone.h1=Register as new User -user.registerDone.text1=You are registered now. -user.registerDone.text2=Please log in here -user.registerConfirmed.userFullname=Full Name -user.registerConfirmed.userPassword=Password -user.registerConfirmed.userPasswordConfirmation=Password again -user.registerConfirmed.button=Confirm Registration -user.registerConfirmed.h1=Register as new User -pages.users.messages=Messages -pages.users.lastLogin=Last Login -pages.users.dateOfRegistration=Date of registration -pages.user.profile=User Selfservice -pages.user.profile.change.name=Change Your User Name -pages.user.profile.change.password=Change Your Password -pages.user.profile.change.contexts=Change Your Contexts -pages.user.profile.add.context=Add Context -pages.user.profile.edit.context=Edit Context -pages.user.profile.delete.context=Delete one Context -pages.user.profile.change.language=Choose Default Language -pages.user.user2user.messages=Messages User2User -pages.search=Search Results -pages.user2UserMessages.h1=Your Dialog with -pages.user2UserMessages.newMessage=New Message\: -pages.user2UserMessages.newUserMessageButton=Send Message -pages.user2UserMessages.showAllText1=Show all Messages -pages.user2UserMessages.showAllText2=(only the last 20 Messages are displayed here) -project.add.h1=Add Project -project.add.description=Description -project.add.button=Add Project -project.edit.h1=Edit Project -project.edit.description=Description -project.edit.button=Save Project -project.show.edit=Edit Project -project.show.delete=Delete Project -project.show.addTask=Add Task -project.show.title=Title -project.show.text=Text -project.show.dueDate=Due Date -project.show.taskState=Task State -project.show.h1=Project -project.show.description=Description -project.show.state.inbox=Inbox -project.show.state.today=Today -project.show.state.next=Next -project.show.state.waiting=Waiting -project.show.state.scheduled=Scheduled -project.show.state.someday=Someday -project.show.state.completed=Completed Tasks -project.show.state.trash=Trash -project.show.nothingToDo=There is nothing to do in this project. -layout.page.newContent=New Content -layout.page.addProject=Add a Project -layout.page.addTask=Add a Task -layout.page.createTestData=Create Test Data -layout.page.showUsers=User -layout.page.logout=Logout -layout.page.inbox=Inbox -layout.page.today=Today -layout.page.next=Next -layout.page.waiting=Waiting -layout.page.scheduled=Scheduled -layout.page.someday=Someday -layout.page.focus=Focus -layout.page.completed=Completed Tasks -layout.page.trash=Trash -layout.page.all=All Tasks -search.resultlist.h1=Search Result for searchterm -search.resultlist.h2.noTasks=No Tasks found -search.resultlist.h2.tasks=Tasks -search.resultlist.tasks.title=Title -search.resultlist.tasks.text=Text -search.resultlist.tasks.dueDate=Due Date -search.resultlist.tasks.state=State -search.resultlist.tasks.project=Project -search.resultlist.tasks.inbox=Inbox -search.resultlist.tasks.today=Today -search.resultlist.tasks.next=Next -search.resultlist.tasks.waiting=Waiting -search.resultlist.tasks.scheduled=Scheduled -search.resultlist.tasks.someday=Someday -search.resultlist.tasks.completed=Completed Tasks -search.resultlist.tasks.trash=Trash -search.resultlist.projects.h2.noProjects=No Projects found -search.resultlist.projects.h2.projects=Projects -search.resultlist.projects.name=Name -search.resultlist.projects.description=Description -task.add.h1=Add Task -task.add.title=Title -task.add.dueDate=Due Date -task.add.text=Text -task.add.taskEnergy=Energy -task.add.taskTime=Time -task.add.button=Add Task -layout.page.signedInUser=Signed in as -task.show.title=Title -task.show.dueDate=Due Date -task.show.text=Description -task.show.taskEnergy=Energy -task.show.taskTime=Time -task.show.button=Save Task -task.show.transform=Transform into Project -task.show.button.edit= Edit Task -task.show.button.close=Ok -task.show.h1=Edit Task -right.nav.projects=Projects -tasks.completed.h1=Completed Tasks -tasks.completed.delete=Delete All Completed Tasks -tasks.completed.title=Title -tasks.completed.text=Text -tasks.completed.project=Project -tasks.completed.noTasks=You have no completed Tasks -tasks.focus.h1=Focus -tasks.focus.title=Title -tasks.focus.text=Text -tasks.focus.dueDate=Due Date -tasks.focus.taskState=Task State -tasks.focus.project=Project -tasks.focus.noTasks=You have no Tasks in Focus -tasks.inbox.h1=Inbox -tasks.inbox.title=Title -tasks.inbox.text=Text -tasks.inbox.project=Project -tasks.inbox.noTasks=You have no Tasks in Your Inbox -tasks.next.h1=Next -tasks.next.title=Title -tasks.next.text=Text -tasks.next.project=Project -tasks.next.noTasks=You have no Tasks to do Next -tasks.scheduled.h1=Scheduled -tasks.scheduled.title=Title -tasks.scheduled.text=Text -tasks.scheduled.dueDate=Due Date -tasks.scheduled.project=Project -tasks.scheduled.noTasks=You have no scheduled Tasks -tasks.someday.h1=Someday -tasks.someday.title=Title -tasks.someday.text=Text -tasks.someday.project=Project -tasks.someday.noTasks=You have no Tasks for Someday -tasks.today.h1=Today -tasks.today.title=Title -tasks.today.text=Text -tasks.today.project=Project -tasks.today.noTasks=You have no Tasks for Today -tasks.trash.h1=Trash -tasks.trash.empty=Empty Trash -tasks.trash.title=Title -tasks.trash.text=Text -tasks.trash.project=Project -tasks.trash.noTasks=You have no deleted Tasks in your Trash -tasks.waiting.h1=Waiting -tasks.waiting.title=Title -tasks.waiting.text=Text -tasks.waiting.project=Project -tasks.waiting.noTasks=You are not waiting for others -tasks.focus.inbox=Inbox -tasks.focus.today=Today -tasks.focus.next=Next -tasks.focus.waiting=Waiting -tasks.focus.scheduled=Scheduled -tasks.focus.someday=Someday -tasks.focus.completed=Completed Tasks -tasks.focus.trash=Trash -tasks.inbox.addTask=Add Task -enum.taskenergy.low=low -enum.taskenergy.medium=medium -enum.taskenergy.high=high -enum.taskenergy.none=none -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 hour -enum.tasktime.hour2=2 hours -enum.tasktime.hour3=3 hours -enum.tasktime.hour4=4 hours -enum.tasktime.hour6=6 hours -enum.tasktime.hour8=8 hours -enum.tasktime.more=more -enum.tasktime.none=none -layout.page.contexts=Context -user.selfservice.profile.h1=User Profile -user.selfservice.profile.userEmail=User Email\: -user.selfservice.profile.name=Change Name\: -user.selfservice.profile.changePassword=Change Password -user.selfservice.profile.changeContexts=Change Contexts -user.selfservice.profile.changeLanguage=Set Default Language -button.back= back -user.selfservice.name.button=Save Username -user.resetPasswordConfirmed.oldUserPassword=Current Password -user.selfservice.language.button=Set Language -enum.language.de=German -enum.language.en=English -user.selfservice.language.defaultLanguage=Language -user.selfservice.forUser=for User\: -user.selfservice.contexts.add.button=Add Context -user.selfservice.contexts.edit=Edit Context -user.selfservice.contexts.edit.button=Save Context -user.selfservice.context.default=Set Default Context -user.selfservice.context.default.button=Save Default Context -task.show.context=change Context -project.edit.context=Context -tasks.all.h1=All Tasks -tasks.all.noTasks=You have no Tasks at all -tasks.all.context=Context -task.col.twtooltip.infoicons.finish.task=Click here to mark Task as finished -task.col.twtooltip.infoicons.unfinish.task=Click here to mark Task as yet unfinished -task.col.twtooltip.infoicons.trash=Trash -task.col.twtooltip.infoicons.unsetfocus=Remove Task from Focus -task.col.twtooltip.infoicons.setfocus=Set Task into Focus -task.col.twtooltip.show.details=Show all Information about this Task -task.col.twtooltip.duedate=Due Date -task.col.twtooltip.taskstate=State -task.col.twtooltip.project=Project -task.col.twtooltip.badge.taskEnergy=Energy Amount -task.col.twtooltip.badge.taskTime=Time Amount -task.col.twtooltip.context=Context -tasks.col.info.icons=  -tasks.col.title=Title -tasks.col.dueDate=Due Date -tasks.col.taskState=Task State -tasks.col.project=Project -tasks.col.energyandtime=  -tasks.col.context=Context +navbar.brand.name=SimpleWorklist +layout.page.login=Login +layout.page.passwordForgotten=Password forgotten? +layout.page.register=Register as New User +pages.users.h1 = Messages and List of registered Users +user.loginForm.github=Sourcecode at Github\: +user.loginForm.gtd.copyright=GTD® and Getting Things Done® are registered trademarks of the David Allen Company. SimpleWorklist is not affiliated with or endorsed by the David Allen Company. +user.loginForm.h1 = Welcome to SimpleWorklist +user.loginForm.h2=Your Todo-List for Getting Things Done® +user.loginForm.login=Please login or +user.loginForm.loginButton=Login +user.loginForm.loginError=Your login attempt was not successful, try again. +user.loginForm.loginError.caused=Caused\: +user.loginForm.moreInformation=For More Information please visit\: +user.loginForm.myBlog=My Blog\: +user.loginForm.password=Password +user.loginForm.passwordReset=Password forgotten? +user.loginForm.projectPage=The Project Page\: +user.loginForm.register=register as new user +user.registerNotConfirmed.h1=Register as new User +user.registerForm.button=Register +user.registerForm.h1=Register as new User +user.registerSentMail.h1=Register as new User +user.registerSentMail.text=Verification needed. Sent an email to the given address. Please check your Inbox. +user.resetPasswordConfirmed.button=Save New Password +user.resetPasswordConfirmed.h1=Password Reset +user.resetPasswordConfirmed.password=New Password +user.resetPasswordConfirmed.passwordAgain=New Password again +user.resetPasswordDone.h1=Password Reset +user.resetPasswordDone.text1=Your Password is changed now. Please log in +user.resetPasswordDone.text2=here +user.resetPasswordForm.button=Request Password Reset +user.resetPasswordForm.h1=Password Reset +user.resetPasswordNotConfirmed.h1=Password Reset +user.resetPasswordNotConfirmed.text=Sorry. There is nothing known for your Request. +user.resetPasswordSentMail.h1=Password Reset +user.resetPasswordSentMail.text=Sent an email with Instructions for Password Reset to the given address. Please check your Inbox. +user.registerNotConfirmed.text=Sorry. There is no registration known for your Request. +user.registerDone.h1=Register as new User +user.registerDone.text1=You are registered now. +user.registerDone.text2=Please log in here +user.registerConfirmed.userFullname=Full Name +user.registerConfirmed.userPassword=Password +user.registerConfirmed.userPasswordConfirmation=Password again +user.registerConfirmed.button=Confirm Registration +user.registerConfirmed.h1=Register as new User +pages.users.messages=Messages +pages.users.lastLogin=Last Login +pages.users.dateOfRegistration=Date of registration +pages.user.profile=User Selfservice +pages.user.profile.change.name=Change Your User Name +pages.user.profile.change.password=Change Your Password +pages.user.profile.change.contexts=Change Your Contexts +pages.user.profile.add.context=Add Context +pages.user.profile.edit.context=Edit Context +pages.user.profile.delete.context=Delete one Context +pages.user.profile.change.language=Choose Default Language +pages.user.user2user.messages=Messages User2User +pages.searchRequest=Search Results +pages.user2UserMessages.h1=Your Dialog with +pages.user2UserMessages.newMessage=New Message\: +pages.user2UserMessages.newUserMessageButton=Send Message +pages.user2UserMessages.showAllText1=Show all Messages +pages.user2UserMessages.showAllText2=(only the last 20 Messages are displayed here) +project.add.h1=Add Project +project.add.description=Description +project.add.button=Add Project +project.edit.h1=Edit Project +project.edit.description=Description +project.edit.button=Save Project +project.show.edit=Edit Project +project.show.delete=Delete Project +project.show.addTask=Add Task +project.show.title=Title +project.show.text=Text +project.show.dueDate=Due Date +project.show.taskState=Task State +project.show.h1=Project +project.show.description=Description +project.show.state.inbox=Inbox +project.show.state.today=Today +project.show.state.next=Next +project.show.state.waiting=Waiting +project.show.state.scheduled=Scheduled +project.show.state.someday=Someday +project.show.state.completed=Completed Tasks +project.show.state.trash=Trash +project.show.nothingToDo=You have no Tasks in this project. +layout.page.newContent=New Content +layout.page.addProject=Add a Project +layout.page.addTask=Add a Task +layout.page.createTestData=Create Test Data +layout.page.showUsers=User +layout.page.logout=Logout +layout.page.inbox=Inbox +layout.page.today=Today +layout.page.next=Next +layout.page.waiting=Waiting +layout.page.scheduled=Scheduled +layout.page.someday=Someday +layout.page.focus=Focus +layout.page.completed=Completed Tasks +layout.page.trash=Trash +layout.page.all=All Tasks +searchRequest.resultlist.h1=Search Result for searchterm +searchRequest.resultlist.h2.noTasks=No Tasks found +searchRequest.resultlist.h2.tasks=Tasks +searchRequest.resultlist.tasks.title=Title +searchRequest.resultlist.tasks.text=Text +searchRequest.resultlist.tasks.dueDate=Due Date +searchRequest.resultlist.tasks.state=State +searchRequest.resultlist.tasks.project=Project +searchRequest.resultlist.tasks.inbox=Inbox +searchRequest.resultlist.tasks.today=Today +searchRequest.resultlist.tasks.next=Next +searchRequest.resultlist.tasks.waiting=Waiting +searchRequest.resultlist.tasks.scheduled=Scheduled +searchRequest.resultlist.tasks.someday=Someday +searchRequest.resultlist.tasks.completed=Completed Tasks +searchRequest.resultlist.tasks.trash=Trash +searchRequest.resultlist.projects.h2.noProjects=No Projects found +searchRequest.resultlist.projects.h2.projects=Projects +searchRequest.resultlist.projects.name=Name +searchRequest.resultlist.projects.description=Description +task.add.h1=Add Task +task.add.title=Title +task.add.dueDate=Due Date +task.add.text=Text +task.add.taskEnergy=Energy +task.add.taskTime=Time +task.add.button=Add Task +layout.page.signedInUser=Signed in as +task.show.title=Title +task.show.dueDate=Due Date +task.show.text=Description +task.show.taskEnergy=Energy +task.show.taskTime=Time +task.show.button=Save Task +task.show.transform=Transform into Project +task.show.button.edit= Edit Task +task.show.button.close=Ok +task.show.h1=Edit Task +right.nav.projects=Projects +tasks.completed.h1=Completed Tasks +tasks.completed.delete=Delete All Completed Tasks +tasks.completed.title=Title +tasks.completed.text=Text +tasks.completed.project=Project +tasks.completed.noTasks=You have no completed Tasks +tasks.focus.h1=Focus +tasks.focus.title=Title +tasks.focus.text=Text +tasks.focus.dueDate=Due Date +tasks.focus.taskState=Task State +tasks.focus.project=Project +tasks.focus.noTasks=You have no Tasks in Focus +tasks.inbox.h1=Inbox +tasks.inbox.title=Title +tasks.inbox.text=Text +tasks.inbox.project=Project +tasks.inbox.noTasks=You have no Tasks in Your Inbox +tasks.next.h1=Next +tasks.next.title=Title +tasks.next.text=Text +tasks.next.project=Project +tasks.next.noTasks=You have no Tasks to do Next +tasks.scheduled.h1=Scheduled +tasks.scheduled.title=Title +tasks.scheduled.text=Text +tasks.scheduled.dueDate=Due Date +tasks.scheduled.project=Project +tasks.scheduled.noTasks=You have no scheduled Tasks +tasks.someday.h1=Someday +tasks.someday.title=Title +tasks.someday.text=Text +tasks.someday.project=Project +tasks.someday.noTasks=You have no Tasks for Someday +tasks.today.h1=Today +tasks.today.title=Title +tasks.today.text=Text +tasks.today.project=Project +tasks.today.noTasks=You have no Tasks for Today +tasks.trash.h1=Trash +tasks.trash.empty=Empty Trash +tasks.trash.title=Title +tasks.trash.text=Text +tasks.trash.project=Project +tasks.trash.noTasks=You have no deleted Tasks in your Trash +tasks.waiting.h1=Waiting +tasks.waiting.title=Title +tasks.waiting.text=Text +tasks.waiting.project=Project +tasks.waiting.noTasks=You are not waiting for others +tasks.focus.inbox=Inbox +tasks.focus.today=Today +tasks.focus.next=Next +tasks.focus.waiting=Waiting +tasks.focus.scheduled=Scheduled +tasks.focus.someday=Someday +tasks.focus.completed=Completed Tasks +tasks.focus.trash=Trash +tasks.inbox.addTask=Add Task +enum.taskenergy.low=low +enum.taskenergy.medium=medium +enum.taskenergy.high=high +enum.taskenergy.none=none +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 hour +enum.tasktime.hour2=2 hours +enum.tasktime.hour3=3 hours +enum.tasktime.hour4=4 hours +enum.tasktime.hour6=6 hours +enum.tasktime.hour8=8 hours +enum.tasktime.more=more +enum.tasktime.none=none +layout.page.contexts=Context +user.selfservice.profile.h1=User Profile +user.selfservice.profile.userEmail=User Email\: +user.selfservice.profile.name=Change Name\: +user.selfservice.profile.changePassword=Change Password +user.selfservice.profile.changeContexts=Change Contexts +user.selfservice.profile.changeLanguage=Set Default Language +button.back= back +user.selfservice.name.button=Save Username +user.resetPasswordConfirmed.oldUserPassword=Current Password +user.selfservice.language.button=Set Language +enum.language.de=German +enum.language.en=English +user.selfservice.language.defaultLanguage=Language +user.selfservice.forUser=for User\: +user.selfservice.contexts.add.button=Add Context +user.selfservice.contexts.edit=Edit Context +user.selfservice.contexts.edit.button=Save Context +user.selfservice.context.default=Set Default Context +user.selfservice.context.default.button=Save Default Context +task.show.context=change Context +project.edit.context=Context +tasks.all.h1=All Tasks +tasks.all.noTasks=You have no Tasks at all +tasks.all.context=Context +task.col.twtooltip.infoicons.finish.task=Click here to mark Task as finished +task.col.twtooltip.infoicons.unfinish.task=Click here to mark Task as yet unfinished +task.col.twtooltip.infoicons.trash=Trash +task.col.twtooltip.infoicons.unsetfocus=Remove Task from Focus +task.col.twtooltip.infoicons.setfocus=Set Task into Focus +task.col.twtooltip.show.details=Show all Information about this Task +task.col.twtooltip.duedate=Due Date +task.col.twtooltip.taskstate=State +task.col.twtooltip.project=Project +task.col.twtooltip.badge.taskEnergy=Energy Amount +task.col.twtooltip.badge.taskTime=Time Amount +task.col.twtooltip.context=Context +tasks.col.info.icons=  +tasks.col.title=Title +tasks.col.dueDate=Due Date +tasks.col.taskState=Task State +tasks.col.project=Project +tasks.col.projectroot=Wurzel +tasks.col.energyandtime=  +tasks.col.context=Context diff --git a/src/main/resources/templates/layout/navbartop.html b/src/main/resources/templates/layout/navbartop.html index e40de671..e006c937 100644 --- a/src/main/resources/templates/layout/navbartop.html +++ b/src/main/resources/templates/layout/navbartop.html @@ -1,106 +1,106 @@ - - - - - - \ No newline at end of file + + + + + + diff --git a/src/main/resources/templates/layout/page.html b/src/main/resources/templates/layout/page.html index 6e6715d3..f8f8cae0 100644 --- a/src/main/resources/templates/layout/page.html +++ b/src/main/resources/templates/layout/page.html @@ -1,215 +1,194 @@ - - - - - - - - - - - - - - - SimpleWorklist - - - - - - - - - - -
-
-
-
-
- -
-
-
- -
-
- - -
-
- - -
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
-
-
- - -
- -
- - - - - - - - - - - + + + + + + + + + + + + SimpleWorklist + + + + + + + + + + +
+
+
+
+
+ +
+
+
+ +
+
+ + +
+
+ + +
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + +
+ +
+ + + + + + + + + + + diff --git a/src/main/resources/templates/layout/tasks.html b/src/main/resources/templates/layout/tasks.html index 6305beaf..41873e10 100644 --- a/src/main/resources/templates/layout/tasks.html +++ b/src/main/resources/templates/layout/tasks.html @@ -56,13 +56,13 @@ draggable="true" ondragstart="dragTask(event)" ondrop="dropTask2Task(event)" ondragover="allowDropOfTask(event)"> - - @@ -72,13 +72,13 @@ th:if="${task.taskState.name() eq 'TRASHED'}" th:alt-title="#{task.col.twtooltip.infoicons.trash}" draggable="true" ondragstart="dragTask(event)" data-placement="bottom"> - - @@ -107,7 +107,7 @@ - Inbox @@ -178,20 +178,20 @@