├── .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 | Grails Runtime Exception Error
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | An error has occurred
19 | Exception: ${exception}
20 | Message: ${message}
21 | Path: ${path}
22 |
23 |
24 |
25 |
26 |
27 | An error has occurred
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/grails-app/views/index.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Welcome to Grails
6 |
7 |
8 |
9 |
10 |
11 |
12 | Application Status
13 |
28 |
29 |
30 | Artefacts
31 |
37 |
38 |
39 | Installed Plugins
40 |
45 |
46 |
47 |
48 |
53 |
54 |
55 |
56 | Welcome to Grails
57 |
58 |
59 | Congratulations, you have successfully started your first Grails application! At the moment
60 | this is the default page, feel free to modify it to either redirect to a controller or display
61 | whatever content you may choose. Below is a list of controllers that are currently deployed in
62 | this application, click on each to execute its default action:
63 |
64 |
65 |
66 |
Available Controllers:
67 |
68 |
69 |
70 | ${c.fullName}
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/grails-app/views/layouts/main.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/grails-app/views/milestone/create.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
16 |
17 |
18 |
19 | ${flash.message}
20 |
21 |
22 |
23 |
24 | data-field-id="${error.field}">
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/grails-app/views/milestone/edit.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
17 |
18 |
19 |
20 | ${flash.message}
21 |
22 |
23 |
24 |
25 | data-field-id="${error.field}">
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/grails-app/views/milestone/index.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
16 |
17 |
18 |
19 | ${flash.message}
20 |
21 |
22 |
23 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/grails-app/views/milestone/show.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
17 |
18 |
19 |
20 | ${flash.message}
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/grails-app/views/notFound.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Page Not Found
5 |
6 |
7 |
8 |
9 |
10 | Error: Page Not Found (404)
11 | Path: ${request.forwardURI}
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/grails-app/views/project/create.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
16 |
17 |
18 |
19 | ${flash.message}
20 |
21 |
22 |
23 |
24 | data-field-id="${error.field}">
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/grails-app/views/project/edit.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
17 |
18 |
19 |
20 | ${flash.message}
21 |
22 |
23 |
24 |
25 | data-field-id="${error.field}">
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/grails-app/views/project/index.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
16 |
17 |
18 |
19 | ${flash.message}
20 |
21 |
22 |
23 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/grails-app/views/project/show.gsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
17 |
18 |
19 |
20 | ${flash.message}
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/grails-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasySpringBoot/pms/b4cda54f580fc6bb848b4e943aaafc3b22a006ba/grails-wrapper.jar
--------------------------------------------------------------------------------
/grailsw:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Grails start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRAILS_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS='"-XX:+TieredCompilation" "-XX:TieredStopAtLevel=1" "-XX:CICompilerCount=3"'
11 |
12 |
13 | # Use the maximum available, or set MAX_FD != -1 to use that value.
14 | MAX_FD="maximum"
15 |
16 | warn ( ) {
17 | echo "$*"
18 | }
19 |
20 | die ( ) {
21 | echo
22 | echo "$*"
23 | echo
24 | exit 1
25 | }
26 |
27 | # OS specific support (must be 'true' or 'false').
28 | cygwin=false
29 | msys=false
30 | darwin=false
31 | case "`uname`" in
32 | CYGWIN* )
33 | cygwin=true
34 | ;;
35 | Darwin* )
36 | darwin=true
37 | ;;
38 | MINGW* )
39 | msys=true
40 | ;;
41 | esac
42 |
43 | # Attempt to set APP_HOME
44 | # Resolve links: $0 may be a link
45 | PRG="$0"
46 | # Need this for relative symlinks.
47 | while [ -h "$PRG" ] ; do
48 | ls=`ls -ld "$PRG"`
49 | link=`expr "$ls" : '.*-> \(.*\)$'`
50 | if expr "$link" : '/.*' > /dev/null; then
51 | PRG="$link"
52 | else
53 | PRG=`dirname "$PRG"`"/$link"
54 | fi
55 | done
56 | SAVED="`pwd`"
57 | cd "`dirname \"$PRG\"`/" >/dev/null
58 | APP_HOME="`pwd -P`"
59 | cd "$SAVED" >/dev/null
60 |
61 | JAR_PATH=$APP_HOME/grails-wrapper.jar
62 |
63 | # Determine the Java command to use to start the JVM.
64 | if [ -n "$JAVA_HOME" ] ; then
65 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
66 | # IBM's JDK on AIX uses strange locations for the executables
67 | JAVACMD="$JAVA_HOME/jre/sh/java"
68 | else
69 | JAVACMD="$JAVA_HOME/bin/java"
70 | fi
71 | if [ ! -x "$JAVACMD" ] ; then
72 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
73 |
74 | Please set the JAVA_HOME variable in your environment to match the
75 | location of your Java installation."
76 | fi
77 | else
78 | JAVACMD="java"
79 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
80 |
81 | Please set the JAVA_HOME variable in your environment to match the
82 | location of your Java installation."
83 | fi
84 |
85 | # Increase the maximum file descriptors if we can.
86 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
87 | MAX_FD_LIMIT=`ulimit -H -n`
88 | if [ $? -eq 0 ] ; then
89 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
90 | MAX_FD="$MAX_FD_LIMIT"
91 | fi
92 | ulimit -n $MAX_FD
93 | if [ $? -ne 0 ] ; then
94 | warn "Could not set maximum file descriptor limit: $MAX_FD"
95 | fi
96 | else
97 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
98 | fi
99 | fi
100 |
101 | # For Cygwin, switch paths to Windows format before running java
102 | if $cygwin ; then
103 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
104 | JAVACMD=`cygpath --unix "$JAVACMD"`
105 |
106 | # We build the pattern for arguments to be converted via cygpath
107 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
108 | SEP=""
109 | for dir in $ROOTDIRSRAW ; do
110 | ROOTDIRS="$ROOTDIRS$SEP$dir"
111 | SEP="|"
112 | done
113 | OURCYGPATTERN="(^($ROOTDIRS))"
114 | # Add a user-defined pattern to the cygpath arguments
115 | if [ "$GRAILS_CYGPATTERN" != "" ] ; then
116 | OURCYGPATTERN="$OURCYGPATTERN|($GRAILS_CYGPATTERN)"
117 | fi
118 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
119 | i=0
120 | for arg in "$@" ; do
121 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
122 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
123 |
124 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
125 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
126 | else
127 | eval `echo args$i`="\"$arg\""
128 | fi
129 | i=$((i+1))
130 | done
131 | case $i in
132 | (0) set -- ;;
133 | (1) set -- "$args0" ;;
134 | (2) set -- "$args0" "$args1" ;;
135 | (3) set -- "$args0" "$args1" "$args2" ;;
136 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
137 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
138 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
139 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
140 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
141 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
142 | esac
143 | fi
144 |
145 | # Split up the JVM_OPTS And GRAILS_OPTS values into an array, following the shell quoting and substitution rules
146 | function splitJvmOpts() {
147 | JVM_OPTS=("$@")
148 | }
149 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRAILS_OPTS
150 |
151 | exec "$JAVACMD" -jar "${JVM_OPTS[@]}" "$JAR_PATH" "$@"
152 |
--------------------------------------------------------------------------------
/grailsw.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Grails 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 GRAILS_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS="-XX:+TieredCompilation" "-XX:TieredStopAtLevel=1" "-XX:CICompilerCount=3"
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 | set JAR_PATH=%APP_HOME%/grails-wrapper.jar
72 |
73 | @rem Execute Grails
74 | "%JAVA_EXE%" -jar %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRAILS_OPTS% %JAR_PATH% %CMD_LINE_ARGS%
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRAILS_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRAILS_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name='pms'
2 |
--------------------------------------------------------------------------------
/src/test/groovy/pms/MilestoneControllerSpec.groovy:
--------------------------------------------------------------------------------
1 | package pms
2 |
3 | import grails.test.mixin.*
4 | import spock.lang.*
5 |
6 | @TestFor(MilestoneController)
7 | @Mock(Milestone)
8 | class MilestoneControllerSpec extends Specification {
9 |
10 | def populateValidParams(params) {
11 | assert params != null
12 |
13 | // TODO: Populate valid properties like...
14 | //params["name"] = 'someValidName'
15 | assert false, "TODO: Provide a populateValidParams() implementation for this generated test suite"
16 | }
17 |
18 | void "Test the index action returns the correct model"() {
19 |
20 | when:"The index action is executed"
21 | controller.index()
22 |
23 | then:"The model is correct"
24 | !model.milestoneList
25 | model.milestoneCount == 0
26 | }
27 |
28 | void "Test the create action returns the correct model"() {
29 | when:"The create action is executed"
30 | controller.create()
31 |
32 | then:"The model is correctly created"
33 | model.milestone!= null
34 | }
35 |
36 | void "Test the save action correctly persists an instance"() {
37 |
38 | when:"The save action is executed with an invalid instance"
39 | request.contentType = FORM_CONTENT_TYPE
40 | request.method = 'POST'
41 | def milestone = new Milestone()
42 | milestone.validate()
43 | controller.save(milestone)
44 |
45 | then:"The create view is rendered again with the correct model"
46 | model.milestone!= null
47 | view == 'create'
48 |
49 | when:"The save action is executed with a valid instance"
50 | response.reset()
51 | populateValidParams(params)
52 | milestone = new Milestone(params)
53 |
54 | controller.save(milestone)
55 |
56 | then:"A redirect is issued to the show action"
57 | response.redirectedUrl == '/milestone/show/1'
58 | controller.flash.message != null
59 | Milestone.count() == 1
60 | }
61 |
62 | void "Test that the show action returns the correct model"() {
63 | when:"The show action is executed with a null domain"
64 | controller.show(null)
65 |
66 | then:"A 404 error is returned"
67 | response.status == 404
68 |
69 | when:"A domain instance is passed to the show action"
70 | populateValidParams(params)
71 | def milestone = new Milestone(params)
72 | controller.show(milestone)
73 |
74 | then:"A model is populated containing the domain instance"
75 | model.milestone == milestone
76 | }
77 |
78 | void "Test that the edit action returns the correct model"() {
79 | when:"The edit action is executed with a null domain"
80 | controller.edit(null)
81 |
82 | then:"A 404 error is returned"
83 | response.status == 404
84 |
85 | when:"A domain instance is passed to the edit action"
86 | populateValidParams(params)
87 | def milestone = new Milestone(params)
88 | controller.edit(milestone)
89 |
90 | then:"A model is populated containing the domain instance"
91 | model.milestone == milestone
92 | }
93 |
94 | void "Test the update action performs an update on a valid domain instance"() {
95 | when:"Update is called for a domain instance that doesn't exist"
96 | request.contentType = FORM_CONTENT_TYPE
97 | request.method = 'PUT'
98 | controller.update(null)
99 |
100 | then:"A 404 error is returned"
101 | response.redirectedUrl == '/milestone/index'
102 | flash.message != null
103 |
104 | when:"An invalid domain instance is passed to the update action"
105 | response.reset()
106 | def milestone = new Milestone()
107 | milestone.validate()
108 | controller.update(milestone)
109 |
110 | then:"The edit view is rendered again with the invalid instance"
111 | view == 'edit'
112 | model.milestone == milestone
113 |
114 | when:"A valid domain instance is passed to the update action"
115 | response.reset()
116 | populateValidParams(params)
117 | milestone = new Milestone(params).save(flush: true)
118 | controller.update(milestone)
119 |
120 | then:"A redirect is issued to the show action"
121 | milestone != null
122 | response.redirectedUrl == "/milestone/show/$milestone.id"
123 | flash.message != null
124 | }
125 |
126 | void "Test that the delete action deletes an instance if it exists"() {
127 | when:"The delete action is called for a null instance"
128 | request.contentType = FORM_CONTENT_TYPE
129 | request.method = 'DELETE'
130 | controller.delete(null)
131 |
132 | then:"A 404 is returned"
133 | response.redirectedUrl == '/milestone/index'
134 | flash.message != null
135 |
136 | when:"A domain instance is created"
137 | response.reset()
138 | populateValidParams(params)
139 | def milestone = new Milestone(params).save(flush: true)
140 |
141 | then:"It exists"
142 | Milestone.count() == 1
143 |
144 | when:"The domain instance is passed to the delete action"
145 | controller.delete(milestone)
146 |
147 | then:"The instance is deleted"
148 | Milestone.count() == 0
149 | response.redirectedUrl == '/milestone/index'
150 | flash.message != null
151 | }
152 | }
153 |
--------------------------------------------------------------------------------
/src/test/groovy/pms/MilestoneSpec.groovy:
--------------------------------------------------------------------------------
1 | package pms
2 |
3 | import grails.test.mixin.TestFor
4 | import spock.lang.Specification
5 |
6 | /**
7 | * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions
8 | */
9 | @TestFor(Milestone)
10 | class MilestoneSpec extends Specification {
11 |
12 | def setup() {
13 | }
14 |
15 | def cleanup() {
16 | }
17 |
18 | void "test something"() {
19 | expect:"fix me"
20 | true == false
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/test/groovy/pms/ProjectControllerSpec.groovy:
--------------------------------------------------------------------------------
1 | package pms
2 |
3 | import grails.test.mixin.*
4 | import spock.lang.*
5 |
6 | @TestFor(ProjectController)
7 | @Mock(Project)
8 | class ProjectControllerSpec extends Specification {
9 |
10 | def populateValidParams(params) {
11 | assert params != null
12 |
13 | // TODO: Populate valid properties like...
14 | //params["name"] = 'someValidName'
15 | assert false, "TODO: Provide a populateValidParams() implementation for this generated test suite"
16 | }
17 |
18 | void "Test the index action returns the correct model"() {
19 |
20 | when:"The index action is executed"
21 | controller.index()
22 |
23 | then:"The model is correct"
24 | !model.projectList
25 | model.projectCount == 0
26 | }
27 |
28 | void "Test the create action returns the correct model"() {
29 | when:"The create action is executed"
30 | controller.create()
31 |
32 | then:"The model is correctly created"
33 | model.project!= null
34 | }
35 |
36 | void "Test the save action correctly persists an instance"() {
37 |
38 | when:"The save action is executed with an invalid instance"
39 | request.contentType = FORM_CONTENT_TYPE
40 | request.method = 'POST'
41 | def project = new Project()
42 | project.validate()
43 | controller.save(project)
44 |
45 | then:"The create view is rendered again with the correct model"
46 | model.project!= null
47 | view == 'create'
48 |
49 | when:"The save action is executed with a valid instance"
50 | response.reset()
51 | populateValidParams(params)
52 | project = new Project(params)
53 |
54 | controller.save(project)
55 |
56 | then:"A redirect is issued to the show action"
57 | response.redirectedUrl == '/project/show/1'
58 | controller.flash.message != null
59 | Project.count() == 1
60 | }
61 |
62 | void "Test that the show action returns the correct model"() {
63 | when:"The show action is executed with a null domain"
64 | controller.show(null)
65 |
66 | then:"A 404 error is returned"
67 | response.status == 404
68 |
69 | when:"A domain instance is passed to the show action"
70 | populateValidParams(params)
71 | def project = new Project(params)
72 | controller.show(project)
73 |
74 | then:"A model is populated containing the domain instance"
75 | model.project == project
76 | }
77 |
78 | void "Test that the edit action returns the correct model"() {
79 | when:"The edit action is executed with a null domain"
80 | controller.edit(null)
81 |
82 | then:"A 404 error is returned"
83 | response.status == 404
84 |
85 | when:"A domain instance is passed to the edit action"
86 | populateValidParams(params)
87 | def project = new Project(params)
88 | controller.edit(project)
89 |
90 | then:"A model is populated containing the domain instance"
91 | model.project == project
92 | }
93 |
94 | void "Test the update action performs an update on a valid domain instance"() {
95 | when:"Update is called for a domain instance that doesn't exist"
96 | request.contentType = FORM_CONTENT_TYPE
97 | request.method = 'PUT'
98 | controller.update(null)
99 |
100 | then:"A 404 error is returned"
101 | response.redirectedUrl == '/project/index'
102 | flash.message != null
103 |
104 | when:"An invalid domain instance is passed to the update action"
105 | response.reset()
106 | def project = new Project()
107 | project.validate()
108 | controller.update(project)
109 |
110 | then:"The edit view is rendered again with the invalid instance"
111 | view == 'edit'
112 | model.project == project
113 |
114 | when:"A valid domain instance is passed to the update action"
115 | response.reset()
116 | populateValidParams(params)
117 | project = new Project(params).save(flush: true)
118 | controller.update(project)
119 |
120 | then:"A redirect is issued to the show action"
121 | project != null
122 | response.redirectedUrl == "/project/show/$project.id"
123 | flash.message != null
124 | }
125 |
126 | void "Test that the delete action deletes an instance if it exists"() {
127 | when:"The delete action is called for a null instance"
128 | request.contentType = FORM_CONTENT_TYPE
129 | request.method = 'DELETE'
130 | controller.delete(null)
131 |
132 | then:"A 404 is returned"
133 | response.redirectedUrl == '/project/index'
134 | flash.message != null
135 |
136 | when:"A domain instance is created"
137 | response.reset()
138 | populateValidParams(params)
139 | def project = new Project(params).save(flush: true)
140 |
141 | then:"It exists"
142 | Project.count() == 1
143 |
144 | when:"The domain instance is passed to the delete action"
145 | controller.delete(project)
146 |
147 | then:"The instance is deleted"
148 | Project.count() == 0
149 | response.redirectedUrl == '/project/index'
150 | flash.message != null
151 | }
152 | }
153 |
--------------------------------------------------------------------------------
/src/test/groovy/pms/ProjectSpec.groovy:
--------------------------------------------------------------------------------
1 | package pms
2 |
3 | import grails.test.mixin.TestFor
4 | import spock.lang.Specification
5 |
6 | /**
7 | * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions
8 | */
9 | @TestFor(Project)
10 | class ProjectSpec extends Specification {
11 |
12 | def setup() {
13 | }
14 |
15 | def cleanup() {
16 | }
17 |
18 | void "test something"() {
19 | expect:"fix me"
20 | true == false
21 | }
22 | }
23 |
--------------------------------------------------------------------------------