Compare commits

...
169 Commits
Author SHA1 Message Date
Eric Davis b5cfe79044 Tagging 1.0.2
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/1.0.2@4213 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:43:11 +00:00
Eric Davis 38a2beb2c0 Merged r4210 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4212 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:41:55 +00:00
Eric Davis 77ba8bbfc0 Merged r4209 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4211 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:41:50 +00:00
Eric Davis 7bbf4af0c1 Locales update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4208 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:34:05 +00:00
Eric Davis babcd39918 Merged r4189 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4207 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:59 +00:00
Eric Davis 924bb8da0b Merged r4188 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4206 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:52 +00:00
Eric Davis 2c91d15c58 Merged r4187 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4205 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:45 +00:00
Eric Davis dd91dc4cb7 Merged r4186 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4204 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:39 +00:00
Eric Davis 98eaff414f Merged r4185 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4203 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:33 +00:00
Eric Davis eb05880717 Merged r4183 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4202 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:28 +00:00
Eric Davis 25b2ffb8fd Merged r4182 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4201 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:22 +00:00
Eric Davis c4e123b2f0 Merged r4181 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4200 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:17 +00:00
Eric Davis 324baf60a6 Merged r4180 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4199 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:11 +00:00
Eric Davis 22bcce63aa Merged r4177 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4198 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:06 +00:00
Eric Davis ef90132cf3 Merged r4175 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4197 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:33:01 +00:00
Eric Davis 3909d2c8ba Merged r4173 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4196 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:55 +00:00
Eric Davis 5e7e11440c Merged r4171 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4195 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:50 +00:00
Eric Davis 7d55572bd1 Merged r4169 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4194 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:44 +00:00
Eric Davis 945cd3933e Merged r4167 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4193 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:38 +00:00
Eric Davis 47b969de00 Merged r4166 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4192 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:32 +00:00
Eric Davis c51f9b8907 Merged r4165 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4191 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:26 +00:00
Eric Davis 65b6b7f5a9 Merged r4164 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4190 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:32:21 +00:00
Eric Davis d44a90045a Merged r4107 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4162 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:07:21 +00:00
Eric Davis 1c63c443b6 Merged r4105 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4161 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:07:16 +00:00
Eric Davis b0b321bd11 Merged r4104 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4160 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:07:09 +00:00
Eric Davis 8bd0ff03a0 Merged r4103 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4159 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:07:04 +00:00
Eric Davis 7dbc8b4f97 Merged r4102 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4158 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:58 +00:00
Eric Davis 019ea4adf3 Merged r4100 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4157 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:53 +00:00
Eric Davis 0a62a9187c Merged r4099 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4156 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:48 +00:00
Eric Davis e450c124d9 Merged r4096 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4155 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:42 +00:00
Eric Davis e1a557fa58 Merged r4095 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4154 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:37 +00:00
Eric Davis b35bc6d93c Merged r4094 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4153 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:31 +00:00
Eric Davis 4593d97472 Merged r4093 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4152 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:26 +00:00
Eric Davis d99d2efcca Merged r4092 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4151 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:20 +00:00
Eric Davis 1c62645270 Merged r4091 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4150 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:14 +00:00
Eric Davis 60caea006a Merged r4090 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4149 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:08 +00:00
Eric Davis 5003152542 Merged r4089 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4148 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:06:02 +00:00
Eric Davis 2149add25c Merged r4088 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4147 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:56 +00:00
Eric Davis b5bbc93325 Merged r4087 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4146 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:50 +00:00
Eric Davis 7ad17f92b1 Merged r4086 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4145 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:43 +00:00
Eric Davis 066f648949 Merged r4083 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4144 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:38 +00:00
Eric Davis 46fc878396 Merged r4082 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4143 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:31 +00:00
Eric Davis d1952aefb8 Merged r4080 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4142 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:26 +00:00
Eric Davis 4a5dce41e2 Merged r4076 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4141 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 04:05:20 +00:00
Eric Davis f74d9809fd Merged r4070 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4140 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:57 +00:00
Eric Davis f219a92c1f Merged r4069 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4139 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:50 +00:00
Eric Davis f8e46cfd30 Merged r4068 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4138 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:44 +00:00
Eric Davis 9321ffde39 Merged r4067 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4137 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:38 +00:00
Eric Davis 1e370f2c5a Merged r4066 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4136 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:32 +00:00
Eric Davis d2f9a726bb Merged r4065 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4135 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:26 +00:00
Eric Davis 00423307ce Merged r4064 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4134 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:21 +00:00
Eric Davis 5a639173de Merged r4063 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4133 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:14 +00:00
Eric Davis 823fd16c3a Merged r4062 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4132 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:09 +00:00
Eric Davis e32fc44dc2 Merged r4061 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4131 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:59:02 +00:00
Eric Davis 934221337d Merged r4060 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4130 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:57 +00:00
Eric Davis c48e40af31 Merged r4059 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4129 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:50 +00:00
Eric Davis 47e12f12cc Merged r4058 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4128 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:45 +00:00
Eric Davis 897258289a Merged r4057 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4127 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:38 +00:00
Eric Davis 67867d99fe Merged r4056 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4126 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:32 +00:00
Eric Davis 32b2e84477 Merged r4055 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4125 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:26 +00:00
Eric Davis 1f278a0221 Merged r4054 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4124 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:20 +00:00
Eric Davis 5e49df04d2 Merged r4053 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4123 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:14 +00:00
Eric Davis 973c54d49b Merged r4052 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4122 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:07 +00:00
Eric Davis d2a4265f86 Merged r4051 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4121 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:58:00 +00:00
Eric Davis 771723c595 Merged r4050 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4120 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:53 +00:00
Eric Davis 8de76de8a1 Merged r4049 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4119 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:47 +00:00
Eric Davis f2711afe65 Merged r4048 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4118 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:41 +00:00
Eric Davis 8fa5019e69 Merged r4047 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4117 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:35 +00:00
Eric Davis 7b472a605d Merged r4043 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4116 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:28 +00:00
Eric Davis 56fba472a7 Merged r4042 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4115 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:22 +00:00
Eric Davis af5d9ca907 Merged r4040 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4114 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:16 +00:00
Eric Davis 8a42ca81a9 Merged r4039 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4113 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:11 +00:00
Eric Davis ada4c889be Merged r4038 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4112 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:05 +00:00
Eric Davis 6fe600b163 Merged r4037 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4111 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:57:00 +00:00
Eric Davis b2e82fd5a0 Merged r4036 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4110 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:56:53 +00:00
Eric Davis cee0dce6b7 Merged r4035 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4109 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:56:47 +00:00
Eric Davis d090e539f6 Merged r4034 form trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4108 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 03:56:41 +00:00
Eric Davis 29f9f3feff Merged r4029 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4032 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:21:25 +00:00
Eric Davis 2bea4b30a5 Merged r4028 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4031 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:21:20 +00:00
Eric Davis 00b53286fd Merged changelog from trunk, r4027.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4030 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:21:15 +00:00
Eric Davis c8c4fb130c Merged r4014 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4026 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:31 +00:00
Eric Davis 0d7cead479 Merged r4013 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4025 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:26 +00:00
Eric Davis b5d64b9a2f Merged r4012 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4024 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:19 +00:00
Eric Davis 519069b867 Merged r4011 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4023 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:14 +00:00
Eric Davis 7443f2a310 Merged r4010 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4022 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:08 +00:00
Eric Davis b419deb907 Merged r4009 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4021 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:49:03 +00:00
Eric Davis b8d5a05b20 Merged r4008 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4020 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:57 +00:00
Eric Davis e29244652c Merged r4007 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4019 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:52 +00:00
Eric Davis 27ef72c35e Merged r4006 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4018 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:45 +00:00
Eric Davis 86e986f014 Merged r4005 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4017 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:38 +00:00
Eric Davis d60cc50d99 Merged r4004 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4016 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:32 +00:00
Eric Davis 9e5d2100b6 Merged r4003 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4015 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:48:26 +00:00
Eric Davis ccbc9f8ff9 Merged r3952 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4002 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:48 +00:00
Eric Davis 047bf692b3 Merged r3951 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4001 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:42 +00:00
Eric Davis 3e692a908b Merged r3950 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4000 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:37 +00:00
Eric Davis d457f90fcd Merged r3949 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3999 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:31 +00:00
Eric Davis b9f23bedb7 Merged r3948 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3998 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:26 +00:00
Eric Davis d1a9f81fc6 Merged r3947 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3997 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:20 +00:00
Eric Davis 80e833cd88 Merged r3946 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3996 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:14 +00:00
Eric Davis a12a073a6e Merged r3945 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3995 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:08 +00:00
Eric Davis bc57078b12 Merged r3944 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3994 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:34:02 +00:00
Eric Davis 1c93f99a55 Merged r3943 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3993 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:57 +00:00
Eric Davis 758feaccab Merged r3942 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3992 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:51 +00:00
Eric Davis 2012c60bfd Merged r3941 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3991 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:46 +00:00
Eric Davis 8ca6941a33 Merged r3940 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3990 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:40 +00:00
Eric Davis 10a76f5e73 Merged r3939 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3989 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:34 +00:00
Eric Davis 6e5f567346 Merged r3938 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3988 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:29 +00:00
Eric Davis 7af610631f Merged r3937 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3987 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:23 +00:00
Eric Davis fab5064643 Merged r3936 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3986 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:18 +00:00
Eric Davis ab5ce45b43 Merged r3935 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3985 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:11 +00:00
Eric Davis 5345a2dd89 Merged r3934 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3984 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:33:05 +00:00
Eric Davis 7ca197b37f Merged r3933 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3983 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:59 +00:00
Eric Davis 72ce3e18f8 Merged r3932 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3982 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:53 +00:00
Eric Davis 358ee2ef2e Merged r3931 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3981 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:47 +00:00
Eric Davis b5b8d34d94 Merged r3930 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3980 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:42 +00:00
Eric Davis 597266e5a2 Merged r3929 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3979 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:36 +00:00
Eric Davis 36ad597b69 Merged r3928 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3978 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:31 +00:00
Eric Davis c67272599c Merged r3927 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3977 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:25 +00:00
Eric Davis b6bc3a3665 Merged r3926 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3976 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:19 +00:00
Eric Davis a96eb375ec Merged r3925 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3975 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:13 +00:00
Eric Davis c7e719fc4b Merged r3924 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3974 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:32:06 +00:00
Eric Davis 18d841553e Merged r3923 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3973 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:59 +00:00
Eric Davis 31d233e567 Merged r3922 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3972 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:53 +00:00
Eric Davis 4ff6070126 Merged r3921 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3971 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:48 +00:00
Eric Davis dfe44017b6 Merged r3920 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3970 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:42 +00:00
Eric Davis 7cae43314a Merged r3919 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3969 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:36 +00:00
Eric Davis 2f529fd834 Merged r3918 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3968 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:30 +00:00
Eric Davis 9892ede7b7 Merged r3917 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3967 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:24 +00:00
Eric Davis 102e845391 Merged r3916 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3966 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:18 +00:00
Eric Davis 7bdf0ab729 Merged r3915 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3965 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:12 +00:00
Eric Davis 4426fd695e Merged r3914 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3964 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:31:06 +00:00
Eric Davis 3f1c3fa020 Merged r3913 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3963 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:59 +00:00
Eric Davis 19bbb6e2cb Merged r3912 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3962 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:53 +00:00
Eric Davis b02463184a Merged r3911 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3961 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:48 +00:00
Eric Davis a6408945e5 Merged r3910 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3960 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:41 +00:00
Eric Davis c20e85e4dd Merged r3909 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3959 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:35 +00:00
Eric Davis 7a9fab7748 Merged r3908 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3958 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:29 +00:00
Eric Davis acaa223cf8 Merged r3907 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3957 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:23 +00:00
Eric Davis 8dde6e019d Merged r3906 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3956 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:30:03 +00:00
Eric Davis ae3d542664 Merged r3905 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3955 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:29:57 +00:00
Eric Davis c731d11209 Merged r3904 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3954 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:29:51 +00:00
Eric Davis 8458dc23d4 Merged r3903 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3953 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 04:29:46 +00:00
Eric Davis 9af4cb5c38 Merged r3899 from trunk
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3902 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-30 19:20:56 +00:00
Eric Davis df120e43cd Merged r3898 from trunk
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3901 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-30 19:20:52 +00:00
Eric Davis 59f98693ae Merged r3897 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3900 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-30 19:20:46 +00:00
Eric Davis 677fee310a Merged r3894 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3896 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-29 15:03:11 +00:00
Eric Davis 0843b188fb Merged r3893 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3895 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-29 15:03:06 +00:00
Jean-Philippe Lang 8f64938b9e Merged r3891 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3892 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 12:57:49 +00:00
Jean-Philippe Lang 29e7ae9698 Merged r3889 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3890 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 12:49:15 +00:00
Jean-Philippe Lang f682be8468 Merged r3887 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3888 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:56:45 +00:00
Jean-Philippe Lang e771fc03bd Merged r3883, r3884 and r3885 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3886 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:49:07 +00:00
Jean-Philippe Lang 52a12aaca8 Merged r3881 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3882 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:49:08 +00:00
Jean-Philippe Lang 8146e096f4 Merged r3879 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3880 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:35:35 +00:00
Jean-Philippe Lang 41e38483a6 Merged r3877 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3878 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:02:55 +00:00
Jean-Philippe Lang 41c6d3cef6 Merged r3875 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3876 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:56:07 +00:00
Jean-Philippe Lang ec526c1261 Merged r3873 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3874 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:52:07 +00:00
Jean-Philippe Lang b4122707f6 Merged r3871 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3872 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:48:51 +00:00
Jean-Philippe Lang f70a8cde88 Merged r3869 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3870 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:40:59 +00:00
Jean-Philippe Lang 69f34a595d Merged r3865 and r3866 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3867 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:34:04 +00:00
Eric Davis be52ccf01f Merged r3859 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3862 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-24 00:23:50 +00:00
Eric Davis 8a1d45ffd6 Merged r3860 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3861 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-24 00:20:35 +00:00
Eric Davis 4b52b7a8df Change version to the show this is the stable branch.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3857 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 16:39:00 +00:00
Eric Davis 6ed2e003a1 Merged r3854 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3856 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 16:38:56 +00:00
Eric Davis 1cc116fe5c Merged r3853 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3855 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 16:38:51 +00:00
Eric Davis 619c148719 Merged r3849 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3852 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 15:53:56 +00:00
Eric Davis 0ae9cc7d07 Merged r3848 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3851 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 15:53:51 +00:00
Eric Davis a2a3dae974 Merged r3847 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3850 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 15:53:46 +00:00
Eric Davis 4f5dc94170 Merged r3845 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3846 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 03:47:03 +00:00
Eric Davis 4775864d69 Adding 1.0 stable branch to prepare for 1.0.0 RC
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@3844 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 03:31:31 +00:00
213 changed files with 7449 additions and 4709 deletions
+1 -1
View File
@@ -2,4 +2,4 @@
Redmine is a flexible project management web application written using Ruby on Rails framework. Redmine is a flexible project management web application written using Ruby on Rails framework.
More details can be found at http://www.redmine.org More details can be found at in the doc directory or on the official website http://www.redmine.org
+6 -6
View File
@@ -83,9 +83,9 @@ class AccountController < ApplicationController
else else
@user = User.new(params[:user]) @user = User.new(params[:user])
@user.admin = false @user.admin = false
@user.status = User::STATUS_REGISTERED @user.register
if session[:auth_source_registration] if session[:auth_source_registration]
@user.status = User::STATUS_ACTIVE @user.activate
@user.login = session[:auth_source_registration][:login] @user.login = session[:auth_source_registration][:login]
@user.auth_source_id = session[:auth_source_registration][:auth_source_id] @user.auth_source_id = session[:auth_source_registration][:auth_source_id]
if @user.save if @user.save
@@ -116,8 +116,8 @@ class AccountController < ApplicationController
token = Token.find_by_action_and_value('register', params[:token]) token = Token.find_by_action_and_value('register', params[:token])
redirect_to(home_url) && return unless token and !token.expired? redirect_to(home_url) && return unless token and !token.expired?
user = token.user user = token.user
redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED redirect_to(home_url) && return unless user.registered?
user.status = User::STATUS_ACTIVE user.activate
if user.save if user.save
token.destroy token.destroy
flash[:notice] = l(:notice_account_activated) flash[:notice] = l(:notice_account_activated)
@@ -170,7 +170,7 @@ class AccountController < ApplicationController
user.mail = registration['email'] unless registration['email'].nil? user.mail = registration['email'] unless registration['email'].nil?
user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil? user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil?
user.random_password user.random_password
user.status = User::STATUS_REGISTERED user.register
case Setting.self_registration case Setting.self_registration
when '1' when '1'
@@ -241,7 +241,7 @@ class AccountController < ApplicationController
# Pass a block for behavior when a user fails to save # Pass a block for behavior when a user fails to save
def register_automatically(user, &block) def register_automatically(user, &block)
# Automatic activation # Automatic activation
user.status = User::STATUS_ACTIVE user.activate
user.last_login_on = Time.now user.last_login_on = Time.now
if user.save if user.save
self.logged_user = user self.logged_user = user
+59
View File
@@ -0,0 +1,59 @@
class ActivitiesController < ApplicationController
menu_item :activity
before_filter :find_optional_project
accept_key_auth :index
def index
@days = Setting.activity_days_default.to_i
if params[:from]
begin; @date_to = params[:from].to_date + 1; rescue; end
end
@date_to ||= Date.today + 1
@date_from = @date_to - @days
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
@author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
@activity.scope_select {|t| !params["show_#{t}"].nil?}
@activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
events = @activity.events(@date_from, @date_to)
if events.empty? || stale?(:etag => [events.first, User.current])
respond_to do |format|
format.html {
@events_by_day = events.group_by(&:event_date)
render :layout => false if request.xhr?
}
format.atom {
title = l(:label_activity)
if @author
title = @author.name
elsif @activity.scope.size == 1
title = l("label_#{@activity.scope.first.singularize}_plural")
end
render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
}
end
end
rescue ActiveRecord::RecordNotFound
render_404
end
private
# TODO: refactor, duplicated in projects_controller
def find_optional_project
return true unless params[:id]
@project = Project.find(params[:id])
authorize
rescue ActiveRecord::RecordNotFound
render_404
end
end
+46 -4
View File
@@ -201,7 +201,23 @@ class ApplicationController < ActionController::Base
def self.model_object(model) def self.model_object(model)
write_inheritable_attribute('model_object', model) write_inheritable_attribute('model_object', model)
end end
# Filter for bulk issue operations
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
projects = @issues.collect(&:project).compact.uniq
if projects.size == 1
@project = projects.first
else
# TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects'
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
# make sure that the user is a member of the project (or admin) if project is private # make sure that the user is a member of the project (or admin) if project is private
# used as a before_filter for actions that do not require any particular permission on the project # used as a before_filter for actions that do not require any particular permission on the project
def check_project_privacy def check_project_privacy
@@ -218,6 +234,10 @@ class ApplicationController < ActionController::Base
end end
end end
def back_url
params[:back_url] || request.env['HTTP_REFERER']
end
def redirect_back_or_default(default) def redirect_back_or_default(default)
back_url = CGI.unescape(params[:back_url].to_s) back_url = CGI.unescape(params[:back_url].to_s)
if !back_url.blank? if !back_url.blank?
@@ -238,7 +258,7 @@ class ApplicationController < ActionController::Base
def render_403 def render_403
@project = nil @project = nil
respond_to do |format| respond_to do |format|
format.html { render :template => "common/403", :layout => (request.xhr? ? false : 'base'), :status => 403 } format.html { render :template => "common/403", :layout => use_layout, :status => 403 }
format.atom { head 403 } format.atom { head 403 }
format.xml { head 403 } format.xml { head 403 }
format.js { head 403 } format.js { head 403 }
@@ -249,7 +269,7 @@ class ApplicationController < ActionController::Base
def render_404 def render_404
respond_to do |format| respond_to do |format|
format.html { render :template => "common/404", :layout => !request.xhr?, :status => 404 } format.html { render :template => "common/404", :layout => use_layout, :status => 404 }
format.atom { head 404 } format.atom { head 404 }
format.xml { head 404 } format.xml { head 404 }
format.js { head 404 } format.js { head 404 }
@@ -262,7 +282,7 @@ class ApplicationController < ActionController::Base
respond_to do |format| respond_to do |format|
format.html { format.html {
flash.now[:error] = msg flash.now[:error] = msg
render :text => '', :layout => !request.xhr?, :status => 500 render :text => '', :layout => use_layout, :status => 500
} }
format.atom { head 500 } format.atom { head 500 }
format.xml { head 500 } format.xml { head 500 }
@@ -270,6 +290,13 @@ class ApplicationController < ActionController::Base
format.json { head 500 } format.json { head 500 }
end end
end end
# Picks which layout to use based on the request
#
# @return [boolean, string] name of the layout to use or false for no layout
def use_layout
request.xhr? ? false : 'base'
end
def invalid_authenticity_token def invalid_authenticity_token
if api_request? if api_request?
@@ -345,6 +372,21 @@ class ApplicationController < ActionController::Base
flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present? flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present?
end end
# Sets the `flash` notice or error based the number of issues that did not save
#
# @param [Array, Issue] issues all of the saved and unsaved Issues
# @param [Array, Integer] unsaved_issue_ids the issue ids that were not saved
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless issues.empty?
else
flash[:error] = l(:notice_failed_to_save_issues,
:count => unsaved_issue_ids.size,
:total => issues.size,
:ids => '#' + unsaved_issue_ids.join(', #'))
end
end
# Rescues an invalid query statement. Just in case... # Rescues an invalid query statement. Just in case...
def query_statement_invalid(exception) def query_statement_invalid(exception)
logger.error "Query::StatementInvalid: #{exception.message}" if logger logger.error "Query::StatementInvalid: #{exception.message}" if logger
@@ -0,0 +1,25 @@
class AutoCompletesController < ApplicationController
before_filter :find_project
def issues
@issues = []
q = params[:q].to_s
if q.match(/^\d+$/)
@issues << @project.issues.visible.find_by_id(q.to_i)
end
unless q.blank?
@issues += @project.issues.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
end
render :layout => false
end
private
def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id)
rescue ActiveRecord::RecordNotFound
render_404
end
end
+1
View File
@@ -18,6 +18,7 @@
class BoardsController < ApplicationController class BoardsController < ApplicationController
default_search_scope :messages default_search_scope :messages
before_filter :find_project, :find_board_if_available, :authorize before_filter :find_project, :find_board_if_available, :authorize
accept_key_auth :index, :show
helper :messages helper :messages
include MessagesHelper include MessagesHelper
+1
View File
@@ -1,4 +1,5 @@
class CalendarsController < ApplicationController class CalendarsController < ApplicationController
menu_item :calendar
before_filter :find_optional_project before_filter :find_optional_project
rescue_from Query::StatementInvalid, :with => :query_statement_invalid rescue_from Query::StatementInvalid, :with => :query_statement_invalid
@@ -0,0 +1,39 @@
class ContextMenusController < ApplicationController
helper :watchers
def issues
@issues = Issue.find_all_by_id(params[:ids], :include => :project)
if (@issues.size == 1)
@issue = @issues.first
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
else
@allowed_statuses = @issues.map do |i|
i.new_statuses_allowed_to(User.current)
end.inject do |memo,s|
memo & s
end
end
@projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
:log_time => (@project && User.current.allowed_to?(:log_time, @project)),
:update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
}
if @project
@assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@trackers = @project.trackers
end
@priorities = IssuePriority.all.reverse
@statuses = IssueStatus.find(:all, :order => 'position')
@back = back_url
render :layout => false
end
end
+37
View File
@@ -0,0 +1,37 @@
class FilesController < ApplicationController
menu_item :files
before_filter :find_project
before_filter :authorize
helper :sort
include SortHelper
def index
sort_init 'filename', 'asc'
sort_update 'filename' => "#{Attachment.table_name}.filename",
'created_on' => "#{Attachment.table_name}.created_on",
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr?
end
# TODO: split method into new (GET) and create (POST)
def new
if request.post?
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = Attachment.attach_files(container, params[:attachments])
render_attachment_warning_if_needed(container)
if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments[:files])
end
redirect_to :controller => 'files', :action => 'index', :id => @project
return
end
@versions = @project.versions.sort
end
end
+2 -1
View File
@@ -1,4 +1,5 @@
class GanttsController < ApplicationController class GanttsController < ApplicationController
menu_item :gantt
before_filter :find_optional_project before_filter :find_optional_project
rescue_from Query::StatementInvalid, :with => :query_statement_invalid rescue_from Query::StatementInvalid, :with => :query_statement_invalid
@@ -37,7 +38,7 @@ class GanttsController < ApplicationController
respond_to do |format| respond_to do |format|
format.html { render :action => "show", :layout => !request.xhr? } format.html { render :action => "show", :layout => !request.xhr? }
format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image') format.png { send_data(@gantt.to_image(@project), :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") } format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") }
end end
end end
+16 -8
View File
@@ -141,14 +141,22 @@ class GroupsController < ApplicationController
@membership = Member.edit_membership(params[:membership_id], params[:membership], @group) @membership = Member.edit_membership(params[:membership_id], params[:membership], @group)
@membership.save if request.post? @membership.save if request.post?
respond_to do |format| respond_to do |format|
format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' } if @membership.valid?
format.js { format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' }
render(:update) {|page| format.js {
page.replace_html "tab-content-memberships", :partial => 'groups/memberships' render(:update) {|page|
page.visual_effect(:highlight, "member-#{@membership.id}") page.replace_html "tab-content-memberships", :partial => 'groups/memberships'
} page.visual_effect(:highlight, "member-#{@membership.id}")
} }
end }
else
format.js {
render(:update) {|page|
page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
}
}
end
end
end end
def destroy_membership def destroy_membership
+65
View File
@@ -0,0 +1,65 @@
class IssueMovesController < ApplicationController
default_search_scope :issues
before_filter :find_issues
before_filter :authorize
def new
prepare_for_issue_move
render :layout => false if request.xhr?
end
def create
prepare_for_issue_move
if request.post?
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
unsaved_issue_ids = []
moved_issues = []
@issues.each do |issue|
issue.reload
issue.init_journal(User.current)
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)})
moved_issues << r
else
unsaved_issue_ids << issue.id
end
end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
if params[:follow]
if @issues.size == 1 && moved_issues.size == 1
redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first
else
redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project)
end
else
redirect_to :controller => 'issues', :action => 'index', :project_id => @project
end
return
end
end
private
def prepare_for_issue_move
@issues.sort!
@copy = params[:copy_options] && params[:copy_options][:copy]
@allowed_projects = Issue.allowed_target_projects_on_move
@target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
@target_project ||= @project
@trackers = @target_project.trackers
@available_statuses = Workflow.available_statuses(@project)
end
def extract_changed_attributes_for_move(params)
changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
end
changed_attributes
end
end
+46 -206
View File
@@ -19,14 +19,14 @@ class IssuesController < ApplicationController
menu_item :new_issue, :only => [:new, :create] menu_item :new_issue, :only => [:new, :create]
default_search_scope :issues default_search_scope :issues
before_filter :find_issue, :only => [:show, :edit, :update, :reply] before_filter :find_issue, :only => [:show, :edit, :update]
before_filter :find_issues, :only => [:bulk_edit, :move, :destroy] before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy]
before_filter :find_project, :only => [:new, :create, :update_form, :preview, :auto_complete] before_filter :find_project, :only => [:new, :create]
before_filter :authorize, :except => [:index, :changes, :preview, :context_menu] before_filter :authorize, :except => [:index]
before_filter :find_optional_project, :only => [:index, :changes] before_filter :find_optional_project, :only => [:index]
before_filter :check_for_default_issue_status, :only => [:new, :create] before_filter :check_for_default_issue_status, :only => [:new, :create]
before_filter :build_new_issue_from_params, :only => [:new, :create] before_filter :build_new_issue_from_params, :only => [:new, :create]
accept_key_auth :index, :show, :changes accept_key_auth :index, :show
rescue_from Query::StatementInvalid, :with => :query_statement_invalid rescue_from Query::StatementInvalid, :with => :query_statement_invalid
@@ -54,6 +54,7 @@ class IssuesController < ApplicationController
:render => { :nothing => true, :status => :method_not_allowed } :render => { :nothing => true, :status => :method_not_allowed }
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed } verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
verify :method => :post, :only => :bulk_update, :render => {:nothing => true, :status => :method_not_allowed }
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed } verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def index def index
@@ -95,21 +96,6 @@ class IssuesController < ApplicationController
render_404 render_404
end end
def changes
retrieve_query
sort_init 'id', 'desc'
sort_update(@query.sortable_columns)
if @query.valid?
@journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC",
:limit => 25)
end
@title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
render :layout => false, :content_type => 'application/atom+xml'
rescue ActiveRecord::RecordNotFound
render_404
end
def show def show
@journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC") @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
@journals.each_with_index {|j,i| j.indice = i+1} @journals.each_with_index {|j,i| j.indice = i+1}
@@ -124,7 +110,7 @@ class IssuesController < ApplicationController
format.html { render :template => 'issues/show.rhtml' } format.html { render :template => 'issues/show.rhtml' }
format.xml { render :layout => false } format.xml { render :layout => false }
format.json { render :text => @issue.to_json, :layout => false } format.json { render :text => @issue.to_json, :layout => false }
format.atom { render :action => 'changes', :layout => false, :content_type => 'application/atom+xml' } format.atom { render :template => 'journals/index', :layout => false, :content_type => 'application/atom+xml' }
format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") } format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
end end
end end
@@ -132,7 +118,10 @@ class IssuesController < ApplicationController
# Add a new issue # Add a new issue
# The new issue will be created from an existing one if copy_from parameter is given # The new issue will be created from an existing one if copy_from parameter is given
def new def new
render :action => 'new', :layout => !request.xhr? respond_to do |format|
format.html { render :action => 'new', :layout => !request.xhr? }
format.js { render :partial => 'attributes' }
end
end end
def create def create
@@ -144,7 +133,7 @@ class IssuesController < ApplicationController
call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue}) call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue})
respond_to do |format| respond_to do |format|
format.html { format.html {
redirect_to(params[:continue] ? { :action => 'new', :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } : redirect_to(params[:continue] ? { :action => 'new', :project_id => @project, :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } :
{ :action => 'show', :id => @issue }) { :action => 'show', :id => @issue })
} }
format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'issues', :action => 'show', :id => @issue) } format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'issues', :action => 'show', :id => @issue) }
@@ -200,98 +189,30 @@ class IssuesController < ApplicationController
end end
end end
def reply
journal = Journal.find(params[:journal_id]) if params[:journal_id]
if journal
user = journal.user
text = journal.notes
else
user = @issue.author
text = @issue.description
end
# Replaces pre blocks with [...]
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
render(:update) { |page|
page.<< "$('notes').value = \"#{escape_javascript content}\";"
page.show 'update'
page << "Form.Element.focus('notes');"
page << "Element.scrollTo('update');"
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
}
end
# Bulk edit a set of issues # Bulk edit a set of issues
def bulk_edit def bulk_edit
@issues.sort! @issues.sort!
if request.post?
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
unsaved_issue_ids = []
@issues.each do |issue|
issue.reload
journal = issue.init_journal(User.current, params[:notes])
issue.safe_attributes = attributes
call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue })
unless issue.save
# Keep unsaved issue ids to display them in flash error
unsaved_issue_ids << issue.id
end
end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project})
return
end
@available_statuses = Workflow.available_statuses(@project) @available_statuses = Workflow.available_statuses(@project)
@custom_fields = @project.all_issue_custom_fields @custom_fields = @project.all_issue_custom_fields
end end
def move def bulk_update
@issues.sort! @issues.sort!
@copy = params[:copy_options] && params[:copy_options][:copy] attributes = parse_params_for_bulk_issue_attributes(params)
@allowed_projects = Issue.allowed_target_projects_on_move
@target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
@target_project ||= @project
@trackers = @target_project.trackers
@available_statuses = Workflow.available_statuses(@project)
if request.post?
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
unsaved_issue_ids = []
moved_issues = []
@issues.each do |issue|
issue.reload
changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
end
issue.init_journal(User.current)
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => changed_attributes})
moved_issues << r
else
unsaved_issue_ids << issue.id
end
end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
if params[:follow] unsaved_issue_ids = []
if @issues.size == 1 && moved_issues.size == 1 @issues.each do |issue|
redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first issue.reload
else journal = issue.init_journal(User.current, params[:notes])
redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project) issue.safe_attributes = attributes
end call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue })
else unless issue.save
redirect_to :controller => 'issues', :action => 'index', :project_id => @project # Keep unsaved issue ids to display them in flash error
unsaved_issue_ids << issue.id
end end
return
end end
render :layout => false if request.xhr? set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project})
end end
def destroy def destroy
@@ -324,77 +245,7 @@ class IssuesController < ApplicationController
format.json { head :ok } format.json { head :ok }
end end
end end
def context_menu
@issues = Issue.find_all_by_id(params[:ids], :include => :project)
if (@issues.size == 1)
@issue = @issues.first
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
end
projects = @issues.collect(&:project).compact.uniq
@project = projects.first if projects.size == 1
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
:log_time => (@project && User.current.allowed_to?(:log_time, @project)),
:update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
}
if @project
@assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@trackers = @project.trackers
end
@priorities = IssuePriority.all.reverse
@statuses = IssueStatus.find(:all, :order => 'position')
@back = params[:back_url] || request.env['HTTP_REFERER']
render :layout => false
end
def update_form
if params[:id].blank?
@issue = Issue.new
@issue.project = @project
else
@issue = @project.issues.visible.find(params[:id])
end
@issue.attributes = params[:issue]
@allowed_statuses = ([@issue.status] + @issue.status.find_new_statuses_allowed_to(User.current.roles_for_project(@project), @issue.tracker)).uniq
@priorities = IssuePriority.all
render :partial => 'attributes'
end
def preview
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
if @issue
@attachements = @issue.attachments
@description = params[:issue] && params[:issue][:description]
if @description && @description.gsub(/(\r?\n|\n\r?)/, "\n") == @issue.description.to_s.gsub(/(\r?\n|\n\r?)/, "\n")
@description = nil
end
@notes = params[:notes]
else
@description = (params[:issue] ? params[:issue][:description] : nil)
end
render :layout => false
end
def auto_complete
@issues = []
q = params[:q].to_s
if q.match(/^\d+$/)
@issues << @project.issues.visible.find_by_id(q.to_i)
end
unless q.blank?
@issues += @project.issues.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
end
render :layout => false
end
private private
def find_issue def find_issue
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category]) @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
@@ -403,22 +254,6 @@ private
render_404 render_404
end end
# Filter for bulk operations
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
projects = @issues.collect(&:project).compact.uniq
if projects.size == 1
@project = projects.first
else
# TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects'
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
def find_project def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id] project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id) @project = Project.find(project_id)
@@ -435,7 +270,7 @@ private
@edit_allowed = User.current.allowed_to?(:edit_issues, @project) @edit_allowed = User.current.allowed_to?(:edit_issues, @project)
@time_entry = TimeEntry.new @time_entry = TimeEntry.new
@notes = params[:notes] @notes = params[:notes] || (params[:issue].present? ? params[:issue][:notes] : nil)
@issue.init_journal(User.current, @notes) @issue.init_journal(User.current, @notes)
# User can change issue attributes only if he has :edit permission or if a workflow transition is allowed # User can change issue attributes only if he has :edit permission or if a workflow transition is allowed
if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue] if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue]
@@ -448,9 +283,16 @@ private
end end
# TODO: Refactor, lots of extra code in here # TODO: Refactor, lots of extra code in here
# TODO: Changing tracker on an existing issue should not trigger this
def build_new_issue_from_params def build_new_issue_from_params
@issue = Issue.new if params[:id].blank?
@issue.copy_from(params[:copy_from]) if params[:copy_from] @issue = Issue.new
@issue.copy_from(params[:copy_from]) if params[:copy_from]
@issue.project = @project
else
@issue = @project.issues.visible.find(params[:id])
end
@issue.project = @project @issue.project = @project
# Tracker must be set before custom field values # Tracker must be set before custom field values
@issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first) @issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first)
@@ -460,7 +302,9 @@ private
end end
if params[:issue].is_a?(Hash) if params[:issue].is_a?(Hash)
@issue.safe_attributes = params[:issue] @issue.safe_attributes = params[:issue]
@issue.watcher_user_ids = params[:issue]['watcher_user_ids'] if User.current.allowed_to?(:add_issue_watchers, @project) if User.current.allowed_to?(:add_issue_watchers, @project) && @issue.new_record?
@issue.watcher_user_ids = params[:issue]['watcher_user_ids']
end
end end
@issue.author = User.current @issue.author = User.current
@issue.start_date ||= Date.today @issue.start_date ||= Date.today
@@ -468,21 +312,17 @@ private
@allowed_statuses = @issue.new_statuses_allowed_to(User.current, true) @allowed_statuses = @issue.new_statuses_allowed_to(User.current, true)
end end
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless issues.empty?
else
flash[:error] = l(:notice_failed_to_save_issues,
:count => unsaved_issue_ids.size,
:total => issues.size,
:ids => '#' + unsaved_issue_ids.join(', #'))
end
end
def check_for_default_issue_status def check_for_default_issue_status
if IssueStatus.default.nil? if IssueStatus.default.nil?
render_error l(:error_no_default_issue_status) render_error l(:error_no_default_issue_status)
return false return false
end end
end end
def parse_params_for_bulk_issue_attributes(params)
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
attributes
end
end end
+56 -1
View File
@@ -16,7 +16,54 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class JournalsController < ApplicationController class JournalsController < ApplicationController
before_filter :find_journal before_filter :find_journal, :only => [:edit]
before_filter :find_issue, :only => [:new]
before_filter :find_optional_project, :only => [:index]
accept_key_auth :index
helper :issues
helper :queries
include QueriesHelper
helper :sort
include SortHelper
def index
retrieve_query
sort_init 'id', 'desc'
sort_update(@query.sortable_columns)
if @query.valid?
@journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC",
:limit => 25)
end
@title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
render :layout => false, :content_type => 'application/atom+xml'
rescue ActiveRecord::RecordNotFound
render_404
end
def new
journal = Journal.find(params[:journal_id]) if params[:journal_id]
if journal
user = journal.user
text = journal.notes
else
user = @issue.author
text = @issue.description
end
# Replaces pre blocks with [...]
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
render(:update) { |page|
page.<< "$('notes').value = \"#{escape_javascript content}\";"
page.show 'update'
page << "Form.Element.focus('notes');"
page << "Element.scrollTo('update');"
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
}
end
def edit def edit
if request.post? if request.post?
@@ -38,4 +85,12 @@ private
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
render_404 render_404
end end
# TODO: duplicated in IssuesController
def find_issue
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
@project = @issue.project
rescue ActiveRecord::RecordNotFound
render_404
end
end end
+28
View File
@@ -0,0 +1,28 @@
class PreviewsController < ApplicationController
before_filter :find_project
def issue
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
if @issue
@attachements = @issue.attachments
@description = params[:issue] && params[:issue][:description]
if @description && @description.gsub(/(\r?\n|\n\r?)/, "\n") == @issue.description.to_s.gsub(/(\r?\n|\n\r?)/, "\n")
@description = nil
end
@notes = params[:notes]
else
@description = (params[:issue] ? params[:issue][:description] : nil)
end
render :layout => false
end
private
def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id)
rescue ActiveRecord::RecordNotFound
render_404
end
end
@@ -0,0 +1,26 @@
class ProjectEnumerationsController < ApplicationController
before_filter :find_project
before_filter :authorize
def save
if request.post? && params[:enumerations]
Project.transaction do
params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity)
end
end
flash[:notice] = l(:notice_successful_update)
end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
def destroy
@project.time_entry_activities.each do |time_entry_activity|
time_entry_activity.destroy(time_entry_activity.parent)
end
flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
end
+66 -184
View File
@@ -17,24 +17,24 @@
class ProjectsController < ApplicationController class ProjectsController < ApplicationController
menu_item :overview menu_item :overview
menu_item :activity, :only => :activity
menu_item :roadmap, :only => :roadmap menu_item :roadmap, :only => :roadmap
menu_item :files, :only => [:list_files, :add_file]
menu_item :settings, :only => :settings menu_item :settings, :only => :settings
before_filter :find_project, :except => [ :index, :list, :add, :copy, :activity ] before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ]
before_filter :find_optional_project, :only => :activity before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy]
before_filter :authorize, :except => [ :index, :list, :add, :copy, :archive, :unarchive, :destroy, :activity ] before_filter :authorize_global, :only => [:new, :create]
before_filter :authorize_global, :only => :add
before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ] before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
accept_key_auth :activity, :index accept_key_auth :index
after_filter :only => [:add, :edit, :archive, :unarchive, :destroy] do |controller| after_filter :only => [:create, :edit, :update, :archive, :unarchive, :destroy] do |controller|
if controller.request.post? if controller.request.post?
controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt' controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
end end
end end
# TODO: convert to PUT only
verify :method => [:post, :put], :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
helper :sort helper :sort
include SortHelper include SortHelper
helper :custom_fields helper :custom_fields
@@ -63,40 +63,45 @@ class ProjectsController < ApplicationController
end end
end end
# Add a new project def new
def add
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position") @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@trackers = Tracker.all @trackers = Tracker.all
@project = Project.new(params[:project]) @project = Project.new(params[:project])
if request.get?
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers? @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
@project.trackers = Tracker.all @project.trackers = Tracker.all
@project.is_public = Setting.default_projects_public? @project.is_public = Setting.default_projects_public?
@project.enabled_module_names = Setting.default_projects_modules @project.enabled_module_names = Setting.default_projects_modules
else end
@project.enabled_module_names = params[:enabled_modules]
if validate_parent_id && @project.save def create
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
# Add current user as a project member if he is not admin @trackers = Tracker.all
unless User.current.admin? @project = Project.new(params[:project])
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
m = Member.new(:user => User.current, :roles => [r]) @project.enabled_module_names = params[:enabled_modules]
@project.members << m if validate_parent_id && @project.save
end @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
respond_to do |format| # Add current user as a project member if he is not admin
format.html { unless User.current.admin?
flash[:notice] = l(:notice_successful_create) r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
redirect_to :controller => 'projects', :action => 'settings', :id => @project m = Member.new(:user => User.current, :roles => [r])
} @project.members << m
format.xml { head :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
end
else
respond_to do |format|
format.html
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
end end
end respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project
}
format.xml { head :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
end
else
respond_to do |format|
format.html { render :action => 'new' }
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
end
end end
def copy def copy
@@ -120,13 +125,13 @@ class ProjectsController < ApplicationController
if validate_parent_id && @project.copy(@source_project, :only => params[:only]) if validate_parent_id && @project.copy(@source_project, :only => params[:only])
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
flash[:notice] = l(:notice_successful_create) flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'admin', :action => 'projects' redirect_to :controller => 'projects', :action => 'settings'
elsif !@project.new_record? elsif !@project.new_record?
# Project was created # Project was created
# But some objects were not copied due to validation failures # But some objects were not copied due to validation failures
# (eg. issues from disabled trackers) # (eg. issues from disabled trackers)
# TODO: inform about that # TODO: inform about that
redirect_to :controller => 'admin', :action => 'projects' redirect_to :controller => 'projects', :action => 'settings'
end end
end end
end end
@@ -177,28 +182,27 @@ class ProjectsController < ApplicationController
@wiki ||= @project.wiki @wiki ||= @project.wiki
end end
# Edit @project
def edit def edit
if request.get? end
def update
@project.attributes = params[:project]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project
}
format.xml { head :ok }
end
else else
@project.attributes = params[:project] respond_to do |format|
if validate_parent_id && @project.save format.html {
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') settings
respond_to do |format| render :action => 'settings'
format.html { }
flash[:notice] = l(:notice_successful_update) format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
redirect_to :action => 'settings', :id => @project
}
format.xml { head :ok }
end
else
respond_to do |format|
format.html {
settings
render :action => 'settings'
}
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
end
end end
end end
end end
@@ -241,120 +245,6 @@ class ProjectsController < ApplicationController
@project = nil @project = nil
end end
def add_file
if request.post?
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = Attachment.attach_files(container, params[:attachments])
render_attachment_warning_if_needed(container)
if !attachments.empty? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments[:files])
end
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
return
end
@versions = @project.versions.sort
end
def save_activities
if request.post? && params[:enumerations]
Project.transaction do
params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity)
end
end
flash[:notice] = l(:notice_successful_update)
end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
def reset_activities
@project.time_entry_activities.each do |time_entry_activity|
time_entry_activity.destroy(time_entry_activity.parent)
end
flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
def list_files
sort_init 'filename', 'asc'
sort_update 'filename' => "#{Attachment.table_name}.filename",
'created_on' => "#{Attachment.table_name}.created_on",
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr?
end
def roadmap
@trackers = @project.trackers.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
@versions = @project.shared_versions || []
@versions += @project.rolled_up_versions.visible if @with_subprojects
@versions = @versions.uniq.sort
@versions.reject! {|version| version.closed? || version.completed? } unless params[:completed]
@issues_by_version = {}
unless @selected_tracker_ids.empty?
@versions.each do |version|
issues = version.fixed_issues.visible.find(:all,
:include => [:project, :status, :tracker, :priority],
:conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
:order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
@issues_by_version[version] = issues
end
end
@versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
end
def activity
@days = Setting.activity_days_default.to_i
if params[:from]
begin; @date_to = params[:from].to_date + 1; rescue; end
end
@date_to ||= Date.today + 1
@date_from = @date_to - @days
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
@author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
@activity.scope_select {|t| !params["show_#{t}"].nil?}
@activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
events = @activity.events(@date_from, @date_to)
if events.empty? || stale?(:etag => [events.first, User.current])
respond_to do |format|
format.html {
@events_by_day = events.group_by(&:event_date)
render :layout => false if request.xhr?
}
format.atom {
title = l(:label_activity)
if @author
title = @author.name
elsif @activity.scope.size == 1
title = l("label_#{@activity.scope.first.singularize}_plural")
end
render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
}
end
end
rescue ActiveRecord::RecordNotFound
render_404
end
private private
def find_optional_project def find_optional_project
return true unless params[:id] return true unless params[:id]
@@ -364,14 +254,6 @@ private
render_404 render_404
end end
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
if ids = params[:tracker_ids]
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
else
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end
end
# Validates parent_id param according to user's permissions # Validates parent_id param according to user's permissions
# TODO: move it to Project model in a validation that depends on User.current # TODO: move it to Project model in a validation that depends on User.current
def validate_parent_id def validate_parent_id
+11 -4
View File
@@ -55,8 +55,7 @@ class TimelogController < ApplicationController
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours" sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
sql << " FROM #{TimeEntry.table_name}" sql << " FROM #{TimeEntry.table_name}"
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id" sql << time_report_joins
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
sql << " WHERE" sql << " WHERE"
sql << " (%s) AND" % sql_condition sql << " (%s) AND" % sql_condition
sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)] sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)]
@@ -261,8 +260,8 @@ private
end end
@from, @to = @to, @from if @from && @to && @from > @to @from, @to = @to, @from if @from && @to && @from > @to
@from ||= (TimeEntry.minimum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries)) || Date.today) - 1 @from ||= (TimeEntry.earilest_date_for_project(@project) || Date.today)
@to ||= (TimeEntry.maximum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries)) || Date.today) @to ||= (TimeEntry.latest_date_for_project(@project) || Date.today)
end end
def load_available_criterias def load_available_criterias
@@ -314,4 +313,12 @@ private
call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project }) call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project })
@available_criterias @available_criterias
end end
def time_report_joins
sql = ''
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
call_hook(:controller_timelog_time_report_joins, {:sql => sql} )
sql
end
end end
+21 -13
View File
@@ -53,10 +53,8 @@ class UsersController < ApplicationController
@user = User.find(params[:id]) @user = User.find(params[:id])
@custom_values = @user.custom_values @custom_values = @user.custom_values
# show only public projects and private projects that the logged in user is also a member of # show projects based on current user visibility
@memberships = @user.memberships.select do |membership| @memberships = @user.memberships.all(:conditions => Project.visible_by(User.current))
membership.project.is_public? || (User.current.member_of?(membership.project))
end
events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10) events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
@events_by_day = events.group_by(&:event_date) @events_by_day = events.group_by(&:event_date)
@@ -97,7 +95,9 @@ class UsersController < ApplicationController
if request.post? if request.post?
@user.admin = params[:user][:admin] if params[:user][:admin] @user.admin = params[:user][:admin] if params[:user][:admin]
@user.login = params[:user][:login] if params[:user][:login] @user.login = params[:user][:login] if params[:user][:login]
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty? or @user.auth_source_id if params[:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?)
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
end
@user.group_ids = params[:user][:group_ids] if params[:user][:group_ids] @user.group_ids = params[:user][:group_ids] if params[:user][:group_ids]
@user.attributes = params[:user] @user.attributes = params[:user]
# Was the account actived ? (do it before User#save clears the change) # Was the account actived ? (do it before User#save clears the change)
@@ -123,14 +123,22 @@ class UsersController < ApplicationController
@membership = Member.edit_membership(params[:membership_id], params[:membership], @user) @membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
@membership.save if request.post? @membership.save if request.post?
respond_to do |format| respond_to do |format|
format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' } if @membership.valid?
format.js { format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
render(:update) {|page| format.js {
page.replace_html "tab-content-memberships", :partial => 'users/memberships' render(:update) {|page|
page.visual_effect(:highlight, "member-#{@membership.id}") page.replace_html "tab-content-memberships", :partial => 'users/memberships'
} page.visual_effect(:highlight, "member-#{@membership.id}")
} }
end }
else
format.js {
render(:update) {|page|
page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
}
}
end
end
end end
def destroy_membership def destroy_membership
+55 -5
View File
@@ -18,15 +18,42 @@
class VersionsController < ApplicationController class VersionsController < ApplicationController
menu_item :roadmap menu_item :roadmap
model_object Version model_object Version
before_filter :find_model_object, :except => [:new, :close_completed] before_filter :find_model_object, :except => [:index, :new, :create, :close_completed]
before_filter :find_project_from_association, :except => [:new, :close_completed] before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed]
before_filter :find_project, :only => [:new, :close_completed] before_filter :find_project, :only => [:index, :new, :create, :close_completed]
before_filter :authorize before_filter :authorize
helper :custom_fields helper :custom_fields
helper :projects helper :projects
def index
@trackers = @project.trackers.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
@versions = @project.shared_versions || []
@versions += @project.rolled_up_versions.visible if @with_subprojects
@versions = @versions.uniq.sort
@versions.reject! {|version| version.closed? || version.completed? } unless params[:completed]
@issues_by_version = {}
unless @selected_tracker_ids.empty?
@versions.each do |version|
issues = version.fixed_issues.visible.find(:all,
:include => [:project, :status, :tracker, :priority],
:conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
:order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
@issues_by_version[version] = issues
end
end
@versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
end
def show def show
@issues = @version.fixed_issues.visible.find(:all,
:include => [:status, :tracker, :priority],
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id")
end end
def new def new
@@ -36,6 +63,17 @@ class VersionsController < ApplicationController
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing']) attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
@version.attributes = attributes @version.attributes = attributes
end end
end
def create
# TODO: refactor with code above in #new
@version = @project.versions.build
if params[:version]
attributes = params[:version].dup
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
@version.attributes = attributes
end
if request.post? if request.post?
if @version.save if @version.save
respond_to do |format| respond_to do |format|
@@ -52,7 +90,7 @@ class VersionsController < ApplicationController
end end
else else
respond_to do |format| respond_to do |format|
format.html format.html { render :action => 'new' }
format.js do format.js do
render(:update) {|page| page.alert(@version.errors.full_messages.join('\n')) } render(:update) {|page| page.alert(@version.errors.full_messages.join('\n')) }
end end
@@ -60,8 +98,11 @@ class VersionsController < ApplicationController
end end
end end
end end
def edit def edit
end
def update
if request.post? && params[:version] if request.post? && params[:version]
attributes = params[:version].dup attributes = params[:version].dup
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing']) attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
@@ -102,4 +143,13 @@ private
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
render_404 render_404
end end
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
if ids = params[:tracker_ids]
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
else
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end
end
end end
-8
View File
@@ -20,12 +20,4 @@ module AdminHelper
options_for_select([[l(:label_all), ''], options_for_select([[l(:label_all), ''],
[l(:status_active), 1]], selected) [l(:status_active), 1]], selected)
end end
def css_project_classes(project)
s = 'project'
s << ' root' if project.root?
s << ' child' if project.child?
s << (project.leaf? ? ' leaf' : ' parent')
s
end
end end
+65 -9
View File
@@ -32,8 +32,27 @@ module ApplicationHelper
end end
# Display a link if user is authorized # Display a link if user is authorized
#
# @param [String] name Anchor text (passed to link_to)
# @param [Hash, String] options Hash params or url for the link target (passed to link_to).
# This will checked by authorize_for to see if the user is authorized
# @param [optional, Hash] html_options Options passed to link_to
# @param [optional, Hash] parameters_for_method_reference Extra parameters for link_to
def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference) def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action]) if options.is_a?(String)
begin
route = ActionController::Routing::Routes.recognize_path(options.gsub(/\?.*/,''), :method => options[:method] || :get)
link_controller = route[:controller]
link_action = route[:action]
rescue ActionController::RoutingError # Parse failed, not a route
link_controller, link_action = nil, nil
end
else
link_controller = options[:controller] || params[:controller]
link_action = options[:action]
end
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(link_controller, link_action)
end end
# Display a link to remote if user is authorized # Display a link to remote if user is authorized
@@ -103,6 +122,23 @@ module ApplicationHelper
link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => revision}, :title => l(:label_revision_id, revision)) link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => revision}, :title => l(:label_revision_id, revision))
end end
# Generates a link to a project if active
# Examples:
#
# link_to_project(project) # => link to the specified project overview
# link_to_project(project, :action=>'settings') # => link to project settings
# link_to_project(project, {:only_path => false}, :class => "project") # => 3rd arg adds html options
# link_to_project(project, {}, :class => "project") # => html options with default url (project overview)
#
def link_to_project(project, options={}, html_options = nil)
if project.active?
url = {:controller => 'projects', :action => 'show', :id => project}.merge(options)
link_to(h(project), url, html_options)
else
h(project)
end
end
def toggle_link(name, id, options={}) def toggle_link(name, id, options={})
onclick = "Element.toggle('#{id}'); " onclick = "Element.toggle('#{id}'); "
onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ") onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
@@ -285,7 +321,7 @@ module ApplicationHelper
def time_tag(time) def time_tag(time)
text = distance_of_time_in_words(Time.now, time) text = distance_of_time_in_words(Time.now, time)
if @project if @project
link_to(text, {:controller => 'projects', :action => 'activity', :id => @project, :from => time.to_date}, :title => format_time(time)) link_to(text, {:controller => 'activities', :action => 'index', :id => @project, :from => time.to_date}, :title => format_time(time))
else else
content_tag('acronym', text, :title => format_time(time)) content_tag('acronym', text, :title => format_time(time))
end end
@@ -368,12 +404,12 @@ module ApplicationHelper
ancestors = (@project.root? ? [] : @project.ancestors.visible) ancestors = (@project.root? ? [] : @project.ancestors.visible)
if ancestors.any? if ancestors.any?
root = ancestors.shift root = ancestors.shift
b << link_to(h(root), {:controller => 'projects', :action => 'show', :id => root, :jump => current_menu_item}, :class => 'root') b << link_to_project(root, {:jump => current_menu_item}, :class => 'root')
if ancestors.size > 2 if ancestors.size > 2
b << '&#8230;' b << '&#8230;'
ancestors = ancestors[-2, 2] ancestors = ancestors[-2, 2]
end end
b += ancestors.collect {|p| link_to(h(p), {:controller => 'projects', :action => 'show', :id => p, :jump => current_menu_item}, :class => 'ancestor') } b += ancestors.collect {|p| link_to_project(p, {:jump => current_menu_item}, :class => 'ancestor') }
end end
b << h(@project) b << h(@project)
b.join(' &#187; ') b.join(' &#187; ')
@@ -393,6 +429,19 @@ module ApplicationHelper
end end
end end
# Returns the theme, controller name, and action as css classes for the
# HTML body.
def body_css_classes
css = []
if theme = Redmine::Themes.theme(Setting.ui_theme)
css << 'theme-' + theme.name
end
css << 'controller-' + params[:controller]
css << 'action-' + params[:action]
css.join(' ')
end
def accesskey(s) def accesskey(s)
Redmine::AccessKeys.key_for s Redmine::AccessKeys.key_for s
end end
@@ -592,8 +641,7 @@ module ApplicationHelper
end end
when 'project' when 'project'
if p = Project.visible.find_by_id(oid) if p = Project.visible.find_by_id(oid)
link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p}, link = link_to_project(p, {:only_path => only_path}, :class => 'project')
:class => 'project'
end end
end end
elsif sep == ':' elsif sep == ':'
@@ -635,8 +683,7 @@ module ApplicationHelper
end end
when 'project' when 'project'
if p = Project.visible.find(:first, :conditions => ["identifier = :s OR LOWER(name) = :s", {:s => name.downcase}]) if p = Project.visible.find(:first, :conditions => ["identifier = :s OR LOWER(name) = :s", {:s => name.downcase}])
link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p}, link = link_to_project(p, {:only_path => only_path}, :class => 'project')
:class => 'project'
end end
end end
end end
@@ -709,6 +756,11 @@ module ApplicationHelper
javascript_include_tag('context_menu') + javascript_include_tag('context_menu') +
stylesheet_link_tag('context_menu') stylesheet_link_tag('context_menu')
end end
if l(:direction) == 'rtl'
content_for :header_tags do
stylesheet_link_tag('context_menu_rtl')
end
end
@context_menu_included = true @context_menu_included = true
end end
javascript_tag "new ContextMenu('#{ url_for(url) }')" javascript_tag "new ContextMenu('#{ url_for(url) }')"
@@ -772,7 +824,7 @@ module ApplicationHelper
# +user+ can be a User or a string that will be scanned for an email address (eg. 'joe <joe@foo.bar>') # +user+ can be a User or a string that will be scanned for an email address (eg. 'joe <joe@foo.bar>')
def avatar(user, options = { }) def avatar(user, options = { })
if Setting.gravatar_enabled? if Setting.gravatar_enabled?
options.merge!({:ssl => Setting.protocol == 'https', :default => Setting.gravatar_default}) options.merge!({:ssl => (defined?(request) && request.ssl?), :default => Setting.gravatar_default})
email = nil email = nil
if user.respond_to?(:mail) if user.respond_to?(:mail)
email = user.mail email = user.mail
@@ -783,6 +835,10 @@ module ApplicationHelper
end end
end end
def favicon
"<link rel='shortcut icon' href='#{image_path('/favicon.ico')}' />"
end
private private
def wiki_helper def wiki_helper
+38
View File
@@ -0,0 +1,38 @@
module CalendarsHelper
def link_to_previous_month(year, month)
target_year, target_month = if month == 1
[year - 1, 12]
else
[year, month - 1]
end
name = if target_month == 12
"#{month_name(target_month)} #{target_year}"
else
"#{month_name(target_month)}"
end
link_to_remote ('&#171; ' + name),
{:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month => target_month)}
end
def link_to_next_month(year, month)
target_year, target_month = if month == 12
[year + 1, 1]
else
[year, month + 1]
end
name = if target_month == 1
"#{month_name(target_month)} #{target_year}"
else
"#{month_name(target_month)}"
end
link_to_remote (name + ' &#187;'),
{:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month =>target_month)}
end
end
+2
View File
@@ -0,0 +1,2 @@
module IssueMovesHelper
end
+12 -1
View File
@@ -28,14 +28,25 @@ module IssuesHelper
ancestors << issue unless issue.leaf? ancestors << issue unless issue.leaf?
end end
end end
# Renders a HTML/CSS tooltip
#
# To use, a trigger div is needed. This is a div with the class of "tooltip"
# that contains this method wrapped in a span with the class of "tip"
#
# <div class="tooltip"><%= link_to_issue(issue) %>
# <span class="tip"><%= render_issue_tooltip(issue) %></span>
# </div>
#
def render_issue_tooltip(issue) def render_issue_tooltip(issue)
@cached_label_status ||= l(:field_status)
@cached_label_start_date ||= l(:field_start_date) @cached_label_start_date ||= l(:field_start_date)
@cached_label_due_date ||= l(:field_due_date) @cached_label_due_date ||= l(:field_due_date)
@cached_label_assigned_to ||= l(:field_assigned_to) @cached_label_assigned_to ||= l(:field_assigned_to)
@cached_label_priority ||= l(:field_priority) @cached_label_priority ||= l(:field_priority)
link_to_issue(issue) + "<br /><br />" + link_to_issue(issue) + "<br /><br />" +
"<strong>#{@cached_label_status}</strong>: #{issue.status.name}<br />" +
"<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" + "<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
"<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" + "<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
"<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" + "<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" +
+1 -1
View File
@@ -22,7 +22,7 @@ module JournalsHelper
links = [] links = []
if !journal.notes.blank? if !journal.notes.blank?
links << link_to_remote(image_tag('comment.png'), links << link_to_remote(image_tag('comment.png'),
{ :url => {:controller => 'issues', :action => 'reply', :id => issue, :journal_id => journal} }, { :url => {:controller => 'journals', :action => 'new', :id => issue, :journal_id => journal} },
:title => l(:button_quote)) if options[:reply_links] :title => l(:button_quote)) if options[:reply_links]
links << link_to_in_place_notes_editor(image_tag('edit.png'), "journal-#{journal.id}-notes", links << link_to_in_place_notes_editor(image_tag('edit.png'), "journal-#{journal.id}-notes",
{ :controller => 'journals', :action => 'edit', :id => journal }, { :controller => 'journals', :action => 'edit', :id => journal },
+1 -1
View File
@@ -72,7 +72,7 @@ module ProjectsHelper
end end
classes = (ancestors.empty? ? 'root' : 'child') classes = (ancestors.empty? ? 'root' : 'child')
s << "<li class='#{classes}'><div class='#{classes}'>" + s << "<li class='#{classes}'><div class='#{classes}'>" +
link_to(h(project), {:controller => 'projects', :action => 'show', :id => project}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}") link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank? s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
s << "</div>\n" s << "</div>\n"
ancestors << project ancestors << project
+1 -1
View File
@@ -50,7 +50,7 @@ module QueriesHelper
when 'User' when 'User'
link_to_user value link_to_user value
when 'Project' when 'Project'
link_to(h(value), :controller => 'projects', :action => 'show', :id => value) link_to_project value
when 'Version' when 'Version'
link_to(h(value), :controller => 'versions', :action => 'show', :id => value) link_to(h(value), :controller => 'versions', :action => 'show', :id => value)
when 'TrueClass' when 'TrueClass'
+3 -2
View File
@@ -19,12 +19,13 @@ class Change < ActiveRecord::Base
belongs_to :changeset belongs_to :changeset
validates_presence_of :changeset_id, :action, :path validates_presence_of :changeset_id, :action, :path
before_save :init_path
def relative_path def relative_path
changeset.repository.relative_path(path) changeset.repository.relative_path(path)
end end
def before_save def init_path
path ||= "" self.path ||= ""
end end
end end
-1
View File
@@ -76,7 +76,6 @@ class Changeset < ActiveRecord::Base
def after_create def after_create
scan_comment_for_issue_ids scan_comment_for_issue_ids
end end
require 'pp'
def scan_comment_for_issue_ids def scan_comment_for_issue_ids
return if comments.blank? return if comments.blank?
+9 -4
View File
@@ -245,7 +245,7 @@ class Issue < ActiveRecord::Base
end end
def done_ratio def done_ratio
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio? if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
status.default_done_ratio status.default_done_ratio
else else
read_attribute(:done_ratio) read_attribute(:done_ratio)
@@ -308,7 +308,7 @@ class Issue < ActiveRecord::Base
# Set the done_ratio using the status if that setting is set. This will keep the done_ratios # Set the done_ratio using the status if that setting is set. This will keep the done_ratios
# even if the user turns off the setting later # even if the user turns off the setting later
def update_done_ratio_from_issue_status def update_done_ratio_from_issue_status
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio? if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
self.done_ratio = status.default_done_ratio self.done_ratio = status.default_done_ratio
end end
end end
@@ -357,6 +357,11 @@ class Issue < ActiveRecord::Base
def overdue? def overdue?
!due_date.nil? && (due_date < Date.today) && !status.is_closed? !due_date.nil? && (due_date < Date.today) && !status.is_closed?
end end
# Does this issue have children?
def children?
!leaf?
end
# Users the issue can be assigned to # Users the issue can be assigned to
def assignable_users def assignable_users
@@ -684,7 +689,7 @@ class Issue < ActiveRecord::Base
end end
# done ratio = weighted average ratio of leaves # done ratio = weighted average ratio of leaves
unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio? unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio
leaves_count = p.leaves.count leaves_count = p.leaves.count
if leaves_count > 0 if leaves_count > 0
average = p.leaves.average(:estimated_hours).to_f average = p.leaves.average(:estimated_hours).to_f
@@ -821,7 +826,7 @@ class Issue < ActiveRecord::Base
j.id as #{select_field}, j.id as #{select_field},
count(i.id) as total count(i.id) as total
from from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{joins} as j #{Issue.table_name} i, #{IssueStatus.table_name} s, #{joins} j
where where
i.status_id=s.id i.status_id=s.id
and #{where} and #{where}
+8 -1
View File
@@ -17,8 +17,10 @@
class IssueStatus < ActiveRecord::Base class IssueStatus < ActiveRecord::Base
before_destroy :check_integrity before_destroy :check_integrity
has_many :workflows, :foreign_key => "old_status_id", :dependent => :delete_all has_many :workflows, :foreign_key => "old_status_id"
acts_as_list acts_as_list
before_destroy :delete_workflows
validates_presence_of :name validates_presence_of :name
validates_uniqueness_of :name validates_uniqueness_of :name
@@ -89,4 +91,9 @@ private
def check_integrity def check_integrity
raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id]) raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id])
end end
# Deletes associated workflows
def delete_workflows
Workflow.delete_all(["old_status_id = :id OR new_status_id = :id", {:id => id}])
end
end end
+8
View File
@@ -65,4 +65,12 @@ class Journal < ActiveRecord::Base
def attachments def attachments
journalized.respond_to?(:attachments) ? journalized.attachments : nil journalized.respond_to?(:attachments) ? journalized.attachments : nil
end end
# Returns a string of css classes
def css_classes
s = 'journal'
s << ' has-notes' unless notes.blank?
s << ' has-details' unless details.blank?
s
end
end end
+6 -1
View File
@@ -15,6 +15,8 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'ar_condition'
class Mailer < ActionMailer::Base class Mailer < ActionMailer::Base
layout 'mailer' layout 'mailer'
helper :application helper :application
@@ -80,7 +82,7 @@ class Mailer < ActionMailer::Base
def reminder(user, issues, days) def reminder(user, issues, days)
set_language_if_valid user.language set_language_if_valid user.language
recipients user.mail recipients user.mail
subject l(:mail_subject_reminder, issues.size) subject l(:mail_subject_reminder, :count => issues.size, :days => days)
body :issues => issues, body :issues => issues,
:days => days, :days => days,
:issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'due_date', :sort_order => 'asc') :issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'due_date', :sort_order => 'asc')
@@ -306,13 +308,16 @@ class Mailer < ActionMailer::Base
# * :days => how many days in the future to remind about (defaults to 7) # * :days => how many days in the future to remind about (defaults to 7)
# * :tracker => id of tracker for filtering issues (defaults to all trackers) # * :tracker => id of tracker for filtering issues (defaults to all trackers)
# * :project => id or identifier of project to process (defaults to all projects) # * :project => id or identifier of project to process (defaults to all projects)
# * :users => array of user ids who should be reminded
def self.reminders(options={}) def self.reminders(options={})
days = options[:days] || 7 days = options[:days] || 7
project = options[:project] ? Project.find(options[:project]) : nil project = options[:project] ? Project.find(options[:project]) : nil
tracker = options[:tracker] ? Tracker.find(options[:tracker]) : nil tracker = options[:tracker] ? Tracker.find(options[:tracker]) : nil
user_ids = options[:users]
s = ARCondition.new ["#{IssueStatus.table_name}.is_closed = ? AND #{Issue.table_name}.due_date <= ?", false, days.day.from_now.to_date] s = ARCondition.new ["#{IssueStatus.table_name}.is_closed = ? AND #{Issue.table_name}.due_date <= ?", false, days.day.from_now.to_date]
s << "#{Issue.table_name}.assigned_to_id IS NOT NULL" s << "#{Issue.table_name}.assigned_to_id IS NOT NULL"
s << ["#{Issue.table_name}.assigned_to_id IN (?)", user_ids] if user_ids.present?
s << "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}" s << "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}"
s << "#{Issue.table_name}.project_id = #{project.id}" if project s << "#{Issue.table_name}.project_id = #{project.id}" if project
s << "#{Issue.table_name}.tracker_id = #{tracker.id}" if tracker s << "#{Issue.table_name}.tracker_id = #{tracker.id}" if tracker
+1 -1
View File
@@ -82,7 +82,7 @@ class Member < ActiveRecord::Base
protected protected
def validate def validate
errors.add_to_base "Role can't be blank" if member_roles.empty? && roles.empty? errors.add_on_empty :role if member_roles.empty? && roles.empty?
end end
private private
+5 -1
View File
@@ -33,7 +33,11 @@ class Principal < ActiveRecord::Base
} }
before_create :set_default_empty_values before_create :set_default_empty_values
def name(formatter = nil)
to_s
end
def <=>(principal) def <=>(principal)
if self.class.name == principal.class.name if self.class.name == principal.class.name
self.to_s.downcase <=> principal.to_s.downcase self.to_s.downcase <=> principal.to_s.downcase
+18 -1
View File
@@ -412,7 +412,15 @@ class Project < ActiveRecord::Base
def short_description(length = 255) def short_description(length = 255)
description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description
end end
def css_classes
s = 'project'
s << ' root' if root?
s << ' child' if child?
s << (leaf? ? ' leaf' : ' parent')
s
end
# Return true if this project is allowed to do the specified action. # Return true if this project is allowed to do the specified action.
# action can be: # action can be:
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
@@ -441,6 +449,15 @@ class Project < ActiveRecord::Base
enabled_modules.clear enabled_modules.clear
end end
end end
# Returns an array of projects that are in this project's hierarchy
#
# Example: parents, children, siblings
def hierarchy
parents = project.self_and_ancestors || []
descendants = project.descendants || []
project_hierarchy = parents | descendants # Set union
end
# Returns an auto-generated project identifier based on the last identifier used # Returns an auto-generated project identifier based on the last identifier used
def self.next_identifier def self.next_identifier
+7 -1
View File
@@ -187,7 +187,7 @@ class Query < ActiveRecord::Base
if project if project
user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] } user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] }
else else
project_ids = User.current.projects.collect(&:id) project_ids = Project.all(:conditions => Project.visible_by(User.current)).collect(&:id)
if project_ids.any? if project_ids.any?
# members of the user's projects # members of the user's projects
user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] } user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] }
@@ -219,6 +219,12 @@ class Query < ActiveRecord::Base
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } } @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
end end
add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true})) add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
# project filter
project_values = Project.all(:conditions => Project.visible_by(User.current), :order => 'lft').map do |p|
pre = (p.level > 0 ? ('--' * p.level + ' ') : '')
["#{pre}#{p.name}",p.id.to_s]
end
@available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values}
end end
@available_filters @available_filters
end end
+16
View File
@@ -81,4 +81,20 @@ class TimeEntry < ActiveRecord::Base
yield yield
end end
end end
def self.earilest_date_for_project(project=nil)
finder_conditions = ARCondition.new(Project.allowed_to_condition(User.current, :view_time_entries))
if project
finder_conditions << ["project_id IN (?)", project.hierarchy.collect(&:id)]
end
TimeEntry.minimum(:spent_on, :include => :project, :conditions => finder_conditions.conditions)
end
def self.latest_date_for_project(project=nil)
finder_conditions = ARCondition.new(Project.allowed_to_condition(User.current, :view_time_entries))
if project
finder_conditions << ["project_id IN (?)", project.hierarchy.collect(&:id)]
end
TimeEntry.maximum(:spent_on, :include => :project, :conditions => finder_conditions.conditions)
end
end end
+34
View File
@@ -79,6 +79,10 @@ class User < Principal
super super
end end
def mail=(arg)
write_attribute(:mail, arg.to_s.strip)
end
def identity_url=(url) def identity_url=(url)
if url.blank? if url.blank?
write_attribute(:identity_url, '') write_attribute(:identity_url, '')
@@ -160,6 +164,30 @@ class User < Principal
self.status == STATUS_LOCKED self.status == STATUS_LOCKED
end end
def activate
self.status = STATUS_ACTIVE
end
def register
self.status = STATUS_REGISTERED
end
def lock
self.status = STATUS_LOCKED
end
def activate!
update_attribute(:status, STATUS_ACTIVE)
end
def register!
update_attribute(:status, STATUS_REGISTERED)
end
def lock!
update_attribute(:status, STATUS_LOCKED)
end
def check_password?(clear_password) def check_password?(clear_password)
if auth_source_id.present? if auth_source_id.present?
auth_source.authenticate(self.login, clear_password) auth_source.authenticate(self.login, clear_password)
@@ -324,6 +352,12 @@ class User < Principal
false false
end end
end end
# Is the user allowed to do the specified action on any project?
# See allowed_to? for the actions and valid options.
def allowed_to_globally?(action, options)
allowed_to?(action, nil, options.reverse_merge(:global => true))
end
def self.current=(user) def self.current=(user)
@current_user = user @current_user = user
+3 -18
View File
@@ -1,20 +1,5 @@
<div id="admin-menu"> <div id="admin-menu">
<ul> <ul>
<li><%= link_to l(:label_project_plural), {:controller => 'admin', :action => 'projects'}, :class => 'projects' %></li> <%= render_menu :admin_menu %>
<li><%= link_to l(:label_user_plural), {:controller => 'users'}, :class => 'users' %></li> </ul>
<li><%= link_to l(:label_group_plural), {:controller => 'groups'}, :class => 'groups' %></li>
<li><%= link_to l(:label_ldap_authentication), :controller => 'ldap_auth_sources', :action => 'index' %></li>
<li><%= link_to l(:label_role_and_permissions), {:controller => 'roles'}, :class => 'roles' %></li>
<li><%= link_to l(:label_tracker_plural), {:controller => 'trackers'}, :class => 'trackers' %></li>
<li><%= link_to l(:label_issue_status_plural), {:controller => 'issue_statuses'}, :class => 'issue_statuses' %></li>
<li><%= link_to l(:label_workflow), {:controller => 'workflows', :action => 'edit'}, :class => 'workflows' %></li>
<li><%= link_to l(:label_custom_field_plural), {:controller => 'custom_fields'}, :class => 'custom_fields' %></li>
<li><%= link_to l(:label_enumerations), {:controller => 'enumerations'}, :class => 'enumerations' %></li>
<li><%= link_to l(:label_settings), {:controller => 'settings'}, :class => 'settings' %></li>
<% menu_items_for(:admin_menu) do |item| -%>
<li><%= link_to h(item.caption), item.url, item.html_options %></li>
<% end -%>
<li><%= link_to l(:label_plugins), {:controller => 'admin', :action => 'plugins'}, :class => 'plugins' %></li>
<li><%= link_to l(:label_information_plural), {:controller => 'admin', :action => 'info'}, :class => 'info' %></li>
</ul>
</div> </div>
+3 -3
View File
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'icon icon-add' %> <%= link_to l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add' %>
</div> </div>
<h2><%=l(:label_project_plural)%></h2> <h2><%=l(:label_project_plural)%></h2>
@@ -26,8 +26,8 @@
</tr></thead> </tr></thead>
<tbody> <tbody>
<% project_tree(@projects) do |project, level| %> <% project_tree(@projects) do |project, level| %>
<tr class="<%= cycle("odd", "even") %> <%= css_project_classes(project) %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> <tr class="<%= cycle("odd", "even") %> <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="name"><%= project.active? ? link_to(h(project.name), :controller => 'projects', :action => 'settings', :id => project) : h(project.name) %></td> <td class="name"><%= link_to_project(project, :action => 'settings') %></td>
<td><%= textilizable project.short_description, :project => project %></td> <td><%= textilizable project.short_description, :project => project %></td>
<td align="center"><%= checked_image project.is_public? %></td> <td align="center"><%= checked_image project.is_public? %></td>
<td align="center"><%= format_date(project.created_on) %></td> <td align="center"><%= format_date(project.created_on) %></td>
+1 -2
View File
@@ -1,6 +1,5 @@
<span id="attachments_fields"> <span id="attachments_fields">
<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil -%> <%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil -%><label class="inline"><span id="attachment_description_label_content"><%= l(:label_optional_description) %></span><%= text_field_tag 'attachments[1][description]', '', :size => 60, :id => nil %>
<label class="inline"><span id="attachment_description_label_content"><%= l(:label_optional_description) %></span><%= text_field_tag 'attachments[1][description]', '', :size => 60, :id => nil %>
</label> </label>
</span> </span>
<br /> <br />
+2 -2
View File
@@ -30,11 +30,11 @@
</table> </table>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_messages => 1, :key => User.current.rss_key} %> <%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_messages => 1, :key => User.current.rss_key} %>
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:controller => 'projects', :action => 'activity', :id => @project, :format => 'atom', :show_messages => 1, :key => User.current.rss_key}) %> <%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :id => @project, :format => 'atom', :show_messages => 1, :key => User.current.rss_key}) %>
<% end %> <% end %>
<% html_title l(:label_board_plural) %> <% html_title l(:label_board_plural) %>
+1 -8
View File
@@ -9,14 +9,7 @@
</fieldset> </fieldset>
<p style="float:right;"> <p style="float:right;">
<%= link_to_remote ('&#171; ' + (@month==1 ? "#{month_name(12)} #{@year-1}" : "#{month_name(@month-1)}")), <%= link_to_previous_month(@year, @month) %> | <%= link_to_next_month(@year, @month) %>
{:update => "content", :url => { :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1) }},
{:href => url_for(:action => 'show', :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1))}
%> |
<%= link_to_remote ((@month==12 ? "#{month_name(1)} #{@year+1}" : "#{month_name(@month+1)}") + ' &#187;'),
{:update => "content", :url => { :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1) }},
{:href => url_for(:action => 'show', :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1))}
%>
</p> </p>
<p class="buttons"> <p class="buttons">
@@ -4,20 +4,23 @@
<% if !@issue.nil? -%> <% if !@issue.nil? -%>
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue}, <li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue},
:class => 'icon-edit', :disabled => !@can[:edit] %></li> :class => 'icon-edit', :disabled => !@can[:edit] %></li>
<li class="folder">
<a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
<ul>
<% @statuses.each do |s| -%>
<li><%= context_menu_link s.name, {:controller => 'issues', :action => 'edit', :id => @issue, :issue => {:status_id => s}, :back_url => @back}, :method => :post,
:selected => (s == @issue.status), :disabled => !(@can[:update] && @allowed_statuses.include?(s)) %></li>
<% end -%>
</ul>
</li>
<% else %> <% else %>
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id)}, <li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id)},
:class => 'icon-edit', :disabled => !@can[:edit] %></li> :class => 'icon-edit', :disabled => !@can[:edit] %></li>
<% end %> <% end %>
<% unless @allowed_statuses.empty? %>
<li class="folder">
<a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
<ul>
<% @statuses.each do |s| -%>
<li><%= context_menu_link s.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {:status_id => s}, :back_url => @back}, :method => :post,
:selected => (@issue && s == @issue.status), :disabled => !(@can[:update] && @allowed_statuses.include?(s)) %></li>
<% end -%>
</ul>
</li>
<% end %>
<% unless @trackers.nil? %> <% unless @trackers.nil? %>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_tracker) %></a> <a href="#" class="submenu"><%= l(:field_tracker) %></a>
@@ -29,15 +32,19 @@
</ul> </ul>
</li> </li>
<% end %> <% end %>
<% if @projects.size == 1 %>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_priority) %></a> <a href="#" class="submenu"><%= l(:field_priority) %></a>
<ul> <ul>
<% @priorities.each do |p| -%> <% @priorities.each do |p| -%>
<li><%= context_menu_link p.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'priority_id' => p}, :back_url => @back}, :method => :post, <li><%= context_menu_link p.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'priority_id' => p}, :back_url => @back}, :method => :post,
:selected => (@issue && p == @issue.priority), :disabled => !@can[:edit] %></li> :selected => (@issue && p == @issue.priority), :disabled => (!@can[:edit] || @issues.detect {|i| !i.leaf?}) %></li>
<% end -%> <% end -%>
</ul> </ul>
</li> </li>
<% end %>
<% unless @project.nil? || @project.shared_versions.open.empty? -%> <% unless @project.nil? || @project.shared_versions.open.empty? -%>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_fixed_version) %></a> <a href="#" class="submenu"><%= l(:field_fixed_version) %></a>
@@ -77,17 +84,19 @@
</ul> </ul>
</li> </li>
<% end -%> <% end -%>
<% if Issue.use_field_for_done_ratio? %>
<% if Issue.use_field_for_done_ratio? && @projects.size == 1 %>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_done_ratio) %></a> <a href="#" class="submenu"><%= l(:field_done_ratio) %></a>
<ul> <ul>
<% (0..10).map{|x|x*10}.each do |p| -%> <% (0..10).map{|x|x*10}.each do |p| -%>
<li><%= context_menu_link "#{p}%", {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'done_ratio' => p}, :back_url => @back}, :method => :post, <li><%= context_menu_link "#{p}%", {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'done_ratio' => p}, :back_url => @back}, :method => :post,
:selected => (@issue && p == @issue.done_ratio), :disabled => !@can[:edit] %></li> :selected => (@issue && p == @issue.done_ratio), :disabled => (!@can[:edit] || @issues.detect {|i| !i.leaf?}) %></li>
<% end -%> <% end -%>
</ul> </ul>
</li> </li>
<% end %> <% end %>
<% if !@issue.nil? %> <% if !@issue.nil? %>
<% if @can[:log_time] -%> <% if @can[:log_time] -%>
<li><%= context_menu_link l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, <li><%= context_menu_link l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue},
@@ -102,9 +111,9 @@
<li><%= context_menu_link l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue}, <li><%= context_menu_link l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue},
:class => 'icon-duplicate', :disabled => !@can[:copy] %></li> :class => 'icon-duplicate', :disabled => !@can[:copy] %></li>
<% end %> <% end %>
<li><%= context_menu_link l(:button_copy), {:controller => 'issues', :action => 'move', :ids => @issues.collect(&:id), :copy_options => {:copy => 't'}}, <li><%= context_menu_link l(:button_copy), new_issue_move_path(:ids => @issues.collect(&:id), :copy_options => {:copy => 't'}),
:class => 'icon-copy', :disabled => !@can[:move] %></li> :class => 'icon-copy', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_move), {:controller => 'issues', :action => 'move', :ids => @issues.collect(&:id)}, <li><%= context_menu_link l(:button_move), new_issue_move_path(:ids => @issues.collect(&:id)),
:class => 'icon-move', :disabled => !@can[:move] %></li> :class => 'icon-move', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_delete), {:controller => 'issues', :action => 'destroy', :ids => @issues.collect(&:id)}, <li><%= context_menu_link l(:button_delete), {:controller => 'issues', :action => 'destroy', :ids => @issues.collect(&:id)},
:method => :post, :confirm => l(:text_issues_destroy_confirmation), :class => 'icon-del', :disabled => !@can[:delete] %></li> :method => :post, :confirm => l(:text_issues_destroy_confirmation), :class => 'icon-del', :disabled => !@can[:delete] %></li>
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:label_attachment_new), {:controller => 'projects', :action => 'add_file', :id => @project}, :class => 'icon icon-add' %> <%= link_to_if_authorized l(:label_attachment_new), {:controller => 'files', :action => 'new', :id => @project}, :class => 'icon icon-add' %>
</div> </div>
<h2><%=l(:label_attachment_plural)%></h2> <h2><%=l(:label_attachment_plural)%></h2>
@@ -2,7 +2,7 @@
<%= error_messages_for 'attachment' %> <%= error_messages_for 'attachment' %>
<div class="box"> <div class="box">
<% form_tag({ :action => 'add_file', :id => @project }, :multipart => true, :class => "tabular") do %> <% form_tag({ :action => 'new', :id => @project }, :multipart => true, :class => "tabular") do %>
<% if @versions.any? %> <% if @versions.any? %>
<p><label for="version_id"><%=l(:field_version)%></label> <p><label for="version_id"><%=l(:field_version)%></label>
@@ -6,14 +6,14 @@
<% end -%> <% end -%>
</ul> </ul>
<% form_tag({}, :id => 'move_form') do %> <% form_tag({:action => 'create'}, :id => 'move_form') do %>
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %> <%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
<div class="box tabular"> <div class="box tabular">
<p><label for="new_project_id"><%=l(:field_project)%>:</label> <p><label for="new_project_id"><%=l(:field_project)%>:</label>
<%= select_tag "new_project_id", <%= select_tag "new_project_id",
project_tree_options_for_select(@allowed_projects, :selected => @target_project), project_tree_options_for_select(@allowed_projects, :selected => @target_project),
:onchange => remote_function(:url => { :action => 'move' }, :onchange => remote_function(:url => { :action => 'new' },
:method => :get, :method => :get,
:update => 'content', :update => 'content',
:with => "Form.serialize('move_form')") %></p> :with => "Form.serialize('move_form')") %></p>
+3 -3
View File
@@ -4,7 +4,7 @@
<% replace_watcher ||= 'watcher' %> <% replace_watcher ||= 'watcher' %>
<%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %> <%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %>
<%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %> <%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %>
<%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'move', :id => @issue, :copy_options => {:copy => 't'} }, :class => 'icon icon-copy' %> <%= link_to_if_authorized l(:button_copy), new_issue_move_path(:id => @issue, :copy_options => {:copy => 't'}), :class => 'icon icon-copy' %>
<%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %> <%= link_to_if_authorized l(:button_move), new_issue_move_path(:id => @issue), :class => 'icon icon-move' %>
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %> <%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => (@issue.leaf? ? l(:text_are_you_sure) : l(:text_are_you_sure_with_children)), :method => :post, :class => 'icon icon-del' %>
</div> </div>
+2 -2
View File
@@ -23,7 +23,7 @@
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'), <%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
l(:label_version_new), l(:label_version_new),
'version[name]', 'version[name]',
{:controller => 'versions', :action => 'new', :project_id => @project}, {:controller => 'versions', :action => 'create', :project_id => @project},
:title => l(:label_version_new), :title => l(:label_version_new),
:tabindex => 200) if authorize_for('versions', 'new') %> :tabindex => 200) if authorize_for('versions', 'new') %>
</p> </p>
@@ -40,6 +40,6 @@
</div> </div>
<div style="clear:both;"> </div> <div style="clear:both;"> </div>
<%= render :partial => 'form_custom_fields' %> <%= render :partial => 'issues/form_custom_fields' %>
<% end %> <% end %>
+3 -1
View File
@@ -3,6 +3,8 @@
<p><%= link_to("#{l(:label_revision)} #{changeset.revision}", <p><%= link_to("#{l(:label_revision)} #{changeset.revision}",
:controller => 'repositories', :action => 'revision', :id => changeset.project, :rev => changeset.revision) %><br /> :controller => 'repositories', :action => 'revision', :id => changeset.project, :rev => changeset.revision) %><br />
<span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p> <span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p>
<%= textilizable(changeset, :comments) %> <div class="changeset-changes">
<%= textilizable(changeset, :comments) %>
</div>
</div> </div>
<% end %> <% end %>
+1 -1
View File
@@ -44,7 +44,7 @@
<%= f.hidden_field :lock_version %> <%= f.hidden_field :lock_version %>
<%= submit_tag l(:button_submit) %> <%= submit_tag l(:button_submit) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => { :controller => 'issues', :action => 'preview', :project_id => @project, :id => @issue }, { :url => preview_issue_path(:project_id => @project, :id => @issue),
:method => 'post', :method => 'post',
:update => 'preview', :update => 'preview',
:with => 'Form.serialize("issue-form")', :with => 'Form.serialize("issue-form")',
+5 -6
View File
@@ -1,6 +1,8 @@
<%= call_hook(:view_issues_form_details_top, { :issue => @issue, :form => f }) %>
<div id="issue_descr_fields" <%= 'style="display:none"' unless @issue.new_record? || @issue.errors.any? %>> <div id="issue_descr_fields" <%= 'style="display:none"' unless @issue.new_record? || @issue.errors.any? %>>
<p><%= f.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %></p> <p><%= f.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %></p>
<%= observe_field :issue_tracker_id, :url => { :action => :update_form, :project_id => @project, :id => @issue }, <%= observe_field :issue_tracker_id, :url => { :action => :new, :project_id => @project, :id => @issue },
:update => :attributes, :update => :attributes,
:with => "Form.serialize('issue-form')" %> :with => "Form.serialize('issue-form')" %>
@@ -9,10 +11,7 @@
<% unless (@issue.new_record? && @issue.parent_issue_id.nil?) || !User.current.allowed_to?(:manage_subtasks, @project) %> <% unless (@issue.new_record? && @issue.parent_issue_id.nil?) || !User.current.allowed_to?(:manage_subtasks, @project) %>
<p><%= f.text_field :parent_issue_id, :size => 10 %></p> <p><%= f.text_field :parent_issue_id, :size => 10 %></p>
<div id="parent_issue_candidates" class="autocomplete"></div> <div id="parent_issue_candidates" class="autocomplete"></div>
<%= javascript_tag "observeParentIssueField('#{url_for(:controller => :issues, <%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %>
:action => :auto_complete,
:id => @issue,
:project_id => @project) }')" %>
<% end %> <% end %>
<p><%= f.text_area :description, <p><%= f.text_area :description,
@@ -23,7 +22,7 @@
</div> </div>
<div id="attributes" class="attributes"> <div id="attributes" class="attributes">
<%= render :partial => 'attributes' %> <%= render :partial => 'issues/attributes' %>
</div> </div>
<% if @issue.new_record? %> <% if @issue.new_record? %>
+2 -2
View File
@@ -1,7 +1,7 @@
<% reply_links = authorize_for('issues', 'edit') -%> <% reply_links = authorize_for('issues', 'edit') -%>
<% for journal in journals %> <% for journal in journals %>
<div id="change-<%= journal.id %>" class="journal"> <div id="change-<%= journal.id %>" class="<%= journal.css_classes %>">
<h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div> <h4><div class="journal-link"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
<%= avatar(journal.user, :size => "24") %> <%= avatar(journal.user, :size => "24") %>
<%= content_tag('a', '', :name => "note-#{journal.indice}")%> <%= content_tag('a', '', :name => "note-#{journal.indice}")%>
<%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %></h4> <%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %></h4>
+2 -2
View File
@@ -3,7 +3,7 @@
<div class="autoscroll"> <div class="autoscroll">
<table class="list issues"> <table class="list issues">
<thead><tr> <thead><tr>
<th><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;', <th class="checkbox hide-when-print"><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %> :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
</th> </th>
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %> <%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
@@ -25,7 +25,7 @@
<% previous_group = group %> <% previous_group = group %>
<% end %> <% end %>
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> <tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td> <td class="checkbox hide-when-print"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
<td class="id"><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td> <td class="id"><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
<% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %> <% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %>
</tr> </tr>
+1 -1
View File
@@ -14,7 +14,7 @@
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %> <%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %>
<%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %> <%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %>
</td> </td>
<td class="project"><%= link_to(h(issue.project), :controller => 'projects', :action => 'show', :id => issue.project) %></td> <td class="project"><%= link_to_project(issue.project) %></td>
<td class="tracker"><%=h issue.tracker %></td> <td class="tracker"><%=h issue.tracker %></td>
<td class="subject"> <td class="subject">
<%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>) <%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>)
+2 -1
View File
@@ -1,6 +1,6 @@
<div class="contextual"> <div class="contextual">
<% if authorize_for('issue_relations', 'new') %> <% if authorize_for('issue_relations', 'new') %>
<%= toggle_link l(:button_add), 'new-relation-form'%> <%= toggle_link l(:button_add), 'new-relation-form', {:focus => 'relation_issue_to_id'} %>
<% end %> <% end %>
</div> </div>
@@ -28,6 +28,7 @@
<% remote_form_for(:relation, @relation, <% remote_form_for(:relation, @relation,
:url => {:controller => 'issue_relations', :action => 'new', :issue_id => @issue}, :url => {:controller => 'issue_relations', :action => 'new', :issue_id => @issue},
:method => :post, :method => :post,
:complete => "Form.Element.focus('relation_issue_to_id');",
:html => {:id => 'new-relation-form', :style => (@relation ? '' : 'display: none;')}) do |f| %> :html => {:id => 'new-relation-form', :style => (@relation ? '' : 'display: none;')}) do |f| %>
<%= render :partial => 'issue_relations/form', :locals => {:f => f}%> <%= render :partial => 'issue_relations/form', :locals => {:f => f}%>
<% end %> <% end %>
+1 -1
View File
@@ -6,7 +6,7 @@
<%= call_hook(:view_issues_sidebar_issues_bottom) %> <%= call_hook(:view_issues_sidebar_issues_bottom) %>
<% if User.current.allowed_to?(:view_calendar, @project, :global => true) %> <% if User.current.allowed_to?(:view_calendar, @project, :global => true) %>
<%= link_to(l(:label_calendar), :controller => 'issues', :action => 'calendar', :project_id => @project) %><br /> <%= link_to(l(:label_calendar), :controller => 'calendars', :action => 'show', :project_id => @project) %><br />
<% end %> <% end %>
<% if User.current.allowed_to?(:view_gantt, @project, :global => true) %> <% if User.current.allowed_to?(:view_gantt, @project, :global => true) %>
<%= link_to(l(:label_gantt), :controller => 'gantts', :action => 'show', :project_id => @project) %><br /> <%= link_to(l(:label_gantt), :controller => 'gantts', :action => 'show', :project_id => @project) %><br />
+1 -1
View File
@@ -2,7 +2,7 @@
<ul><%= @issues.collect {|i| content_tag('li', link_to(h("#{i.tracker} ##{i.id}"), { :action => 'show', :id => i }) + h(": #{i.subject}")) }.join("\n") %></ul> <ul><%= @issues.collect {|i| content_tag('li', link_to(h("#{i.tracker} ##{i.id}"), { :action => 'show', :id => i }) + h(": #{i.subject}")) }.join("\n") %></ul>
<% form_tag() do %> <% form_tag(:action => 'bulk_update') do %>
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %> <%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
<div class="box tabular"> <div class="box tabular">
<fieldset class="attributes"> <fieldset class="attributes">
+3 -2
View File
@@ -39,6 +39,7 @@
{ :url => { :set_filter => 1 }, { :url => { :set_filter => 1 },
:before => 'selectAllOptions("selected_columns");', :before => 'selectAllOptions("selected_columns");',
:update => "content", :update => "content",
:complete => "apply_filters_observer()",
:with => "Form.serialize('query_form')" :with => "Form.serialize('query_form')"
}, :class => 'icon icon-checked' %> }, :class => 'icon icon-checked' %>
@@ -78,7 +79,7 @@
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_issue_plural)) %> <%= auto_discovery_link_tag(:atom, {:query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_issue_plural)) %>
<%= auto_discovery_link_tag(:atom, {:action => 'changes', :query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_changes_details)) %> <%= auto_discovery_link_tag(:atom, {:controller => 'journals', :action => 'index', :query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_changes_details)) %>
<% end %> <% end %>
<%= context_menu :controller => 'issues', :action => 'context_menu' %> <%= context_menu issues_context_menu_path %>
+1 -1
View File
@@ -9,7 +9,7 @@
<%= submit_tag l(:button_create) %> <%= submit_tag l(:button_create) %>
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %> <%= submit_tag l(:button_create_and_continue), :name => 'continue' %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => { :controller => 'issues', :action => 'preview', :project_id => @project }, { :url => preview_issue_path(:project_id => @project),
:method => 'post', :method => 'post',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('issue-form')", :with => "Form.serialize('issue-form')",
+2 -1
View File
@@ -128,6 +128,7 @@
<%= stylesheet_link_tag 'scm' %> <%= stylesheet_link_tag 'scm' %>
<%= javascript_include_tag 'context_menu' %> <%= javascript_include_tag 'context_menu' %>
<%= stylesheet_link_tag 'context_menu' %> <%= stylesheet_link_tag 'context_menu' %>
<%= stylesheet_link_tag 'context_menu_rtl' if l(:direction) == 'rtl' %>
<% end %> <% end %>
<div id="context-menu" style="display: none;"></div> <div id="context-menu" style="display: none;"></div>
<%= javascript_tag "new ContextMenu('#{url_for(:controller => 'issues', :action => 'context_menu')}')" %> <%= javascript_tag "new ContextMenu('#{issues_context_menu_path}')" %>
+3 -1
View File
@@ -5,7 +5,9 @@
<title><%=h html_title %></title> <title><%=h html_title %></title>
<meta name="description" content="<%= Redmine::Info.app_name %>" /> <meta name="description" content="<%= Redmine::Info.app_name %>" />
<meta name="keywords" content="issue,bug,tracker" /> <meta name="keywords" content="issue,bug,tracker" />
<%= favicon %>
<%= stylesheet_link_tag 'application', :media => 'all' %> <%= stylesheet_link_tag 'application', :media => 'all' %>
<%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
<%= javascript_include_tag :defaults %> <%= javascript_include_tag :defaults %>
<%= heads_for_wiki_formatter %> <%= heads_for_wiki_formatter %>
<!--[if IE]> <!--[if IE]>
@@ -18,7 +20,7 @@
<!-- page specific tags --> <!-- page specific tags -->
<%= yield :header_tags -%> <%= yield :header_tags -%>
</head> </head>
<body> <body class="<%= body_css_classes %>">
<div id="wrapper"> <div id="wrapper">
<div id="wrapper2"> <div id="wrapper2">
<div id="top-menu"> <div id="top-menu">
+1 -1
View File
@@ -30,7 +30,7 @@
</div> </div>
<h4> <h4>
<%= avatar(message.author, :size => "24") %> <%= avatar(message.author, :size => "24") %>
<%= link_to h(message.subject), { :controller => 'messages', :action => 'show', :board_id => @board, :id => @topic, :anchor => "message-#{message.id}" } %> <%= link_to h(message.subject), { :controller => 'messages', :action => 'show', :board_id => @board, :id => @topic, :r => message, :anchor => "message-#{message.id}" } %>
- -
<%= authoring message.created_on, message.author %> <%= authoring message.created_on, message.author %>
</h4> </h4>
+1 -1
View File
@@ -1,4 +1,4 @@
<p><%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless @project %> <p><%= link_to_project(news.project) + ': ' unless @project %>
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %> <%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %> <%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %>
<br /> <br />
+4
View File
@@ -12,3 +12,7 @@
}, :accesskey => accesskey(:preview) %> }, :accesskey => accesskey(:preview) %>
<% end %> <% end %>
<div id="preview" class="wiki"></div> <div id="preview" class="wiki"></div>
<% content_for :header_tags do %>
<%= stylesheet_link_tag 'scm' %>
<% end %>
+2 -1
View File
@@ -28,7 +28,7 @@
<p class="nodata"><%= l(:label_no_data) %></p> <p class="nodata"><%= l(:label_no_data) %></p>
<% else %> <% else %>
<% @newss.each do |news| %> <% @newss.each do |news| %>
<h3><%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless news.project == @project %> <h3><%= link_to_project(news.project) + ': ' unless news.project == @project %>
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %> <%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %></h3> <%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %></h3>
<p class="author"><%= authoring news.created_on, news.author %></p> <p class="author"><%= authoring news.created_on, news.author %></p>
@@ -45,6 +45,7 @@
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :page => nil, :key => User.current.rss_key})) %> <%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :page => nil, :key => User.current.rss_key})) %>
<%= stylesheet_link_tag 'scm' %>
<% end %> <% end %>
<% html_title(l(:label_news_plural)) -%> <% html_title(l(:label_news_plural)) -%>
+1 -1
View File
@@ -1,4 +1,4 @@
<% labelled_tabular_form_for :project, @project, :url => { :action => "edit", :id => @project } do |f| %> <% labelled_tabular_form_for :project, @project, :url => { :action => "update", :id => @project } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<% end %> <% end %>
+2 -2
View File
@@ -2,14 +2,14 @@
<div class="box"> <div class="box">
<!--[form:project]--> <!--[form:project]-->
<p><%= f.text_field :name, :required => true %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p> <p><%= f.text_field :name, :required => true, :maxlength => 30 %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p>
<% unless @project.allowed_parents.compact.empty? %> <% unless @project.allowed_parents.compact.empty? %>
<p><%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %></p> <p><%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %></p>
<% end %> <% end %>
<p><%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %></p> <p><%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %></p>
<p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen? %> <p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen?, :maxlength => 20 %>
<% unless @project.identifier_frozen? %> <% unless @project.identifier_frozen? %>
<br /><em><%= l(:text_length_between, :min => 1, :max => 20) %> <%= l(:text_project_identifier_info) %></em> <br /><em><%= l(:text_length_between, :min => 1, :max => 20) %> <%= l(:text_project_identifier_info) %></em>
<% end %></p> <% end %></p>
+8
View File
@@ -0,0 +1,8 @@
<% if @users_by_role.any? %>
<div class="members box">
<h3><%=l(:label_member_plural)%></h3>
<p><% @users_by_role.keys.sort.each do |role| %>
<%=h role %>: <%= @users_by_role[role].sort.collect{|u| link_to_user u}.join(", ") %><br />
<% end %></p>
</div>
<% end %>
+2 -2
View File
@@ -3,10 +3,10 @@
<% end %> <% end %>
<div class="contextual"> <div class="contextual">
<%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'icon icon-add') + ' |' if User.current.allowed_to?(:add_project, nil, :global => true) %> <%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add') + ' |' if User.current.allowed_to?(:add_project, nil, :global => true) %>
<%= link_to(l(:label_issue_view_all), { :controller => 'issues' }) + ' |' if User.current.allowed_to?(:view_issues, nil, :global => true) %> <%= link_to(l(:label_issue_view_all), { :controller => 'issues' }) + ' |' if User.current.allowed_to?(:view_issues, nil, :global => true) %>
<%= link_to(l(:label_overall_spent_time), { :controller => 'time_entries' }) + ' |' if User.current.allowed_to?(:view_time_entries, nil, :global => true) %> <%= link_to(l(:label_overall_spent_time), { :controller => 'time_entries' }) + ' |' if User.current.allowed_to?(:view_time_entries, nil, :global => true) %>
<%= link_to l(:label_overall_activity), { :controller => 'projects', :action => 'activity' }%> <%= link_to l(:label_overall_activity), { :controller => 'activities', :action => 'index' }%>
</div> </div>
<h2><%=l(:label_project_plural)%></h2> <h2><%=l(:label_project_plural)%></h2>
@@ -1,6 +1,6 @@
<h2><%=l(:label_project_new)%></h2> <h2><%=l(:label_project_new)%></h2>
<% labelled_tabular_form_for :project, @project, :url => { :action => "add" } do |f| %> <% labelled_tabular_form_for :project, @project, :url => { :action => "create" } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<fieldset class="box"><legend><%= l(:label_module_plural) %></legend> <fieldset class="box"><legend><%= l(:label_module_plural) %></legend>
@@ -1,4 +1,4 @@
<% form_tag({:controller => 'projects', :action => 'save_activities', :id => @project}, :class => "tabular") do %> <% form_tag({:controller => 'project_enumerations', :action => 'save', :id => @project}, :class => "tabular") do %>
<table class="list"> <table class="list">
<thead><tr> <thead><tr>
@@ -32,7 +32,7 @@
</table> </table>
<div class="contextual"> <div class="contextual">
<%= link_to(l(:button_reset), {:controller => 'projects', :action => 'reset_activities', :id => @project}, <%= link_to(l(:button_reset), {:controller => 'project_enumerations', :action => 'destroy', :id => @project},
:method => :delete, :method => :delete,
:confirm => l(:text_are_you_sure), :confirm => l(:text_are_you_sure),
:class => 'icon icon-del') %> :class => 'icon icon-del') %>
+3 -10
View File
@@ -1,6 +1,6 @@
<div class="contextual"> <div class="contextual">
<% if User.current.allowed_to?(:add_subprojects, @project) %> <% if User.current.allowed_to?(:add_subprojects, @project) %>
<%= link_to l(:label_subproject_new), {:controller => 'projects', :action => 'add', :parent_id => @project}, :class => 'icon icon-add' %> <%= link_to l(:label_subproject_new), {:controller => 'projects', :action => 'new', :parent_id => @project}, :class => 'icon icon-add' %>
<% end %> <% end %>
</div> </div>
@@ -51,14 +51,7 @@
</div> </div>
<div class="splitcontentright"> <div class="splitcontentright">
<% if @users_by_role.any? %> <%= render :partial => 'members_box' %>
<div class="members box">
<h3><%=l(:label_member_plural)%></h3>
<p><% @users_by_role.keys.sort.each do |role| %>
<%=h role %>: <%= @users_by_role[role].sort.collect{|u| link_to_user u}.join(", ") %><br />
<% end %></p>
</div>
<% end %>
<% if @news.any? && authorize_for('news', 'index') %> <% if @news.any? && authorize_for('news', 'index') %>
<div class="news box"> <div class="news box">
@@ -81,7 +74,7 @@
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:action => 'activity', :id => @project, :format => 'atom', :key => User.current.rss_key}) %> <%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :id => @project, :format => 'atom', :key => User.current.rss_key}) %>
<% end %> <% end %>
<% html_title(l(:label_overview)) -%> <% html_title(l(:label_overview)) -%>
+12
View File
@@ -53,6 +53,18 @@ function toggle_multi_select(field) {
select.multiple = true; select.multiple = true;
} }
} }
function apply_filters_observer() {
$$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
if(e.keyCode == Event.KEY_RETURN) {
<%= remote_function(:url => { :set_filter => 1},
:update => "content",
:with => "Form.serialize('query_form')",
:complete => "e.stop(); apply_filters_observer()") %>
}
});
}
Event.observe(document,"dom:loaded", apply_filters_observer);
//]]> //]]>
</script> </script>
+1 -1
View File
@@ -1,7 +1,7 @@
<h2><%= l(:label_revision) %> <%= format_revision(@rev_to) + ':' if @rev_to %><%= format_revision(@rev) %> <%=h @path %></h2> <h2><%= l(:label_revision) %> <%= format_revision(@rev_to) + ':' if @rev_to %><%= format_revision(@rev) %> <%=h @path %></h2>
<!-- Choose view type --> <!-- Choose view type -->
<% form_tag({}, :method => 'get') do %> <% form_tag({:path => to_path_param(@path)}, :method => 'get') do %>
<%= hidden_field_tag('rev', params[:rev]) if params[:rev] %> <%= hidden_field_tag('rev', params[:rev]) if params[:rev] %>
<%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %> <%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %>
<p><label><%= l(:label_view_diff) %></label> <p><label><%= l(:label_view_diff) %></label>
+1 -1
View File
@@ -20,7 +20,7 @@
</div> </div>
<div style="float:right;"> <div style="float:right;">
<%= link_to l(:label_ldap_authentication), :controller => 'ldap_auth_sources', :action => 'index' %> <%= link_to l(:label_ldap_authentication), {:controller => 'ldap_auth_sources', :action => 'index'}, :class => 'icon icon-server-authentication' %>
</div> </div>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
+3 -1
View File
@@ -14,7 +14,9 @@
<% @user.memberships.each do |membership| %> <% @user.memberships.each do |membership| %>
<% next if membership.new_record? %> <% next if membership.new_record? %>
<tr id="member-<%= membership.id %>" class="<%= cycle 'odd', 'even' %> class"> <tr id="member-<%= membership.id %>" class="<%= cycle 'odd', 'even' %> class">
<td class="project"><%=h membership.project %></td> <td class="project">
<%= link_to_project membership.project %>
</td>
<td class="roles"> <td class="roles">
<span id="member-<%= membership.id %>-roles"><%=h membership.roles.sort.collect(&:to_s).join(', ') %></span> <span id="member-<%= membership.id %>-roles"><%=h membership.roles.sort.collect(&:to_s).join(', ') %></span>
<% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user, :membership_id => membership }, <% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user, :membership_id => membership },
+4 -4
View File
@@ -24,7 +24,7 @@
<h3><%=l(:label_project_plural)%></h3> <h3><%=l(:label_project_plural)%></h3>
<ul> <ul>
<% for membership in @memberships %> <% for membership in @memberships %>
<li><%= link_to(h(membership.project.name), :controller => 'projects', :action => 'show', :id => membership.project) %> <li><%= link_to_project(membership.project) %>
(<%=h membership.roles.sort.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)</li> (<%=h membership.roles.sort.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)</li>
<% end %> <% end %>
</ul> </ul>
@@ -35,7 +35,7 @@
<div class="splitcontentright"> <div class="splitcontentright">
<% unless @events_by_day.empty? %> <% unless @events_by_day.empty? %>
<h3><%= link_to l(:label_activity), :controller => 'projects', :action => 'activity', :id => nil, :user_id => @user, :from => @events_by_day.keys.first %></h3> <h3><%= link_to l(:label_activity), :controller => 'activities', :action => 'index', :id => nil, :user_id => @user, :from => @events_by_day.keys.first %></h3>
<p> <p>
<%=l(:label_reported_issues)%>: <%= Issue.count(:conditions => ["author_id=?", @user.id]) %> <%=l(:label_reported_issues)%>: <%= Issue.count(:conditions => ["author_id=?", @user.id]) %>
@@ -57,11 +57,11 @@
</div> </div>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => nil, :user_id => @user, :key => User.current.rss_key} %> <%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => nil, :user_id => @user, :key => User.current.rss_key} %>
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :user_id => @user, :format => :atom, :key => User.current.rss_key) %> <%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :user_id => @user, :format => :atom, :key => User.current.rss_key) %>
<% end %> <% end %>
<% end %> <% end %>
<%= call_hook :view_account_right_bottom, :user => @user %> <%= call_hook :view_account_right_bottom, :user => @user %>
+1 -1
View File
@@ -1,6 +1,6 @@
<h2><%=l(:label_version)%></h2> <h2><%=l(:label_version)%></h2>
<% labelled_tabular_form_for :version, @version, :url => { :action => 'edit' } do |f| %> <% labelled_tabular_form_for :version, @version, :url => { :action => 'update', :id => @version } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<% end %> <% end %>
@@ -51,4 +51,4 @@
<% html_title(l(:label_roadmap)) %> <% html_title(l(:label_roadmap)) %>
<%= context_menu :controller => 'issues', :action => 'context_menu' %> <%= context_menu issues_context_menu_path %>
+2 -2
View File
@@ -1,6 +1,6 @@
<h2><%=l(:label_version_new)%></h2> <h2><%=l(:label_version_new)%></h2>
<% labelled_tabular_form_for :version, @version, :url => { :action => 'new' } do |f| %> <% labelled_tabular_form_for :version, @version, :url => { :action => 'create', :project_id => @project } do |f| %>
<%= render :partial => 'versions/form', :locals => { :f => f } %> <%= render :partial => 'versions/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %> <%= submit_tag l(:button_create) %>
<% end %> <% end %>
+2 -5
View File
@@ -32,13 +32,10 @@
<%= render :partial => 'versions/overview', :locals => {:version => @version} %> <%= render :partial => 'versions/overview', :locals => {:version => @version} %>
<%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %> <%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
<% issues = @version.fixed_issues.find(:all, <% if @issues.present? %>
:include => [:status, :tracker, :priority],
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") %>
<% if issues.size > 0 %>
<fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend> <fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
<ul> <ul>
<% issues.each do |issue| -%> <% @issues.each do |issue| -%>
<li><%= link_to_issue(issue) %></li> <li><%= link_to_issue(issue) %></li>
<% end -%> <% end -%>
</ul> </ul>
+2 -2
View File
@@ -20,7 +20,7 @@
<% for project in @projects %> <% for project in @projects %>
<% @project = project %> <% @project = project %>
<li> <li>
<%= link_to h(project.name), :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>) <%= link_to_project project %> (<%= format_time(project.created_on) %>)
<%= textilizable project.short_description, :project => project %> <%= textilizable project.short_description, :project => project %>
</li> </li>
<% end %> <% end %>
@@ -34,6 +34,6 @@
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:controller => 'news', :action => 'index', :key => User.current.rss_key, :format => 'atom'}, <%= auto_discovery_link_tag(:atom, {:controller => 'news', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
:title => "#{Setting.app_title}: #{l(:label_news_latest)}") %> :title => "#{Setting.app_title}: #{l(:label_news_latest)}") %>
<%= auto_discovery_link_tag(:atom, {:controller => 'projects', :action => 'activity', :key => User.current.rss_key, :format => 'atom'}, <%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
:title => "#{Setting.app_title}: #{l(:label_activity)}") %> :title => "#{Setting.app_title}: #{l(:label_activity)}") %>
<% end %> <% end %>
+2 -2
View File
@@ -23,11 +23,11 @@
<% unless @pages.empty? %> <% unless @pages.empty? %>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %> <%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %> <%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% end %> <% end %>
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %> <%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<% end %> <% end %>
+2 -2
View File
@@ -16,11 +16,11 @@
<% unless @pages.empty? %> <% unless @pages.empty? %>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %> <%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %> <%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% end %> <% end %>
<% end %> <% end %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %> <%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<% end %> <% end %>
+9 -1
View File
@@ -4,9 +4,17 @@
# Code is not reloaded between requests # Code is not reloaded between requests
config.cache_classes = true config.cache_classes = true
#####
# Customize the default logger (http://ruby-doc.org/core/classes/Logger.html)
#
# Use a different logger for distributed setups # Use a different logger for distributed setups
# config.logger = SyslogLogger.new # config.logger = SyslogLogger.new
#
# Rotate logs bigger than 1MB, keeps no more than 7 rotated logs around.
# When setting a new Logger, make sure to set it's log level too.
#
# config.logger = Logger.new(config.log_path, 7, 1048576)
# config.logger.level = Logger::INFO
# Full error reports are disabled and caching is turned on # Full error reports are disabled and caching is turned on
config.action_controller.consider_all_requests_local = false config.action_controller.consider_all_requests_local = false
+14
View File
@@ -78,3 +78,17 @@ module AsynchronousMailer
end end
ActionMailer::Base.send :include, AsynchronousMailer ActionMailer::Base.send :include, AsynchronousMailer
# TODO: Hack to support i18n 4.x on Rails 2.3.5. Remove post 2.3.6.
# See http://www.redmine.org/issues/6428 and http://www.redmine.org/issues/5608
module I18n
module Backend
module Base
def warn_syntax_deprecation!
return if @skip_syntax_deprecation
warn "The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead.\nDowngrade your i18n gem to 0.3.7 (everything above must be deinstalled) to remove this warning, see http://www.redmine.org/issues/5608 for more information."
@skip_syntax_deprecation = true
end
end
end
end
+21 -6
View File
@@ -1,4 +1,5 @@
bg: bg:
direction: ltr
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
@@ -63,7 +64,11 @@ bg:
one: "almost 1 year" one: "almost 1 year"
other: "almost {{count}} years" other: "almost {{count}} years"
number: number:
format:
separator: "."
delimiter: ""
precision: 3
human: human:
format: format:
precision: 1 precision: 1
@@ -71,13 +76,13 @@ bg:
storage_units: storage_units:
format: "%n %u" format: "%n %u"
units: units:
kb: KB
tb: TB
gb: GB
byte: byte:
one: Byte one: Byte
other: Bytes other: Bytes
mb: 'MB' kb: "KB"
mb: "MB"
gb: "GB"
tb: "TB"
# Used in array.to_sentence. # Used in array.to_sentence.
support: support:
@@ -111,6 +116,7 @@ bg:
greater_than_start_date: "трябва да е след началната дата" greater_than_start_date: "трябва да е след началната дата"
not_same_project: "не е от същия проект" not_same_project: "не е от същия проект"
circular_dependency: "Тази релация ще доведе до безкрайна зависимост" circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
actionview_instancetag_blank_option: Изберете actionview_instancetag_blank_option: Изберете
@@ -704,7 +710,7 @@ bg:
text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted." text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted."
label_and_its_subprojects: "{{value}} and its subprojects" label_and_its_subprojects: "{{value}} and its subprojects"
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:" mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
mail_subject_reminder: "{{count}} issue(s) due in the next days" mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days"
text_user_wrote: "{{value}} wrote:" text_user_wrote: "{{value}} wrote:"
label_duplicated_by: duplicated by label_duplicated_by: duplicated by
setting_enabled_scm: Enabled SCM setting_enabled_scm: Enabled SCM
@@ -898,3 +904,12 @@ bg:
text_zoom_in: Zoom in text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry. notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time label_overall_spent_time: Overall spent time
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
+12 -1
View File
@@ -1,6 +1,7 @@
#Ernad Husremovic hernad@bring.out.ba #Ernad Husremovic hernad@bring.out.ba
bs: bs:
direction: ltr
date: date:
formats: formats:
default: "%d.%m.%Y" default: "%d.%m.%Y"
@@ -129,6 +130,7 @@ bs:
greater_than_start_date: "mora biti veći nego početni datum" greater_than_start_date: "mora biti veći nego početni datum"
not_same_project: "ne pripada istom projektu" not_same_project: "ne pripada istom projektu"
circular_dependency: "Ova relacija stvar cirkularnu zavisnost" circular_dependency: "Ova relacija stvar cirkularnu zavisnost"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
actionview_instancetag_blank_option: Molimo odaberite actionview_instancetag_blank_option: Molimo odaberite
@@ -184,7 +186,7 @@ bs:
mail_body_account_information: Informacija o vašem korisničkom računu mail_body_account_information: Informacija o vašem korisničkom računu
mail_subject_account_activation_request: "{{value}} zahtjev za aktivaciju korisničkog računa" mail_subject_account_activation_request: "{{value}} zahtjev za aktivaciju korisničkog računa"
mail_body_account_activation_request: "Novi korisnik ({{value}}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:" mail_body_account_activation_request: "Novi korisnik ({{value}}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:"
mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim danima" mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim {{days}} danima"
mail_body_reminder: "{{count}} aktivnost(i) koje su dodjeljenje vama u narednim {{days}} danima:" mail_body_reminder: "{{count}} aktivnost(i) koje su dodjeljenje vama u narednim {{days}} danima:"
gui_validation_error: 1 greška gui_validation_error: 1 greška
@@ -922,3 +924,12 @@ bs:
text_zoom_in: Zoom in text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry. notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time label_overall_spent_time: Overall spent time
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
+132 -112
View File
@@ -1,4 +1,9 @@
# Redmine catalan translation:
# by Joan Duran
ca: ca:
# Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
direction: ltr
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
@@ -64,6 +69,11 @@ ca:
other: "almost {{count}} years" other: "almost {{count}} years"
number: number:
# Default format for numbers
format:
separator: "."
delimiter: ""
precision: 3
human: human:
format: format:
delimiter: "" delimiter: ""
@@ -78,6 +88,7 @@ ca:
mb: "MB" mb: "MB"
gb: "GB" gb: "GB"
tb: "TB" tb: "TB"
# Used in array.to_sentence. # Used in array.to_sentence.
support: support:
@@ -111,6 +122,7 @@ ca:
greater_than_start_date: "ha de ser superior que la data inicial" greater_than_start_date: "ha de ser superior que la data inicial"
not_same_project: "no pertany al mateix projecte" not_same_project: "no pertany al mateix projecte"
circular_dependency: "Aquesta relació crearia una dependència circular" circular_dependency: "Aquesta relació crearia una dependència circular"
cant_link_an_issue_with_a_descendant: "Un assumpte no es pot enllaçar a una de les seves subtasques"
actionview_instancetag_blank_option: Seleccioneu actionview_instancetag_blank_option: Seleccioneu
@@ -144,18 +156,33 @@ ca:
notice_email_sent: "S'ha enviat un correu electrònic a {{value}}" notice_email_sent: "S'ha enviat un correu electrònic a {{value}}"
notice_email_error: "S'ha produït un error en enviar el correu ({{value}})" notice_email_error: "S'ha produït un error en enviar el correu ({{value}})"
notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del RSS." notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del RSS."
notice_api_access_key_reseted: "S'ha reiniciat la clau d'accés a l'API."
notice_failed_to_save_issues: "No s'han pogut desar %s assumptes de {{count}} seleccionats: {{ids}}." notice_failed_to_save_issues: "No s'han pogut desar %s assumptes de {{count}} seleccionats: {{ids}}."
notice_failed_to_save_members: "No s'han pogut desar els membres: {{errors}}."
notice_no_issue_selected: "No s'ha seleccionat cap assumpte. Activeu els assumptes que voleu editar." notice_no_issue_selected: "No s'ha seleccionat cap assumpte. Activeu els assumptes que voleu editar."
notice_account_pending: "S'ha creat el compte i ara està pendent de l'aprovació de l'administrador." notice_account_pending: "S'ha creat el compte i ara està pendent de l'aprovació de l'administrador."
notice_default_data_loaded: "S'ha carregat correctament la configuració predeterminada." notice_default_data_loaded: "S'ha carregat correctament la configuració predeterminada."
notice_unable_delete_version: "No s'ha pogut suprimir la versió." notice_unable_delete_version: "No s'ha pogut suprimir la versió."
notice_unable_delete_time_entry: "No s'ha pogut suprimir l'entrada del registre de temps."
notice_issue_done_ratios_updated: "S'ha actualitzat el tant per cent dels assumptes."
error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: {{value}} " error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: {{value}} "
error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el dipòsit." error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el dipòsit."
error_scm_command_failed: "S'ha produït un error en intentar accedir al dipòsit: {{value}}" error_scm_command_failed: "S'ha produït un error en intentar accedir al dipòsit: {{value}}"
error_scm_annotate: "L'entrada no existeix o no s'ha pogut anotar." error_scm_annotate: "L'entrada no existeix o no s'ha pogut anotar."
error_issue_not_found_in_project: "No s'ha trobat l'assumpte o no pertany a aquest projecte" error_issue_not_found_in_project: "No s'ha trobat l'assumpte o no pertany a aquest projecte"
error_no_tracker_in_project: "Aquest projecte no té seguidor associat. Comproveu els paràmetres del projecte."
error_no_default_issue_status: "No s'ha definit cap estat d'assumpte predeterminat. Comproveu la configuració (aneu a «Administració -> Estats de l'assumpte»)."
error_can_not_delete_custom_field: "No s'ha pogut suprimir el camp personalitat"
error_can_not_delete_tracker: "Aquest seguidor conté assumptes i no es pot suprimir."
error_can_not_remove_role: "Aquest rol s'està utilitzant i no es pot suprimir."
error_can_not_reopen_issue_on_closed_version: "Un assumpte assignat a una versió tancada no es pot tornar a obrir"
error_can_not_archive_project: "Aquest projecte no es pot arxivar"
error_issue_done_ratios_not_updated: "No s'ha actualitza el tant per cent dels assumptes."
error_workflow_copy_source: "Seleccioneu un seguidor o rol font"
error_workflow_copy_target: "Seleccioneu seguidors i rols objectiu"
error_unable_delete_issue_status: "No s'ha pogut suprimir l'estat de l'assumpte"
error_unable_to_connect: "No s'ha pogut connectar ({{value}})"
warning_attachments_not_saved: "No s'han pogut desar {{count}} fitxers." warning_attachments_not_saved: "No s'han pogut desar {{count}} fitxers."
mail_subject_lost_password: "Contrasenya de {{value}}" mail_subject_lost_password: "Contrasenya de {{value}}"
@@ -166,8 +193,12 @@ ca:
mail_body_account_information: Informació del compte mail_body_account_information: Informació del compte
mail_subject_account_activation_request: "Sol·licitud d'activació del compte de {{value}}" mail_subject_account_activation_request: "Sol·licitud d'activació del compte de {{value}}"
mail_body_account_activation_request: "S'ha registrat un usuari nou ({{value}}). El seu compte està pendent d'aprovació:" mail_body_account_activation_request: "S'ha registrat un usuari nou ({{value}}). El seu compte està pendent d'aprovació:"
mail_subject_reminder: "%d assumptes venceran els següents {{count}} dies" mail_subject_reminder: "{{count}} assumptes venceran els següents {{days}} dies"
mail_body_reminder: "{{count}} assumptes que teniu assignades venceran els següents {{days}} dies:" mail_body_reminder: "{{count}} assumptes que teniu assignades venceran els següents {{days}} dies:"
mail_subject_wiki_content_added: "S'ha afegit la pàgina wiki «{{page}}»"
mail_body_wiki_content_added: "En {{author}} ha afegit la pàgina wiki «{{page}}»."
mail_subject_wiki_content_updated: "S'ha actualitzat la pàgina wiki «{{page}}»"
mail_body_wiki_content_updated: "En {{author}} ha actualitzat la pàgina wiki «{{page}}»."
gui_validation_error: 1 error gui_validation_error: 1 error
gui_validation_error_plural: "{{count}} errors" gui_validation_error_plural: "{{count}} errors"
@@ -207,6 +238,7 @@ ca:
field_priority: Prioritat field_priority: Prioritat
field_fixed_version: Versió objectiu field_fixed_version: Versió objectiu
field_user: Usuari field_user: Usuari
field_principal: Principal
field_role: Rol field_role: Rol
field_homepage: Pàgina web field_homepage: Pàgina web
field_is_public: Públic field_is_public: Públic
@@ -251,6 +283,7 @@ ca:
field_redirect_existing_links: Redirigeix els enllaços existents field_redirect_existing_links: Redirigeix els enllaços existents
field_estimated_hours: Temps previst field_estimated_hours: Temps previst
field_column_names: Columnes field_column_names: Columnes
field_time_entries: "Registre de temps"
field_time_zone: Zona horària field_time_zone: Zona horària
field_searchable: Es pot cercar field_searchable: Es pot cercar
field_default_value: Valor predeterminat field_default_value: Valor predeterminat
@@ -260,6 +293,9 @@ ca:
field_watcher: Vigilància field_watcher: Vigilància
field_identity_url: URL OpenID field_identity_url: URL OpenID
field_content: Contingut field_content: Contingut
field_group_by: "Agrupa els resultats per"
field_sharing: Compartició
field_parent_issue: "Tasca pare"
setting_app_title: "Títol de l'aplicació" setting_app_title: "Títol de l'aplicació"
setting_app_subtitle: "Subtítol de l'aplicació" setting_app_subtitle: "Subtítol de l'aplicació"
@@ -295,20 +331,35 @@ ca:
setting_activity_days_default: "Dies a mostrar l'activitat del projecte" setting_activity_days_default: "Dies a mostrar l'activitat del projecte"
setting_display_subprojects_issues: "Mostra els assumptes d'un subprojecte en el projecte pare per defecte" setting_display_subprojects_issues: "Mostra els assumptes d'un subprojecte en el projecte pare per defecte"
setting_enabled_scm: "Habilita l'SCM" setting_enabled_scm: "Habilita l'SCM"
setting_mail_handler_body_delimiters: "Trunca els correus electrònics després d'una d'aquestes línies"
setting_mail_handler_api_enabled: "Habilita el WS per correus electrònics d'entrada" setting_mail_handler_api_enabled: "Habilita el WS per correus electrònics d'entrada"
setting_mail_handler_api_key: Clau API setting_mail_handler_api_key: Clau API
setting_sequential_project_identifiers: Genera identificadors de projecte seqüencials setting_sequential_project_identifiers: Genera identificadors de projecte seqüencials
setting_gravatar_enabled: "Utilitza les icones d'usuari Gravatar" setting_gravatar_enabled: "Utilitza les icones d'usuari Gravatar"
setting_gravatar_default: "Imatge Gravatar predeterminada"
setting_diff_max_lines_displayed: Número màxim de línies amb diferències mostrades setting_diff_max_lines_displayed: Número màxim de línies amb diferències mostrades
setting_file_max_size_displayed: Mida màxima dels fitxers de text mostrats en línia setting_file_max_size_displayed: Mida màxima dels fitxers de text mostrats en línia
setting_repository_log_display_limit: Número màxim de revisions que es mostren al registre de fitxers setting_repository_log_display_limit: Número màxim de revisions que es mostren al registre de fitxers
setting_openid: "Permet entrar i registrar-se amb l'OpenID" setting_openid: "Permet entrar i registrar-se amb l'OpenID"
setting_password_min_length: "Longitud mínima de la contrasenya"
setting_new_project_user_role_id: "Aquest rol es dóna a un usuari no administrador per a crear projectes"
setting_default_projects_modules: "Mòduls activats per defecte en els projectes nous"
setting_issue_done_ratio: "Calcula tant per cent realitzat de l'assumpte amb"
setting_issue_done_ratio_issue_status: "Utilitza l'estat de l'assumpte"
setting_issue_done_ratio_issue_field: "Utilitza el camp de l'assumpte"
setting_start_of_week: "Inicia les setmanes en"
setting_rest_api_enabled: "Habilita el servei web REST"
setting_cache_formatted_text: Cache formatted text
permission_add_project: "Crea projectes"
permission_add_subprojects: "Crea subprojectes"
permission_edit_project: Edita el projecte permission_edit_project: Edita el projecte
permission_select_project_modules: Selecciona els mòduls del projecte permission_select_project_modules: Selecciona els mòduls del projecte
permission_manage_members: Gestiona els membres permission_manage_members: Gestiona els membres
permission_manage_project_activities: "Gestiona les activitats del projecte"
permission_manage_versions: Gestiona les versions permission_manage_versions: Gestiona les versions
permission_manage_categories: Gestiona les categories dels assumptes permission_manage_categories: Gestiona les categories dels assumptes
permission_view_issues: "Visualitza els assumptes"
permission_add_issues: Afegeix assumptes permission_add_issues: Afegeix assumptes
permission_edit_issues: Edita els assumptes permission_edit_issues: Edita els assumptes
permission_manage_issue_relations: Gestiona les relacions dels assumptes permission_manage_issue_relations: Gestiona les relacions dels assumptes
@@ -323,6 +374,7 @@ ca:
permission_view_calendar: Visualitza el calendari permission_view_calendar: Visualitza el calendari
permission_view_issue_watchers: Visualitza la llista de vigilàncies permission_view_issue_watchers: Visualitza la llista de vigilàncies
permission_add_issue_watchers: Afegeix vigilàncies permission_add_issue_watchers: Afegeix vigilàncies
permission_delete_issue_watchers: Suprimeix els vigilants
permission_log_time: Registra el temps invertit permission_log_time: Registra el temps invertit
permission_view_time_entries: Visualitza el temps invertit permission_view_time_entries: Visualitza el temps invertit
permission_edit_time_entries: Edita els registres de temps permission_edit_time_entries: Edita els registres de temps
@@ -352,6 +404,8 @@ ca:
permission_edit_own_messages: Edita els missatges propis permission_edit_own_messages: Edita els missatges propis
permission_delete_messages: Suprimeix els missatges permission_delete_messages: Suprimeix els missatges
permission_delete_own_messages: Suprimeix els missatges propis permission_delete_own_messages: Suprimeix els missatges propis
permission_export_wiki_pages: "Exporta les pàgines wiki"
permission_manage_subtasks: "Gestiona subtasques"
project_module_issue_tracking: "Seguidor d'assumptes" project_module_issue_tracking: "Seguidor d'assumptes"
project_module_time_tracking: Seguidor de temps project_module_time_tracking: Seguidor de temps
@@ -361,10 +415,13 @@ ca:
project_module_wiki: Wiki project_module_wiki: Wiki
project_module_repository: Dipòsit project_module_repository: Dipòsit
project_module_boards: Taulers project_module_boards: Taulers
project_module_calendar: Calendari
project_module_gantt: Gantt
label_user: Usuari label_user: Usuari
label_user_plural: Usuaris label_user_plural: Usuaris
label_user_new: Usuari nou label_user_new: Usuari nou
label_user_anonymous: Anònim
label_project: Projecte label_project: Projecte
label_project_new: Projecte nou label_project_new: Projecte nou
label_project_plural: Projectes label_project_plural: Projectes
@@ -411,12 +468,13 @@ ca:
label_information_plural: Informació label_information_plural: Informació
label_please_login: Entreu label_please_login: Entreu
label_register: Registre label_register: Registre
label_login_with_open_id_option: o entra amb l'OpenID label_login_with_open_id_option: "o entra amb l'OpenID"
label_password_lost: Contrasenya perduda label_password_lost: Contrasenya perduda
label_home: Inici label_home: Inici
label_my_page: La meva pàgina label_my_page: La meva pàgina
label_my_account: El meu compte label_my_account: El meu compte
label_my_projects: Els meus projectes label_my_projects: Els meus projectes
label_my_page_block: "Els meus blocs de pàgina"
label_administration: Administració label_administration: Administració
label_login: Entra label_login: Entra
label_logout: Surt label_logout: Surt
@@ -436,6 +494,7 @@ ca:
label_auth_source_new: "Mode d'autenticació nou" label_auth_source_new: "Mode d'autenticació nou"
label_auth_source_plural: "Modes d'autenticació" label_auth_source_plural: "Modes d'autenticació"
label_subproject_plural: Subprojectes label_subproject_plural: Subprojectes
label_subproject_new: "Subprojecte nou"
label_and_its_subprojects: "{{value}} i els seus subprojectes" label_and_its_subprojects: "{{value}} i els seus subprojectes"
label_min_max_length: Longitud mín - max label_min_max_length: Longitud mín - max
label_list: Llist label_list: Llist
@@ -470,8 +529,9 @@ ca:
label_version: Versió label_version: Versió
label_version_new: Versió nova label_version_new: Versió nova
label_version_plural: Versions label_version_plural: Versions
label_close_versions: "Tanca les versions completades"
label_confirmation: Confirmació label_confirmation: Confirmació
label_export_to: 'També disponible a:' label_export_to: "També disponible a:"
label_read: Llegeix... label_read: Llegeix...
label_public_projects: Projectes públics label_public_projects: Projectes públics
label_open_issues: obert label_open_issues: obert
@@ -528,6 +588,8 @@ ca:
label_not_equals: no és label_not_equals: no és
label_in_less_than: en menys de label_in_less_than: en menys de
label_in_more_than: en més de label_in_more_than: en més de
label_greater_or_equal: ">="
label_less_or_equal: <=
label_in: en label_in: en
label_today: avui label_today: avui
label_all_time: tot el temps label_all_time: tot el temps
@@ -550,17 +612,21 @@ ca:
label_browse: Navega label_browse: Navega
label_modification: "{{count}} canvi" label_modification: "{{count}} canvi"
label_modification_plural: "{{count}} canvis" label_modification_plural: "{{count}} canvis"
label_branch: Branca
label_tag: Etiqueta
label_revision: Revisió label_revision: Revisió
label_revision_plural: Revisions label_revision_plural: Revisions
label_revision_id: "Revisió {{value}}"
label_associated_revisions: Revisions associades label_associated_revisions: Revisions associades
label_added: afegit label_added: afegit
label_modified: modificat label_modified: modificat
label_renamed: reanomenat
label_copied: copiat label_copied: copiat
label_renamed: reanomenat
label_deleted: suprimit label_deleted: suprimit
label_latest_revision: Última revisió label_latest_revision: Última revisió
label_latest_revision_plural: Últimes revisions label_latest_revision_plural: Últimes revisions
label_view_revisions: Visualitza les revisions label_view_revisions: Visualitza les revisions
label_view_all_revisions: "Visualitza totes les revisions"
label_max_size: Mida màxima label_max_size: Mida màxima
label_sort_highest: Mou a la part superior label_sort_highest: Mou a la part superior
label_sort_higher: Mou cap amunt label_sort_higher: Mou cap amunt
@@ -586,6 +652,7 @@ ca:
label_changes_details: Detalls de tots els canvis label_changes_details: Detalls de tots els canvis
label_issue_tracking: "Seguiment d'assumptes" label_issue_tracking: "Seguiment d'assumptes"
label_spent_time: Temps invertit label_spent_time: Temps invertit
label_overall_spent_time: "Temps total invertit"
label_f_hour: "{{value}} hora" label_f_hour: "{{value}} hora"
label_f_hour_plural: "{{value}} hores" label_f_hour_plural: "{{value}} hores"
label_time_tracking: Temps de seguiment label_time_tracking: Temps de seguiment
@@ -623,6 +690,8 @@ ca:
label_board: Fòrum label_board: Fòrum
label_board_new: Fòrum nou label_board_new: Fòrum nou
label_board_plural: Fòrums label_board_plural: Fòrums
label_board_locked: Bloquejat
label_board_sticky: Sticky
label_topic_plural: Temes label_topic_plural: Temes
label_message_plural: Missatges label_message_plural: Missatges
label_message_last: Últim missatge label_message_last: Últim missatge
@@ -638,6 +707,8 @@ ca:
label_language_based: "Basat en l'idioma de l'usuari" label_language_based: "Basat en l'idioma de l'usuari"
label_sort_by: "Ordena per {{value}}" label_sort_by: "Ordena per {{value}}"
label_send_test_email: Envia un correu electrònic de prova label_send_test_email: Envia un correu electrònic de prova
label_feeds_access_key: "Clau d'accés del RSS"
label_missing_feeds_access_key: "Falta una clau d'accés del RSS"
label_feeds_access_key_created_on: "Clau d'accés del RSS creada fa {{value}}" label_feeds_access_key_created_on: "Clau d'accés del RSS creada fa {{value}}"
label_module_plural: Mòduls label_module_plural: Mòduls
label_added_time_by: "Afegit per {{author}} fa {{age}}" label_added_time_by: "Afegit per {{author}} fa {{age}}"
@@ -683,6 +754,28 @@ ca:
label_ascending: Ascendent label_ascending: Ascendent
label_descending: Descendent label_descending: Descendent
label_date_from_to: Des de {{start}} a {{end}} label_date_from_to: Des de {{start}} a {{end}}
label_wiki_content_added: "S'ha afegit la pàgina wiki"
label_wiki_content_updated: "S'ha actualitzat la pàgina wiki"
label_group: Grup
label_group_plural: Grups
label_group_new: Grup nou
label_time_entry_plural: Temps invertit
label_version_sharing_hierarchy: "Amb la jerarquia del projecte"
label_version_sharing_system: "Amb tots els projectes"
label_version_sharing_descendants: "Amb tots els subprojectes"
label_version_sharing_tree: "Amb l'arbre del projecte"
label_version_sharing_none: "Sense compartir"
label_update_issue_done_ratios: "Actualitza el tant per cent dels assumptes realitzats"
label_copy_source: Font
label_copy_target: Objectiu
label_copy_same_as_target: "El mateix que l'objectiu"
label_display_used_statuses_only: "Mostra només els estats que utilitza aquest seguidor"
label_api_access_key: "Clau d'accés a l'API"
label_missing_api_access_key: "Falta una clau d'accés de l'API"
label_api_access_key_created_on: "Clau d'accés de l'API creada fa {{value}}"
label_profile: Perfil
label_subtask_plural: Subtasques
label_project_copy_notifications: "Envia notificacions de correu electrònic durant la còpia del projecte"
button_login: Entra button_login: Entra
button_submit: Tramet button_submit: Tramet
@@ -704,11 +797,12 @@ ca:
button_list: Llista button_list: Llista
button_view: Visualitza button_view: Visualitza
button_move: Mou button_move: Mou
button_move_and_follow: "Mou i segueix"
button_back: Enrere button_back: Enrere
button_cancel: Cancel·la button_cancel: Cancel·la
button_activate: Activa button_activate: Activa
button_sort: Ordena button_sort: Ordena
button_log_time: "Hora d'entrada" button_log_time: "Registre de temps"
button_rollback: Torna a aquesta versió button_rollback: Torna a aquesta versió
button_watch: Vigila button_watch: Vigila
button_unwatch: No vigilis button_unwatch: No vigilis
@@ -719,15 +813,24 @@ ca:
button_rename: Reanomena button_rename: Reanomena
button_change_password: Canvia la contrasenya button_change_password: Canvia la contrasenya
button_copy: Copia button_copy: Copia
button_copy_and_follow: "Copia i segueix"
button_annotate: Anota button_annotate: Anota
button_update: Actualitza button_update: Actualitza
button_configure: Configura button_configure: Configura
button_quote: Cita button_quote: Cita
button_duplicate: Duplica
button_show: Mostra
status_active: actiu status_active: actiu
status_registered: informat status_registered: informat
status_locked: bloquejat status_locked: bloquejat
version_status_open: oberta
version_status_locked: bloquejada
version_status_closed: tancada
field_active: Actiu
text_select_mail_notifications: "Seleccioneu les accions per les quals s'hauria d'enviar una notificació per correu electrònic." text_select_mail_notifications: "Seleccioneu les accions per les quals s'hauria d'enviar una notificació per correu electrònic."
text_regexp_info: ex. ^[A-Z0-9]+$ text_regexp_info: ex. ^[A-Z0-9]+$
text_min_max_length_info: 0 significa sense restricció text_min_max_length_info: 0 significa sense restricció
@@ -735,6 +838,10 @@ ca:
text_subprojects_destroy_warning: "També seran suprimits els seus subprojectes: {{value}}." text_subprojects_destroy_warning: "També seran suprimits els seus subprojectes: {{value}}."
text_workflow_edit: Seleccioneu un rol i un seguidor per a editar el flux de treball text_workflow_edit: Seleccioneu un rol i un seguidor per a editar el flux de treball
text_are_you_sure: Segur? text_are_you_sure: Segur?
text_journal_changed: "{{label}} ha canviat de {{old}} a {{new}}"
text_journal_set_to: "{{label}} s'ha establert a {{value}}"
text_journal_deleted: "{{label}} s'ha suprimit ({{old}})"
text_journal_added: "S'ha afegit {{label}} {{value}}"
text_tip_task_begin_day: "tasca que s'inicia aquest dia" text_tip_task_begin_day: "tasca que s'inicia aquest dia"
text_tip_task_end_day: tasca que finalitza aquest dia text_tip_task_end_day: tasca que finalitza aquest dia
text_tip_task_begin_end_day: "tasca que s'inicia i finalitza aquest dia" text_tip_task_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
@@ -745,6 +852,7 @@ ca:
text_tracker_no_workflow: "No s'ha definit cap flux de treball per a aquest seguidor" text_tracker_no_workflow: "No s'ha definit cap flux de treball per a aquest seguidor"
text_unallowed_characters: Caràcters no permesos text_unallowed_characters: Caràcters no permesos
text_comma_separated: Es permeten valors múltiples (separats per una coma). text_comma_separated: Es permeten valors múltiples (separats per una coma).
text_line_separated: "Es permeten diversos valors (una línia per cada valor)."
text_issues_ref_in_commit_messages: Referència i soluciona els assumptes en els missatges publicats text_issues_ref_in_commit_messages: Referència i soluciona els assumptes en els missatges publicats
text_issue_added: "L'assumpte {{id}} ha sigut informat per {{author}}." text_issue_added: "L'assumpte {{id}} ha sigut informat per {{author}}."
text_issue_updated: "L'assumpte {{id}} ha sigut actualitzat per {{author}}." text_issue_updated: "L'assumpte {{id}} ha sigut actualitzat per {{author}}."
@@ -765,14 +873,21 @@ ca:
text_destroy_time_entries_question: "S'han informat {{hours}} hores en els assumptes que aneu a suprimir. Què voleu fer?" text_destroy_time_entries_question: "S'han informat {{hours}} hores en els assumptes que aneu a suprimir. Què voleu fer?"
text_destroy_time_entries: Suprimeix les hores informades text_destroy_time_entries: Suprimeix les hores informades
text_assign_time_entries_to_project: Assigna les hores informades al projecte text_assign_time_entries_to_project: Assigna les hores informades al projecte
text_reassign_time_entries: 'Torna a assignar les hores informades a aquest assumpte:' text_reassign_time_entries: "Torna a assignar les hores informades a aquest assumpte:"
text_user_wrote: "{{value}} va escriure:" text_user_wrote: "{{value}} va escriure:"
text_enumeration_destroy_question: "{{count}} objectes estan assignats a aquest valor." text_enumeration_destroy_question: "{{count}} objectes estan assignats a aquest valor."
text_enumeration_category_reassign_to: 'Torna a assignar-los a aquest valor:' text_enumeration_category_reassign_to: "Torna a assignar-los a aquest valor:"
text_email_delivery_not_configured: "El lliurament per correu electrònic no està configurat i les notificacions estan inhabilitades.\nConfigureu el servidor SMTP a config/email.yml i reinicieu l'aplicació per habilitar-lo." text_email_delivery_not_configured: "El lliurament per correu electrònic no està configurat i les notificacions estan inhabilitades.\nConfigureu el servidor SMTP a config/email.yml i reinicieu l'aplicació per habilitar-lo."
text_repository_usernames_mapping: "Seleccioneu l'assignació entre els usuaris del Redmine i cada nom d'usuari trobat al dipòsit.\nEls usuaris amb el mateix nom d'usuari o correu del Redmine i del dipòsit s'assignaran automàticament." text_repository_usernames_mapping: "Seleccioneu l'assignació entre els usuaris del Redmine i cada nom d'usuari trobat al dipòsit.\nEls usuaris amb el mateix nom d'usuari o correu del Redmine i del dipòsit s'assignaran automàticament."
text_diff_truncated: "... Aquestes diferències s'han trucat perquè excedeixen la mida màxima que es pot mostrar." text_diff_truncated: "... Aquestes diferències s'han trucat perquè excedeixen la mida màxima que es pot mostrar."
text_custom_field_possible_values_info: 'Una línia per a cada valor' text_custom_field_possible_values_info: "Una línia per a cada valor"
text_wiki_page_destroy_question: "Aquesta pàgina té {{descendants}} pàgines fill i descendents. Què voleu fer?"
text_wiki_page_nullify_children: "Deixa les pàgines fill com a pàgines arrel"
text_wiki_page_destroy_children: "Suprimeix les pàgines fill i tots els seus descendents"
text_wiki_page_reassign_children: "Reasigna les pàgines fill a aquesta pàgina pare"
text_own_membership_delete_confirmation: "Esteu a punt de suprimir algun o tots els vostres permisos i potser no podreu editar més aquest projecte.\nSegur que voleu continuar?"
text_zoom_in: Redueix
text_zoom_out: Amplia
default_role_manager: Gestor default_role_manager: Gestor
default_role_developer: Desenvolupador default_role_developer: Desenvolupador
@@ -799,105 +914,10 @@ ca:
enumeration_issue_priorities: Prioritat dels assumptes enumeration_issue_priorities: Prioritat dels assumptes
enumeration_doc_categories: Categories del document enumeration_doc_categories: Categories del document
enumeration_activities: Activitats (seguidor de temps) enumeration_activities: Activitats (seguidor de temps)
label_greater_or_equal: ">=" enumeration_system_activity: Activitat del sistema
label_less_or_equal: <= field_member_of_group: Member of Group
text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do? field_assigned_to_role: Member of Role
text_wiki_page_reassign_children: Reassign child pages to this parent page button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_wiki_page_nullify_children: Keep child pages as root pages text_are_you_sure_with_children: Delete issue and all child issues?
text_wiki_page_destroy_children: Delete child pages and all their descendants field_text: Text field
setting_password_min_length: Minimum password length
field_group_by: Group results by
mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
label_wiki_content_added: Wiki page added
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}.
label_wiki_content_updated: Wiki page updated
mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}.
permission_add_project: Create project
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
label_view_all_revisions: View all revisions
label_tag: Tag
label_branch: Branch
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})"
label_group_plural: Groups
label_group: Group
label_group_new: New group
label_time_entry_plural: Spent time
text_journal_added: "{{label}} {{value}} added"
field_active: Active
enumeration_system_activity: System Activity
permission_delete_issue_watchers: Delete watchers
version_status_closed: closed
version_status_locked: locked
version_status_open: open
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
label_user_anonymous: Anonymous
button_move_and_follow: Move and follow
setting_default_projects_modules: Default enabled modules for new projects
setting_gravatar_default: Default Gravatar image
field_sharing: Sharing
label_version_sharing_hierarchy: With project hierarchy
label_version_sharing_system: With all projects
label_version_sharing_descendants: With subprojects
label_version_sharing_tree: With project tree
label_version_sharing_none: Not shared
error_can_not_archive_project: This project can not be archived
button_duplicate: Duplicate
button_copy_and_follow: Copy and follow
label_copy_source: Source
setting_issue_done_ratio: Calculate the issue done ratio with
setting_issue_done_ratio_issue_status: Use the issue status
error_issue_done_ratios_not_updated: Issue done ratios not updated.
error_workflow_copy_target: Please select target tracker(s) and role(s)
setting_issue_done_ratio_issue_field: Use the issue field
label_copy_same_as_target: Same as target
label_copy_target: Target
notice_issue_done_ratios_updated: Issue done ratios updated.
error_workflow_copy_source: Please select a source tracker or role
label_update_issue_done_ratios: Update issue done ratios
setting_start_of_week: Start calendars on
permission_view_issues: View Issues
label_display_used_statuses_only: Only display statuses that are used by this tracker
label_revision_id: Revision {{value}}
label_api_access_key: API access key
label_api_access_key_created_on: API access key created {{value}} ago
label_feeds_access_key: RSS access key
notice_api_access_key_reseted: Your API access key was reset.
setting_rest_api_enabled: Enable REST web service
label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key
button_show: Show
text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject
text_own_membership_delete_confirmation: |-
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
error_unable_delete_issue_status: Unable to delete issue status
label_profile: Profile
permission_manage_subtasks: Manage subtasks
field_parent_issue: Parent task
label_subtask_plural: Subtasks
label_project_copy_notifications: Send email notifications during the project copy
error_can_not_delete_custom_field: Unable to delete custom field
error_unable_to_connect: Unable to connect ({{value}})
error_can_not_remove_role: This role is in use and can not be deleted.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
field_principal: Principal
label_my_page_block: My page block
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
text_zoom_out: Zoom out
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
+179 -165
View File
@@ -1,4 +1,5 @@
cs: cs:
direction: ltr
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
@@ -23,8 +24,8 @@ cs:
time: "%H:%M" time: "%H:%M"
short: "%d %b %H:%M" short: "%d %b %H:%M"
long: "%B %d, %Y %H:%M" long: "%B %d, %Y %H:%M"
am: "am" am: "dop."
pm: "pm" pm: "odp."
datetime: datetime:
distance_in_words: distance_in_words:
@@ -60,10 +61,14 @@ cs:
one: "více než 1 rok" one: "více než 1 rok"
other: "více než {{count}} roky" other: "více než {{count}} roky"
almost_x_years: almost_x_years:
one: "almost 1 year" one: "témeř 1 rok"
other: "almost {{count}} years" other: "téměř {{count}} roky"
number: number:
format:
separator: "."
delimiter: ""
precision: 3
human: human:
format: format:
precision: 1 precision: 1
@@ -111,6 +116,7 @@ cs:
greater_than_start_date: "musí být větší než počáteční datum" greater_than_start_date: "musí být větší než počáteční datum"
not_same_project: "nepatří stejnému projektu" not_same_project: "nepatří stejnému projektu"
circular_dependency: "Tento vztah by vytvořil cyklickou závislost" circular_dependency: "Tento vztah by vytvořil cyklickou závislost"
cant_link_an_issue_with_a_descendant: "Úkol nemůže být spojen s jedním z jeho dílčích úkolů"
# Updated by Josef Liška <jl@chl.cz> # Updated by Josef Liška <jl@chl.cz>
# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz # CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
@@ -144,19 +150,19 @@ cs:
notice_successful_connection: Úspěšné připojení. notice_successful_connection: Úspěšné připojení.
notice_file_not_found: Stránka na kterou se snažíte zobrazit neexistuje nebo byla smazána. notice_file_not_found: Stránka na kterou se snažíte zobrazit neexistuje nebo byla smazána.
notice_locking_conflict: Údaje byly změněny jiným uživatelem. notice_locking_conflict: Údaje byly změněny jiným uživatelem.
notice_scm_error: Entry and/or revision doesn't exist in the repository. notice_scm_error: Záznam a/nebo revize neexistuje v repozitáři.
notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky. notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky.
notice_email_sent: "Na adresu {{value}} byl odeslán email" notice_email_sent: "Na adresu {{value}} byl odeslán email"
notice_email_error: "Při odesílání emailu nastala chyba ({{value}})" notice_email_error: "Při odesílání emailu nastala chyba ({{value}})"
notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován. notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován.
notice_failed_to_save_issues: "Failed to save {{count}} issue(s) on {{total}} selected: {{ids}}." notice_failed_to_save_issues: "Chyba při uložení {{count}} úkolu(ů) z {{total}} vybraných: {{ids}}."
notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat" notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat"
notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem." notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem."
notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána. notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána.
error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: {{value}}" error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: {{value}}"
error_scm_not_found: "Položka a/nebo revize neexistují v repository." error_scm_not_found: "Položka a/nebo revize neexistují v repozitáři."
error_scm_command_failed: "Při pokusu o přístup k repository došlo k chybě: {{value}}" error_scm_command_failed: "Při pokusu o přístup k repozitáři došlo k chybě: {{value}}"
error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu' error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu'
mail_subject_lost_password: "Vaše heslo ({{value}})" mail_subject_lost_password: "Vaše heslo ({{value}})"
@@ -204,10 +210,10 @@ cs:
field_due_date: Uzavřít do field_due_date: Uzavřít do
field_assigned_to: Přiřazeno field_assigned_to: Přiřazeno
field_priority: Priorita field_priority: Priorita
field_fixed_version: Přiřazeno k verzi field_fixed_version: Cílová verze
field_user: Uživatel field_user: Uživatel
field_role: Role field_role: Role
field_homepage: Homepage field_homepage: Domovská stránka
field_is_public: Veřejný field_is_public: Veřejný
field_parent: Nadřazený projekt field_parent: Nadřazený projekt
field_is_in_roadmap: Úkoly zobrazené v plánu field_is_in_roadmap: Úkoly zobrazené v plánu
@@ -259,18 +265,18 @@ cs:
setting_app_subtitle: Podtitulek aplikace setting_app_subtitle: Podtitulek aplikace
setting_welcome_text: Uvítací text setting_welcome_text: Uvítací text
setting_default_language: Výchozí jazyk setting_default_language: Výchozí jazyk
setting_login_required: Auten. vyžadována setting_login_required: Autentifikace vyžadována
setting_self_registration: Povolena automatická registrace setting_self_registration: Povolena automatická registrace
setting_attachment_max_size: Maximální velikost přílohy setting_attachment_max_size: Maximální velikost přílohy
setting_issues_export_limit: Limit pro export úkolů setting_issues_export_limit: Limit pro export úkolů
setting_mail_from: Odesílat emaily z adresy setting_mail_from: Odesílat emaily z adresy
setting_bcc_recipients: Příjemci skryté kopie (bcc) setting_bcc_recipients: Příjemci skryté kopie (bcc)
setting_host_name: Host name setting_host_name: Jméno serveru
setting_text_formatting: Formátování textu setting_text_formatting: Formátování textu
setting_wiki_compression: Komperese historie Wiki setting_wiki_compression: Komprese historie Wiki
setting_feeds_limit: Feed content limit setting_feeds_limit: Limit obsahu příspěvků
setting_default_projects_public: Nové projekty nastavovat jako veřejné setting_default_projects_public: Nové projekty nastavovat jako veřejné
setting_autofetch_changesets: Autofetch commits setting_autofetch_changesets: Automaticky stahovat commity
setting_sys_api_enabled: Povolit WS pro správu repozitory setting_sys_api_enabled: Povolit WS pro správu repozitory
setting_commit_ref_keywords: Klíčová slova pro odkazy setting_commit_ref_keywords: Klíčová slova pro odkazy
setting_commit_fix_keywords: Klíčová slova pro uzavření setting_commit_fix_keywords: Klíčová slova pro uzavření
@@ -284,8 +290,8 @@ cs:
setting_protocol: Protokol setting_protocol: Protokol
setting_per_page_options: Povolené počty řádků na stránce setting_per_page_options: Povolené počty řádků na stránce
setting_user_format: Formát zobrazení uživatele setting_user_format: Formát zobrazení uživatele
setting_activity_days_default: Days displayed on project activity setting_activity_days_default: Dny zobrazené v činnosti projektu
setting_display_subprojects_issues: Display subprojects issues on main projects by default setting_display_subprojects_issues: Automaticky zobrazit úkoly podprojektu v hlavním projektu
project_module_issue_tracking: Sledování úkolů project_module_issue_tracking: Sledování úkolů
project_module_time_tracking: Sledování času project_module_time_tracking: Sledování času
@@ -293,7 +299,7 @@ cs:
project_module_documents: Dokumenty project_module_documents: Dokumenty
project_module_files: Soubory project_module_files: Soubory
project_module_wiki: Wiki project_module_wiki: Wiki
project_module_repository: Repository project_module_repository: Repozitář
project_module_boards: Diskuse project_module_boards: Diskuse
label_user: Uživatel label_user: Uživatel
@@ -303,16 +309,16 @@ cs:
label_project_new: Nový projekt label_project_new: Nový projekt
label_project_plural: Projekty label_project_plural: Projekty
label_x_projects: label_x_projects:
zero: no projects zero: žádné projekty
one: 1 project one: 1 projekt
other: "{{count}} projects" other: "{{count}} projekty(ů)"
label_project_all: Všechny projekty label_project_all: Všechny projekty
label_project_latest: Poslední projekty label_project_latest: Poslední projekty
label_issue: Úkol label_issue: Úkol
label_issue_new: Nový úkol label_issue_new: Nový úkol
label_issue_plural: Úkoly label_issue_plural: Úkoly
label_issue_view_all: Všechny úkoly label_issue_view_all: Všechny úkoly
label_issues_by: "Úkoly od uživatele {{value}}" label_issues_by: "Úkoly podle {{value}}"
label_issue_added: Úkol přidán label_issue_added: Úkol přidán
label_issue_updated: Úkol aktualizován label_issue_updated: Úkol aktualizován
label_document: Dokument label_document: Dokument
@@ -329,7 +335,7 @@ cs:
label_tracker: Fronta label_tracker: Fronta
label_tracker_plural: Fronty label_tracker_plural: Fronty
label_tracker_new: Nová fronta label_tracker_new: Nová fronta
label_workflow: Workflow label_workflow: Průběh práce
label_issue_status: Stav úkolu label_issue_status: Stav úkolu
label_issue_status_plural: Stavy úkolů label_issue_status_plural: Stavy úkolů
label_issue_status_new: Nový stav label_issue_status_new: Nový stav
@@ -372,14 +378,14 @@ cs:
label_list: Seznam label_list: Seznam
label_date: Datum label_date: Datum
label_integer: Celé číslo label_integer: Celé číslo
label_float: Desetiné číslo label_float: Desetinné číslo
label_boolean: Ano/Ne label_boolean: Ano/Ne
label_string: Text label_string: Text
label_text: Dlouhý text label_text: Dlouhý text
label_attribute: Atribut label_attribute: Atribut
label_attribute_plural: Atributy label_attribute_plural: Atributy
label_download: "{{count}} Download" label_download: "{{count}} stažení"
label_download_plural: "{{count}} Downloads" label_download_plural: "{{count}} stažení"
label_no_data: Žádné položky label_no_data: Žádné položky
label_change_status: Změnit stav label_change_status: Změnit stav
label_history: Historie label_history: Historie
@@ -388,7 +394,7 @@ cs:
label_attachment_delete: Odstranit soubor label_attachment_delete: Odstranit soubor
label_attachment_plural: Soubory label_attachment_plural: Soubory
label_file_added: Soubor přidán label_file_added: Soubor přidán
label_report: Přeheled label_report: Přehled
label_report_plural: Přehledy label_report_plural: Přehledy
label_news: Novinky label_news: Novinky
label_news_new: Přidat novinku label_news_new: Přidat novinku
@@ -410,17 +416,17 @@ cs:
label_closed_issues: uzavřený label_closed_issues: uzavřený
label_closed_issues_plural: uzavřené label_closed_issues_plural: uzavřené
label_x_open_issues_abbr_on_total: label_x_open_issues_abbr_on_total:
zero: 0 open / {{total}} zero: 0 otevřených / {{total}}
one: 1 open / {{total}} one: 1 otevřený / {{total}}
other: "{{count}} open / {{total}}" other: "{{count}} otevřených / {{total}}"
label_x_open_issues_abbr: label_x_open_issues_abbr:
zero: 0 open zero: 0 otevřených
one: 1 open one: 1 otevřený
other: "{{count}} open" other: "{{count}} otevřených"
label_x_closed_issues_abbr: label_x_closed_issues_abbr:
zero: 0 closed zero: 0 uzavřených
one: 1 closed one: 1 uzavřený
other: "{{count}} closed" other: "{{count}} uzavřených"
label_total: Celkem label_total: Celkem
label_permissions: Práva label_permissions: Práva
label_current_status: Aktuální stav label_current_status: Aktuální stav
@@ -444,9 +450,9 @@ cs:
label_comment: Komentář label_comment: Komentář
label_comment_plural: Komentáře label_comment_plural: Komentáře
label_x_comments: label_x_comments:
zero: no comments zero: žádné komentáře
one: 1 comment one: 1 komentář
other: "{{count}} comments" other: "{{count}} komentářů"
label_comment_add: Přidat komentáře label_comment_add: Přidat komentáře
label_comment_added: Komentář přidán label_comment_added: Komentář přidán
label_comment_delete: Odstranit komentář label_comment_delete: Odstranit komentář
@@ -476,8 +482,8 @@ cs:
label_contains: obsahuje label_contains: obsahuje
label_not_contains: neobsahuje label_not_contains: neobsahuje
label_day_plural: dny label_day_plural: dny
label_repository: Repository label_repository: Repozitář
label_repository_plural: Repository label_repository_plural: Repozitáře
label_browse: Procházet label_browse: Procházet
label_modification: "{{count}} změna" label_modification: "{{count}} změna"
label_modification_plural: "{{count}} změn" label_modification_plural: "{{count}} změn"
@@ -526,7 +532,7 @@ cs:
label_diff_inline: uvnitř label_diff_inline: uvnitř
label_diff_side_by_side: vedle sebe label_diff_side_by_side: vedle sebe
label_options: Nastavení label_options: Nastavení
label_copy_workflow_from: Kopírovat workflow z label_copy_workflow_from: Kopírovat průběh práce z
label_permissions_report: Přehled práv label_permissions_report: Přehled práv
label_watched_issues: Sledované úkoly label_watched_issues: Sledované úkoly
label_related_issues: Související úkoly label_related_issues: Související úkoly
@@ -547,7 +553,7 @@ cs:
label_stay_logged_in: Zůstat přihlášený label_stay_logged_in: Zůstat přihlášený
label_disabled: zakázán label_disabled: zakázán
label_show_completed_versions: Ukázat dokončené verze label_show_completed_versions: Ukázat dokončené verze
label_me: mě label_me: já
label_board: Fórum label_board: Fórum
label_board_new: Nové fórum label_board_new: Nové fórum
label_board_plural: Fóra label_board_plural: Fóra
@@ -570,12 +576,12 @@ cs:
label_module_plural: Moduly label_module_plural: Moduly
label_added_time_by: "Přidáno uživatelem {{author}} před {{age}}" label_added_time_by: "Přidáno uživatelem {{author}} před {{age}}"
label_updated_time: "Aktualizováno před {{value}}" label_updated_time: "Aktualizováno před {{value}}"
label_jump_to_a_project: Zvolit projekt... label_jump_to_a_project: Vyberte projekt...
label_file_plural: Soubory label_file_plural: Soubory
label_changeset_plural: Changesety label_changeset_plural: Changesety
label_default_columns: Výchozí sloupce label_default_columns: Výchozí sloupce
label_no_change_option: (beze změny) label_no_change_option: (beze změny)
label_bulk_edit_selected_issues: Bulk edit selected issues label_bulk_edit_selected_issues: Hromadná úprava vybraných úkolů
label_theme: Téma label_theme: Téma
label_default: Výchozí label_default: Výchozí
label_search_titles_only: Vyhledávat pouze v názvech label_search_titles_only: Vyhledávat pouze v názvech
@@ -594,7 +600,7 @@ cs:
label_scm: SCM label_scm: SCM
label_plugins: Doplňky label_plugins: Doplňky
label_ldap_authentication: Autentifikace LDAP label_ldap_authentication: Autentifikace LDAP
label_downloads_abbr: D/L label_downloads_abbr: Staž.
label_optional_description: Volitelný popis label_optional_description: Volitelný popis
label_add_another_file: Přidat další soubor label_add_another_file: Přidat další soubor
label_preferences: Nastavení label_preferences: Nastavení
@@ -647,7 +653,7 @@ cs:
text_regexp_info: např. ^[A-Z0-9]+$ text_regexp_info: např. ^[A-Z0-9]+$
text_min_max_length_info: 0 znamená bez limitu text_min_max_length_info: 0 znamená bez limitu
text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ? text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ?
text_workflow_edit: Vyberte roli a frontu k editaci workflow text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce
text_are_you_sure: Jste si jisti? text_are_you_sure: Jste si jisti?
text_tip_task_begin_day: úkol začíná v tento den text_tip_task_begin_day: úkol začíná v tento den
text_tip_task_end_day: úkol končí v tento den text_tip_task_end_day: úkol končí v tento den
@@ -656,24 +662,24 @@ cs:
text_caracters_maximum: "{{count}} znaků maximálně." text_caracters_maximum: "{{count}} znaků maximálně."
text_caracters_minimum: "Musí být alespoň {{count}} znaků dlouhé." text_caracters_minimum: "Musí být alespoň {{count}} znaků dlouhé."
text_length_between: "Délka mezi {{min}} a {{max}} znaky." text_length_between: "Délka mezi {{min}} a {{max}} znaky."
text_tracker_no_workflow: Pro tuto frontu není definován žádný workflow text_tracker_no_workflow: Pro tuto frontu není definován žádný průběh práce
text_unallowed_characters: Nepovolené znaky text_unallowed_characters: Nepovolené znaky
text_comma_separated: Povoleno více hodnot (oddělěné čárkou). text_comma_separated: Povoleno více hodnot (oddělěné čárkou).
text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages text_issues_ref_in_commit_messages: Odkazování a opravování úkolů ve zprávách commitů
text_issue_added: "Úkol {{id}} byl vytvořen uživatelem {{author}}." text_issue_added: "Úkol {{id}} byl vytvořen uživatelem {{author}}."
text_issue_updated: "Úkol {{id}} byl aktualizován uživatelem {{author}}." text_issue_updated: "Úkol {{id}} byl aktualizován uživatelem {{author}}."
text_wiki_destroy_confirmation: Opravdu si přejete odstranit tuto WIKI a celý její obsah? text_wiki_destroy_confirmation: Opravdu si přejete odstranit tuto Wiki a celý její obsah?
text_issue_category_destroy_question: "Některé úkoly ({{count}}) jsou přiřazeny k této kategorii. Co s nimi chtete udělat?" text_issue_category_destroy_question: "Některé úkoly ({{count}}) jsou přiřazeny k této kategorii. Co s nimi chtete udělat?"
text_issue_category_destroy_assignments: Zrušit přiřazení ke kategorii text_issue_category_destroy_assignments: Zrušit přiřazení ke kategorii
text_issue_category_reassign_to: Přiřadit úkoly do této kategorie text_issue_category_reassign_to: Přiřadit úkoly do této kategorie
text_user_mail_option: "U projektů, které nebyly vybrány, budete dostávat oznámení pouze o vašich či o sledovaných položkách (např. o položkách jejichž jste autor nebo ke kterým jste přiřazen(a))." text_user_mail_option: "U projektů, které nebyly vybrány, budete dostávat oznámení pouze o vašich či o sledovaných položkách (např. o položkách jejichž jste autor nebo ke kterým jste přiřazen(a))."
text_no_configuration_data: "Role, fronty, stavy úkolů ani workflow nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci.Po té si můžete vše upravit" text_no_configuration_data: "Role, fronty, stavy úkolů ani průběh práce nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci. Po té si můžete vše upravit"
text_load_default_configuration: Nahrát výchozí konfiguraci text_load_default_configuration: Nahrát výchozí konfiguraci
text_status_changed_by_changeset: "Použito v changesetu {{value}}." text_status_changed_by_changeset: "Použito v changesetu {{value}}."
text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?' text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?'
text_select_project_modules: 'Aktivní moduly v tomto projektu:' text_select_project_modules: 'Aktivní moduly v tomto projektu:'
text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno
text_file_repository_writable: Povolen zápis do repository text_file_repository_writable: Povolen zápis do adresáře ukládání souborů
text_rmagick_available: RMagick k dispozici (volitelné) text_rmagick_available: RMagick k dispozici (volitelné)
text_destroy_time_entries_question: "U úkolů, které chcete odstranit je evidováno {{hours}} práce. Co chete udělat?" text_destroy_time_entries_question: "U úkolů, které chcete odstranit je evidováno {{hours}} práce. Co chete udělat?"
text_destroy_time_entries: Odstranit evidované hodiny. text_destroy_time_entries: Odstranit evidované hodiny.
@@ -687,7 +693,7 @@ cs:
default_tracker_feature: Požadavek default_tracker_feature: Požadavek
default_tracker_support: Podpora default_tracker_support: Podpora
default_issue_status_new: Nový default_issue_status_new: Nový
default_issue_status_in_progress: In Progress default_issue_status_in_progress: Ve vývoji
default_issue_status_resolved: Vyřešený default_issue_status_resolved: Vyřešený
default_issue_status_feedback: Čeká se default_issue_status_feedback: Čeká se
default_issue_status_closed: Uzavřený default_issue_status_closed: Uzavřený
@@ -699,7 +705,7 @@ cs:
default_priority_high: Vysoká default_priority_high: Vysoká
default_priority_urgent: Urgentní default_priority_urgent: Urgentní
default_priority_immediate: Okamžitá default_priority_immediate: Okamžitá
default_activity_design: Design default_activity_design: Návhr
default_activity_development: Vývoj default_activity_development: Vývoj
enumeration_issue_priorities: Priority úkolů enumeration_issue_priorities: Priority úkolů
@@ -710,10 +716,10 @@ cs:
text_subprojects_destroy_warning: "Jeho podprojek(y): {{value}} budou také smazány." text_subprojects_destroy_warning: "Jeho podprojek(y): {{value}} budou také smazány."
label_and_its_subprojects: "{{value}} a jeho podprojekty" label_and_its_subprojects: "{{value}} a jeho podprojekty"
mail_body_reminder: "{{count}} úkol(ů), které máte přiřazeny má termín během několik dní ({{days}}):" mail_body_reminder: "{{count}} úkol(ů), které máte přiřazeny má termín během několik dní ({{days}}):"
mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní" mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní ({{days}})"
text_user_wrote: "{{value}} napsal:" text_user_wrote: "{{value}} napsal:"
label_duplicated_by: duplicated by label_duplicated_by: duplikováno od
setting_enabled_scm: Povoleno SCM setting_enabled_scm: Povolené SCM
text_enumeration_category_reassign_to: 'Přeřadit je do této:' text_enumeration_category_reassign_to: 'Přeřadit je do této:'
text_enumeration_destroy_question: "Několik ({{count}}) objektů je přiřazeno k této hodnotě." text_enumeration_destroy_question: "Několik ({{count}}) objektů je přiřazeno k této hodnotě."
label_incoming_emails: Příchozí e-maily label_incoming_emails: Příchozí e-maily
@@ -739,22 +745,22 @@ cs:
permission_view_changesets: Zobrazování sady změn permission_view_changesets: Zobrazování sady změn
permission_view_time_entries: Zobrazení stráveného času permission_view_time_entries: Zobrazení stráveného času
permission_manage_versions: Spravování verzí permission_manage_versions: Spravování verzí
permission_manage_wiki: Spravování wiki permission_manage_wiki: Spravování Wiki
permission_manage_categories: Spravování kategorií úkolů permission_manage_categories: Spravování kategorií úkolů
permission_protect_wiki_pages: Zabezpečení wiki stránek permission_protect_wiki_pages: Zabezpečení Wiki stránek
permission_comment_news: Komentování novinek permission_comment_news: Komentování novinek
permission_delete_messages: Mazání zpráv permission_delete_messages: Mazání zpráv
permission_select_project_modules: Výběr modulů projektu permission_select_project_modules: Výběr modulů projektu
permission_manage_documents: Správa dokumentů permission_manage_documents: Správa dokumentů
permission_edit_wiki_pages: Upravování stránek wiki permission_edit_wiki_pages: Upravování stránek Wiki
permission_add_issue_watchers: Přidání sledujících uživatelů permission_add_issue_watchers: Přidání sledujících uživatelů
permission_view_gantt: Zobrazené Ganttova diagramu permission_view_gantt: Zobrazené Ganttova diagramu
permission_move_issues: Přesouvání úkolů permission_move_issues: Přesouvání úkolů
permission_manage_issue_relations: Spravování vztahů mezi úkoly permission_manage_issue_relations: Spravování vztahů mezi úkoly
permission_delete_wiki_pages: Mazání stránek na wiki permission_delete_wiki_pages: Mazání stránek na Wiki
permission_manage_boards: Správa diskusních fór permission_manage_boards: Správa diskusních fór
permission_delete_wiki_pages_attachments: Mazání příloh permission_delete_wiki_pages_attachments: Mazání příloh
permission_view_wiki_edits: Prohlížení historie wiki permission_view_wiki_edits: Prohlížení historie Wiki
permission_add_messages: Posílání zpráv permission_add_messages: Posílání zpráv
permission_view_messages: Prohlížení zpráv permission_view_messages: Prohlížení zpráv
permission_manage_files: Spravování souborů permission_manage_files: Spravování souborů
@@ -766,26 +772,26 @@ cs:
permission_delete_issues: Mazání úkolů permission_delete_issues: Mazání úkolů
permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů
permission_manage_repository: Spravování repozitáře permission_manage_repository: Spravování repozitáře
permission_commit_access: Commit access permission_commit_access: Commit přístup
permission_browse_repository: Procházení repozitáře permission_browse_repository: Procházení repozitáře
permission_view_documents: Prohlížení dokumentů permission_view_documents: Prohlížení dokumentů
permission_edit_project: Úprava projektů permission_edit_project: Úprava projektů
permission_add_issue_notes: Přidávání poznámek permission_add_issue_notes: Přidávání poznámek
permission_save_queries: Ukládání dotazů permission_save_queries: Ukládání dotazů
permission_view_wiki_pages: Prohlížení wiki permission_view_wiki_pages: Prohlížení Wiki
permission_rename_wiki_pages: Přejmenovávání wiki stránek permission_rename_wiki_pages: Přejmenovávání Wiki stránek
permission_edit_time_entries: Upravování záznamů o stráveném času permission_edit_time_entries: Upravování záznamů o stráveném času
permission_edit_own_issue_notes: Upravování vlastních poznámek permission_edit_own_issue_notes: Upravování vlastních poznámek
setting_gravatar_enabled: Použít uživatelské ikony Gravatar setting_gravatar_enabled: Použít uživatelské ikony Gravatar
label_example: Příklad label_example: Příklad
text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživateslkým jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky." text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživatelským jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky."
permission_edit_own_messages: Upravit vlastní zprávy permission_edit_own_messages: Upravit vlastní zprávy
permission_delete_own_messages: Smazat vlastní zprávy permission_delete_own_messages: Smazat vlastní zprávy
label_user_activity: "Aktivita uživatele: {{value}}" label_user_activity: "Aktivita uživatele: {{value}}"
label_updated_time_by: "Akutualizováno: {{author}} před: {{age}}" label_updated_time_by: "Akutualizováno: {{author}} před: {{age}}"
text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.' text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.'
setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů
text_plugin_assets_writable: Plugin assets directory writable text_plugin_assets_writable: Možnost zápisu do adresáře plugin assets
warning_attachments_not_saved: "{{count}} soubor(ů) nebylo možné uložit." warning_attachments_not_saved: "{{count}} soubor(ů) nebylo možné uložit."
button_create_and_continue: Vytvořit a pokračovat button_create_and_continue: Vytvořit a pokračovat
text_custom_field_possible_values_info: 'Každá hodnota na novém řádku' text_custom_field_possible_values_info: 'Každá hodnota na novém řádku'
@@ -804,103 +810,111 @@ cs:
label_date_from_to: Od {{start}} do {{end}} label_date_from_to: Od {{start}} do {{end}}
label_greater_or_equal: ">=" label_greater_or_equal: ">="
label_less_or_equal: <= label_less_or_equal: <=
text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do? text_wiki_page_destroy_question: Tato stránka má {{descendants}} podstránek a potomků. Co chcete udělat?
text_wiki_page_reassign_children: Reassign child pages to this parent page text_wiki_page_reassign_children: Přiřadit podstránky k tomuto rodiči
text_wiki_page_nullify_children: Keep child pages as root pages text_wiki_page_nullify_children: Ponechat podstránky jako kořenové stránky
text_wiki_page_destroy_children: Delete child pages and all their descendants text_wiki_page_destroy_children: Smazat podstránky a všechny jejich potomky
setting_password_min_length: Minimum password length setting_password_min_length: Minimální délka hesla
field_group_by: Group results by field_group_by: Seskupovat výsledky podle
mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated" mail_subject_wiki_content_updated: "'{{page}}' Wiki stránka byla aktualizována"
label_wiki_content_added: Wiki page added label_wiki_content_added: Wiki stránka přidána
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added" mail_subject_wiki_content_added: "'{{page}}' Wiki stránka byla přidána"
mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}. mail_body_wiki_content_added: "'{{page}}' Wiki stránka byla přidána od {{author}}."
label_wiki_content_updated: Wiki page updated label_wiki_content_updated: Wiki stránka aktualizována
mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}. mail_body_wiki_content_updated: "'{{page}}' Wiki stránka byla aktualizována od {{author}}."
permission_add_project: Create project permission_add_project: Vytvořit projekt
setting_new_project_user_role_id: Role given to a non-admin user who creates a project setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil
label_view_all_revisions: View all revisions label_view_all_revisions: Zobrazit všechny revize
label_tag: Tag label_tag: Tag
label_branch: Branch label_branch: Branch
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings. error_no_tracker_in_project: Žádná fronta nebyla přiřazena tomuto projektu. Prosím zkontroluje nastavení projektu.
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses"). error_no_default_issue_status: Není nastaven výchozí stav úkolu. Prosím zkontrolujte nastavení ("Administrace -> Stavy úkolů").
text_journal_changed: "{{label}} changed from {{old}} to {{new}}" text_journal_changed: "{{label}} změněn z {{old}} na {{new}}"
text_journal_set_to: "{{label}} set to {{value}}" text_journal_set_to: "{{label}} nastaven na {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})" text_journal_deleted: "{{label}} smazán ({{old}})"
label_group_plural: Groups label_group_plural: Skupiny
label_group: Group label_group: Skupina
label_group_new: New group label_group_new: Nová skupina
label_time_entry_plural: Spent time label_time_entry_plural: Strávený čas
text_journal_added: "{{label}} {{value}} added" text_journal_added: "{{label}} {{value}} přidán"
field_active: Active field_active: Aktivní
enumeration_system_activity: System Activity enumeration_system_activity: Systémová aktivita
permission_delete_issue_watchers: Delete watchers permission_delete_issue_watchers: Smazat přihlížející
version_status_closed: closed version_status_closed: zavřený
version_status_locked: locked version_status_locked: uzamčený
version_status_open: open version_status_open: otevřený
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened error_can_not_reopen_issue_on_closed_version: Úkol přiřazený k uzavřené verzi nemůže být znovu otevřen
label_user_anonymous: Anonymous label_user_anonymous: Anonymní
button_move_and_follow: Move and follow button_move_and_follow: Přesunout a následovat
setting_default_projects_modules: Default enabled modules for new projects setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt
setting_gravatar_default: Default Gravatar image setting_gravatar_default: Výchozí Gravatar
field_sharing: Sharing field_sharing: Sdílení
label_version_sharing_hierarchy: With project hierarchy label_version_sharing_hierarchy: S hierarchií projektu
label_version_sharing_system: With all projects label_version_sharing_system: Se všemi projekty
label_version_sharing_descendants: With subprojects label_version_sharing_descendants: S podprojekty
label_version_sharing_tree: With project tree label_version_sharing_tree: Se stromem projektu
label_version_sharing_none: Not shared label_version_sharing_none: Nesdíleno
error_can_not_archive_project: This project can not be archived error_can_not_archive_project: Tento projekt nemůže být archivován
button_duplicate: Duplicate button_duplicate: Duplikát
button_copy_and_follow: Copy and follow button_copy_and_follow: Kopírovat a následovat
label_copy_source: Source label_copy_source: Zdroj
setting_issue_done_ratio: Calculate the issue done ratio with setting_issue_done_ratio: Spočítat koeficient dokončení úkolu s
setting_issue_done_ratio_issue_status: Use the issue status setting_issue_done_ratio_issue_status: Použít stav úkolu
error_issue_done_ratios_not_updated: Issue done ratios not updated. error_issue_done_ratios_not_updated: Koeficient dokončení úkolu nebyl aktualizován.
error_workflow_copy_target: Please select target tracker(s) and role(s) error_workflow_copy_target: Prosím vyberte cílovou frontu(y) a roly(e)
setting_issue_done_ratio_issue_field: Use the issue field setting_issue_done_ratio_issue_field: Použít pole úkolu
label_copy_same_as_target: Same as target label_copy_same_as_target: Stejný jako cíl
label_copy_target: Target label_copy_target: Cíl
notice_issue_done_ratios_updated: Issue done ratios updated. notice_issue_done_ratios_updated: Koeficienty dokončení úkolu byly aktualizovány.
error_workflow_copy_source: Please select a source tracker or role error_workflow_copy_source: Prosím vyberte zdrojovou frontu nebo roly
label_update_issue_done_ratios: Update issue done ratios label_update_issue_done_ratios: Aktualizovat koeficienty dokončení úkolů
setting_start_of_week: Start calendars on setting_start_of_week: Začínat kalendáře
permission_view_issues: View Issues permission_view_issues: Zobrazit úkoly
label_display_used_statuses_only: Only display statuses that are used by this tracker label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou
label_revision_id: Revision {{value}} label_revision_id: Revize {{value}}
label_api_access_key: API access key label_api_access_key: API přístupový klíč
label_api_access_key_created_on: API access key created {{value}} ago label_api_access_key_created_on: API přístupový klíč vytvořen {{value}}
label_feeds_access_key: RSS access key label_feeds_access_key: RSS přístupový klíč
notice_api_access_key_reseted: Your API access key was reset. notice_api_access_key_reseted: Váš API přístupový klíč byl resetován.
setting_rest_api_enabled: Enable REST web service setting_rest_api_enabled: Zapnout službu REST
label_missing_api_access_key: Missing an API access key label_missing_api_access_key: Chybějící přístupový klíč API
label_missing_feeds_access_key: Missing a RSS access key label_missing_feeds_access_key: Chybějící přístupový klíč RSS
button_show: Show button_show: Zobrazit
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Více hodnot povoleno (jeden řádek pro každou hodnotu).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Zkrátit e-maily po jednom z těchto řádků
permission_add_subprojects: Create subprojects permission_add_subprojects: Vytvořit podprojekty
label_subproject_new: New subproject label_subproject_new: Nový podprojekt
text_own_membership_delete_confirmation: |- text_own_membership_delete_confirmation: |-
You are about to remove some or all of your permissions and may no longer be able to edit this project after that. Chystáte se odebrat si některá nebo všechny svá oprávnění a potom již nemusíte být schopni upravit tento projekt.
Are you sure you want to continue? Opravdu chcete pokračovat?
label_close_versions: Close completed versions label_close_versions: Zavřít dokončené verze
label_board_sticky: Sticky label_board_sticky: Nálepka
label_board_locked: Locked label_board_locked: Uzamčeno
permission_export_wiki_pages: Export wiki pages permission_export_wiki_pages: Exportovat Wiki stránky
setting_cache_formatted_text: Cache formatted text setting_cache_formatted_text: Ukládat formátovaný text do vyrovnávací paměti
permission_manage_project_activities: Manage project activities permission_manage_project_activities: Spravovat aktivity projektu
error_unable_delete_issue_status: Unable to delete issue status error_unable_delete_issue_status: Nelze smazat stavy úkolů
label_profile: Profile label_profile: Profil
permission_manage_subtasks: Manage subtasks permission_manage_subtasks: Spravovat podúkoly
field_parent_issue: Parent task field_parent_issue: Rodičovský úkol
label_subtask_plural: Subtasks label_subtask_plural: Podúkol
label_project_copy_notifications: Send email notifications during the project copy label_project_copy_notifications: Odeslat email oznámení v průběhu kopie projektu
error_can_not_delete_custom_field: Unable to delete custom field error_can_not_delete_custom_field: Nelze smazat volitelné pole
error_unable_to_connect: Unable to connect ({{value}}) error_unable_to_connect: Nelze se připojit ({{value}})
error_can_not_remove_role: This role is in use and can not be deleted. error_can_not_remove_role: Tato role je právě používaná a nelze ji smazat.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted. error_can_not_delete_tracker: Tato fronta obsahuje úkoly a nemůže být smazán.
field_principal: Principal field_principal: Hlavní
label_my_page_block: My page block label_my_page_block: Bloky na mé stránce
notice_failed_to_save_members: "Failed to save member(s): {{errors}}." notice_failed_to_save_members: "Nepodařilo se uložit člena(y): {{errors}}."
text_zoom_out: Zoom out text_zoom_out: Oddálit
text_zoom_in: Zoom in text_zoom_in: Přiblížit
notice_unable_delete_time_entry: Unable to delete time log entry. notice_unable_delete_time_entry: Nelze smazat čas ze záznamu.
label_overall_spent_time: Overall spent time label_overall_spent_time: Celkově strávený čas
field_time_entries: Zaznamenaný čas
project_module_gantt: Gantt
project_module_calendar: Kalendář
field_member_of_group: Člen skupiny
field_assigned_to_role: Člen role
button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: {{page_title}}"
text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
field_text: Textové pole
+12 -1
View File
@@ -3,6 +3,7 @@
# updated and upgraded to 0.9 by Morten Krogh Andersen (http://www.krogh.net) # updated and upgraded to 0.9 by Morten Krogh Andersen (http://www.krogh.net)
da: da:
direction: ltr
date: date:
formats: formats:
default: "%d.%m.%Y" default: "%d.%m.%Y"
@@ -129,6 +130,7 @@ da:
greater_than_start_date: "skal være senere end startdatoen" greater_than_start_date: "skal være senere end startdatoen"
not_same_project: "hører ikke til samme projekt" not_same_project: "hører ikke til samme projekt"
circular_dependency: "Denne relation vil skabe et afhængighedsforhold" circular_dependency: "Denne relation vil skabe et afhængighedsforhold"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
template: template:
header: header:
@@ -791,7 +793,7 @@ da:
permission_browse_repository: Gennemse repository permission_browse_repository: Gennemse repository
permission_manage_repository: Administrér repository permission_manage_repository: Administrér repository
permission_manage_members: Administrér medlemmer permission_manage_members: Administrér medlemmer
mail_subject_reminder: "{{count}} sag(er) har deadline i de kommende dage" mail_subject_reminder: "{{count}} sag(er) har deadline i de kommende dage ({{days}})"
permission_add_issue_notes: Tilføj noter permission_add_issue_notes: Tilføj noter
permission_edit_messages: Redigér beskeder permission_edit_messages: Redigér beskeder
permission_view_issue_watchers: Se liste over overvågere permission_view_issue_watchers: Se liste over overvågere
@@ -924,3 +926,12 @@ da:
text_zoom_in: Zoom in text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry. notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time label_overall_spent_time: Overall spent time
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
+56 -39
View File
@@ -2,6 +2,7 @@
# by Clemens Kofler (clemens@railway.at) # by Clemens Kofler (clemens@railway.at)
de: de:
direction: ltr
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
@@ -67,10 +68,11 @@ de:
other: "fast {{count}} Jahren" other: "fast {{count}} Jahren"
number: number:
# Default format for numbers
format: format:
precision: 2
separator: ',' separator: ','
delimiter: '.' delimiter: '.'
precision: 2
currency: currency:
format: format:
unit: '€' unit: '€'
@@ -99,13 +101,13 @@ de:
gb: "GB" gb: "GB"
tb: "TB" tb: "TB"
# Used in array.to_sentence. # Used in array.to_sentence.
support: support:
array: array:
sentence_connector: "und" sentence_connector: "und"
skip_last_comma: true skip_last_comma: true
activerecord: activerecord:
errors: errors:
template: template:
@@ -136,9 +138,10 @@ de:
greater_than_start_date: "muss größer als Anfangsdatum sein" greater_than_start_date: "muss größer als Anfangsdatum sein"
not_same_project: "gehört nicht zum selben Projekt" not_same_project: "gehört nicht zum selben Projekt"
circular_dependency: "Diese Beziehung würde eine zyklische Abhängigkeit erzeugen" circular_dependency: "Diese Beziehung würde eine zyklische Abhängigkeit erzeugen"
cant_link_an_issue_with_a_descendant: "Ein Ticket kann nicht mit einer ihrer Unteraufgaben verlinkt werden"
actionview_instancetag_blank_option: Bitte auswählen actionview_instancetag_blank_option: Bitte auswählen
general_text_No: 'Nein' general_text_No: 'Nein'
general_text_Yes: 'Ja' general_text_Yes: 'Ja'
general_text_no: 'nein' general_text_no: 'nein'
@@ -171,6 +174,7 @@ de:
notice_feeds_access_key_reseted: Ihr Atom-Zugriffsschlüssel wurde zurückgesetzt. notice_feeds_access_key_reseted: Ihr Atom-Zugriffsschlüssel wurde zurückgesetzt.
notice_api_access_key_reseted: Ihr API-Zugriffsschlüssel wurde zurückgesetzt. notice_api_access_key_reseted: Ihr API-Zugriffsschlüssel wurde zurückgesetzt.
notice_failed_to_save_issues: "{{count}} von {{total}} ausgewählten Tickets konnte(n) nicht gespeichert werden: {{ids}}." notice_failed_to_save_issues: "{{count}} von {{total}} ausgewählten Tickets konnte(n) nicht gespeichert werden: {{ids}}."
notice_failed_to_save_members: "Benutzer konnte nicht gespeichert werden: {{errors}}."
notice_no_issue_selected: "Kein Ticket ausgewählt! Bitte wählen Sie die Tickets, die Sie bearbeiten möchten." notice_no_issue_selected: "Kein Ticket ausgewählt! Bitte wählen Sie die Tickets, die Sie bearbeiten möchten."
notice_account_pending: "Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung des Administrators." notice_account_pending: "Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung des Administrators."
notice_default_data_loaded: Die Standard-Konfiguration wurde erfolgreich geladen. notice_default_data_loaded: Die Standard-Konfiguration wurde erfolgreich geladen.
@@ -185,17 +189,18 @@ de:
error_issue_not_found_in_project: 'Das Ticket wurde nicht gefunden oder gehört nicht zu diesem Projekt.' error_issue_not_found_in_project: 'Das Ticket wurde nicht gefunden oder gehört nicht zu diesem Projekt.'
error_no_tracker_in_project: Diesem Projekt ist kein Tracker zugeordnet. Bitte überprüfen Sie die Projekteinstellungen. error_no_tracker_in_project: Diesem Projekt ist kein Tracker zugeordnet. Bitte überprüfen Sie die Projekteinstellungen.
error_no_default_issue_status: Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter "Administration -> Ticket-Status"). error_no_default_issue_status: Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter "Administration -> Ticket-Status").
error_can_not_delete_custom_field: Kann das benutzerdefinierte Feld nicht löschen.
error_can_not_delete_tracker: Dieser Tracker enthält Tickets und kann nicht gelöscht werden.
error_can_not_remove_role: Diese Rolle wird verwendet und kann nicht gelöscht werden.
error_can_not_reopen_issue_on_closed_version: Das Ticket ist einer abgeschlossenen Version zugeordnet und kann daher nicht wieder geöffnet werden. error_can_not_reopen_issue_on_closed_version: Das Ticket ist einer abgeschlossenen Version zugeordnet und kann daher nicht wieder geöffnet werden.
error_can_not_archive_project: Dieses Projekt kann nicht archiviert werden. error_can_not_archive_project: Dieses Projekt kann nicht archiviert werden.
error_issue_done_ratios_not_updated: Der Ticket-Fortschritt wurde nicht aktualisiert. error_issue_done_ratios_not_updated: Der Ticket-Fortschritt wurde nicht aktualisiert.
error_workflow_copy_source: Bitte wählen Sie einen Quell-Tracker und eine Quell-Rolle. error_workflow_copy_source: Bitte wählen Sie einen Quell-Tracker und eine Quell-Rolle.
error_workflow_copy_target: Bitte wählen Sie die Ziel-Tracker und -Rollen. error_workflow_copy_target: Bitte wählen Sie die Ziel-Tracker und -Rollen.
error_unable_delete_issue_status: "Der Ticket-Status konnte nicht gelöscht werden." error_unable_delete_issue_status: "Der Ticket-Status konnte nicht gelöscht werden."
error_unable_to_connect: Fehler beim Verbinden ({{value}})
warning_attachments_not_saved: warning_attachments_not_saved: "{{count}} Datei(en) konnten nicht gespeichert werden."
one: "1 Datei konnte nicht gespeichert werden."
other: "{{count}} Dateien konnten nicht gespeichert werden."
mail_subject_lost_password: "Ihr {{value}} Kennwort" mail_subject_lost_password: "Ihr {{value}} Kennwort"
mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:' mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:'
mail_subject_register: "{{value}} Kontoaktivierung" mail_subject_register: "{{value}} Kontoaktivierung"
@@ -204,7 +209,7 @@ de:
mail_body_account_information: Ihre Konto-Informationen mail_body_account_information: Ihre Konto-Informationen
mail_subject_account_activation_request: "Antrag auf {{value}} Kontoaktivierung" mail_subject_account_activation_request: "Antrag auf {{value}} Kontoaktivierung"
mail_body_account_activation_request: "Ein neuer Benutzer ({{value}}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:" mail_body_account_activation_request: "Ein neuer Benutzer ({{value}}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:"
mail_subject_reminder: "{{count}} Tickets müssen in den nächsten Tagen abgegeben werden" mail_subject_reminder: "{{count}} Tickets müssen in den nächsten {{days}} Tagen abgegeben werden"
mail_body_reminder: "{{count}} Tickets, die Ihnen zugewiesen sind, müssen in den nächsten {{days}} Tagen abgegeben werden:" mail_body_reminder: "{{count}} Tickets, die Ihnen zugewiesen sind, müssen in den nächsten {{days}} Tagen abgegeben werden:"
mail_subject_wiki_content_added: "Wiki-Seite '{{page}}' hinzugefügt" mail_subject_wiki_content_added: "Wiki-Seite '{{page}}' hinzugefügt"
mail_body_wiki_content_added: "Die Wiki-Seite '{{page}}' wurde von {{author}} hinzugefügt." mail_body_wiki_content_added: "Die Wiki-Seite '{{page}}' wurde von {{author}} hinzugefügt."
@@ -249,6 +254,7 @@ de:
field_priority: Priorität field_priority: Priorität
field_fixed_version: Zielversion field_fixed_version: Zielversion
field_user: Benutzer field_user: Benutzer
field_principal: Auftraggeber
field_role: Rolle field_role: Rolle
field_homepage: Projekt-Homepage field_homepage: Projekt-Homepage
field_is_public: Öffentlich field_is_public: Öffentlich
@@ -293,6 +299,7 @@ de:
field_redirect_existing_links: Existierende Links umleiten field_redirect_existing_links: Existierende Links umleiten
field_estimated_hours: Geschätzter Aufwand field_estimated_hours: Geschätzter Aufwand
field_column_names: Spalten field_column_names: Spalten
field_time_entries: Logzeit
field_time_zone: Zeitzone field_time_zone: Zeitzone
field_searchable: Durchsuchbar field_searchable: Durchsuchbar
field_default_value: Standardwert field_default_value: Standardwert
@@ -304,6 +311,7 @@ de:
field_content: Inhalt field_content: Inhalt
field_group_by: Gruppiere Ergebnisse nach field_group_by: Gruppiere Ergebnisse nach
field_sharing: Gemeinsame Verwendung field_sharing: Gemeinsame Verwendung
field_parent_issue: Übergeordnete Aufgabe
setting_app_title: Applikations-Titel setting_app_title: Applikations-Titel
setting_app_subtitle: Applikations-Untertitel setting_app_subtitle: Applikations-Untertitel
@@ -413,6 +421,7 @@ de:
permission_delete_messages: Forenbeiträge löschen permission_delete_messages: Forenbeiträge löschen
permission_delete_own_messages: Eigene Forenbeiträge löschen permission_delete_own_messages: Eigene Forenbeiträge löschen
permission_export_wiki_pages: Wiki-Seiten exportieren permission_export_wiki_pages: Wiki-Seiten exportieren
permission_manage_subtasks: Unteraufgaben verwalten
project_module_issue_tracking: Ticket-Verfolgung project_module_issue_tracking: Ticket-Verfolgung
project_module_time_tracking: Zeiterfassung project_module_time_tracking: Zeiterfassung
@@ -422,7 +431,9 @@ de:
project_module_wiki: Wiki project_module_wiki: Wiki
project_module_repository: Projektarchiv project_module_repository: Projektarchiv
project_module_boards: Foren project_module_boards: Foren
project_module_calendar: Kalender
project_module_gantt: Gantt
label_user: Benutzer label_user: Benutzer
label_user_plural: Benutzer label_user_plural: Benutzer
label_user_new: Neuer Benutzer label_user_new: Neuer Benutzer
@@ -479,6 +490,7 @@ de:
label_my_page: Meine Seite label_my_page: Meine Seite
label_my_account: Mein Konto label_my_account: Mein Konto
label_my_projects: Meine Projekte label_my_projects: Meine Projekte
label_my_page_block: Bereich "Meine Seite"
label_administration: Administration label_administration: Administration
label_login: Anmelden label_login: Anmelden
label_logout: Abmelden label_logout: Abmelden
@@ -492,7 +504,7 @@ de:
label_user_activity: "Aktivität von {{value}}" label_user_activity: "Aktivität von {{value}}"
label_new: Neu label_new: Neu
label_logged_as: Angemeldet als label_logged_as: Angemeldet als
label_environment: Environment label_environment: Umgebung
label_authentication: Authentifizierung label_authentication: Authentifizierung
label_auth_source: Authentifizierungs-Modus label_auth_source: Authentifizierungs-Modus
label_auth_source_new: Neuer Authentifizierungs-Modus label_auth_source_new: Neuer Authentifizierungs-Modus
@@ -542,9 +554,18 @@ de:
label_open_issues_plural: offen label_open_issues_plural: offen
label_closed_issues: geschlossen label_closed_issues: geschlossen
label_closed_issues_plural: geschlossen label_closed_issues_plural: geschlossen
label_x_open_issues_abbr_on_total: "{{count}} offen / {{total}}" label_x_open_issues_abbr_on_total:
label_x_open_issues_abbr: "{{count}} offen" zero: 0 offen / {{total}}
label_x_closed_issues_abbr: "{{count}} geschlossen" one: 1 offen / {{total}}
other: "{{count}} offen / {{total}}"
label_x_open_issues_abbr:
zero: 0 offen
one: 1 offen
other: "{{count}} offen"
label_x_closed_issues_abbr:
zero: 0 geschlossen
one: 1 geschlossen
other: "{{count}} geschlossen"
label_total: Gesamtzahl label_total: Gesamtzahl
label_permissions: Berechtigungen label_permissions: Berechtigungen
label_current_status: Gegenwärtiger Status label_current_status: Gegenwärtiger Status
@@ -768,7 +789,10 @@ de:
label_api_access_key: API-Zugriffsschlüssel label_api_access_key: API-Zugriffsschlüssel
label_missing_api_access_key: Der API-Zugriffsschlüssel fehlt. label_missing_api_access_key: Der API-Zugriffsschlüssel fehlt.
label_api_access_key_created_on: Der API-Zugriffsschlüssel wurde vor {{value}} erstellt label_api_access_key_created_on: Der API-Zugriffsschlüssel wurde vor {{value}} erstellt
label_profile: Profil
label_subtask_plural: Unteraufgaben
label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des Projekts.
button_login: Anmelden button_login: Anmelden
button_submit: OK button_submit: OK
button_save: Speichern button_save: Speichern
@@ -812,17 +836,17 @@ de:
button_quote: Zitieren button_quote: Zitieren
button_duplicate: Duplizieren button_duplicate: Duplizieren
button_show: Anzeigen button_show: Anzeigen
status_active: aktiv status_active: aktiv
status_registered: angemeldet status_registered: angemeldet
status_locked: gesperrt status_locked: gesperrt
version_status_closed: abgeschlossen
version_status_locked: gesperrt
version_status_open: offen version_status_open: offen
version_status_locked: gesperrt
version_status_closed: abgeschlossen
field_active: Aktiv field_active: Aktiv
text_select_mail_notifications: Bitte wählen Sie die Aktionen aus, für die eine Mailbenachrichtigung gesendet werden soll. text_select_mail_notifications: Bitte wählen Sie die Aktionen aus, für die eine Mailbenachrichtigung gesendet werden soll.
text_regexp_info: z. B. ^[A-Z0-9]+$ text_regexp_info: z. B. ^[A-Z0-9]+$
text_min_max_length_info: 0 heißt keine Beschränkung text_min_max_length_info: 0 heißt keine Beschränkung
@@ -877,10 +901,10 @@ de:
text_wiki_page_nullify_children: Verschiebe die Unterseiten auf die oberste Ebene text_wiki_page_nullify_children: Verschiebe die Unterseiten auf die oberste Ebene
text_wiki_page_destroy_children: Lösche alle Unterseiten text_wiki_page_destroy_children: Lösche alle Unterseiten
text_wiki_page_reassign_children: Ordne die Unterseiten dieser Seite zu text_wiki_page_reassign_children: Ordne die Unterseiten dieser Seite zu
text_own_membership_delete_confirmation: |- text_own_membership_delete_confirmation: "Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.\nSind Sie sicher, dass Sie dies tun möchten?"
Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen. text_zoom_in: Zoom in
Sind Sie sicher, dass Sie dies tun möchten? text_zoom_out: Zoom out
default_role_manager: Manager default_role_manager: Manager
default_role_developer: Entwickler default_role_developer: Entwickler
default_role_reporter: Reporter default_role_reporter: Reporter
@@ -902,21 +926,14 @@ de:
default_priority_immediate: Sofort default_priority_immediate: Sofort
default_activity_design: Design default_activity_design: Design
default_activity_development: Entwicklung default_activity_development: Entwicklung
enumeration_issue_priorities: Ticket-Prioritäten enumeration_issue_priorities: Ticket-Prioritäten
enumeration_doc_categories: Dokumentenkategorien enumeration_doc_categories: Dokumentenkategorien
enumeration_activities: Aktivitäten (Zeiterfassung) enumeration_activities: Aktivitäten (Zeiterfassung)
enumeration_system_activity: System-Aktivität enumeration_system_activity: System-Aktivität
label_profile: Profil
permission_manage_subtasks: Unteraufgaben verwalten field_member_of_group: Member of Group
field_parent_issue: Übergeordnete Aufgabe field_assigned_to_role: Member of Role
label_subtask_plural: Unteraufgaben text_are_you_sure_with_children: Delete issue and all child issues?
label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des Projekts. field_text: Text field
error_can_not_delete_custom_field: Kann das benutzerdefinierte Feld nicht löschen.
error_unable_to_connect: Fehler beim Verbinden ({{value}})
error_can_not_remove_role: Diese Rolle wird verwendet und kann nicht gelöscht werden.
error_can_not_delete_tracker: Dieser Tracker enthält Tickets und kann nicht gelöscht werden.
field_principal: Principal
label_my_page_block: My page block
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
text_zoom_out: Zoom out
text_zoom_in: Zoom in
+17 -2
View File
@@ -2,6 +2,7 @@
# by Vaggelis Typaldos (vtypal@gmail.com), Spyros Raptis (spirosrap@gmail.com) # by Vaggelis Typaldos (vtypal@gmail.com), Spyros Raptis (spirosrap@gmail.com)
el: el:
direction: ltr
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
@@ -66,7 +67,11 @@ el:
one: "almost 1 year" one: "almost 1 year"
other: "almost {{count}} years" other: "almost {{count}} years"
number: number:
format:
separator: "."
delimiter: ""
precision: 3
human: human:
format: format:
precision: 1 precision: 1
@@ -114,6 +119,7 @@ el:
greater_than_start_date: "πρέπει να είναι αργότερα από την ημερομηνία έναρξης" greater_than_start_date: "πρέπει να είναι αργότερα από την ημερομηνία έναρξης"
not_same_project: "δεν ανήκει στο ίδιο έργο" not_same_project: "δεν ανήκει στο ίδιο έργο"
circular_dependency: "Αυτή η σχέση θα δημιουργήσει κυκλικές εξαρτήσεις" circular_dependency: "Αυτή η σχέση θα δημιουργήσει κυκλικές εξαρτήσεις"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
actionview_instancetag_blank_option: Παρακαλώ επιλέξτε actionview_instancetag_blank_option: Παρακαλώ επιλέξτε
@@ -171,7 +177,7 @@ el:
mail_body_account_information: Πληροφορίες του λογαριασμού σας mail_body_account_information: Πληροφορίες του λογαριασμού σας
mail_subject_account_activation_request: "αίτημα ενεργοποίησης λογαριασμού {{value}}" mail_subject_account_activation_request: "αίτημα ενεργοποίησης λογαριασμού {{value}}"
mail_body_account_activation_request: "'Ένας νέος χρήστης ({{value}}) έχει εγγραφεί. Ο λογαριασμός είναι σε στάδιο αναμονής της έγκρισης σας:" mail_body_account_activation_request: "'Ένας νέος χρήστης ({{value}}) έχει εγγραφεί. Ο λογαριασμός είναι σε στάδιο αναμονής της έγκρισης σας:"
mail_subject_reminder: "{{count}} θέμα(τα) με προθεσμία στις επόμενες ημέρες" mail_subject_reminder: "{{count}} θέμα(τα) με προθεσμία στις επόμενες {{days}} ημέρες"
mail_body_reminder: "{{count}}θέμα(τα) που έχουν ανατεθεί σε σας, με προθεσμία στις επόμενες {{days}} ημέρες:" mail_body_reminder: "{{count}}θέμα(τα) που έχουν ανατεθεί σε σας, με προθεσμία στις επόμενες {{days}} ημέρες:"
mail_subject_wiki_content_added: "'προστέθηκε η σελίδα wiki {{page}}' " mail_subject_wiki_content_added: "'προστέθηκε η σελίδα wiki {{page}}' "
mail_body_wiki_content_added: "Η σελίδα wiki '{{page}}' προστέθηκε από τον {{author}}." mail_body_wiki_content_added: "Η σελίδα wiki '{{page}}' προστέθηκε από τον {{author}}."
@@ -904,3 +910,12 @@ el:
text_zoom_in: Zoom in text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry. notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time label_overall_spent_time: Overall spent time
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field

Some files were not shown because too many files have changed in this diff Show More