├── .gitignore ├── README.md ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── grails-app ├── assets │ ├── images │ │ ├── apple-touch-icon-retina.png │ │ ├── apple-touch-icon.png │ │ ├── favicon.ico │ │ ├── grails-cupsonly-logo-white.svg │ │ ├── skin │ │ │ ├── database_add.png │ │ │ ├── database_delete.png │ │ │ ├── database_edit.png │ │ │ ├── database_save.png │ │ │ ├── database_table.png │ │ │ ├── exclamation.png │ │ │ ├── house.png │ │ │ ├── information.png │ │ │ ├── shadow.jpg │ │ │ ├── sorted_asc.gif │ │ │ └── sorted_desc.gif │ │ └── spinner.gif │ ├── javascripts │ │ ├── application.js │ │ ├── bootstrap.js │ │ └── jquery-2.2.0.min.js │ └── stylesheets │ │ ├── application.css │ │ ├── bootstrap.css │ │ ├── errors.css │ │ ├── grails.css │ │ ├── main.css │ │ └── mobile.css ├── conf │ ├── application.yml │ ├── logback.groovy │ └── spring │ │ └── resources.groovy ├── controllers │ └── pms │ │ ├── MilestoneController.groovy │ │ ├── ProjectController.groovy │ │ └── UrlMappings.groovy ├── domain │ └── pms │ │ ├── Milestone.groovy │ │ └── Project.groovy ├── i18n │ ├── messages.properties │ ├── messages_cs_CZ.properties │ ├── messages_da.properties │ ├── messages_de.properties │ ├── messages_es.properties │ ├── messages_fr.properties │ ├── messages_it.properties │ ├── messages_ja.properties │ ├── messages_nb.properties │ ├── messages_nl.properties │ ├── messages_pl.properties │ ├── messages_pt_BR.properties │ ├── messages_pt_PT.properties │ ├── messages_ru.properties │ ├── messages_sv.properties │ ├── messages_th.properties │ └── messages_zh_CN.properties ├── init │ └── pms │ │ ├── Application.groovy │ │ └── BootStrap.groovy └── views │ ├── error.gsp │ ├── index.gsp │ ├── layouts │ └── main.gsp │ ├── milestone │ ├── create.gsp │ ├── edit.gsp │ ├── index.gsp │ └── show.gsp │ ├── notFound.gsp │ └── project │ ├── create.gsp │ ├── edit.gsp │ ├── index.gsp │ └── show.gsp ├── grails-wrapper.jar ├── grailsw ├── grailsw.bat ├── settings.gradle └── src └── test └── groovy └── pms ├── MilestoneControllerSpec.groovy ├── MilestoneSpec.groovy ├── ProjectControllerSpec.groovy └── ProjectSpec.groovy /.gitignore: -------------------------------------------------------------------------------- 1 | Thumbs.db 2 | .DS_Store 3 | .gradle 4 | build/ 5 | .idea 6 | *.iml 7 | *.ipr 8 | *.iws 9 | .project 10 | .settings 11 | .classpath 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pms 2 | 介绍Spring Boot集成Groovy开发。开发一个极简版的pms(项目管理系统)。 3 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | mavenLocal() 4 | maven { url "https://repo.grails.org/grails/core" } 5 | } 6 | dependencies { 7 | classpath "org.grails:grails-gradle-plugin:$grailsVersion" 8 | classpath "com.bertramlabs.plugins:asset-pipeline-gradle:2.14.1" 9 | classpath "org.grails.plugins:hibernate5:${gormVersion-".RELEASE"}" 10 | } 11 | } 12 | 13 | version "0.1" 14 | group "pms" 15 | 16 | apply plugin:"eclipse" 17 | apply plugin:"idea" 18 | apply plugin:"war" 19 | apply plugin:"org.grails.grails-web" 20 | apply plugin:"org.grails.grails-gsp" 21 | apply plugin:"asset-pipeline" 22 | 23 | repositories { 24 | mavenLocal() 25 | maven { url "https://repo.grails.org/grails/core" } 26 | } 27 | 28 | dependencies { 29 | compile "org.springframework.boot:spring-boot-starter-logging" 30 | compile "org.springframework.boot:spring-boot-autoconfigure" 31 | compile "org.grails:grails-core" 32 | compile "org.springframework.boot:spring-boot-starter-actuator" 33 | compile "org.springframework.boot:spring-boot-starter-tomcat" 34 | compile "org.grails:grails-dependencies" 35 | compile "org.grails:grails-web-boot" 36 | compile "org.grails.plugins:cache" 37 | compile "org.grails.plugins:scaffolding" 38 | compile "org.grails.plugins:hibernate5" 39 | compile "org.hibernate:hibernate-core:5.1.3.Final" 40 | compile "org.hibernate:hibernate-ehcache:5.1.3.Final" 41 | console "org.grails:grails-console" 42 | profile "org.grails.profiles:web" 43 | runtime "com.bertramlabs.plugins:asset-pipeline-grails:2.14.1" 44 | runtime "com.h2database:h2" 45 | testCompile "org.grails:grails-plugin-testing" 46 | testCompile "org.grails.plugins:geb" 47 | testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1" 48 | testRuntime "net.sourceforge.htmlunit:htmlunit:2.18" 49 | } 50 | 51 | bootRun { 52 | jvmArgs('-Dspring.output.ansi.enabled=always') 53 | addResources = true 54 | } 55 | 56 | 57 | assets { 58 | minifyJs = true 59 | minifyCss = true 60 | } 61 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | grailsVersion=3.2.8 2 | gormVersion=6.0.9.RELEASE 3 | gradleWrapperVersion=3.4.1 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Nov 27 23:09:32 CET 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-bin.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /grails-app/assets/images/apple-touch-icon-retina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/apple-touch-icon-retina.png -------------------------------------------------------------------------------- /grails-app/assets/images/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/apple-touch-icon.png -------------------------------------------------------------------------------- /grails-app/assets/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/favicon.ico -------------------------------------------------------------------------------- /grails-app/assets/images/grails-cupsonly-logo-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/database_add.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/database_delete.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/database_edit.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/database_save.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/database_table.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/exclamation.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/house.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/information.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/shadow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/shadow.jpg -------------------------------------------------------------------------------- /grails-app/assets/images/skin/sorted_asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/sorted_asc.gif -------------------------------------------------------------------------------- /grails-app/assets/images/skin/sorted_desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/skin/sorted_desc.gif -------------------------------------------------------------------------------- /grails-app/assets/images/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-app/assets/images/spinner.gif -------------------------------------------------------------------------------- /grails-app/assets/javascripts/application.js: -------------------------------------------------------------------------------- 1 | // This is a manifest file that'll be compiled into application.js. 2 | // 3 | // Any JavaScript file within this directory can be referenced here using a relative path. 4 | // 5 | // You're free to add application-wide JavaScript to this file, but it's generally better 6 | // to create separate JavaScript files as needed. 7 | // 8 | //= require jquery-2.2.0.min 9 | //= require bootstrap 10 | //= require_tree . 11 | //= require_self 12 | 13 | if (typeof jQuery !== 'undefined') { 14 | (function($) { 15 | $(document).ajaxStart(function() { 16 | $('#spinner').fadeIn(); 17 | }).ajaxStop(function() { 18 | $('#spinner').fadeOut(); 19 | }); 20 | })(jQuery); 21 | } 22 | -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/application.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This is a manifest file that'll be compiled into application.css, which will include all the files 3 | * listed below. 4 | * 5 | * Any CSS file within this directory can be referenced here using a relative path. 6 | * 7 | * You're free to add application-wide styles to this file and they'll appear at the top of the 8 | * compiled file, but it's generally better to create a new file per style scope. 9 | * 10 | *= require bootstrap 11 | *= require grails 12 | *= require main 13 | *= require mobile 14 | *= require_self 15 | */ 16 | -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/errors.css: -------------------------------------------------------------------------------- 1 | h1, h2 { 2 | margin: 10px 25px 5px; 3 | } 4 | 5 | h2 { 6 | font-size: 1.1em; 7 | } 8 | 9 | .filename { 10 | font-style: italic; 11 | } 12 | 13 | .exceptionMessage { 14 | margin: 10px; 15 | border: 1px solid #000; 16 | padding: 5px; 17 | background-color: #E9E9E9; 18 | } 19 | 20 | .stack, 21 | .snippet { 22 | margin: 0 25px 10px; 23 | } 24 | 25 | .stack, 26 | .snippet { 27 | border: 1px solid #ccc; 28 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); 29 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); 30 | box-shadow: 0 0 2px rgba(0,0,0,0.2); 31 | } 32 | 33 | /* error details */ 34 | .error-details { 35 | border-top: 1px solid #FFAAAA; 36 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); 37 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); 38 | box-shadow: 0 0 2px rgba(0,0,0,0.2); 39 | border-bottom: 1px solid #FFAAAA; 40 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); 41 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); 42 | box-shadow: 0 0 2px rgba(0,0,0,0.2); 43 | background-color:#FFF3F3; 44 | line-height: 1.5; 45 | overflow: hidden; 46 | padding: 5px; 47 | padding-left:25px; 48 | } 49 | 50 | .error-details dt { 51 | clear: left; 52 | float: left; 53 | font-weight: bold; 54 | margin-right: 5px; 55 | } 56 | 57 | .error-details dt:after { 58 | content: ":"; 59 | } 60 | 61 | .error-details dd { 62 | display: block; 63 | } 64 | 65 | /* stack trace */ 66 | .stack { 67 | padding: 5px; 68 | overflow: auto; 69 | height: 150px; 70 | } 71 | 72 | /* code snippet */ 73 | .snippet { 74 | background-color: #fff; 75 | font-family: monospace; 76 | } 77 | 78 | .snippet .line { 79 | display: block; 80 | } 81 | 82 | .snippet .lineNumber { 83 | background-color: #ddd; 84 | color: #999; 85 | display: inline-block; 86 | margin-right: 5px; 87 | padding: 0 3px; 88 | text-align: right; 89 | width: 3em; 90 | } 91 | 92 | .snippet .error { 93 | background-color: #fff3f3; 94 | font-weight: bold; 95 | } 96 | 97 | .snippet .error .lineNumber { 98 | background-color: #faa; 99 | color: #333; 100 | font-weight: bold; 101 | } 102 | 103 | .snippet .line:first-child .lineNumber { 104 | padding-top: 5px; 105 | } 106 | 107 | .snippet .line:last-child .lineNumber { 108 | padding-bottom: 5px; 109 | } -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/grails.css: -------------------------------------------------------------------------------- 1 | html, code, kbd, pre, samp { 2 | -ms-text-size-adjust: 100%; 3 | -webkit-text-size-adjust: 100%; 4 | } 5 | 6 | html, body { 7 | height: 100%; 8 | -webkit-overflow-scrolling: touch; 9 | } 10 | 11 | p, ul, pre, h1, h2, h3, h4, h5, h6, h7, h8 { 12 | margin: 1em 0; 13 | } 14 | 15 | p { 16 | display: block; 17 | } 18 | 19 | h1, h2, h3, h4, h5, h6, h7, h8 { 20 | font-weight: bold; 21 | } 22 | 23 | pre { 24 | border-radius: 0; 25 | border: 0; 26 | font-size: 14px; 27 | } 28 | 29 | /* customizing bootstrap nav bar */ 30 | .navbar { 31 | margin-bottom: 0px; 32 | padding-right: 110px; 33 | } 34 | .navbar .container { 35 | margin: 10px; 36 | } 37 | .navbar-default a { 38 | color: #ffffff !important; 39 | font-size: 18px !important; 40 | text-decoration: none; 41 | } 42 | .grails-icon img { 43 | width: 40px; 44 | 45 | } 46 | .navbar-default, .navbar-static-top { 47 | background-color: #4D8618; 48 | border: 0px; 49 | } 50 | a.navbar-brand { 51 | color: white !important; 52 | font-size: 19px !important; 53 | } 54 | .navbar-default .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:hover, .navbar-default .navbar-nav>.active>a:focus { 55 | background-color: transparent; 56 | color: white; 57 | } 58 | .navbar-nav>li.active>a { 59 | color: white !important; 60 | } 61 | .navbar-nav>li>a:hover { 62 | background-color: #db4800 !important; 63 | color: white !important; 64 | } 65 | .navbar-nav>li>a { 66 | color: #c0d3db; 67 | } 68 | .navbar-default .navbar-toggle .icon-bar { 69 | background-color: white; 70 | } 71 | .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { 72 | background-color: #db4800; 73 | } 74 | 75 | @media (min-width: 768px) { 76 | .container { 77 | width: auto; 78 | } 79 | } 80 | 81 | /* specific to index.html */ 82 | 83 | @media (max-width: 999px) { 84 | #fork-me { 85 | display: none; 86 | } 87 | 88 | .navbar { 89 | padding-right: 0px; 90 | } 91 | } 92 | 93 | #fork-me{ 94 | position: fixed; 95 | padding: 0px 50px 0px 50px; 96 | top: 40px; 97 | right: -60px; 98 | background-color: #a60000; 99 | color: #ffffff; 100 | font-size: 1em; 101 | z-index: 100; 102 | transform: rotate(+45deg); 103 | text-align: center; 104 | font-weight: bolder; 105 | border: #c14646; 106 | border-style: dashed; 107 | border-width: 1px; 108 | } 109 | 110 | #fork-me p { 111 | margin: 0em 0; 112 | } 113 | 114 | #band { 115 | /*grey =#808080*/ 116 | background: #79B94C no-repeat 50% 30%; 117 | height: 400px; 118 | } 119 | 120 | .svg #band { 121 | background-image: url(../img/grails-cupsonly-logo-white.svg); 122 | } 123 | 124 | .no-svg #band { 125 | background-image: url(../img/groovy-logo-white.png); 126 | } 127 | 128 | @media (max-width: 1010px) { 129 | #band { 130 | background-size: 90%; 131 | height: 300px; 132 | } 133 | } 134 | 135 | @media (max-width: 690px) { 136 | #band { 137 | background-size: 80%; 138 | height: 200px; 139 | } 140 | } 141 | 142 | @media (max-width: 475px) { 143 | #band { 144 | background-size: 70%; 145 | height: 100px; 146 | } 147 | } 148 | 149 | #they-use-groovy { 150 | width: 100%; 151 | height: 450px; 152 | background-color: #db4800; 153 | margin-bottom: 20px; 154 | text-align: center; 155 | } 156 | 157 | #they-use-groovy .item { 158 | text-align: center; 159 | color: white; 160 | } 161 | 162 | #logos-holder { 163 | display: inline-block; 164 | padding: 0px; 165 | margin: 0px; 166 | text-align: center; 167 | } 168 | 169 | #logos-holder .logo { 170 | padding: 0px; 171 | margin: 0px; 172 | display: inline-block; 173 | width: 100px; 174 | height: 80px; 175 | background-size: 95%; 176 | background-repeat: no-repeat; 177 | background-position: 50% 50%; 178 | } 179 | 180 | @media (min-width: 330px) { 181 | #logos-holder { 182 | width: 320px; 183 | } 184 | 185 | #they-use-groovy { 186 | height: 1130px; 187 | } 188 | } 189 | 190 | @media (min-width: 475px) { 191 | #logos-holder { 192 | width: 420px; 193 | } 194 | 195 | #they-use-groovy { 196 | height: 900px; 197 | } 198 | } 199 | 200 | @media (min-width: 690px) { 201 | #logos-holder { 202 | width: 630px; 203 | } 204 | 205 | #they-use-groovy { 206 | height: 600px; 207 | } 208 | } 209 | 210 | @media (min-width: 1010px) { 211 | #logos-holder { 212 | width: 940px; 213 | } 214 | 215 | #they-use-groovy { 216 | height: 450px; 217 | } 218 | } 219 | 220 | .centered { 221 | text-align: center; 222 | } 223 | 224 | .event-img { 225 | margin: -20px -20px 20px -20px; 226 | background-repeat: no-repeat; 227 | background-position: 50% top; 228 | height: 180px; 229 | } 230 | 231 | .event-logo { 232 | height: 180px; 233 | float: right; 234 | } 235 | 236 | @media (max-width: 1010px) { 237 | .event-logo { 238 | height: ; 239 | } 240 | 241 | } 242 | 243 | @media (max-width: 690px) { 244 | .event-logo { 245 | height: 60px; 246 | }} 247 | 248 | @media (max-width: 475px) { 249 | .event-logo { 250 | display: none; 251 | } 252 | } 253 | 254 | article .content time { 255 | font-weight: bold; 256 | } 257 | 258 | .doc-embed { 259 | border: 0; 260 | width: 100%; 261 | min-height: 100%; 262 | } 263 | 264 | .download-table { 265 | width: 100%; 266 | text-align: center; 267 | } 268 | 269 | .download-table td { 270 | width: 20%; 271 | } 272 | 273 | #mc-embedded-subscribe { 274 | width: 200px; 275 | font-weight: bold; 276 | } 277 | 278 | #mc-embedded-subscribe:hover { 279 | background-color: #F2F2F2; 280 | font-weight: bold; 281 | } 282 | 283 | #footer .colset-3-footer .col-1 h1, #footer .colset-3-footer .col-2 h1, #footer .colset-3-footer .col-3 h1 { 284 | font-size: 15px !important; 285 | } 286 | 287 | .anchor-link:before { 288 | content: ' # '; 289 | color: lightgray; 290 | } 291 | 292 | .anchor-link:hover:before { 293 | color: orange; 294 | } 295 | 296 | code, kbd, pre, samp { 297 | font-family: "Source Code Pro", "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; 298 | } 299 | 300 | #contribute-btn { 301 | position: absolute; 302 | right: 15px; 303 | } 304 | 305 | @media (max-width: 767px) { 306 | #contribute-btn { 307 | width: 100%; 308 | position: relative; 309 | margin-top: 30px; 310 | right: 0px; 311 | } 312 | 313 | #contribute-btn button { 314 | width: 100%; 315 | right: 15px; 316 | } 317 | } 318 | 319 | @media (min-width: 1200px) { 320 | #contribute-btn { 321 | top: 25px; 322 | right: 15px; 323 | } 324 | } 325 | 326 | #big-download-button { 327 | float: right; 328 | font-size: 30px; 329 | padding: 15px; 330 | margin: 10px 0px 10px 20px; 331 | border: 2px solid #db4800; 332 | border-radius: 6px; 333 | background-color: #db4800; 334 | color: white; 335 | } 336 | 337 | #big-download-button:hover { 338 | background-color: #e6e6e6; 339 | color: #db4800; 340 | } 341 | 342 | .colset-3-footer .col-1, .colset-3-footer .col-2, .colset-3-footer .col-3 { 343 | min-width: 180px; 344 | float: left; 345 | } 346 | 347 | .colset-3-footer .col-3 { 348 | min-width: 220px; 349 | } 350 | 351 | .colset-3-article article { 352 | float: left; 353 | } 354 | 355 | .col1, .col2 { 356 | min-width: 300px; 357 | float: left; 358 | } 359 | 360 | @media (max-width: 988px) { 361 | .col1, .col2 { 362 | width: 98% !important; 363 | max-width: 98%; 364 | } 365 | 366 | .colset-3-article article { 367 | width: 98% !important; 368 | max-width: 98%; 369 | } 370 | } 371 | 372 | body, html { 373 | font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; 374 | padding: 0; 375 | margin: 0; 376 | background: #FFF; 377 | color: #343437; 378 | line-height: 25px; 379 | font-weight: normal; 380 | font-size: 14px; 381 | } 382 | 383 | a { 384 | color: #db4800; 385 | text-decoration: underline; 386 | } 387 | 388 | a:hover { 389 | color: #db4800; 390 | text-decoration: none 391 | } 392 | 393 | h1 { 394 | font-size: 2.125em; 395 | margin: .67em 0 396 | } 397 | 398 | h2 { 399 | font-size: 1.6875em; 400 | font-weight: bold; 401 | } 402 | 403 | h3, #toctitle, .sidebarblock > .content > .title { 404 | font-size: 1.375em; 405 | font-weight: bold; 406 | } 407 | 408 | h4 { 409 | font-size: 1.125em; 410 | font-weight: bold; 411 | } 412 | 413 | h5 { 414 | font-size: 1.125em; 415 | font-weight: bold; 416 | color: #db4800; 417 | } 418 | 419 | h6 { 420 | font-size: 1.08em; 421 | font-weight: normal; 422 | color: #db4800; 423 | } 424 | 425 | h7 { 426 | font-weight: bold; 427 | color: #245f78; 428 | } 429 | 430 | h8 { 431 | color: #245f78; 432 | } 433 | 434 | #footer { 435 | background: #f2f2f2; 436 | text-align: center; 437 | font-size: 14px; 438 | padding: 20px 0 30px; 439 | margin-top: 30px; 440 | color: #AAA 441 | } 442 | 443 | #footer .col-right { 444 | float: right; 445 | width: 300px; 446 | text-align: right; 447 | padding-top: 10px 448 | } 449 | 450 | #footer .colset-3-footer { 451 | color: #222; 452 | font-size: 14px 453 | } 454 | 455 | #footer .colset-3-footer:before, #footer .colset-3-footer:after { 456 | content: " "; 457 | display: table 458 | } 459 | 460 | #footer .colset-3-footer:after { 461 | clear: both 462 | } 463 | 464 | #footer .colset-3-footer .col-1, #footer .colset-3-footer .col-2, #footer .colset-3-footer .col-3 { 465 | width: 18%; 466 | padding: 20px 0 30px; 467 | padding-right: 3%; 468 | float: left; 469 | text-align: left 470 | } 471 | 472 | #footer .colset-3-footer .col-3 { 473 | width: 24%; 474 | } 475 | 476 | #footer .colset-3-footer .col-1 h1, #footer .colset-3-footer .col-2 h1, #footer .colset-3-footer .col-3 h1 { 477 | font-weight: 600; 478 | font-size: 15px; 479 | line-height: 30px; 480 | margin: 0 481 | } 482 | 483 | #footer .colset-3-footer .col-1 ul, #footer .colset-3-footer .col-2 ul, #footer .colset-3-footer .col-3 ul { 484 | list-style-type: none; 485 | margin: 0; 486 | padding: 0 487 | } 488 | 489 | #footer .colset-3-footer .col-1 ul li, #footer .colset-3-footer .col-2 ul li, #footer .colset-3-footer .col-3 ul li { 490 | margin: 0; 491 | padding: 0 492 | } 493 | 494 | #footer .colset-3-footer .col-1 ul li a, #footer .colset-3-footer .col-2 ul li a, #footer .colset-3-footer .col-3 ul li a { 495 | color: #343437; 496 | text-decoration: none 497 | } 498 | 499 | #footer .colset-3-footer .col-1 ul li a:hover, #footer .colset-3-footer .col-2 ul li a:hover, #footer .colset-3-footer .col-3 ul li a:hover { 500 | text-decoration: underline 501 | } 502 | 503 | #footer .second a { 504 | color: #db4800 505 | } 506 | 507 | .row { 508 | position: relative; 509 | max-width: 1400px; 510 | margin: 0 auto; 511 | padding: 0 5% 512 | } 513 | 514 | .row:before, .row:after { 515 | content: " "; 516 | display: table 517 | } 518 | 519 | .row:after { 520 | clear: both 521 | } 522 | 523 | .band { 524 | background: #4298b8; 525 | height: 400px; 526 | margin-bottom: 20px; 527 | color: white 528 | } 529 | 530 | .band .item { 531 | text-align: center 532 | } 533 | 534 | .band .item:before, .band .item:after { 535 | content: " "; 536 | display: table 537 | } 538 | 539 | .band .item:after { 540 | clear: both 541 | } 542 | 543 | #content { 544 | background: white 545 | } 546 | 547 | #content .row:before, #content .row:after { 548 | content: " "; 549 | display: table 550 | } 551 | 552 | #content .row:after { 553 | clear: both 554 | } 555 | 556 | #content .row > h1 { 557 | font-size: 34px; 558 | line-height: 40px; 559 | font-weight: 200; 560 | text-align: center; 561 | margin: 0; 562 | padding: 20px 0 563 | } 564 | 565 | #content hr.row, #content hr.divider { 566 | border: 0 none; 567 | border-top: 1px solid #EEE; 568 | margin: 0 5%; 569 | margin-top: 40px 570 | } 571 | 572 | #content hr.divider { 573 | margin: 0; 574 | margin-top: 40px; 575 | margin-bottom: 30px 576 | } 577 | 578 | #content .colset-2-its:before, #content .colset-2-its:after { 579 | content: " "; 580 | display: table 581 | } 582 | 583 | #content .colset-2-its:after { 584 | clear: both 585 | } 586 | 587 | #content .colset-2-its > h1 { 588 | padding-bottom: 15px; 589 | margin-top: 15px; 590 | margin-bottom: 0 591 | } 592 | 593 | #content .colset-2-its > p { 594 | margin-top: 0; 595 | padding-bottom: 5px; 596 | text-align: center; 597 | color: #222; 598 | font-size: 15px 599 | } 600 | 601 | #content .colset-2-its .col1, #content .colset-2-its .col2 { 602 | float: left; 603 | width: 48%; 604 | padding-right: 1%; 605 | padding-left: 1%; 606 | } 607 | 608 | #content .colset-2-its .col2 { 609 | padding-left: 1%; 610 | padding-right: 1%; 611 | } 612 | 613 | #content .colset-2-its article { 614 | padding: 10px 0 615 | } 616 | 617 | #content .colset-2-its article:before, #content .colset-2-its article:after { 618 | content: " "; 619 | display: table 620 | } 621 | 622 | #content .colset-2-its article:after { 623 | clear: both 624 | } 625 | 626 | #content .colset-2-its article .icon { 627 | display: block; 628 | width: 80px; 629 | height: 80px; 630 | background-image: url(../img/icons-colset-2-its.png); 631 | float: left; 632 | margin-top: 12px; 633 | margin-right: 15px 634 | } 635 | 636 | #content .colset-2-its article .icon.icon-1 { 637 | background-position: 0 0 638 | } 639 | 640 | #content .colset-2-its article .icon.icon-2 { 641 | background-position: 0 -80px 642 | } 643 | 644 | #content .colset-2-its article .icon.icon-3 { 645 | background-position: 0 -160px 646 | } 647 | 648 | #content .colset-2-its article .icon.icon-4 { 649 | background-position: 0 -240px 650 | } 651 | 652 | #content .colset-2-its article .icon.icon-5 { 653 | background-position: 0 -320px 654 | } 655 | 656 | #content .colset-2-its article .icon.icon-6 { 657 | background-position: 0 -400px 658 | } 659 | 660 | #content .colset-2-its article > h1 { 661 | font-size: 19px; 662 | font-weight: 600; 663 | margin-bottom: 0; 664 | line-height: 30px 665 | } 666 | 667 | #content .colset-2-its article p { 668 | margin: 0; 669 | line-height: 24px; 670 | font-size: 14px 671 | } 672 | 673 | #content .first-event-row { 674 | padding-top: 30px; 675 | } 676 | 677 | #content .last-event-row { 678 | padding-bottom: 30px 679 | } 680 | 681 | #content .colset-3-article > h1 { 682 | font-size: 24px 683 | } 684 | 685 | #content .colset-3-article div.content { 686 | padding: 20px; 687 | padding-bottom: 5px 688 | } 689 | 690 | #content .colset-3-article article { 691 | float: left; 692 | width: 29%; 693 | margin: 10px 2%; 694 | -webkit-box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); 695 | box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1) 696 | } 697 | 698 | #content .colset-3-article article .img { 699 | margin: -20px -20px 20px -20px; 700 | background-position: center top; 701 | height: 180px 702 | } 703 | 704 | #content .colset-3-article article h1 { 705 | margin: 0; 706 | font-size: 18px; 707 | font-weight: normal; 708 | line-height: 25px 709 | } 710 | 711 | #content .colset-3-article article h1 a { 712 | color: #343437; 713 | cursor: pointer 714 | } 715 | 716 | #content .colset-3-article article h1 a:hover { 717 | color: #46a5c8 718 | } 719 | 720 | #content .colset-3-article article p, #content .colset-3-article article time { 721 | font-size: 13px 722 | } 723 | 724 | #content .colset-3-article article .author a { 725 | color: #db4800 726 | } 727 | 728 | #content .colset-3-article article:first-child { 729 | padding-left: 0 730 | } 731 | 732 | #content .colset-3-article article:last-child { 733 | padding-right: 0 734 | } 735 | 736 | #content.page-1 .row { 737 | padding-top: 10px; 738 | padding-bottom: 10px 739 | } 740 | 741 | #content.page-1 .row h1 { 742 | text-align: left; 743 | font-size: 36px 744 | } 745 | 746 | #content.page-1 .row article { 747 | font-size: 14px 748 | } 749 | 750 | #content.page-1 .row article .desc { 751 | font-size: 16px 752 | } 753 | 754 | #content.page-1 .row article h1 { 755 | margin: 0; 756 | paddnig: 0; 757 | text-align: left; 758 | font-size: 26px 759 | } 760 | 761 | #content.page-1 .row article h2 { 762 | margin: 0; 763 | paddnig: 0 764 | } 765 | 766 | #content.page-1 .row article h3 { 767 | font-weight: bold 768 | } 769 | 770 | #content.page-1 .row article pre { 771 | display: block; 772 | background: #f2f2f2; 773 | padding: 12px 20px 774 | } 775 | 776 | ul.nav-sidebar { 777 | margin: 0; 778 | margin-top: 20px; 779 | padding: 5px 0; 780 | border: 1px solid #EEE; 781 | list-style-type: none 782 | } 783 | 784 | ul.nav-sidebar li a { 785 | display: block; 786 | cursor: pointer; 787 | padding: 5px 10px; 788 | font-weight: 400; 789 | text-decoration: none; 790 | color: #343437 791 | } 792 | 793 | ul.nav-sidebar li.active a:hover, ul.nav-sidebar li a:hover { 794 | color: white; 795 | background-color: #db4800; 796 | } 797 | 798 | ul.nav-sidebar li.active a { 799 | background-color: #f2f2f2 800 | } 801 | 802 | .table { 803 | margin: 20px 0 804 | } 805 | 806 | .table thead tr th { 807 | padding: 10px; 808 | font-weight: normal; 809 | font-size: 18px 810 | } 811 | 812 | .table tbody tr td { 813 | vertical-align: top; 814 | font-size: 12px; 815 | padding: 10px; 816 | border-top: 1px solid #EEE 817 | } 818 | 819 | *, *:after, *::before { 820 | -moz-box-sizing: border-box; 821 | box-sizing: border-box 822 | } 823 | 824 | body { 825 | background: #444 826 | } 827 | 828 | html.noScroll { 829 | overflow: hidden 830 | } 831 | 832 | html.noScroll body, html.noScroll .st-container, html.noScroll .st-pusher, html.noScroll .st-content { 833 | overflow: hidden 834 | } 835 | 836 | html, body, .st-container, .st-pusher, .st-content { 837 | overflow: auto 838 | } 839 | 840 | .sign-in-fa-icon:before { 841 | font-family: FontAwesome; 842 | content: '\f090'; 843 | padding-right: 10px; 844 | } 845 | 846 | #st-container { 847 | height: 100%; 848 | } 849 | 850 | .st-content { 851 | background: white 852 | } 853 | 854 | .st-content, .st-content-inner { 855 | position: relative; 856 | height: 100%; 857 | } 858 | 859 | .st-container { 860 | position: relative; 861 | overflow: hidden 862 | } 863 | 864 | .st-pusher { 865 | position: relative; 866 | left: 0; 867 | z-index: 99; 868 | height: 100%; 869 | -webkit-transition: -webkit-transform .5s; 870 | transition: transform .5s 871 | } 872 | 873 | .st-pusher::after { 874 | position: absolute; 875 | top: 0; 876 | right: 0; 877 | width: 0; 878 | height: 0; 879 | background: rgba(0, 0, 0, 0.3); 880 | content: ''; 881 | opacity: 0; 882 | -webkit-transition: opacity .5s, width .1s .5s, height .1s .5s; 883 | transition: opacity .5s, width .1s .5s, height .1s .5s 884 | } 885 | 886 | .st-menu-open .st-pusher::after { 887 | width: 100%; 888 | height: 100%; 889 | opacity: 1; 890 | -webkit-transition: opacity .5s; 891 | transition: opacity .5s 892 | } 893 | 894 | .st-menu { 895 | position: fixed; 896 | top: 0; 897 | left: auto; 898 | z-index: 100; 899 | visibility: hidden; 900 | width: 300px; 901 | height: 100%; 902 | background: #79B94C; 903 | -webkit-transition: all .5s; 904 | transition: all .5s; 905 | right: -600px 906 | } 907 | 908 | .st-menu::after { 909 | position: absolute; 910 | top: 0; 911 | right: 0; 912 | width: 100%; 913 | height: 100%; 914 | background: rgba(0, 0, 0, 0.2); 915 | content: ''; 916 | opacity: 1; 917 | -webkit-transition: opacity .5s; 918 | transition: opacity .5s 919 | } 920 | 921 | .st-menu-open .st-menu::after { 922 | width: 0; 923 | height: 0; 924 | opacity: 0; 925 | -webkit-transition: opacity .5s, width .1s .5s, height .1s .5s; 926 | transition: opacity .5s, width .1s .5s, height .1s .5s 927 | } 928 | 929 | .st-menu ul { 930 | margin: 0; 931 | padding: 0; 932 | list-style: none 933 | } 934 | 935 | .st-menu h2 { 936 | margin: 0; 937 | padding: 1em; 938 | color: white; 939 | text-shadow: 0 0 1px rgba(0, 0, 0, 0.1); 940 | font-weight: 300; 941 | font-size: 2em 942 | } 943 | 944 | .st-menu ul li { 945 | display: block 946 | } 947 | 948 | .st-menu ul li a { 949 | display: block; 950 | position: relative; 951 | padding: 1em 1em 1em 45px; 952 | outline: 0; 953 | box-shadow: inset 0 -1px rgba(0, 0, 0, 0.2); 954 | color: #f3efe0; 955 | text-shadow: 0 0 1px rgba(255, 255, 255, 0.1); 956 | letter-spacing: 1px; 957 | font-weight: 400; 958 | text-decoration: none 959 | } 960 | 961 | .st-menu ul li a span.fa { 962 | display: block; 963 | position: absolute; 964 | left: 12px; 965 | top: 17px; 966 | font-size: 20px; 967 | width: 30px; 968 | text-align: center 969 | } 970 | 971 | .st-menu ul li a span.fa.fa-tasks, .st-menu ul li a span.fa.fa-envelope { 972 | top: 18px; 973 | font-size: 18px 974 | } 975 | 976 | .st-menu ul li:first-child a { 977 | box-shadow: inset 0 -1px rgba(0, 0, 0, 0.2), inset 0 1px rgba(0, 0, 0, 0.2) 978 | } 979 | 980 | .st-menu ul li a:hover { 981 | background: rgba(0, 0, 0, 0.2); 982 | box-shadow: inset 0 -1px rgba(0, 0, 0, 0); 983 | color: #fff 984 | } 985 | 986 | .st-effect-9.st-container { 987 | -webkit-perspective: 10000px; 988 | perspective: 10000px 989 | } 990 | 991 | .st-effect-9 .st-pusher { 992 | -webkit-transform-style: preserve-3d; 993 | transform-style: preserve-3d 994 | } 995 | 996 | .st-effect-9.st-menu-open .st-pusher { 997 | -webkit-transform: translate3d(0, 0, -300px); 998 | transform: translate3d(0, 0, -300px) 999 | } 1000 | 1001 | .st-effect-9.st-menu { 1002 | right: -600px; 1003 | opacity: 1; 1004 | -webkit-transform: translate3d(-100%, 0, 0); 1005 | transform: translate3d(-100%, 0, 0) 1006 | } 1007 | 1008 | .st-effect-9.st-menu-open .st-effect-9.st-menu { 1009 | visibility: visible; 1010 | right: -300px 1011 | } 1012 | 1013 | .st-effect-9.st-menu::after { 1014 | display: none 1015 | } 1016 | 1017 | /* Video from the learn page */ 1018 | .presentations { 1019 | margin-top: 30px; 1020 | margin-bottom: 30px; 1021 | } 1022 | 1023 | .presentations img.screenshot { 1024 | float: left; 1025 | margin-right: 40px; 1026 | margin-top: 1em; 1027 | margin-bottom: 0px; 1028 | width: 300px; 1029 | height: auto; 1030 | } 1031 | 1032 | .presentations .metadata { 1033 | display: table-cell; 1034 | min-width: 328px; 1035 | } 1036 | 1037 | .presentations .title { 1038 | margin-top: 1em !important; 1039 | margin-bottom: 0.5em !important; 1040 | } 1041 | 1042 | 1043 | .presentations .speaker { 1044 | color: #245f78; 1045 | margin-bottom: 0.5em; 1046 | } 1047 | 1048 | .presentations .summary { 1049 | line-height: 1.3; 1050 | } 1051 | 1052 | .presentations .urls { 1053 | } 1054 | 1055 | @media screen and (max-width: 767px) { 1056 | .presentations .img.screenshot, .video .metadata { 1057 | float: none; 1058 | } 1059 | } 1060 | -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/main.css: -------------------------------------------------------------------------------- 1 | /* FONT STACK */ 2 | body, 3 | input, select, textarea { 4 | font-family: "Open Sans", "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; 5 | } 6 | 7 | h1, h2, h3, h4, h5, h6 { 8 | line-height: 1.1; 9 | } 10 | 11 | /* BASE LAYOUT */ 12 | 13 | html { 14 | background-color: #ddd; 15 | background-image: -moz-linear-gradient(center top, #aaa, #ddd); 16 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #aaa), color-stop(1, #ddd)); 17 | background-image: linear-gradient(top, #aaa, #ddd); 18 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr = '#aaaaaa', EndColorStr = '#dddddd'); 19 | background-repeat: no-repeat; 20 | height: 100%; 21 | /* change the box model to exclude the padding from the calculation of 100% height (IE8+) */ 22 | -webkit-box-sizing: border-box; 23 | -moz-box-sizing: border-box; 24 | box-sizing: border-box; 25 | } 26 | 27 | html.no-cssgradients { 28 | background-color: #aaa; 29 | } 30 | 31 | html * { 32 | margin: 0; 33 | } 34 | 35 | body { 36 | background: #ffffff; 37 | color: #333333; 38 | overflow-x: hidden; /* prevents box-shadow causing a horizontal scrollbar in firefox when viewport < 960px wide */ 39 | -moz-box-shadow: 0 0 0.3em #4D8618; 40 | -webkit-box-shadow: 0 0 0.3em #4D8618; 41 | box-shadow: 0 0 0.3em #4D8618; 42 | } 43 | 44 | #grailsLogo { 45 | background-color: #abbf78; 46 | } 47 | 48 | a:hover, a:active { 49 | outline: none; /* prevents outline in webkit on active links but retains it for tab focus */ 50 | } 51 | 52 | h1, h2, h3 { 53 | font-weight: normal; 54 | font-size: 1.25em; 55 | margin: 0.8em 0 0.3em 0; 56 | } 57 | 58 | ul { 59 | padding: 0; 60 | } 61 | 62 | img { 63 | border: 0; 64 | } 65 | 66 | /* GENERAL */ 67 | 68 | #grailsLogo a { 69 | display: inline-block; 70 | margin: 1em; 71 | } 72 | 73 | .content { 74 | } 75 | 76 | .content h1 { 77 | border-bottom: 1px solid #CCCCCC; 78 | margin: 0.8em 1em 0.3em; 79 | padding: 0 0.25em; 80 | } 81 | 82 | .scaffold-list h1 { 83 | border: none; 84 | } 85 | 86 | .footer { 87 | background: #48802c; 88 | color: #000; 89 | clear: both; 90 | font-size: 0.8em; 91 | margin-top: 1.5em; 92 | padding: 1em; 93 | min-height: 1em; 94 | } 95 | 96 | .footer a { 97 | color: #4D8618; 98 | } 99 | 100 | .spinner { 101 | background: url(../images/spinner.gif) 50% 50% no-repeat transparent; 102 | height: 16px; 103 | width: 16px; 104 | padding: 0.5em; 105 | position: absolute; 106 | right: 0; 107 | top: 0; 108 | text-indent: -9999px; 109 | } 110 | 111 | /* NAVIGATION MENU */ 112 | 113 | .nav { 114 | zoom: 1; 115 | } 116 | 117 | .nav ul { 118 | overflow: hidden; 119 | padding-left: 0; 120 | zoom: 1; 121 | } 122 | 123 | .nav li { 124 | display: block; 125 | float: left; 126 | list-style-type: none; 127 | margin-right: 0.5em; 128 | padding: 0; 129 | } 130 | 131 | .nav a { 132 | color: #666666; 133 | display: block; 134 | padding: 0.25em 0.7em; 135 | text-decoration: none; 136 | -moz-border-radius: 0.3em; 137 | -webkit-border-radius: 0.3em; 138 | border-radius: 0.3em; 139 | } 140 | 141 | .nav a:active, .nav a:visited { 142 | color: #666666; 143 | } 144 | 145 | .nav a:focus, .nav a:hover { 146 | background-color: #999999; 147 | color: #ffffff; 148 | outline: none; 149 | text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); 150 | } 151 | 152 | .no-borderradius .nav a:focus, .no-borderradius .nav a:hover { 153 | background-color: transparent; 154 | color: #444444; 155 | text-decoration: underline; 156 | } 157 | 158 | .nav a.home, .nav a.list, .nav a.create { 159 | background-position: 0.7em center; 160 | background-repeat: no-repeat; 161 | text-indent: 25px; 162 | } 163 | 164 | .nav a.home { 165 | background-image: url(../images/skin/house.png); 166 | } 167 | 168 | .nav a.list { 169 | background-image: url(../images/skin/database_table.png); 170 | } 171 | 172 | .nav a.create { 173 | background-image: url(../images/skin/database_add.png); 174 | } 175 | 176 | .nav li.dropdown.open ul.dropdown-menu { 177 | background-color: #4D8618; 178 | } 179 | 180 | /* CREATE/EDIT FORMS AND SHOW PAGES */ 181 | 182 | fieldset, 183 | .property-list { 184 | margin: 0.6em 1.25em 0 1.25em; 185 | padding: 0.3em 1.8em 1.25em; 186 | position: relative; 187 | zoom: 1; 188 | border: none; 189 | } 190 | 191 | .property-list .fieldcontain { 192 | list-style: none; 193 | overflow: hidden; 194 | zoom: 1; 195 | } 196 | 197 | .fieldcontain { 198 | margin-top: 1em; 199 | } 200 | 201 | .fieldcontain label, 202 | .fieldcontain .property-label { 203 | color: #666666; 204 | text-align: right; 205 | width: 25%; 206 | } 207 | 208 | .fieldcontain .property-label { 209 | float: left; 210 | } 211 | 212 | .fieldcontain .property-value { 213 | display: block; 214 | margin-left: 27%; 215 | } 216 | 217 | label { 218 | cursor: pointer; 219 | display: inline-block; 220 | margin: 0 0.25em 0 0; 221 | } 222 | 223 | input, select, textarea { 224 | background-color: #fcfcfc; 225 | border: 1px solid #cccccc; 226 | font-size: 1em; 227 | padding: 0.2em 0.4em; 228 | } 229 | 230 | select { 231 | padding: 0.2em 0.2em 0.2em 0; 232 | } 233 | 234 | select[multiple] { 235 | vertical-align: top; 236 | } 237 | 238 | textarea { 239 | width: 250px; 240 | height: 150px; 241 | overflow: auto; /* IE always renders vertical scrollbar without this */ 242 | vertical-align: top; 243 | } 244 | 245 | input[type=checkbox], input[type=radio] { 246 | background-color: transparent; 247 | border: 0; 248 | padding: 0; 249 | } 250 | 251 | input:focus, select:focus, textarea:focus { 252 | background-color: #ffffff; 253 | border: 1px solid #eeeeee; 254 | outline: 0; 255 | -moz-box-shadow: 0 0 0.5em #ffffff; 256 | -webkit-box-shadow: 0 0 0.5em #ffffff; 257 | box-shadow: 0 0 0.5em #ffffff; 258 | } 259 | 260 | .required-indicator { 261 | color: #cc0000; 262 | display: inline-block; 263 | font-weight: bold; 264 | margin-left: 0.3em; 265 | position: relative; 266 | top: 0.1em; 267 | } 268 | 269 | ul.one-to-many { 270 | display: inline-block; 271 | list-style-position: inside; 272 | vertical-align: top; 273 | } 274 | 275 | ul.one-to-many li.add { 276 | list-style-type: none; 277 | } 278 | 279 | /* EMBEDDED PROPERTIES */ 280 | 281 | fieldset.embedded { 282 | background-color: transparent; 283 | border: 1px solid #CCCCCC; 284 | margin-left: 0; 285 | margin-right: 0; 286 | padding-left: 0; 287 | padding-right: 0; 288 | -moz-box-shadow: none; 289 | -webkit-box-shadow: none; 290 | box-shadow: none; 291 | } 292 | 293 | fieldset.embedded legend { 294 | margin: 0 1em; 295 | } 296 | 297 | /* MESSAGES AND ERRORS */ 298 | 299 | .errors, 300 | .message { 301 | font-size: 0.8em; 302 | line-height: 2; 303 | margin: 1em 2em; 304 | padding: 0.25em; 305 | } 306 | 307 | .message { 308 | background: #f3f3ff; 309 | border: 1px solid #b2d1ff; 310 | color: #006dba; 311 | -moz-box-shadow: 0 0 0.25em #b2d1ff; 312 | -webkit-box-shadow: 0 0 0.25em #b2d1ff; 313 | box-shadow: 0 0 0.25em #b2d1ff; 314 | } 315 | 316 | .errors { 317 | background: #fff3f3; 318 | border: 1px solid #ffaaaa; 319 | color: #cc0000; 320 | -moz-box-shadow: 0 0 0.25em #ff8888; 321 | -webkit-box-shadow: 0 0 0.25em #ff8888; 322 | box-shadow: 0 0 0.25em #ff8888; 323 | } 324 | 325 | .errors ul, 326 | .message { 327 | padding: 0; 328 | } 329 | 330 | .errors li { 331 | list-style: none; 332 | background: transparent url(../images/skin/exclamation.png) 0.5em 50% no-repeat; 333 | text-indent: 2.2em; 334 | } 335 | 336 | .message { 337 | background: transparent url(../images/skin/information.png) 0.5em 50% no-repeat; 338 | text-indent: 2.2em; 339 | } 340 | 341 | /* form fields with errors */ 342 | 343 | .error input, .error select, .error textarea { 344 | background: #fff3f3; 345 | border-color: #ffaaaa; 346 | color: #cc0000; 347 | } 348 | 349 | .error input:focus, .error select:focus, .error textarea:focus { 350 | -moz-box-shadow: 0 0 0.5em #ffaaaa; 351 | -webkit-box-shadow: 0 0 0.5em #ffaaaa; 352 | box-shadow: 0 0 0.5em #ffaaaa; 353 | } 354 | 355 | /* same effects for browsers that support HTML5 client-side validation (these have to be specified separately or IE will ignore the entire rule) */ 356 | 357 | input:invalid, select:invalid, textarea:invalid { 358 | background: #fff3f3; 359 | border-color: #ffaaaa; 360 | color: #cc0000; 361 | } 362 | 363 | input:invalid:focus, select:invalid:focus, textarea:invalid:focus { 364 | -moz-box-shadow: 0 0 0.5em #ffaaaa; 365 | -webkit-box-shadow: 0 0 0.5em #ffaaaa; 366 | box-shadow: 0 0 0.5em #ffaaaa; 367 | } 368 | 369 | /* TABLES */ 370 | 371 | table { 372 | border-top: 1px solid #DFDFDF; 373 | border-collapse: collapse; 374 | width: 100%; 375 | margin-bottom: 1em; 376 | } 377 | 378 | tr { 379 | border: 0; 380 | } 381 | 382 | tr>td:first-child, tr>th:first-child { 383 | padding-left: 1.25em; 384 | } 385 | 386 | tr>td:last-child, tr>th:last-child { 387 | padding-right: 1.25em; 388 | } 389 | 390 | td, th { 391 | line-height: 1.5em; 392 | padding: 0.5em 0.6em; 393 | text-align: left; 394 | vertical-align: top; 395 | } 396 | 397 | th { 398 | background-color: #efefef; 399 | background-image: -moz-linear-gradient(top, #ffffff, #eaeaea); 400 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(1, #eaeaea)); 401 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr = '#ffffff', EndColorStr = '#eaeaea'); 402 | -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#eaeaea')"; 403 | color: #666666; 404 | font-weight: bold; 405 | line-height: 1.7em; 406 | padding: 0.2em 0.6em; 407 | } 408 | 409 | thead th { 410 | white-space: nowrap; 411 | } 412 | 413 | th a { 414 | display: block; 415 | text-decoration: none; 416 | } 417 | 418 | th a:link, th a:visited { 419 | color: #666666; 420 | } 421 | 422 | th a:hover, th a:focus { 423 | color: #333333; 424 | } 425 | 426 | th.sortable a { 427 | background-position: right; 428 | background-repeat: no-repeat; 429 | padding-right: 1.1em; 430 | } 431 | 432 | th.asc a { 433 | background-image: url(../images/skin/sorted_asc.gif); 434 | } 435 | 436 | th.desc a { 437 | background-image: url(../images/skin/sorted_desc.gif); 438 | } 439 | 440 | .odd { 441 | background: #f7f7f7; 442 | } 443 | 444 | .even { 445 | background: #ffffff; 446 | } 447 | 448 | th:hover, tr:hover { 449 | background: #79b94c; 450 | } 451 | 452 | /* PAGINATION */ 453 | 454 | .pagination { 455 | border-top: 0; 456 | margin: 0.8em 1em 0.3em; 457 | padding: 0.3em 0.2em; 458 | text-align: center; 459 | -moz-box-shadow: 0 0 3px 1px #AAAAAA; 460 | -webkit-box-shadow: 0 0 3px 1px #AAAAAA; 461 | box-shadow: 0 0 3px 1px #AAAAAA; 462 | background-color: #EFEFEF; 463 | } 464 | 465 | .pagination a, 466 | .pagination .currentStep { 467 | color: #666666; 468 | display: inline-block; 469 | margin: 0 0.1em; 470 | padding: 0.25em 0.7em; 471 | text-decoration: none; 472 | -moz-border-radius: 0.3em; 473 | -webkit-border-radius: 0.3em; 474 | border-radius: 0.3em; 475 | } 476 | 477 | .pagination a:hover, .pagination a:focus, 478 | .pagination .currentStep { 479 | background-color: #999999; 480 | color: #ffffff; 481 | outline: none; 482 | text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); 483 | } 484 | 485 | .no-borderradius .pagination a:hover, .no-borderradius .pagination a:focus, 486 | .no-borderradius .pagination .currentStep { 487 | background-color: transparent; 488 | color: #444444; 489 | text-decoration: underline; 490 | } 491 | 492 | /* ACTION BUTTONS */ 493 | 494 | .buttons { 495 | background-color: #efefef; 496 | overflow: hidden; 497 | padding: 0.3em; 498 | -moz-box-shadow: 0 0 3px 1px #aaaaaa; 499 | -webkit-box-shadow: 0 0 3px 1px #aaaaaa; 500 | box-shadow: 0 0 3px 1px #aaaaaa; 501 | margin: 0.1em 0 0 0; 502 | border: none; 503 | } 504 | 505 | .buttons input, 506 | .buttons a { 507 | background-color: transparent; 508 | border: 0; 509 | color: #666666; 510 | cursor: pointer; 511 | display: inline-block; 512 | margin: 0 0.25em 0; 513 | overflow: visible; 514 | padding: 0.25em 0.7em; 515 | text-decoration: none; 516 | 517 | -moz-border-radius: 0.3em; 518 | -webkit-border-radius: 0.3em; 519 | border-radius: 0.3em; 520 | } 521 | 522 | .buttons input:hover, .buttons input:focus, 523 | .buttons a:hover, .buttons a:focus { 524 | background-color: #999999; 525 | color: #ffffff; 526 | outline: none; 527 | text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); 528 | -moz-box-shadow: none; 529 | -webkit-box-shadow: none; 530 | box-shadow: none; 531 | } 532 | 533 | .no-borderradius .buttons input:hover, .no-borderradius .buttons input:focus, 534 | .no-borderradius .buttons a:hover, .no-borderradius .buttons a:focus { 535 | background-color: transparent; 536 | color: #444444; 537 | text-decoration: underline; 538 | } 539 | 540 | .buttons .delete, .buttons .edit, .buttons .save { 541 | background-position: 0.7em center; 542 | background-repeat: no-repeat; 543 | text-indent: 25px; 544 | } 545 | 546 | .buttons .delete { 547 | background-image: url(../images/skin/database_delete.png); 548 | } 549 | 550 | .buttons .edit { 551 | background-image: url(../images/skin/database_edit.png); 552 | } 553 | 554 | .buttons .save { 555 | background-image: url(../images/skin/database_save.png); 556 | } 557 | 558 | a.skip { 559 | position: absolute; 560 | left: -9999px; 561 | } 562 | 563 | .grails-logo-container { 564 | background:#79b94c no-repeat 50% 30%; 565 | margin-bottom: 20px; 566 | color: white; 567 | height:300px; 568 | text-align:center; 569 | } 570 | 571 | img.grails-logo { 572 | height:340px; 573 | margin-top:-10px; 574 | } 575 | -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/mobile.css: -------------------------------------------------------------------------------- 1 | /* Styles for mobile devices */ 2 | 3 | @media screen and (max-width: 480px) { 4 | .nav { 5 | padding: 0.5em; 6 | } 7 | 8 | .nav li { 9 | margin: 0 0.5em 0 0; 10 | padding: 0.25em; 11 | } 12 | 13 | /* Hide individual steps in pagination, just have next & previous */ 14 | .pagination .step, .pagination .currentStep { 15 | display: none; 16 | } 17 | 18 | .pagination .prevLink { 19 | float: left; 20 | } 21 | 22 | .pagination .nextLink { 23 | float: right; 24 | } 25 | 26 | /* pagination needs to wrap around floated buttons */ 27 | .pagination { 28 | overflow: hidden; 29 | } 30 | 31 | /* slightly smaller margin around content body */ 32 | fieldset, 33 | .property-list { 34 | padding: 0.3em 1em 1em; 35 | } 36 | 37 | input, textarea { 38 | width: 100%; 39 | -moz-box-sizing: border-box; 40 | -webkit-box-sizing: border-box; 41 | -ms-box-sizing: border-box; 42 | box-sizing: border-box; 43 | } 44 | 45 | select, input[type=checkbox], input[type=radio], input[type=submit], input[type=button], input[type=reset] { 46 | width: auto; 47 | } 48 | 49 | /* hide all but the first column of list tables */ 50 | .scaffold-list td:not(:first-child), 51 | .scaffold-list th:not(:first-child) { 52 | display: none; 53 | } 54 | 55 | .scaffold-list thead th { 56 | text-align: center; 57 | } 58 | 59 | /* stack form elements */ 60 | .fieldcontain { 61 | margin-top: 0.6em; 62 | } 63 | 64 | .fieldcontain label, 65 | .fieldcontain .property-label, 66 | .fieldcontain .property-value { 67 | display: block; 68 | float: none; 69 | margin: 0 0 0.25em 0; 70 | text-align: left; 71 | width: auto; 72 | } 73 | 74 | .errors ul, 75 | .message p { 76 | margin: 0.5em; 77 | } 78 | 79 | .error ul { 80 | margin-left: 0; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /grails-app/conf/application.yml: -------------------------------------------------------------------------------- 1 | --- 2 | grails: 3 | profile: web 4 | codegen: 5 | defaultPackage: pms 6 | spring: 7 | transactionManagement: 8 | proxies: false 9 | gorm: 10 | # Whether to autowire entities. 11 | # Disabled by default for performance reasons. 12 | autowire: false 13 | reactor: 14 | # Whether to translate GORM events into Reactor events 15 | # Disabled by default for performance reasons 16 | events: false 17 | info: 18 | app: 19 | name: '@info.app.name@' 20 | version: '@info.app.version@' 21 | grailsVersion: '@info.app.grailsVersion@' 22 | spring: 23 | main: 24 | banner-mode: "off" 25 | groovy: 26 | template: 27 | check-template-location: false 28 | 29 | # Spring Actuator Endpoints are Disabled by Default 30 | endpoints: 31 | enabled: false 32 | jmx: 33 | enabled: true 34 | 35 | --- 36 | grails: 37 | mime: 38 | disable: 39 | accept: 40 | header: 41 | userAgents: 42 | - Gecko 43 | - WebKit 44 | - Presto 45 | - Trident 46 | types: 47 | all: '*/*' 48 | atom: application/atom+xml 49 | css: text/css 50 | csv: text/csv 51 | form: application/x-www-form-urlencoded 52 | html: 53 | - text/html 54 | - application/xhtml+xml 55 | js: text/javascript 56 | json: 57 | - application/json 58 | - text/json 59 | multipartForm: multipart/form-data 60 | pdf: application/pdf 61 | rss: application/rss+xml 62 | text: text/plain 63 | hal: 64 | - application/hal+json 65 | - application/hal+xml 66 | xml: 67 | - text/xml 68 | - application/xml 69 | urlmapping: 70 | cache: 71 | maxsize: 1000 72 | controllers: 73 | defaultScope: singleton 74 | converters: 75 | encoding: UTF-8 76 | views: 77 | default: 78 | codec: html 79 | gsp: 80 | encoding: UTF-8 81 | htmlcodec: xml 82 | codecs: 83 | expression: html 84 | scriptlets: html 85 | taglib: none 86 | staticparts: none 87 | endpoints: 88 | jmx: 89 | unique-names: true 90 | 91 | --- 92 | hibernate: 93 | cache: 94 | queries: false 95 | use_second_level_cache: true 96 | use_query_cache: false 97 | region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory 98 | 99 | dataSource: 100 | pooled: true 101 | jmxExport: true 102 | driverClassName: org.h2.Driver 103 | username: sa 104 | password: 105 | 106 | environments: 107 | development: 108 | dataSource: 109 | dbCreate: create-drop 110 | url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 111 | test: 112 | dataSource: 113 | dbCreate: update 114 | url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 115 | production: 116 | dataSource: 117 | dbCreate: none 118 | url: jdbc:h2:./prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 119 | properties: 120 | jmxEnabled: true 121 | initialSize: 5 122 | maxActive: 50 123 | minIdle: 5 124 | maxIdle: 25 125 | maxWait: 10000 126 | maxAge: 600000 127 | timeBetweenEvictionRunsMillis: 5000 128 | minEvictableIdleTimeMillis: 60000 129 | validationQuery: SELECT 1 130 | validationQueryTimeout: 3 131 | validationInterval: 15000 132 | testOnBorrow: true 133 | testWhileIdle: true 134 | testOnReturn: false 135 | jdbcInterceptors: ConnectionState 136 | defaultTransactionIsolation: 2 # TRANSACTION_READ_COMMITTED 137 | 138 | 139 | server: 140 | port: 8008 141 | -------------------------------------------------------------------------------- /grails-app/conf/logback.groovy: -------------------------------------------------------------------------------- 1 | import grails.util.BuildSettings 2 | import grails.util.Environment 3 | import org.springframework.boot.logging.logback.ColorConverter 4 | import org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter 5 | 6 | import java.nio.charset.Charset 7 | 8 | conversionRule 'clr', ColorConverter 9 | conversionRule 'wex', WhitespaceThrowableProxyConverter 10 | 11 | // See http://logback.qos.ch/manual/groovy.html for details on configuration 12 | appender('STDOUT', ConsoleAppender) { 13 | encoder(PatternLayoutEncoder) { 14 | charset = Charset.forName('UTF-8') 15 | 16 | pattern = 17 | '%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} ' + // Date 18 | '%clr(%5p) ' + // Log level 19 | '%clr(---){faint} %clr([%15.15t]){faint} ' + // Thread 20 | '%clr(%-40.40logger{39}){cyan} %clr(:){faint} ' + // Logger 21 | '%m%n%wex' // Message 22 | } 23 | } 24 | 25 | def targetDir = BuildSettings.TARGET_DIR 26 | if (Environment.isDevelopmentMode() && targetDir != null) { 27 | appender("FULL_STACKTRACE", FileAppender) { 28 | file = "${targetDir}/stacktrace.log" 29 | append = true 30 | encoder(PatternLayoutEncoder) { 31 | pattern = "%level %logger - %msg%n" 32 | } 33 | } 34 | logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false) 35 | } 36 | root(ERROR, ['STDOUT']) 37 | -------------------------------------------------------------------------------- /grails-app/conf/spring/resources.groovy: -------------------------------------------------------------------------------- 1 | // Place your Spring DSL code here 2 | beans = { 3 | } 4 | -------------------------------------------------------------------------------- /grails-app/controllers/pms/MilestoneController.groovy: -------------------------------------------------------------------------------- 1 | package pms 2 | 3 | import static org.springframework.http.HttpStatus.* 4 | import grails.transaction.Transactional 5 | 6 | @Transactional(readOnly = true) 7 | class MilestoneController { 8 | 9 | static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 10 | 11 | def index(Integer max) { 12 | params.max = Math.min(max ?: 10, 100) 13 | respond Milestone.list(params), model:[milestoneCount: Milestone.count()] 14 | } 15 | 16 | def show(Milestone milestone) { 17 | respond milestone 18 | } 19 | 20 | def create() { 21 | respond new Milestone(params) 22 | } 23 | 24 | @Transactional 25 | def save(Milestone milestone) { 26 | if (milestone == null) { 27 | transactionStatus.setRollbackOnly() 28 | notFound() 29 | return 30 | } 31 | 32 | if (milestone.hasErrors()) { 33 | transactionStatus.setRollbackOnly() 34 | respond milestone.errors, view:'create' 35 | return 36 | } 37 | 38 | milestone.save flush:true 39 | 40 | request.withFormat { 41 | form multipartForm { 42 | flash.message = message(code: 'default.created.message', args: [message(code: 'milestone.label', default: 'Milestone'), milestone.id]) 43 | redirect milestone 44 | } 45 | '*' { respond milestone, [status: CREATED] } 46 | } 47 | } 48 | 49 | def edit(Milestone milestone) { 50 | respond milestone 51 | } 52 | 53 | @Transactional 54 | def update(Milestone milestone) { 55 | if (milestone == null) { 56 | transactionStatus.setRollbackOnly() 57 | notFound() 58 | return 59 | } 60 | 61 | if (milestone.hasErrors()) { 62 | transactionStatus.setRollbackOnly() 63 | respond milestone.errors, view:'edit' 64 | return 65 | } 66 | 67 | milestone.save flush:true 68 | 69 | request.withFormat { 70 | form multipartForm { 71 | flash.message = message(code: 'default.updated.message', args: [message(code: 'milestone.label', default: 'Milestone'), milestone.id]) 72 | redirect milestone 73 | } 74 | '*'{ respond milestone, [status: OK] } 75 | } 76 | } 77 | 78 | @Transactional 79 | def delete(Milestone milestone) { 80 | 81 | if (milestone == null) { 82 | transactionStatus.setRollbackOnly() 83 | notFound() 84 | return 85 | } 86 | 87 | milestone.delete flush:true 88 | 89 | request.withFormat { 90 | form multipartForm { 91 | flash.message = message(code: 'default.deleted.message', args: [message(code: 'milestone.label', default: 'Milestone'), milestone.id]) 92 | redirect action:"index", method:"GET" 93 | } 94 | '*'{ render status: NO_CONTENT } 95 | } 96 | } 97 | 98 | protected void notFound() { 99 | request.withFormat { 100 | form multipartForm { 101 | flash.message = message(code: 'default.not.found.message', args: [message(code: 'milestone.label', default: 'Milestone'), params.id]) 102 | redirect action: "index", method: "GET" 103 | } 104 | '*'{ render status: NOT_FOUND } 105 | } 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /grails-app/controllers/pms/ProjectController.groovy: -------------------------------------------------------------------------------- 1 | package pms 2 | 3 | import static org.springframework.http.HttpStatus.* 4 | import grails.transaction.Transactional 5 | 6 | @Transactional(readOnly = true) 7 | class ProjectController { 8 | 9 | static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 10 | 11 | def index(Integer max) { 12 | params.max = Math.min(max ?: 10, 100) 13 | respond Project.list(params), model:[projectCount: Project.count()] 14 | } 15 | 16 | def show(Project project) { 17 | respond project 18 | } 19 | 20 | def create() { 21 | respond new Project(params) 22 | } 23 | 24 | @Transactional 25 | def save(Project project) { 26 | if (project == null) { 27 | transactionStatus.setRollbackOnly() 28 | notFound() 29 | return 30 | } 31 | 32 | if (project.hasErrors()) { 33 | transactionStatus.setRollbackOnly() 34 | respond project.errors, view:'create' 35 | return 36 | } 37 | 38 | project.save flush:true 39 | 40 | request.withFormat { 41 | form multipartForm { 42 | flash.message = message(code: 'default.created.message', args: [message(code: 'project.label', default: 'Project'), project.id]) 43 | redirect project 44 | } 45 | '*' { respond project, [status: CREATED] } 46 | } 47 | } 48 | 49 | def edit(Project project) { 50 | respond project 51 | } 52 | 53 | @Transactional 54 | def update(Project project) { 55 | if (project == null) { 56 | transactionStatus.setRollbackOnly() 57 | notFound() 58 | return 59 | } 60 | 61 | if (project.hasErrors()) { 62 | transactionStatus.setRollbackOnly() 63 | respond project.errors, view:'edit' 64 | return 65 | } 66 | 67 | project.save flush:true 68 | 69 | request.withFormat { 70 | form multipartForm { 71 | flash.message = message(code: 'default.updated.message', args: [message(code: 'project.label', default: 'Project'), project.id]) 72 | redirect project 73 | } 74 | '*'{ respond project, [status: OK] } 75 | } 76 | } 77 | 78 | @Transactional 79 | def delete(Project project) { 80 | 81 | if (project == null) { 82 | transactionStatus.setRollbackOnly() 83 | notFound() 84 | return 85 | } 86 | 87 | project.delete flush:true 88 | 89 | request.withFormat { 90 | form multipartForm { 91 | flash.message = message(code: 'default.deleted.message', args: [message(code: 'project.label', default: 'Project'), project.id]) 92 | redirect action:"index", method:"GET" 93 | } 94 | '*'{ render status: NO_CONTENT } 95 | } 96 | } 97 | 98 | protected void notFound() { 99 | request.withFormat { 100 | form multipartForm { 101 | flash.message = message(code: 'default.not.found.message', args: [message(code: 'project.label', default: 'Project'), params.id]) 102 | redirect action: "index", method: "GET" 103 | } 104 | '*'{ render status: NOT_FOUND } 105 | } 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /grails-app/controllers/pms/UrlMappings.groovy: -------------------------------------------------------------------------------- 1 | package pms 2 | 3 | class UrlMappings { 4 | 5 | static mappings = { 6 | "/$controller/$action?/$id?(.$format)?"{ 7 | constraints { 8 | // apply constraints here 9 | } 10 | } 11 | 12 | "/"(view:"/index") 13 | "500"(view:'/error') 14 | "404"(view:'/notFound') 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /grails-app/domain/pms/Milestone.groovy: -------------------------------------------------------------------------------- 1 | package pms 2 | 3 | class Milestone { 4 | 5 | static constraints = { 6 | } 7 | 8 | Integer id 9 | Integer projectId 10 | String name 11 | String owner 12 | Date expectDate 13 | Date actualDate 14 | String status 15 | 16 | } 17 | -------------------------------------------------------------------------------- /grails-app/domain/pms/Project.groovy: -------------------------------------------------------------------------------- 1 | package pms 2 | 3 | class Project { 4 | 5 | static constraints = { 6 | } 7 | 8 | Integer id 9 | String name 10 | String owner 11 | Date startDate 12 | Date endDate 13 | String status 14 | } 15 | -------------------------------------------------------------------------------- /grails-app/i18n/messages.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Property [{0}] of class [{1}] with value [{2}] does not match the required pattern [{3}] 2 | default.invalid.url.message=Property [{0}] of class [{1}] with value [{2}] is not a valid URL 3 | default.invalid.creditCard.message=Property [{0}] of class [{1}] with value [{2}] is not a valid credit card number 4 | default.invalid.email.message=Property [{0}] of class [{1}] with value [{2}] is not a valid e-mail address 5 | default.invalid.range.message=Property [{0}] of class [{1}] with value [{2}] does not fall within the valid range from [{3}] to [{4}] 6 | default.invalid.size.message=Property [{0}] of class [{1}] with value [{2}] does not fall within the valid size range from [{3}] to [{4}] 7 | default.invalid.max.message=Property [{0}] of class [{1}] with value [{2}] exceeds maximum value [{3}] 8 | default.invalid.min.message=Property [{0}] of class [{1}] with value [{2}] is less than minimum value [{3}] 9 | default.invalid.max.size.message=Property [{0}] of class [{1}] with value [{2}] exceeds the maximum size of [{3}] 10 | default.invalid.min.size.message=Property [{0}] of class [{1}] with value [{2}] is less than the minimum size of [{3}] 11 | default.invalid.validator.message=Property [{0}] of class [{1}] with value [{2}] does not pass custom validation 12 | default.not.inlist.message=Property [{0}] of class [{1}] with value [{2}] is not contained within the list [{3}] 13 | default.blank.message=Property [{0}] of class [{1}] cannot be blank 14 | default.not.equal.message=Property [{0}] of class [{1}] with value [{2}] cannot equal [{3}] 15 | default.null.message=Property [{0}] of class [{1}] cannot be null 16 | default.not.unique.message=Property [{0}] of class [{1}] with value [{2}] must be unique 17 | 18 | default.paginate.prev=Previous 19 | default.paginate.next=Next 20 | default.boolean.true=True 21 | default.boolean.false=False 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} created 26 | default.updated.message={0} {1} updated 27 | default.deleted.message={0} {1} deleted 28 | default.not.deleted.message={0} {1} could not be deleted 29 | default.not.found.message={0} not found with id {1} 30 | default.optimistic.locking.failure=Another user has updated this {0} while you were editing 31 | 32 | default.home.label=Home 33 | default.list.label={0} List 34 | default.add.label=Add {0} 35 | default.new.label=New {0} 36 | default.create.label=Create {0} 37 | default.show.label=Show {0} 38 | default.edit.label=Edit {0} 39 | 40 | default.button.create.label=Create 41 | default.button.edit.label=Edit 42 | default.button.update.label=Update 43 | default.button.delete.label=Delete 44 | default.button.delete.confirm.message=Are you sure? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Property {0} must be a valid URL 48 | typeMismatch.java.net.URI=Property {0} must be a valid URI 49 | typeMismatch.java.util.Date=Property {0} must be a valid Date 50 | typeMismatch.java.lang.Double=Property {0} must be a valid number 51 | typeMismatch.java.lang.Integer=Property {0} must be a valid number 52 | typeMismatch.java.lang.Long=Property {0} must be a valid number 53 | typeMismatch.java.lang.Short=Property {0} must be a valid number 54 | typeMismatch.java.math.BigDecimal=Property {0} must be a valid number 55 | typeMismatch.java.math.BigInteger=Property {0} must be a valid number 56 | typeMismatch=Property {0} is type-mismatched 57 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_cs_CZ.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neodpovídá požadovanému vzoru [{3}] 2 | default.invalid.url.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní URL 3 | default.invalid.creditCard.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní číslo kreditní karty 4 | default.invalid.email.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní emailová adresa 5 | default.invalid.range.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}] 6 | default.invalid.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}] 7 | default.invalid.max.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální povolenou hodnotu [{3}] 8 | default.invalid.min.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální povolená hodnota [{3}] 9 | default.invalid.max.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální velikost [{3}] 10 | default.invalid.min.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální velikost [{3}] 11 | default.invalid.validator.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neprošla validací 12 | default.not.inlist.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není obsažena v seznamu [{3}] 13 | default.blank.message=Položka [{0}] třídy [{1}] nemůže být prázdná 14 | default.not.equal.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] nemůže být stejná jako [{3}] 15 | default.null.message=Položka [{0}] třídy [{1}] nemůže být prázdná 16 | default.not.unique.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] musí být unikátní 17 | 18 | default.paginate.prev=Předcházející 19 | default.paginate.next=Následující 20 | default.boolean.true=Pravda 21 | default.boolean.false=Nepravda 22 | default.date.format=dd. MM. yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} vytvořeno 26 | default.updated.message={0} {1} aktualizováno 27 | default.deleted.message={0} {1} smazáno 28 | default.not.deleted.message={0} {1} nelze smazat 29 | default.not.found.message={0} nenalezen s id {1} 30 | default.optimistic.locking.failure=Jiný uživatel aktualizoval záznam {0}, právě když byl vámi editován 31 | 32 | default.home.label=Domů 33 | default.list.label={0} Seznam 34 | default.add.label=Přidat {0} 35 | default.new.label=Nový {0} 36 | default.create.label=Vytvořit {0} 37 | default.show.label=Ukázat {0} 38 | default.edit.label=Editovat {0} 39 | 40 | default.button.create.label=Vytvoř 41 | default.button.edit.label=Edituj 42 | default.button.update.label=Aktualizuj 43 | default.button.delete.label=Smaž 44 | default.button.delete.confirm.message=Jste si jistý? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Položka {0} musí být validní URL 48 | typeMismatch.java.net.URI=Položka {0} musí být validní URI 49 | typeMismatch.java.util.Date=Položka {0} musí být validní datum 50 | typeMismatch.java.lang.Double=Položka {0} musí být validní desetinné číslo 51 | typeMismatch.java.lang.Integer=Položka {0} musí být validní číslo 52 | typeMismatch.java.lang.Long=Položka {0} musí být validní číslo 53 | typeMismatch.java.lang.Short=Položka {0} musí být validní číslo 54 | typeMismatch.java.math.BigDecimal=Položka {0} musí být validní číslo 55 | typeMismatch.java.math.BigInteger=Položka {0} musí být validní číslo 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_da.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke mønsteret [{3}] 2 | default.invalid.url.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig URL 3 | default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke et gyldigt kreditkortnummer 4 | default.invalid.email.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig e-mail adresse 5 | default.invalid.range.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for intervallet fra [{3}] til [{4}] 6 | default.invalid.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for størrelsen fra [{3}] til [{4}] 7 | default.invalid.max.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale værdi [{3}] 8 | default.invalid.min.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale værdi [{3}] 9 | default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale størrelse på [{3}] 10 | default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale størrelse på [{3}] 11 | default.invalid.validator.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke den brugerdefinerede validering 12 | default.not.inlist.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] findes ikke i listen [{3}] 13 | default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom 14 | default.not.equal.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] må ikke være [{3}] 15 | default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null 16 | default.not.unique.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] skal være unik 17 | 18 | default.paginate.prev=Forrige 19 | default.paginate.next=Næste 20 | default.boolean.true=Sand 21 | default.boolean.false=Falsk 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} oprettet 26 | default.updated.message={0} {1} opdateret 27 | default.deleted.message={0} {1} slettet 28 | default.not.deleted.message={0} {1} kunne ikke slettes 29 | default.not.found.message={0} med id {1} er ikke fundet 30 | default.optimistic.locking.failure=En anden bruger har opdateret denne {0} imens du har lavet rettelser 31 | 32 | default.home.label=Hjem 33 | default.list.label={0} Liste 34 | default.add.label=Tilføj {0} 35 | default.new.label=Ny {0} 36 | default.create.label=Opret {0} 37 | default.show.label=Vis {0} 38 | default.edit.label=Ret {0} 39 | 40 | default.button.create.label=Opret 41 | default.button.edit.label=Ret 42 | default.button.update.label=Opdater 43 | default.button.delete.label=Slet 44 | default.button.delete.confirm.message=Er du sikker? 45 | 46 | # Databindingsfejl. Brug "typeMismatch.$className.$propertyName for at passe til en given klasse (f.eks typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Feltet {0} skal være en valid URL 48 | typeMismatch.java.net.URI=Feltet {0} skal være en valid URI 49 | typeMismatch.java.util.Date=Feltet {0} skal være en valid Dato 50 | typeMismatch.java.lang.Double=Feltet {0} skal være et valid tal 51 | typeMismatch.java.lang.Integer=Feltet {0} skal være et valid tal 52 | typeMismatch.java.lang.Long=Feltet {0} skal være et valid tal 53 | typeMismatch.java.lang.Short=Feltet {0} skal være et valid tal 54 | typeMismatch.java.math.BigDecimal=Feltet {0} skal være et valid tal 55 | typeMismatch.java.math.BigInteger=Feltet {0} skal være et valid tal 56 | 57 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_de.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] entspricht nicht dem vorgegebenen Muster [{3}] 2 | default.invalid.url.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige URL 3 | default.invalid.creditCard.message=Das Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige Kreditkartennummer 4 | default.invalid.email.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige E-Mail Adresse 5 | default.invalid.range.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] 6 | default.invalid.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] 7 | default.invalid.max.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist größer als der Höchstwert von [{3}] 8 | default.invalid.min.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist kleiner als der Mindestwert von [{3}] 9 | default.invalid.max.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] übersteigt den Höchstwert von [{3}] 10 | default.invalid.min.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] unterschreitet den Mindestwert von [{3}] 11 | default.invalid.validator.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist ungültig 12 | default.not.inlist.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht in der Liste [{3}] enthalten. 13 | default.blank.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht leer sein 14 | default.not.equal.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nicht gleich [{3}] sein 15 | default.null.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht null sein 16 | default.not.unique.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nur einmal vorkommen 17 | 18 | default.paginate.prev=Vorherige 19 | default.paginate.next=Nächste 20 | default.boolean.true=Wahr 21 | default.boolean.false=Falsch 22 | default.date.format=dd.MM.yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} wurde angelegt 26 | default.updated.message={0} {1} wurde geändert 27 | default.deleted.message={0} {1} wurde gelöscht 28 | default.not.deleted.message={0} {1} konnte nicht gelöscht werden 29 | default.not.found.message={0} mit der id {1} wurde nicht gefunden 30 | default.optimistic.locking.failure=Ein anderer Benutzer hat das {0} Object geändert während Sie es bearbeitet haben 31 | 32 | default.home.label=Home 33 | default.list.label={0} Liste 34 | default.add.label={0} hinzufügen 35 | default.new.label={0} anlegen 36 | default.create.label={0} anlegen 37 | default.show.label={0} anzeigen 38 | default.edit.label={0} bearbeiten 39 | 40 | default.button.create.label=Anlegen 41 | default.button.edit.label=Bearbeiten 42 | default.button.update.label=Aktualisieren 43 | default.button.delete.label=Löschen 44 | default.button.delete.confirm.message=Sind Sie sicher? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Die Eigenschaft {0} muss eine gültige URL sein 48 | typeMismatch.java.net.URI=Die Eigenschaft {0} muss eine gültige URI sein 49 | typeMismatch.java.util.Date=Die Eigenschaft {0} muss ein gültiges Datum sein 50 | typeMismatch.java.lang.Double=Die Eigenschaft {0} muss eine gültige Zahl sein 51 | typeMismatch.java.lang.Integer=Die Eigenschaft {0} muss eine gültige Zahl sein 52 | typeMismatch.java.lang.Long=Die Eigenschaft {0} muss eine gültige Zahl sein 53 | typeMismatch.java.lang.Short=Die Eigenschaft {0} muss eine gültige Zahl sein 54 | typeMismatch.java.math.BigDecimal=Die Eigenschaft {0} muss eine gültige Zahl sein 55 | typeMismatch.java.math.BigInteger=Die Eigenschaft {0} muss eine gültige Zahl sein 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_es.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no corresponde al patrón [{3}] 2 | default.invalid.url.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una URL válida 3 | default.invalid.creditCard.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es un número de tarjeta de crédito válida 4 | default.invalid.email.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una dirección de correo electrónico válida 5 | default.invalid.range.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el rango válido de [{3}] a [{4}] 6 | default.invalid.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el tamaño válido de [{3}] a [{4}] 7 | default.invalid.max.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el valor máximo [{3}] 8 | default.invalid.min.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menos que el valor mínimo [{3}] 9 | default.invalid.max.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el tamaño máximo de [{3}] 10 | default.invalid.min.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menor que el tamaño mínimo de [{3}] 11 | default.invalid.validator.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es válido 12 | default.not.inlist.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no esta contenido dentro de la lista [{3}] 13 | default.blank.message=La propiedad [{0}] de la clase [{1}] no puede ser vacía 14 | default.not.equal.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no puede igualar a [{3}] 15 | default.null.message=La propiedad [{0}] de la clase [{1}] no puede ser nulo 16 | default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] debe ser única 17 | 18 | default.paginate.prev=Anterior 19 | default.paginate.next=Siguiente 20 | default.boolean.true=Verdadero 21 | default.boolean.false=Falso 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} creado 26 | default.updated.message={0} {1} actualizado 27 | default.deleted.message={0} {1} eliminado 28 | default.not.deleted.message={0} {1} no puede eliminarse 29 | default.not.found.message=No se encuentra {0} con id {1} 30 | default.optimistic.locking.failure=Mientras usted editaba, otro usuario ha actualizado su {0} 31 | 32 | default.home.label=Principal 33 | default.list.label={0} Lista 34 | default.add.label=Agregar {0} 35 | default.new.label=Nuevo {0} 36 | default.create.label=Crear {0} 37 | default.show.label=Mostrar {0} 38 | default.edit.label=Editar {0} 39 | 40 | default.button.create.label=Crear 41 | default.button.edit.label=Editar 42 | default.button.update.label=Actualizar 43 | default.button.delete.label=Eliminar 44 | default.button.delete.confirm.message=¿Está usted seguro? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=La propiedad {0} debe ser una URL válida 48 | typeMismatch.java.net.URI=La propiedad {0} debe ser una URI válida 49 | typeMismatch.java.util.Date=La propiedad {0} debe ser una fecha válida 50 | typeMismatch.java.lang.Double=La propiedad {0} debe ser un número válido 51 | typeMismatch.java.lang.Integer=La propiedad {0} debe ser un número válido 52 | typeMismatch.java.lang.Long=La propiedad {0} debe ser un número válido 53 | typeMismatch.java.lang.Short=La propiedad {0} debe ser un número válido 54 | typeMismatch.java.math.BigDecimal=La propiedad {0} debe ser un número válido 55 | typeMismatch.java.math.BigInteger=La propiedad {0} debe ser un número válido -------------------------------------------------------------------------------- /grails-app/i18n/messages_fr.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] 2 | default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide 3 | default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide 4 | default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide 5 | default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 6 | default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 7 | default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 8 | default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 9 | default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 10 | default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 11 | default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide 12 | default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] 13 | default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide 14 | default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] 15 | default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle 16 | default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique 17 | 18 | default.paginate.prev=Précédent 19 | default.paginate.next=Suivant 20 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_it.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] 2 | default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido 3 | default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido 4 | default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido 5 | default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] 6 | default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] 7 | default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 8 | default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 9 | default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 10 | default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 11 | default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida 12 | default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] 13 | default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota 14 | default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] 15 | default.null.message=La proprietà [{0}] della classe [{1}] non può essere null 16 | default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica 17 | 18 | default.paginate.prev=Precedente 19 | default.paginate.next=Successivo 20 | default.boolean.true=Vero 21 | default.boolean.false=Falso 22 | default.date.format=dd/MM/yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} creato 26 | default.updated.message={0} {1} aggiornato 27 | default.deleted.message={0} {1} eliminato 28 | default.not.deleted.message={0} {1} non può essere eliminato 29 | default.not.found.message={0} non trovato con id {1} 30 | default.optimistic.locking.failure=Un altro utente ha aggiornato questo {0} mentre si era in modifica 31 | 32 | default.home.label=Home 33 | default.list.label={0} Elenco 34 | default.add.label=Aggiungi {0} 35 | default.new.label=Nuovo {0} 36 | default.create.label=Crea {0} 37 | default.show.label=Mostra {0} 38 | default.edit.label=Modifica {0} 39 | 40 | default.button.create.label=Crea 41 | default.button.edit.label=Modifica 42 | default.button.update.label=Aggiorna 43 | default.button.delete.label=Elimina 44 | default.button.delete.confirm.message=Si è sicuri? 45 | 46 | # Data binding errors. Usa "typeMismatch.$className.$propertyName per la personalizzazione (es typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=La proprietà {0} deve essere un URL valido 48 | typeMismatch.java.net.URI=La proprietà {0} deve essere un URI valido 49 | typeMismatch.java.util.Date=La proprietà {0} deve essere una data valida 50 | typeMismatch.java.lang.Double=La proprietà {0} deve essere un numero valido 51 | typeMismatch.java.lang.Integer=La proprietà {0} deve essere un numero valido 52 | typeMismatch.java.lang.Long=La proprietà {0} deve essere un numero valido 53 | typeMismatch.java.lang.Short=La proprietà {0} deve essere un numero valido 54 | typeMismatch.java.math.BigDecimal=La proprietà {0} deve essere un numero valido 55 | typeMismatch.java.math.BigInteger=La proprietà {0} deve essere un numero valido 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_ja.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]パターンと一致していません。 2 | default.invalid.url.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なURLではありません。 3 | default.invalid.creditCard.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なクレジットカード番号ではありません。 4 | default.invalid.email.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なメールアドレスではありません。 5 | default.invalid.range.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]範囲内を指定してください。 6 | default.invalid.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]以内を指定してください。 7 | default.invalid.max.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 8 | default.invalid.min.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 9 | default.invalid.max.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 10 | default.invalid.min.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 11 | default.invalid.validator.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、カスタムバリデーションを通過できません。 12 | default.not.inlist.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]リスト内に存在しません。 13 | default.blank.message=[{1}]クラスのプロパティ[{0}]の空白は許可されません。 14 | default.not.equal.message=クラス[{1}]プロパティ[{0}]の値[{2}]に[{3}]は許可されません。 15 | default.null.message=[{1}]クラスのプロパティ[{0}]にnullは許可されません。 16 | default.not.unique.message=クラス[{1}]プロパティ[{0}]の値[{2}]は既に使用されています。 17 | 18 | default.paginate.prev=戻る 19 | default.paginate.next=次へ 20 | default.boolean.true=はい 21 | default.boolean.false=いいえ 22 | default.date.format=yyyy/MM/dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0}(id:{1})を作成しました。 26 | default.updated.message={0}(id:{1})を更新しました。 27 | default.deleted.message={0}(id:{1})を削除しました。 28 | default.not.deleted.message={0}(id:{1})は削除できませんでした。 29 | default.not.found.message={0}(id:{1})は見つかりませんでした。 30 | default.optimistic.locking.failure=この{0}は編集中に他のユーザによって先に更新されています。 31 | 32 | default.home.label=ホーム 33 | default.list.label={0}リスト 34 | default.add.label={0}を追加 35 | default.new.label={0}を新規作成 36 | default.create.label={0}を作成 37 | default.show.label={0}詳細 38 | default.edit.label={0}を編集 39 | 40 | default.button.create.label=作成 41 | default.button.edit.label=編集 42 | default.button.update.label=更新 43 | default.button.delete.label=削除 44 | default.button.delete.confirm.message=本当に削除してよろしいですか? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL={0}は有効なURLでなければなりません。 48 | typeMismatch.java.net.URI={0}は有効なURIでなければなりません。 49 | typeMismatch.java.util.Date={0}は有効な日付でなければなりません。 50 | typeMismatch.java.lang.Double={0}は有効な数値でなければなりません。 51 | typeMismatch.java.lang.Integer={0}は有効な数値でなければなりません。 52 | typeMismatch.java.lang.Long={0}は有効な数値でなければなりません。 53 | typeMismatch.java.lang.Short={0}は有効な数値でなければなりません。 54 | typeMismatch.java.math.BigDecimal={0}は有効な数値でなければなりません。 55 | typeMismatch.java.math.BigInteger={0}は有効な数値でなければなりません。 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_nb.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overholder ikke mønsteret [{3}] 2 | default.invalid.url.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke en gyldig URL 3 | default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke et gyldig kredittkortnummer 4 | default.invalid.email.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke en gyldig epostadresse 5 | default.invalid.range.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke innenfor intervallet [{3}] til [{4}] 6 | default.invalid.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke innenfor intervallet [{3}] til [{4}] 7 | default.invalid.max.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overstiger maksimumsverdien på [{3}] 8 | default.invalid.min.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er under minimumsverdien på [{3}] 9 | default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overstiger maksimumslengden på [{3}] 10 | default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er kortere enn minimumslengden på [{3}] 11 | default.invalid.validator.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overholder ikke den brukerdefinerte valideringen 12 | default.not.inlist.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] finnes ikke i listen [{3}] 13 | default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom 14 | default.not.equal.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] kan ikke være [{3}] 15 | default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null 16 | default.not.unique.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] må være unik 17 | 18 | default.paginate.prev=Forrige 19 | default.paginate.next=Neste 20 | default.boolean.true=Ja 21 | default.boolean.false=Nei 22 | default.date.format=dd.MM.yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} opprettet 26 | default.updated.message={0} {1} oppdatert 27 | default.deleted.message={0} {1} slettet 28 | default.not.deleted.message={0} {1} kunne ikke slettes 29 | default.not.found.message={0} med id {1} ble ikke funnet 30 | default.optimistic.locking.failure=En annen bruker har oppdatert denne {0} mens du redigerte 31 | 32 | default.home.label=Hjem 33 | default.list.label={0}liste 34 | default.add.label=Legg til {0} 35 | default.new.label=Ny {0} 36 | default.create.label=Opprett {0} 37 | default.show.label=Vis {0} 38 | default.edit.label=Endre {0} 39 | 40 | default.button.create.label=Opprett 41 | default.button.edit.label=Endre 42 | default.button.update.label=Oppdater 43 | default.button.delete.label=Slett 44 | default.button.delete.confirm.message=Er du sikker? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Feltet {0} må være en gyldig URL 48 | typeMismatch.java.net.URI=Feltet {0} må være en gyldig URI 49 | typeMismatch.java.util.Date=Feltet {0} må være en gyldig dato 50 | typeMismatch.java.lang.Double=Feltet {0} må være et gyldig tall 51 | typeMismatch.java.lang.Integer=Feltet {0} må være et gyldig heltall 52 | typeMismatch.java.lang.Long=Feltet {0} må være et gyldig heltall 53 | typeMismatch.java.lang.Short=Feltet {0} må være et gyldig heltall 54 | typeMismatch.java.math.BigDecimal=Feltet {0} må være et gyldig tall 55 | typeMismatch.java.math.BigInteger=Feltet {0} må være et gyldig heltall 56 | 57 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_nl.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet overeen met het vereiste patroon [{3}] 2 | default.invalid.url.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldige URL 3 | default.invalid.creditCard.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig credit card nummer 4 | default.invalid.email.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig e-mailadres 5 | default.invalid.range.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige waardenreeks van [{3}] tot [{4}] 6 | default.invalid.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige grootte van [{3}] tot [{4}] 7 | default.invalid.max.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumwaarde [{3}] 8 | default.invalid.min.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan de minimumwaarde [{3}] 9 | default.invalid.max.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumgrootte van [{3}] 10 | default.invalid.min.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan minimumgrootte van [{3}] 11 | default.invalid.validator.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is niet geldig 12 | default.not.inlist.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet voor in de lijst [{3}] 13 | default.blank.message=Attribuut [{0}] van entiteit [{1}] mag niet leeg zijn 14 | default.not.equal.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] mag niet gelijk zijn aan [{3}] 15 | default.null.message=Attribuut [{0}] van entiteit [{1}] mag niet leeg zijn 16 | default.not.unique.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] moet uniek zijn 17 | 18 | default.paginate.prev=Vorige 19 | default.paginate.next=Volgende 20 | default.boolean.true=Ja 21 | default.boolean.false=Nee 22 | default.date.format=dd-MM-yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} ingevoerd 26 | default.updated.message={0} {1} gewijzigd 27 | default.deleted.message={0} {1} verwijderd 28 | default.not.deleted.message={0} {1} kon niet worden verwijderd 29 | default.not.found.message={0} met id {1} kon niet worden gevonden 30 | default.optimistic.locking.failure=Een andere gebruiker heeft deze {0} al gewijzigd 31 | 32 | default.home.label=Home 33 | default.list.label={0} Overzicht 34 | default.add.label=Toevoegen {0} 35 | default.new.label=Invoeren {0} 36 | default.create.label=Invoeren {0} 37 | default.show.label=Details {0} 38 | default.edit.label=Wijzigen {0} 39 | 40 | default.button.create.label=Invoeren 41 | default.button.edit.label=Wijzigen 42 | default.button.update.label=Opslaan 43 | default.button.delete.label=Verwijderen 44 | default.button.delete.confirm.message=Weet je het zeker? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Attribuut {0} is geen geldige URL 48 | typeMismatch.java.net.URI=Attribuut {0} is geen geldige URI 49 | typeMismatch.java.util.Date=Attribuut {0} is geen geldige datum 50 | typeMismatch.java.lang.Double=Attribuut {0} is geen geldig nummer 51 | typeMismatch.java.lang.Integer=Attribuut {0} is geen geldig nummer 52 | typeMismatch.java.lang.Long=Attribuut {0} is geen geldig nummer 53 | typeMismatch.java.lang.Short=Attribuut {0} is geen geldig nummer 54 | typeMismatch.java.math.BigDecimal=Attribuut {0} is geen geldig nummer 55 | typeMismatch.java.math.BigInteger=Attribuut {0} is geen geldig nummer 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_pl.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Translated by Matthias Hryniszak - padcom@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie pasuje do wymaganego wzorca [{3}] 6 | default.invalid.url.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] jest niepoprawnym adresem URL 7 | default.invalid.creditCard.message=Właściwość [{0}] klasy [{1}] with value [{2}] nie jest poprawnym numerem karty kredytowej 8 | default.invalid.email.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie jest poprawnym adresem e-mail 9 | default.invalid.range.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie zawiera się zakładanym zakresie od [{3}] do [{4}] 10 | default.invalid.size.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie zawiera się w zakładanym zakresie rozmiarów od [{3}] do [{4}] 11 | default.invalid.max.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] przekracza maksymalną wartość [{3}] 12 | default.invalid.min.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] jest mniejsza niż minimalna wartość [{3}] 13 | default.invalid.max.size.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] przekracza maksymalny rozmiar [{3}] 14 | default.invalid.min.size.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] jest mniejsza niż minimalny rozmiar [{3}] 15 | default.invalid.validator.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie spełnia założonych niestandardowych warunków 16 | default.not.inlist.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie zawiera się w liście [{3}] 17 | default.blank.message=Właściwość [{0}] klasy [{1}] nie może być pusta 18 | default.not.equal.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie może równać się [{3}] 19 | default.null.message=Właściwość [{0}] klasy [{1}] nie może być null 20 | default.not.unique.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] musi być unikalna 21 | 22 | default.paginate.prev=Poprzedni 23 | default.paginate.next=Następny 24 | default.boolean.true=Prawda 25 | default.boolean.false=Fałsz 26 | default.date.format=yyyy-MM-dd HH:mm:ss z 27 | default.number.format=0 28 | 29 | default.created.message=Utworzono {0} {1} 30 | default.updated.message=Zaktualizowano {0} {1} 31 | default.deleted.message=Usunięto {0} {1} 32 | default.not.deleted.message={0} {1} nie mógł zostać usunięty 33 | default.not.found.message=Nie znaleziono {0} o id {1} 34 | default.optimistic.locking.failure=Inny użytkownik zaktualizował ten obiekt {0} w trakcie twoich zmian 35 | 36 | default.home.label=Strona domowa 37 | default.list.label=Lista {0} 38 | default.add.label=Dodaj {0} 39 | default.new.label=Utwórz {0} 40 | default.create.label=Utwórz {0} 41 | default.show.label=Pokaż {0} 42 | default.edit.label=Edytuj {0} 43 | 44 | default.button.create.label=Utwórz 45 | default.button.edit.label=Edytuj 46 | default.button.update.label=Zaktualizuj 47 | default.button.delete.label=Usuń 48 | default.button.delete.confirm.message=Czy jesteś pewien? 49 | 50 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 51 | typeMismatch.java.net.URL=Właściwość {0} musi być poprawnym adresem URL 52 | typeMismatch.java.net.URI=Właściwość {0} musi być poprawnym adresem URI 53 | typeMismatch.java.util.Date=Właściwość {0} musi być poprawną datą 54 | typeMismatch.java.lang.Double=Właściwość {0} musi być poprawnyą liczbą 55 | typeMismatch.java.lang.Integer=Właściwość {0} musi być poprawnyą liczbą 56 | typeMismatch.java.lang.Long=Właściwość {0} musi być poprawnyą liczbą 57 | typeMismatch.java.lang.Short=Właściwość {0} musi być poprawnyą liczbą 58 | typeMismatch.java.math.BigDecimal=Właściwość {0} musi być poprawnyą liczbą 59 | typeMismatch.java.math.BigInteger=Właściwość {0} musi być poprawnyą liczbą 60 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_pt_BR.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Translated by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atende ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é uma URL válida 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está entre a faixa de valores válida de [{3}] até [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está na faixa de tamanho válida de [{3}] até [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um valor dentre os permitidos na lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ficar em branco 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | default.boolean.true=Sim 25 | default.boolean.false=Não 26 | default.date.format=dd/MM/yyyy HH:mm:ss z 27 | default.number.format=0 28 | 29 | default.created.message={0} {1} criado 30 | default.updated.message={0} {1} atualizado 31 | default.deleted.message={0} {1} removido 32 | default.not.deleted.message={0} {1} não pode ser removido 33 | default.not.found.message={0} não foi encontrado com o id {1} 34 | default.optimistic.locking.failure=Outro usuário atualizou este [{0}] enquanto você tentou salvá-lo 35 | 36 | default.home.label=Principal 37 | default.list.label={0} Listagem 38 | default.add.label=Adicionar {0} 39 | default.new.label=Novo {0} 40 | default.create.label=Criar {0} 41 | default.show.label=Ver {0} 42 | default.edit.label=Editar {0} 43 | 44 | default.button.create.label=Criar 45 | default.button.edit.label=Editar 46 | default.button.update.label=Alterar 47 | default.button.delete.label=Remover 48 | default.button.delete.confirm.message=Tem certeza? 49 | 50 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para customizar (eg typeMismatch.Book.author) 51 | typeMismatch.java.net.URL=O campo {0} deve ser uma URL válida. 52 | typeMismatch.java.net.URI=O campo {0} deve ser uma URI válida. 53 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 54 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 55 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 56 | typeMismatch.java.lang.Long=O campo {0} deve ser um número válido. 57 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 58 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 59 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. 60 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_pt_PT.properties: -------------------------------------------------------------------------------- 1 | # 2 | # translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. 27 | typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. 35 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_ru.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Значение [{2}] поля [{0}] класса [{1}] не соответствует образцу [{3}] 2 | default.invalid.url.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым URL-адресом 3 | default.invalid.creditCard.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым номером кредитной карты 4 | default.invalid.email.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым e-mail адресом 5 | default.invalid.range.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в допустимый интервал от [{3}] до [{4}] 6 | default.invalid.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) не попадает в допустимый интервал от [{3}] до [{4}] 7 | default.invalid.max.message=Значение [{2}] поля [{0}] класса [{1}] больше чем максимально допустимое значение [{3}] 8 | default.invalid.min.message=Значение [{2}] поля [{0}] класса [{1}] меньше чем минимально допустимое значение [{3}] 9 | default.invalid.max.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) больше чем максимально допустимый размер [{3}] 10 | default.invalid.min.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) меньше чем минимально допустимый размер [{3}] 11 | default.invalid.validator.message=Значение [{2}] поля [{0}] класса [{1}] не допустимо 12 | default.not.inlist.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в список допустимых значений [{3}] 13 | default.blank.message=Поле [{0}] класса [{1}] не может быть пустым 14 | default.not.equal.message=Значение [{2}] поля [{0}] класса [{1}] не может быть равно [{3}] 15 | default.null.message=Поле [{0}] класса [{1}] не может иметь значение null 16 | default.not.unique.message=Значение [{2}] поля [{0}] класса [{1}] должно быть уникальным 17 | 18 | default.paginate.prev=Предыдушая страница 19 | default.paginate.next=Следующая страница 20 | 21 | # Ошибки при присвоении данных. Для точной настройки для полей классов используйте 22 | # формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) 23 | typeMismatch.java.net.URL=Значение поля {0} не является допустимым URL 24 | typeMismatch.java.net.URI=Значение поля {0} не является допустимым URI 25 | typeMismatch.java.util.Date=Значение поля {0} не является допустимой датой 26 | typeMismatch.java.lang.Double=Значение поля {0} не является допустимым числом 27 | typeMismatch.java.lang.Integer=Значение поля {0} не является допустимым числом 28 | typeMismatch.java.lang.Long=Значение поля {0} не является допустимым числом 29 | typeMismatch.java.lang.Short=Значение поля {0} не является допустимым числом 30 | typeMismatch.java.math.BigDecimal=Значение поля {0} не является допустимым числом 31 | typeMismatch.java.math.BigInteger=Значение поля {0} не является допустимым числом 32 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_sv.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Attributet [{0}] för klassen [{1}] med värde [{2}] matchar inte mot uttrycket [{3}] 2 | default.invalid.url.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte en giltig URL 3 | default.invalid.creditCard.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte ett giltigt kreditkortsnummer 4 | default.invalid.email.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte en giltig e-postadress 5 | default.invalid.range.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte inom intervallet [{3}] till [{4}] 6 | default.invalid.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] har en storlek som inte är inom [{3}] till [{4}] 7 | default.invalid.max.message=Attributet [{0}] för klassen [{1}] med värde [{2}] överskrider maxvärdet [{3}] 8 | default.invalid.min.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är mindre än minimivärdet [{3}] 9 | default.invalid.max.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] överskrider maxstorleken [{3}] 10 | default.invalid.min.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är mindre än minimistorleken [{3}] 11 | default.invalid.validator.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte giltigt enligt anpassad regel 12 | default.not.inlist.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte giltigt, måste vara ett av [{3}] 13 | default.blank.message=Attributet [{0}] för klassen [{1}] får inte vara tomt 14 | default.not.equal.message=Attributet [{0}] för klassen [{1}] med värde [{2}] får inte vara lika med [{3}] 15 | default.null.message=Attributet [{0}] för klassen [{1}] får inte vara tomt 16 | default.not.unique.message=Attributet [{0}] för klassen [{1}] med värde [{2}] måste vara unikt 17 | 18 | default.paginate.prev=Föregående 19 | default.paginate.next=Nästa 20 | default.boolean.true=Sant 21 | default.boolean.false=Falskt 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} skapades 26 | default.updated.message={0} {1} uppdaterades 27 | default.deleted.message={0} {1} borttagen 28 | default.not.deleted.message={0} {1} kunde inte tas bort 29 | default.not.found.message={0} med id {1} kunde inte hittas 30 | default.optimistic.locking.failure=En annan användare har uppdaterat det här {0} objektet medan du redigerade det 31 | 32 | default.home.label=Hem 33 | default.list.label= {0} - Lista 34 | default.add.label=Lägg till {0} 35 | default.new.label=Skapa {0} 36 | default.create.label=Skapa {0} 37 | default.show.label=Visa {0} 38 | default.edit.label=Ändra {0} 39 | 40 | default.button.create.label=Skapa 41 | default.button.edit.label=Ändra 42 | default.button.update.label=Uppdatera 43 | default.button.delete.label=Ta bort 44 | default.button.delete.confirm.message=Är du säker? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Värdet för {0} måste vara en giltig URL 48 | typeMismatch.java.net.URI=Värdet för {0} måste vara en giltig URI 49 | typeMismatch.java.util.Date=Värdet {0} måste vara ett giltigt datum 50 | typeMismatch.java.lang.Double=Värdet {0} måste vara ett giltigt nummer 51 | typeMismatch.java.lang.Integer=Värdet {0} måste vara ett giltigt heltal 52 | typeMismatch.java.lang.Long=Värdet {0} måste vara ett giltigt heltal 53 | typeMismatch.java.lang.Short=Värdet {0} måste vara ett giltigt heltal 54 | typeMismatch.java.math.BigDecimal=Värdet {0} måste vara ett giltigt nummer 55 | typeMismatch.java.math.BigInteger=Värdet {0} måste vara ett giltigt heltal -------------------------------------------------------------------------------- /grails-app/i18n/messages_th.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบที่กำหนดไว้ใน [{3}] 2 | default.invalid.url.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบ URL 3 | default.invalid.creditCard.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบหมายเลขบัตรเครดิต 4 | default.invalid.email.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบอีเมล์ 5 | default.invalid.range.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีค่าที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] 6 | default.invalid.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีขนาดที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] 7 | default.invalid.max.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าเกิดกว่าค่ามากสุด [{3}] 8 | default.invalid.min.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าน้อยกว่าค่าต่ำสุด [{3}] 9 | default.invalid.max.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดเกินกว่าขนาดมากสุดของ [{3}] 10 | default.invalid.min.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดต่ำกว่าขนาดต่ำสุดของ [{3}] 11 | default.invalid.validator.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ผ่านการทวนสอบค่าที่ตั้งขึ้น 12 | default.not.inlist.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้อยู่ในรายการต่อไปนี้ [{3}] 13 | default.blank.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็นค่าว่างได้ 14 | default.not.equal.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่สามารถเท่ากับ [{3}] ได้ 15 | default.null.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็น null ได้ 16 | default.not.unique.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] จะต้องไม่ซ้ำ (unique) 17 | 18 | default.paginate.prev=ก่อนหน้า 19 | default.paginate.next=ถัดไป 20 | default.boolean.true=จริง 21 | default.boolean.false=เท็จ 22 | default.date.format=dd-MM-yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message=สร้าง {0} {1} เรียบร้อยแล้ว 26 | default.updated.message=ปรับปรุง {0} {1} เรียบร้อยแล้ว 27 | default.deleted.message=ลบ {0} {1} เรียบร้อยแล้ว 28 | default.not.deleted.message=ไม่สามารถลบ {0} {1} 29 | default.not.found.message=ไม่พบ {0} ด้วย id {1} นี้ 30 | default.optimistic.locking.failure=มีผู้ใช้ท่านอื่นปรับปรุง {0} ขณะที่คุณกำลังแก้ไขข้อมูลอยู่ 31 | 32 | default.home.label=หน้าแรก 33 | default.list.label=รายการ {0} 34 | default.add.label=เพิ่ม {0} 35 | default.new.label=สร้าง {0} ใหม่ 36 | default.create.label=สร้าง {0} 37 | default.show.label=แสดง {0} 38 | default.edit.label=แก้ไข {0} 39 | 40 | default.button.create.label=สร้าง 41 | default.button.edit.label=แก้ไข 42 | default.button.update.label=ปรับปรุง 43 | default.button.delete.label=ลบ 44 | default.button.delete.confirm.message=คุณแน่ใจหรือไม่ ? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=คุณสมบัติ '{0}' จะต้องเป็นค่า URL ที่ถูกต้อง 48 | typeMismatch.java.net.URI=คุณสมบัติ '{0}' จะต้องเป็นค่า URI ที่ถูกต้อง 49 | typeMismatch.java.util.Date=คุณสมบัติ '{0}' จะต้องมีค่าเป็นวันที่ 50 | typeMismatch.java.lang.Double=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Double 51 | typeMismatch.java.lang.Integer=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Integer 52 | typeMismatch.java.lang.Long=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Long 53 | typeMismatch.java.lang.Short=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Short 54 | typeMismatch.java.math.BigDecimal=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigDecimal 55 | typeMismatch.java.math.BigInteger=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigInteger 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_zh_CN.properties: -------------------------------------------------------------------------------- 1 | default.blank.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3A\u7A7A 2 | default.doesnt.match.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E\u5B9A\u4E49\u7684\u6A21\u5F0F [{3}]\u4E0D\u5339\u914D 3 | default.invalid.creditCard.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u4FE1\u7528\u5361\u53F7 4 | default.invalid.email.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 5 | default.invalid.max.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 6 | default.invalid.max.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 7 | default.invalid.min.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 8 | default.invalid.min.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 9 | default.invalid.range.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 10 | default.invalid.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 11 | default.invalid.url.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684URL 12 | default.invalid.validator.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u672A\u80FD\u901A\u8FC7\u81EA\u5B9A\u4E49\u7684\u9A8C\u8BC1 13 | default.not.equal.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E[{3}]\u4E0D\u76F8\u7B49 14 | default.not.inlist.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5217\u8868\u7684\u53D6\u503C\u8303\u56F4\u5185 15 | default.not.unique.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u5FC5\u987B\u662F\u552F\u4E00\u7684 16 | default.null.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3Anull 17 | default.paginate.next=\u4E0B\u9875 18 | default.paginate.prev=\u4E0A\u9875 19 | -------------------------------------------------------------------------------- /grails-app/init/pms/Application.groovy: -------------------------------------------------------------------------------- 1 | package pms 2 | 3 | import grails.boot.GrailsApp 4 | import grails.boot.config.GrailsAutoConfiguration 5 | 6 | class Application extends GrailsAutoConfiguration { 7 | static void main(String[] args) { 8 | GrailsApp.run(Application, args) 9 | } 10 | } -------------------------------------------------------------------------------- /grails-app/init/pms/BootStrap.groovy: -------------------------------------------------------------------------------- 1 | package pms 2 | 3 | class BootStrap { 4 | 5 | def init = { servletContext -> 6 | } 7 | def destroy = { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /grails-app/views/error.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <g:if env="development">Grails Runtime Exception</g:if><g:else>Error</g:else> 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 23 | 24 | 25 | 26 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /grails-app/views/index.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Welcome to Grails 6 | 7 |