Compare commits

..
Author SHA1 Message Date
Jean-Philippe Lang d3ae4cfd11 tagged version 1.0.4
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/1.0.4@4448 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-28 12:57:17 +00:00
Jean-Philippe Lang ed52753a12 Updates for 1.0.4 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4447 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-28 12:47:36 +00:00
Jean-Philippe Lang bac64c9ab4 Backported r4441 to r4444 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4445 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 16:45:07 +00:00
Jean-Philippe Lang b58382ef2e Merged r4386 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4440 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 15:48:30 +00:00
Jean-Philippe Lang 541a371b41 Backported r4357, r4358, r4360 and r4363 to r4367 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4439 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 15:16:26 +00:00
Jean-Philippe Lang bdb888476d Merged r4437 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4438 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 14:47:31 +00:00
Jean-Philippe Lang f5f55359a8 Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4436 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 14:40:51 +00:00
Jean-Philippe Lang eb590ce1eb Merged r4428 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4435 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 14:31:29 +00:00
Jean-Philippe Lang db64675310 Merged r4431 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4434 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 14:30:41 +00:00
Jean-Philippe Lang 92b37c0bea Merged r4426 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4433 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 14:28:51 +00:00
Jean-Philippe Lang faa461c66a Merged r4422 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4423 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-21 14:26:01 +00:00
Jean-Philippe Lang b5a409791c Merged r4419 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4420 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-20 14:12:35 +00:00
Jean-Philippe Lang 6c362a5a76 Merged r4417 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4418 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-20 14:06:32 +00:00
Jean-Philippe Lang dbb26b08f8 Merged r4414 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4415 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-20 10:23:13 +00:00
Jean-Philippe Lang 2a7a95d746 Backported r4397 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4401 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 11:30:53 +00:00
Jean-Philippe Lang c70ae6c735 Merged r4380 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4400 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 11:18:23 +00:00
Jean-Philippe Lang e174c10d6d Merged r4385 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4399 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 11:17:20 +00:00
Jean-Philippe Lang 2b9a5bf6e2 Merged r4378 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4398 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 11:15:53 +00:00
Jean-Philippe Lang d3b536e9a6 Merged r4389 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4390 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-09 19:56:29 +00:00
Jean-Philippe Lang 9b1eda1b22 Fixed a test broken by r4355 (#6786).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4356 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 14:47:23 +00:00
Jean-Philippe Lang f1f0704ef8 Merged r4354 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4355 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 13:14:14 +00:00
Eric Davis 4bf0c59416 Merged r4349 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4351 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 00:39:34 +00:00
Eric Davis 8cc20c66c9 Merged r4348 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4350 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 00:39:29 +00:00
Eric Davis e9e7463225 Locales update for the stable branch
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4347 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 00:32:16 +00:00
Eric Davis e2877d9287 Merged r4312 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4346 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:57:50 +00:00
Eric Davis 2873a703cc Merged r4311 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4345 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:57:44 +00:00
Eric Davis a472f86bfa Merged r4310 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4344 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:57:38 +00:00
Eric Davis 60af09793d Merged r4309 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4343 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:57:33 +00:00
Eric Davis 2cf5656ad0 Merged r4308 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4342 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:57:28 +00:00
Eric Davis 39cc1276cd Merged r4307 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4341 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:57:23 +00:00
Eric Davis 86ee82384a Merged r4306 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4340 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:57:18 +00:00
Eric Davis 0ceea88453 Merged r4305 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4339 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:57:12 +00:00
Eric Davis 17ccc33e74 Merged r4304 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4338 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:57:07 +00:00
Eric Davis 93fae41512 Merged r4302 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4337 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:57:02 +00:00
Eric Davis aba28ff068 Merged r4301 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4336 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:57 +00:00
Eric Davis 004f9eaf73 Merged r4300 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4335 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:52 +00:00
Eric Davis 01728eaf7a Merged r4299 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4334 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:47 +00:00
Eric Davis 3a401f78ac Merged r4298 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4333 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:41 +00:00
Eric Davis 7c485cd387 Merged r4297 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4332 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:36 +00:00
Eric Davis cbacc0ce30 Merged r4293 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4331 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:31 +00:00
Eric Davis 1ee7954f44 Merged r4292 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4330 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:26 +00:00
Eric Davis 527cd5734a Merged r4291 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4329 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:20 +00:00
Eric Davis e2266a92da Merged r4288 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4328 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:15 +00:00
Eric Davis a04bbfb165 Merged r4287 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4327 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:10 +00:00
Eric Davis 494c149df6 Merged r4284 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4326 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:05 +00:00
Eric Davis 1b4012323f Merged r4275 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4325 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:56:00 +00:00
Eric Davis a8e4e703fb Merged r4273 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4324 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:55 +00:00
Eric Davis 2b69a96d6d Merged r4263 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4323 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:50 +00:00
Eric Davis 50cb1be8fd Merged r4258 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4322 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:45 +00:00
Eric Davis 79a0d92421 Merged r4257 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4321 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:40 +00:00
Eric Davis 0093e08a44 Merged r4256 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4320 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:34 +00:00
Eric Davis 95ecc56e06 Merged r4254 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4319 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:29 +00:00
Eric Davis 0078d40ba1 Merged r4249 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4318 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:25 +00:00
Eric Davis a63c92388f Merged r4245 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4317 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:19 +00:00
Eric Davis 05432cfc3d Merged r4241 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4316 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:14 +00:00
Eric Davis e29696ea37 Merged r4240 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4315 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:09 +00:00
Eric Davis c18d96bd8b Merged r4238 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4314 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:55:02 +00:00
Eric Davis a8eef8366c Merged r4237 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4313 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-31 23:54:56 +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 3004 additions and 5316 deletions
+7 -17
View File
@@ -153,7 +153,7 @@ class ApplicationController < ActionController::Base
# Authorize the user for the requested action # Authorize the user for the requested action
def authorize(ctrl = params[:controller], action = params[:action], global = false) def authorize(ctrl = params[:controller], action = params[:action], global = false)
allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project || @projects, :global => global) allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project, :global => global)
allowed ? true : deny_access allowed ? true : deny_access
end end
@@ -169,13 +169,6 @@ class ApplicationController < ActionController::Base
render_404 render_404
end end
# Find project of id params[:project_id]
def find_project_by_project_id
@project = Project.find(params[:project_id])
rescue ActiveRecord::RecordNotFound
render_404
end
# Find a project based on params[:project_id] # Find a project based on params[:project_id]
# TODO: some subclasses override this, see about merging their logic # TODO: some subclasses override this, see about merging their logic
def find_optional_project def find_optional_project
@@ -213,19 +206,16 @@ class ApplicationController < ActionController::Base
def find_issues def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids]) @issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty? raise ActiveRecord::RecordNotFound if @issues.empty?
@projects = @issues.collect(&:project).compact.uniq projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1 if projects.size == 1
rescue ActiveRecord::RecordNotFound @project = projects.first
render_404 else
end
# Check if project is unique before bulk operations
def check_project_uniqueness
unless @project
# TODO: let users bulk edit/move/destroy issues from different projects # TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects' render_error 'Can not bulk edit/move/destroy issues from different projects'
return false return false
end end
rescue ActiveRecord::RecordNotFound
render_404
end 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
+1 -4
View File
@@ -34,11 +34,8 @@ class CalendarsController < ApplicationController
@calendar.events = events @calendar.events = events
end end
render :action => 'show', :layout => false if request.xhr? render :layout => false if request.xhr?
end end
def update
show
end
end end
-36
View File
@@ -1,36 +0,0 @@
class CommentsController < ApplicationController
default_search_scope :news
model_object News
before_filter :find_model_object
before_filter :find_project_from_association
before_filter :authorize
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
def create
@comment = Comment.new(params[:comment])
@comment.author = User.current
if @news.comments << @comment
flash[:notice] = l(:label_comment_added)
end
redirect_to :controller => 'news', :action => 'show', :id => @news
end
verify :method => :delete, :only => :destroy, :render => {:nothing => true, :status => :method_not_allowed }
def destroy
@news.comments.find(params[:comment_id]).destroy
redirect_to :controller => 'news', :action => 'show', :id => @news
end
private
# ApplicationController's find_model_object sets it based on the controller
# name so it needs to be overriden and set to @news instead
def find_model_object
super
@news = @object
@comment = nil
@news
end
end
+3 -7
View File
@@ -16,21 +16,17 @@ class ContextMenusController < ApplicationController
@projects = @issues.collect(&:project).compact.uniq @projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1 @project = @projects.first if @projects.size == 1
@can = {:edit => User.current.allowed_to?(:edit_issues, @projects), @can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
:log_time => (@project && User.current.allowed_to?(:log_time, @project)), :log_time => (@project && User.current.allowed_to?(:log_time, @project)),
:update => (User.current.allowed_to?(:edit_issues, @projects) || (User.current.allowed_to?(:change_status, @projects) && !@allowed_statuses.blank?)), :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)), :move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)), :copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => User.current.allowed_to?(:delete_issues, @projects) :delete => (@project && User.current.allowed_to?(:delete_issues, @project))
} }
if @project if @project
@assignables = @project.assignable_users @assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to) @assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@trackers = @project.trackers @trackers = @project.trackers
else
#when multiple projects, we only keep the intersection of each set
@assignables = @projects.map(&:assignable_users).inject{|memo,a| memo & a}
@trackers = @projects.map(&:trackers).inject{|memo,t| memo & t}
end end
@priorities = IssuePriority.all.reverse @priorities = IssuePriority.all.reverse
+13 -12
View File
@@ -1,7 +1,7 @@
class FilesController < ApplicationController class FilesController < ApplicationController
menu_item :files menu_item :files
before_filter :find_project_by_project_id before_filter :find_project
before_filter :authorize before_filter :authorize
helper :sort helper :sort
@@ -19,18 +19,19 @@ class FilesController < ApplicationController
render :layout => !request.xhr? render :layout => !request.xhr?
end end
# TODO: split method into new (GET) and create (POST)
def new 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 @versions = @project.versions.sort
end end
def create
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 project_files_path(@project)
end
end end
+19 -9
View File
@@ -4,7 +4,6 @@ class GanttsController < ApplicationController
rescue_from Query::StatementInvalid, :with => :query_statement_invalid rescue_from Query::StatementInvalid, :with => :query_statement_invalid
helper :gantt
helper :issues helper :issues
helper :projects helper :projects
helper :queries helper :queries
@@ -15,22 +14,33 @@ class GanttsController < ApplicationController
def show def show
@gantt = Redmine::Helpers::Gantt.new(params) @gantt = Redmine::Helpers::Gantt.new(params)
@gantt.project = @project
retrieve_query retrieve_query
@query.group_by = nil @query.group_by = nil
@gantt.query = @query if @query.valid? if @query.valid?
events = []
# Issues that have start and due dates
events += @query.issues(:include => [:tracker, :assigned_to, :priority],
:order => "start_date, due_date",
:conditions => ["(((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?) or (start_date<? and due_date>?)) and start_date is not null and due_date is not null)", @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to]
)
# Issues that don't have a due date but that are assigned to a version with a date
events += @query.issues(:include => [:tracker, :assigned_to, :priority, :fixed_version],
:order => "start_date, effective_date",
:conditions => ["(((start_date>=? and start_date<=?) or (effective_date>=? and effective_date<=?) or (start_date<? and effective_date>?)) and start_date is not null and due_date is null and effective_date is not null)", @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to]
)
# Versions
events += @query.versions(:conditions => ["effective_date BETWEEN ? AND ?", @gantt.date_from, @gantt.date_to])
@gantt.events = events
end
basename = (@project ? "#{@project.identifier}-" : '') + 'gantt' basename = (@project ? "#{@project.identifier}-" : '') + 'gantt'
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, :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
def update
show
end
end end
+5 -2
View File
@@ -1,6 +1,6 @@
class IssueMovesController < ApplicationController class IssueMovesController < ApplicationController
default_search_scope :issues default_search_scope :issues
before_filter :find_issues, :check_project_uniqueness before_filter :find_issues
before_filter :authorize before_filter :authorize
def new def new
@@ -18,6 +18,7 @@ class IssueMovesController < ApplicationController
@issues.each do |issue| @issues.each do |issue|
issue.reload issue.reload
issue.init_journal(User.current) issue.init_journal(User.current)
issue.current_journal.notes = @notes if @notes.present?
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy }) 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)}) if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)})
moved_issues << r moved_issues << r
@@ -50,11 +51,13 @@ class IssueMovesController < ApplicationController
@target_project ||= @project @target_project ||= @project
@trackers = @target_project.trackers @trackers = @target_project.trackers
@available_statuses = Workflow.available_statuses(@project) @available_statuses = Workflow.available_statuses(@project)
@notes = params[:notes]
@notes ||= ''
end end
def extract_changed_attributes_for_move(params) def extract_changed_attributes_for_move(params)
changed_attributes = {} changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute| [:assigned_to_id, :status_id, :start_date, :due_date, :priority_id].each do |valid_attribute|
unless params[valid_attribute].blank? unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute]) changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end end
+5 -9
View File
@@ -21,13 +21,12 @@ class IssuesController < ApplicationController
before_filter :find_issue, :only => [:show, :edit, :update] before_filter :find_issue, :only => [:show, :edit, :update]
before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy] before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy]
before_filter :check_project_uniqueness, :only => [:move, :perform_move]
before_filter :find_project, :only => [:new, :create] before_filter :find_project, :only => [:new, :create]
before_filter :authorize, :except => [:index] before_filter :authorize, :except => [:index]
before_filter :find_optional_project, :only => [:index] 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 accept_key_auth :index, :show, :create, :update, :destroy
rescue_from Query::StatementInvalid, :with => :query_statement_invalid rescue_from Query::StatementInvalid, :with => :query_statement_invalid
@@ -48,7 +47,6 @@ class IssuesController < ApplicationController
include SortHelper include SortHelper
include IssuesHelper include IssuesHelper
helper :timelog helper :timelog
helper :gantt
include Redmine::Export::PDF include Redmine::Export::PDF
verify :method => [:post, :delete], verify :method => [:post, :delete],
@@ -194,10 +192,8 @@ class IssuesController < ApplicationController
# Bulk edit a set of issues # Bulk edit a set of issues
def bulk_edit def bulk_edit
@issues.sort! @issues.sort!
@available_statuses = @projects.map{|p|Workflow.available_statuses(p)}.inject{|memo,w|memo & w} @available_statuses = Workflow.available_statuses(@project)
@custom_fields = @projects.map{|p|p.all_issue_custom_fields}.inject{|memo,c|memo & c} @custom_fields = @project.all_issue_custom_fields
@assignables = @projects.map(&:assignable_users).inject{|memo,a| memo & a}
@trackers = @projects.map(&:trackers).inject{|memo,t| memo & t}
end end
def bulk_update def bulk_update
@@ -244,7 +240,7 @@ class IssuesController < ApplicationController
end end
@issues.each(&:destroy) @issues.each(&:destroy)
respond_to do |format| respond_to do |format|
format.html { redirect_back_or_default(:action => 'index', :project_id => @project) } format.html { redirect_to :action => 'index', :project_id => @project }
format.xml { head :ok } format.xml { head :ok }
format.json { head :ok } format.json { head :ok }
end end
@@ -304,6 +300,7 @@ private
render_error l(:error_no_tracker_in_project) render_error l(:error_no_tracker_in_project)
return false return false
end end
@issue.start_date ||= Date.today
if params[:issue].is_a?(Hash) if params[:issue].is_a?(Hash)
@issue.safe_attributes = params[:issue] @issue.safe_attributes = params[:issue]
if User.current.allowed_to?(:add_issue_watchers, @project) && @issue.new_record? if User.current.allowed_to?(:add_issue_watchers, @project) && @issue.new_record?
@@ -311,7 +308,6 @@ private
end end
end end
@issue.author = User.current @issue.author = User.current
@issue.start_date ||= Date.today
@priorities = IssuePriority.all @priorities = IssuePriority.all
@allowed_statuses = @issue.new_statuses_allowed_to(User.current, true) @allowed_statuses = @issue.new_statuses_allowed_to(User.current, true)
end end
+7 -3
View File
@@ -54,7 +54,7 @@ class MyController < ApplicationController
@pref = @user.pref @pref = @user.pref
if request.post? if request.post?
@user.attributes = params[:user] @user.attributes = params[:user]
@user.mail_notification = params[:notification_option] || 'only_my_events' @user.mail_notification = (params[:notification_option] == 'all')
@user.pref.attributes = params[:pref] @user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1') @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save if @user.save
@@ -66,8 +66,12 @@ class MyController < ApplicationController
return return
end end
end end
@notification_options = @user.valid_notification_options @notification_options = [[l(:label_user_mail_option_all), 'all'],
@notification_option = @user.mail_notification #? ? 'all' : (@user.notified_projects_ids.empty? ? 'none' : 'selected') [l(:label_user_mail_option_none), 'none']]
# Only users that belong to more than 1 project can select projects for which they are notified
# Note that @user.membership.size would fail since AR ignores :include association option when doing a count
@notification_options.insert 1, [l(:label_user_mail_option_selected), 'selected'] if @user.memberships.length > 1
@notification_option = @user.mail_notification? ? 'all' : (@user.notified_projects_ids.empty? ? 'none' : 'selected')
end end
# Manage user's password # Manage user's password
+28 -17
View File
@@ -18,10 +18,10 @@
class NewsController < ApplicationController class NewsController < ApplicationController
default_search_scope :news default_search_scope :news
model_object News model_object News
before_filter :find_model_object, :except => [:new, :create, :index] before_filter :find_model_object, :except => [:new, :index, :preview]
before_filter :find_project_from_association, :except => [:new, :create, :index] before_filter :find_project_from_association, :except => [:new, :index, :preview]
before_filter :find_project, :only => [:new, :create] before_filter :find_project, :only => [:new, :preview]
before_filter :authorize, :except => [:index] before_filter :authorize, :except => [:index, :preview]
before_filter :find_optional_project, :only => :index before_filter :find_optional_project, :only => :index
accept_key_auth :index accept_key_auth :index
@@ -46,38 +46,49 @@ class NewsController < ApplicationController
def new def new
@news = News.new(:project => @project, :author => User.current) @news = News.new(:project => @project, :author => User.current)
end
def create
@news = News.new(:project => @project, :author => User.current)
if request.post? if request.post?
@news.attributes = params[:news] @news.attributes = params[:news]
if @news.save if @news.save
flash[:notice] = l(:notice_successful_create) flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'news', :action => 'index', :project_id => @project redirect_to :controller => 'news', :action => 'index', :project_id => @project
else
render :action => 'new'
end end
end end
end end
def edit
end
def update def edit
if request.put? and @news.update_attributes(params[:news]) if request.post? and @news.update_attributes(params[:news])
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'show', :id => @news redirect_to :action => 'show', :id => @news
else
render :action => 'edit'
end end
end end
def add_comment
@comment = Comment.new(params[:comment])
@comment.author = User.current
if @news.comments << @comment
flash[:notice] = l(:label_comment_added)
redirect_to :action => 'show', :id => @news
else
show
render :action => 'show'
end
end
def destroy_comment
@news.comments.find(params[:comment_id]).destroy
redirect_to :action => 'show', :id => @news
end
def destroy def destroy
@news.destroy @news.destroy
redirect_to :action => 'index', :project_id => @project redirect_to :action => 'index', :project_id => @project
end end
def preview
@text = (params[:news] ? params[:news][:description] : nil)
render :partial => 'common/preview'
end
private private
def find_project def find_project
@project = Project.find(params[:project_id]) @project = Project.find(params[:project_id])
-5
View File
@@ -16,11 +16,6 @@ class PreviewsController < ApplicationController
render :layout => false render :layout => false
end end
def news
@text = (params[:news] ? params[:news][:description] : nil)
render :partial => 'common/preview'
end
private private
def find_project def find_project
@@ -1,9 +1,9 @@
class ProjectEnumerationsController < ApplicationController class ProjectEnumerationsController < ApplicationController
before_filter :find_project_by_project_id before_filter :find_project
before_filter :authorize before_filter :authorize
def update def save
if request.put? && params[:enumerations] if request.post? && params[:enumerations]
Project.transaction do Project.transaction do
params[:enumerations].each do |id, activity| params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity) @project.update_or_create_time_entry_activity(id, activity)
+2 -2
View File
@@ -24,7 +24,7 @@ class ProjectsController < ApplicationController
before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy] before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy]
before_filter :authorize_global, :only => [:new, :create] before_filter :authorize_global, :only => [:new, :create]
before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ] before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
accept_key_auth :index accept_key_auth :index, :show, :create, :update, :destroy
after_filter :only => [:create, :edit, :update, :archive, :unarchive, :destroy] do |controller| after_filter :only => [:create, :edit, :update, :archive, :unarchive, :destroy] do |controller|
if controller.request.post? if controller.request.post?
@@ -93,7 +93,7 @@ class ProjectsController < ApplicationController
flash[:notice] = l(:notice_successful_create) flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project redirect_to :controller => 'projects', :action => 'settings', :id => @project
} }
format.xml { head :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) } format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
end end
else else
respond_to do |format| respond_to do |format|
+1 -1
View File
@@ -26,7 +26,7 @@ class SettingsController < ApplicationController
end end
def edit def edit
@notifiables = Redmine::Notifiable.all @notifiables = %w(issue_added issue_updated news_added document_added file_added message_posted wiki_content_added wiki_content_updated)
if request.post? && params[:settings] && params[:settings].is_a?(Hash) if request.post? && params[:settings] && params[:settings].is_a?(Hash)
settings = (params[:settings] || {}).dup.symbolize_keys settings = (params[:settings] || {}).dup.symbolize_keys
settings.each do |name, value| settings.each do |name, value|
@@ -1,209 +0,0 @@
class TimeEntryReportsController < ApplicationController
menu_item :issues
before_filter :find_optional_project
before_filter :load_available_criterias
helper :sort
include SortHelper
helper :issues
helper :timelog
include TimelogHelper
helper :custom_fields
include CustomFieldsHelper
def report
@criterias = params[:criterias] || []
@criterias = @criterias.select{|criteria| @available_criterias.has_key? criteria}
@criterias.uniq!
@criterias = @criterias[0,3]
@columns = (params[:columns] && %w(year month week day).include?(params[:columns])) ? params[:columns] : 'month'
retrieve_date_range
unless @criterias.empty?
sql_select = @criterias.collect{|criteria| @available_criterias[criteria][:sql] + " AS " + criteria}.join(', ')
sql_group_by = @criterias.collect{|criteria| @available_criterias[criteria][:sql]}.join(', ')
sql_condition = ''
if @project.nil?
sql_condition = Project.allowed_to_condition(User.current, :view_time_entries)
elsif @issue.nil?
sql_condition = @project.project_condition(Setting.display_subprojects_issues?)
else
sql_condition = "#{Issue.table_name}.root_id = #{@issue.root_id} AND #{Issue.table_name}.lft >= #{@issue.lft} AND #{Issue.table_name}.rgt <= #{@issue.rgt}"
end
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
sql << " FROM #{TimeEntry.table_name}"
sql << time_report_joins
sql << " WHERE"
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 << " GROUP BY #{sql_group_by}, tyear, tmonth, tweek, spent_on"
@hours = ActiveRecord::Base.connection.select_all(sql)
@hours.each do |row|
case @columns
when 'year'
row['year'] = row['tyear']
when 'month'
row['month'] = "#{row['tyear']}-#{row['tmonth']}"
when 'week'
row['week'] = "#{row['tyear']}-#{row['tweek']}"
when 'day'
row['day'] = "#{row['spent_on']}"
end
end
@total_hours = @hours.inject(0) {|s,k| s = s + k['hours'].to_f}
@periods = []
# Date#at_beginning_of_ not supported in Rails 1.2.x
date_from = @from.to_time
# 100 columns max
while date_from <= @to.to_time && @periods.length < 100
case @columns
when 'year'
@periods << "#{date_from.year}"
date_from = (date_from + 1.year).at_beginning_of_year
when 'month'
@periods << "#{date_from.year}-#{date_from.month}"
date_from = (date_from + 1.month).at_beginning_of_month
when 'week'
@periods << "#{date_from.year}-#{date_from.to_date.cweek}"
date_from = (date_from + 7.day).at_beginning_of_week
when 'day'
@periods << "#{date_from.to_date}"
date_from = date_from + 1.day
end
end
end
respond_to do |format|
format.html { render :layout => !request.xhr? }
format.csv { send_data(report_to_csv(@criterias, @periods, @hours), :type => 'text/csv; header=present', :filename => 'timelog.csv') }
end
end
private
# TODO: duplicated in TimelogController
def find_optional_project
if !params[:issue_id].blank?
@issue = Issue.find(params[:issue_id])
@project = @issue.project
elsif !params[:project_id].blank?
@project = Project.find(params[:project_id])
end
deny_access unless User.current.allowed_to?(:view_time_entries, @project, :global => true)
end
# Retrieves the date range based on predefined ranges or specific from/to param dates
# TODO: duplicated in TimelogController
def retrieve_date_range
@free_period = false
@from, @to = nil, nil
if params[:period_type] == '1' || (params[:period_type].nil? && !params[:period].nil?)
case params[:period].to_s
when 'today'
@from = @to = Date.today
when 'yesterday'
@from = @to = Date.today - 1
when 'current_week'
@from = Date.today - (Date.today.cwday - 1)%7
@to = @from + 6
when 'last_week'
@from = Date.today - 7 - (Date.today.cwday - 1)%7
@to = @from + 6
when '7_days'
@from = Date.today - 7
@to = Date.today
when 'current_month'
@from = Date.civil(Date.today.year, Date.today.month, 1)
@to = (@from >> 1) - 1
when 'last_month'
@from = Date.civil(Date.today.year, Date.today.month, 1) << 1
@to = (@from >> 1) - 1
when '30_days'
@from = Date.today - 30
@to = Date.today
when 'current_year'
@from = Date.civil(Date.today.year, 1, 1)
@to = Date.civil(Date.today.year, 12, 31)
end
elsif params[:period_type] == '2' || (params[:period_type].nil? && (!params[:from].nil? || !params[:to].nil?))
begin; @from = params[:from].to_s.to_date unless params[:from].blank?; rescue; end
begin; @to = params[:to].to_s.to_date unless params[:to].blank?; rescue; end
@free_period = true
else
# default
end
@from, @to = @to, @from if @from && @to && @from > @to
@from ||= (TimeEntry.earilest_date_for_project(@project) || Date.today)
@to ||= (TimeEntry.latest_date_for_project(@project) || Date.today)
end
def load_available_criterias
@available_criterias = { 'project' => {:sql => "#{TimeEntry.table_name}.project_id",
:klass => Project,
:label => :label_project},
'version' => {:sql => "#{Issue.table_name}.fixed_version_id",
:klass => Version,
:label => :label_version},
'category' => {:sql => "#{Issue.table_name}.category_id",
:klass => IssueCategory,
:label => :field_category},
'member' => {:sql => "#{TimeEntry.table_name}.user_id",
:klass => User,
:label => :label_member},
'tracker' => {:sql => "#{Issue.table_name}.tracker_id",
:klass => Tracker,
:label => :label_tracker},
'activity' => {:sql => "#{TimeEntry.table_name}.activity_id",
:klass => TimeEntryActivity,
:label => :label_activity},
'issue' => {:sql => "#{TimeEntry.table_name}.issue_id",
:klass => Issue,
:label => :label_issue}
}
# Add list and boolean custom fields as available criterias
custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields)
custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id)",
:format => cf.field_format,
:label => cf.name}
end if @project
# Add list and boolean time entry custom fields
TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id)",
:format => cf.field_format,
:label => cf.name}
end
# Add list and boolean time entry activity custom fields
TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id)",
:format => cf.field_format,
:label => cf.name}
end
call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project })
@available_criterias
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"
# TODO: rename hook
call_hook(:controller_timelog_time_report_joins, {:sql => sql} )
sql
end
end
+145 -41
View File
@@ -17,9 +17,12 @@
class TimelogController < ApplicationController class TimelogController < ApplicationController
menu_item :issues menu_item :issues
before_filter :find_project, :authorize, :only => [:new, :create, :edit, :update, :destroy] before_filter :find_project, :authorize, :only => [:edit, :destroy]
before_filter :find_optional_project, :only => [:index] before_filter :find_optional_project, :only => [:report, :details]
before_filter :load_available_criterias, :only => [:report]
verify :method => :post, :only => :destroy, :redirect_to => { :action => :details }
helper :sort helper :sort
include SortHelper include SortHelper
helper :issues helper :issues
@@ -27,7 +30,83 @@ class TimelogController < ApplicationController
helper :custom_fields helper :custom_fields
include CustomFieldsHelper include CustomFieldsHelper
def index def report
@criterias = params[:criterias] || []
@criterias = @criterias.select{|criteria| @available_criterias.has_key? criteria}
@criterias.uniq!
@criterias = @criterias[0,3]
@columns = (params[:columns] && %w(year month week day).include?(params[:columns])) ? params[:columns] : 'month'
retrieve_date_range
unless @criterias.empty?
sql_select = @criterias.collect{|criteria| @available_criterias[criteria][:sql] + " AS " + criteria}.join(', ')
sql_group_by = @criterias.collect{|criteria| @available_criterias[criteria][:sql]}.join(', ')
sql_condition = ''
if @project.nil?
sql_condition = Project.allowed_to_condition(User.current, :view_time_entries)
elsif @issue.nil?
sql_condition = @project.project_condition(Setting.display_subprojects_issues?)
else
sql_condition = "#{Issue.table_name}.root_id = #{@issue.root_id} AND #{Issue.table_name}.lft >= #{@issue.lft} AND #{Issue.table_name}.rgt <= #{@issue.rgt}"
end
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
sql << " FROM #{TimeEntry.table_name}"
sql << time_report_joins
sql << " WHERE"
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 << " GROUP BY #{sql_group_by}, tyear, tmonth, tweek, spent_on"
@hours = ActiveRecord::Base.connection.select_all(sql)
@hours.each do |row|
case @columns
when 'year'
row['year'] = row['tyear']
when 'month'
row['month'] = "#{row['tyear']}-#{row['tmonth']}"
when 'week'
row['week'] = "#{row['tyear']}-#{row['tweek']}"
when 'day'
row['day'] = "#{row['spent_on']}"
end
end
@total_hours = @hours.inject(0) {|s,k| s = s + k['hours'].to_f}
@periods = []
# Date#at_beginning_of_ not supported in Rails 1.2.x
date_from = @from.to_time
# 100 columns max
while date_from <= @to.to_time && @periods.length < 100
case @columns
when 'year'
@periods << "#{date_from.year}"
date_from = (date_from + 1.year).at_beginning_of_year
when 'month'
@periods << "#{date_from.year}-#{date_from.month}"
date_from = (date_from + 1.month).at_beginning_of_month
when 'week'
@periods << "#{date_from.year}-#{date_from.to_date.cweek}"
date_from = (date_from + 7.day).at_beginning_of_week
when 'day'
@periods << "#{date_from.to_date}"
date_from = date_from + 1.day
end
end
end
respond_to do |format|
format.html { render :layout => !request.xhr? }
format.csv { send_data(report_to_csv(@criterias, @periods, @hours), :type => 'text/csv; header=present', :filename => 'timelog.csv') }
end
end
def details
sort_init 'spent_on', 'desc' sort_init 'spent_on', 'desc'
sort_update 'spent_on' => 'spent_on', sort_update 'spent_on' => 'spent_on',
'user' => 'user_id', 'user' => 'user_id',
@@ -83,53 +162,21 @@ class TimelogController < ApplicationController
end end
end end
end end
def new
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
@time_entry.attributes = params[:time_entry]
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
render :action => 'edit'
end
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
def create
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
@time_entry.attributes = params[:time_entry]
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
if @time_entry.save
flash[:notice] = l(:notice_successful_update)
redirect_back_or_default :action => 'index', :project_id => @time_entry.project
else
render :action => 'edit'
end
end
def edit def edit
(render_403; return) if @time_entry && !@time_entry.editable_by?(User.current) (render_403; return) if @time_entry && !@time_entry.editable_by?(User.current)
@time_entry.attributes = params[:time_entry] @time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
end
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def update
(render_403; return) if @time_entry && !@time_entry.editable_by?(User.current)
@time_entry.attributes = params[:time_entry] @time_entry.attributes = params[:time_entry]
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry }) call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
if @time_entry.save if request.post? and @time_entry.save
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
redirect_back_or_default :action => 'index', :project_id => @time_entry.project redirect_back_or_default :action => 'details', :project_id => @time_entry.project
else return
render :action => 'edit'
end end
end end
verify :method => :delete, :only => :destroy, :render => {:nothing => true, :status => :method_not_allowed }
def destroy def destroy
(render_404; return) unless @time_entry (render_404; return) unless @time_entry
(render_403; return) unless @time_entry.editable_by?(User.current) (render_403; return) unless @time_entry.editable_by?(User.current)
@@ -140,7 +187,7 @@ class TimelogController < ApplicationController
end end
redirect_to :back redirect_to :back
rescue ::ActionController::RedirectBackError rescue ::ActionController::RedirectBackError
redirect_to :action => 'index', :project_id => @time_entry.project redirect_to :action => 'details', :project_id => @time_entry.project
end end
private private
@@ -217,4 +264,61 @@ private
@to ||= (TimeEntry.latest_date_for_project(@project) || Date.today) @to ||= (TimeEntry.latest_date_for_project(@project) || Date.today)
end end
def load_available_criterias
@available_criterias = { 'project' => {:sql => "#{TimeEntry.table_name}.project_id",
:klass => Project,
:label => :label_project},
'version' => {:sql => "#{Issue.table_name}.fixed_version_id",
:klass => Version,
:label => :label_version},
'category' => {:sql => "#{Issue.table_name}.category_id",
:klass => IssueCategory,
:label => :field_category},
'member' => {:sql => "#{TimeEntry.table_name}.user_id",
:klass => User,
:label => :label_member},
'tracker' => {:sql => "#{Issue.table_name}.tracker_id",
:klass => Tracker,
:label => :label_tracker},
'activity' => {:sql => "#{TimeEntry.table_name}.activity_id",
:klass => TimeEntryActivity,
:label => :label_activity},
'issue' => {:sql => "#{TimeEntry.table_name}.issue_id",
:klass => Issue,
:label => :label_issue}
}
# Add list and boolean custom fields as available criterias
custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields)
custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id)",
:format => cf.field_format,
:label => cf.name}
end if @project
# Add list and boolean time entry custom fields
TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id)",
:format => cf.field_format,
:label => cf.name}
end
# Add list and boolean time entry activity custom fields
TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id)",
:format => cf.field_format,
:label => cf.name}
end
call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project })
@available_criterias
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
+36 -79
View File
@@ -71,96 +71,53 @@ class UsersController < ApplicationController
render_404 render_404
end end
def new def add
@notification_options = User::MAIL_NOTIFICATION_OPTIONS if request.get?
@notification_option = Setting.default_notification_option @user = User.new(:language => Setting.default_language)
@user = User.new(:language => Setting.default_language)
@auth_sources = AuthSource.find(:all)
end
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
def create
@notification_options = User::MAIL_NOTIFICATION_OPTIONS
@notification_option = Setting.default_notification_option
@user = User.new(params[:user])
@user.admin = params[:user][:admin] || false
@user.login = params[:user][:login]
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless @user.auth_source_id
# TODO: Similar to My#account
@user.mail_notification = params[:notification_option] || 'only_my_events'
@user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save
@user.pref.save
@user.notified_project_ids = (params[:notification_option] == 'selected' ? params[:notified_project_ids] : [])
Mailer.deliver_account_information(@user, params[:password]) if params[:send_information]
flash[:notice] = l(:notice_successful_create)
redirect_to(params[:continue] ? {:controller => 'users', :action => 'new'} :
{:controller => 'users', :action => 'edit', :id => @user})
return
else else
@auth_sources = AuthSource.find(:all) @user = User.new(params[:user])
@notification_option = @user.mail_notification @user.admin = params[:user][:admin] || false
@user.login = params[:user][:login]
render :action => 'new' @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless @user.auth_source_id
if @user.save
Mailer.deliver_account_information(@user, params[:password]) if params[:send_information]
flash[:notice] = l(:notice_successful_create)
redirect_to(params[:continue] ? {:controller => 'users', :action => 'add'} :
{:controller => 'users', :action => 'edit', :id => @user})
return
end
end end
@auth_sources = AuthSource.find(:all)
end end
def edit def edit
@user = User.find(params[:id]) @user = User.find(params[:id])
@notification_options = @user.valid_notification_options if request.post?
@notification_option = @user.mail_notification @user.admin = params[:user][:admin] if params[:user][:admin]
@user.login = params[:user][:login] if params[:user][:login]
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.attributes = params[:user]
# Was the account actived ? (do it before User#save clears the change)
was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
if @user.save
if was_activated
Mailer.deliver_account_activated(@user)
elsif @user.active? && params[:send_information] && !params[:password].blank? && @user.auth_source_id.nil?
Mailer.deliver_account_information(@user, params[:password])
end
flash[:notice] = l(:notice_successful_update)
redirect_to :back
end
end
@auth_sources = AuthSource.find(:all) @auth_sources = AuthSource.find(:all)
@membership ||= Member.new @membership ||= Member.new
end
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def update
@user = User.find(params[:id])
@notification_options = @user.valid_notification_options
@notification_option = @user.mail_notification
@user.admin = params[:user][:admin] if params[:user][:admin]
@user.login = params[:user][:login] if params[:user][:login]
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.attributes = params[:user]
# Was the account actived ? (do it before User#save clears the change)
was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
# TODO: Similar to My#account
@user.mail_notification = params[:notification_option] || 'only_my_events'
@user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save
@user.pref.save
@user.notified_project_ids = (params[:notification_option] == 'selected' ? params[:notified_project_ids] : [])
if was_activated
Mailer.deliver_account_activated(@user)
elsif @user.active? && params[:send_information] && !params[:password].blank? && @user.auth_source_id.nil?
Mailer.deliver_account_information(@user, params[:password])
end
flash[:notice] = l(:notice_successful_update)
redirect_to :back
else
@auth_sources = AuthSource.find(:all)
@membership ||= Member.new
render :action => :edit
end
rescue ::ActionController::RedirectBackError rescue ::ActionController::RedirectBackError
redirect_to :controller => 'users', :action => 'edit', :id => @user redirect_to :controller => 'users', :action => 'edit', :id => @user
end end
def edit_membership def edit_membership
@user = User.find(params[:id]) @user = User.find(params[:id])
@membership = Member.edit_membership(params[:membership_id], params[:membership], @user) @membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
+6 -2
View File
@@ -103,18 +103,22 @@ class VersionsController < ApplicationController
end end
def update def update
if request.put? && 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'])
if @version.update_attributes(attributes) if @version.update_attributes(attributes)
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
else
respond_to do |format|
format.html { render :action => 'edit' }
end
end end
end end
end end
def close_completed def close_completed
if request.put? if request.post?
@project.close_completed_versions @project.close_completed_versions
end end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
+58 -71
View File
@@ -22,14 +22,14 @@ class WikiController < ApplicationController
before_filter :find_wiki, :authorize before_filter :find_wiki, :authorize
before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy] before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy]
verify :method => :post, :only => [:destroy, :protect], :redirect_to => { :action => :show } verify :method => :post, :only => [:destroy, :protect], :redirect_to => { :action => :index }
helper :attachments helper :attachments
include AttachmentsHelper include AttachmentsHelper
helper :watchers helper :watchers
# display a page (in editing mode if it doesn't exist) # display a page (in editing mode if it doesn't exist)
def show def index
page_title = params[:page] page_title = params[:page]
@page = @wiki.find_or_new_page(page_title) @page = @wiki.find_or_new_page(page_title)
if @page.new_record? if @page.new_record?
@@ -71,48 +71,34 @@ class WikiController < ApplicationController
@content.text = initial_page_content(@page) if @content.text.blank? @content.text = initial_page_content(@page) if @content.text.blank?
# don't keep previous comment # don't keep previous comment
@content.comments = nil @content.comments = nil
if request.get?
# To prevent StaleObjectError exception when reverting to a previous version # To prevent StaleObjectError exception when reverting to a previous version
@content.version = @page.content.version @content.version = @page.content.version
else
if !@page.new_record? && @content.text == params[:content][:text]
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
# don't save if text wasn't changed
redirect_to :action => 'index', :id => @project, :page => @page.title
return
end
#@content.text = params[:content][:text]
#@content.comments = params[:content][:comments]
@content.attributes = params[:content]
@content.author = User.current
# if page is new @page.save will also save content, but not if page isn't a new record
if (@page.new_record? ? @page.save : @content.save)
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page})
redirect_to :action => 'index', :id => @project, :page => @page.title
end
end
rescue ActiveRecord::StaleObjectError rescue ActiveRecord::StaleObjectError
# Optimistic locking exception # Optimistic locking exception
flash[:error] = l(:notice_locking_conflict) flash[:error] = l(:notice_locking_conflict)
end end
verify :method => :post, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
# Creates a new page or updates an existing one
def update
@page = @wiki.find_or_new_page(params[:page])
return render_403 unless editable?
@page.content = WikiContent.new(:page => @page) if @page.new_record?
@content = @page.content_for_version(params[:version])
@content.text = initial_page_content(@page) if @content.text.blank?
# don't keep previous comment
@content.comments = nil
if !@page.new_record? && params[:content].present? && @content.text == params[:content][:text]
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
# don't save if text wasn't changed
redirect_to :action => 'show', :project_id => @project, :page => @page.title
return
end
@content.attributes = params[:content]
@content.author = User.current
# if page is new @page.save will also save content, but not if page isn't a new record
if (@page.new_record? ? @page.save : @content.save)
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page})
redirect_to :action => 'show', :project_id => @project, :page => @page.title
end
rescue ActiveRecord::StaleObjectError
# Optimistic locking exception
flash[:error] = l(:notice_locking_conflict)
end
# rename a page # rename a page
def rename def rename
return render_403 unless editable? return render_403 unless editable?
@@ -121,13 +107,13 @@ class WikiController < ApplicationController
@original_title = @page.pretty_title @original_title = @page.pretty_title
if request.post? && @page.update_attributes(params[:wiki_page]) if request.post? && @page.update_attributes(params[:wiki_page])
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'show', :project_id => @project, :page => @page.title redirect_to :action => 'index', :id => @project, :page => @page.title
end end
end end
def protect def protect
@page.update_attribute :protected, params[:protected] @page.update_attribute :protected, params[:protected]
redirect_to :action => 'show', :project_id => @project, :page => @page.title redirect_to :action => 'index', :id => @project, :page => @page.title
end end
# show page history # show page history
@@ -180,26 +166,37 @@ class WikiController < ApplicationController
end end
end end
@page.destroy @page.destroy
redirect_to :action => 'page_index', :project_id => @project redirect_to :action => 'special', :id => @project, :page => 'Page_index'
end end
# Export wiki to a single html file # display special pages
def export def special
if User.current.allowed_to?(:export_wiki_pages, @project) page_title = params[:page].downcase
@pages = @wiki.pages.find :all, :order => 'title' case page_title
export = render_to_string :action => 'export_multiple', :layout => false # show pages index, sorted by title
send_data(export, :type => 'text/html', :filename => "wiki.html") when 'page_index', 'date_index'
# eager load information about last updates, without loading text
@pages = @wiki.pages.find :all, :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on",
:joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id",
:order => 'title'
@pages_by_date = @pages.group_by {|p| p.updated_on.to_date}
@pages_by_parent_id = @pages.group_by(&:parent_id)
# export wiki to a single html file
when 'export'
if User.current.allowed_to?(:export_wiki_pages, @project)
@pages = @wiki.pages.find :all, :order => 'title'
export = render_to_string :action => 'export_multiple', :layout => false
send_data(export, :type => 'text/html', :filename => "wiki.html")
else
redirect_to :action => 'index', :id => @project, :page => nil
end
return
else else
redirect_to :action => 'show', :project_id => @project, :page => nil # requested special page doesn't exist, redirect to default page
redirect_to :action => 'index', :id => @project, :page => nil
return
end end
end render :action => "special_#{page_title}"
def page_index
load_pages_grouped_by_date_without_content
end
def date_index
load_pages_grouped_by_date_without_content
end end
def preview def preview
@@ -218,13 +215,13 @@ class WikiController < ApplicationController
return render_403 unless editable? return render_403 unless editable?
attachments = Attachment.attach_files(@page, params[:attachments]) attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page) render_attachment_warning_if_needed(@page)
redirect_to :action => 'show', :page => @page.title redirect_to :action => 'index', :page => @page.title
end end
private private
def find_wiki def find_wiki
@project = Project.find(params[:project_id]) @project = Project.find(params[:id])
@wiki = @project.wiki @wiki = @project.wiki
render_404 unless @wiki render_404 unless @wiki
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
@@ -248,14 +245,4 @@ private
extend helper unless self.instance_of?(helper) extend helper unless self.instance_of?(helper)
helper.instance_method(:initial_page_content).bind(self).call(page) helper.instance_method(:initial_page_content).bind(self).call(page)
end end
# eager load information about last updates, without loading text
def load_pages_grouped_by_date_without_content
@pages = @wiki.pages.find :all, :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on",
:joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id",
:order => 'title'
@pages_by_date = @pages.group_by {|p| p.updated_on.to_date}
@pages_by_parent_id = @pages.group_by(&:parent_id)
end
end end
+2 -4
View File
@@ -177,7 +177,7 @@ module ApplicationHelper
content << "<ul class=\"pages-hierarchy\">\n" content << "<ul class=\"pages-hierarchy\">\n"
pages[node].each do |page| pages[node].each do |page|
content << "<li>" content << "<li>"
content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => 'show', :project_id => page.project, :page => page.title}, content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => 'index', :id => page.project, :page => page.title},
:title => (page.respond_to?(:updated_on) ? l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on)) : nil)) :title => (page.respond_to?(:updated_on) ? l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on)) : nil))
content << "\n" + render_page_hierarchy(pages, page.id) if pages[page.id] content << "\n" + render_page_hierarchy(pages, page.id) if pages[page.id]
content << "</li>\n" content << "</li>\n"
@@ -546,7 +546,7 @@ module ApplicationHelper
when :local; "#{title}.html" when :local; "#{title}.html"
when :anchor; "##{title}" # used for single-file wiki export when :anchor; "##{title}" # used for single-file wiki export
else else
url_for(:only_path => only_path, :controller => 'wiki', :action => 'show', :project_id => link_project, :page => Wiki.titleize(page), :anchor => anchor) url_for(:only_path => only_path, :controller => 'wiki', :action => 'index', :id => link_project, :page => Wiki.titleize(page), :anchor => anchor)
end end
link_to((title || page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new'))) link_to((title || page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new')))
else else
@@ -818,8 +818,6 @@ module ApplicationHelper
email = $1 email = $1
end end
return gravatar(email.to_s.downcase, options) unless email.blank? rescue nil return gravatar(email.to_s.downcase, options) unless email.blank? rescue nil
else
''
end end
end end
+9 -16
View File
@@ -1,5 +1,5 @@
module CalendarsHelper module CalendarsHelper
def link_to_previous_month(year, month, options={}) def link_to_previous_month(year, month)
target_year, target_month = if month == 1 target_year, target_month = if month == 1
[year - 1, 12] [year - 1, 12]
else else
@@ -11,11 +11,13 @@ module CalendarsHelper
else else
"#{month_name(target_month)}" "#{month_name(target_month)}"
end end
link_to_month(('&#171; ' + name), target_year, target_month, options) 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 end
def link_to_next_month(year, month, options={}) def link_to_next_month(year, month)
target_year, target_month = if month == 12 target_year, target_month = if month == 12
[year + 1, 1] [year + 1, 1]
else else
@@ -28,18 +30,9 @@ module CalendarsHelper
"#{month_name(target_month)}" "#{month_name(target_month)}"
end end
link_to_month((name + ' &#187;'), target_year, target_month, options) link_to_remote (name + ' &#187;'),
end {:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month =>target_month)}
def link_to_month(link_name, year, month, options={})
project_id = options[:project].present? ? options[:project].to_param : nil
link_target = calendar_path(:year => year, :month => month, :project_id => project_id)
link_to_remote(link_name,
{:update => "content", :url => link_target, :method => :put},
{:href => link_target})
end end
end end
-24
View File
@@ -1,24 +0,0 @@
# redMine - project management software
# Copyright (C) 2006 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module GanttHelper
def number_of_issues_on_versions(gantt)
versions = gantt.events.collect {|event| (event.is_a? Version) ? event : nil}.compact
versions.sum {|v| v.fixed_issues.for_gantt.with_query(@query).count}
end
end
+3 -5
View File
@@ -44,10 +44,8 @@ module IssuesHelper
@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)
@cached_label_project ||= l(:field_project)
link_to_issue(issue) + "<br /><br />" + link_to_issue(issue) + "<br /><br />" +
"<strong>#{@cached_label_project}</strong>: #{link_to_project(issue.project)}<br />" +
"<strong>#{@cached_label_status}</strong>: #{issue.status.name}<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 />" +
@@ -254,7 +252,7 @@ module IssuesHelper
when :in when :in
if gantt.zoom < 4 if gantt.zoom < 4
link_to_remote(l(:text_zoom_in) + image_tag('zoom_in.png', img_attributes.merge(:alt => l(:text_zoom_in))), link_to_remote(l(:text_zoom_in) + image_tag('zoom_in.png', img_attributes.merge(:alt => l(:text_zoom_in))),
{:url => gantt.params.merge(:zoom => (gantt.zoom+1)), :method => :get, :update => 'content'}, {:url => gantt.params.merge(:zoom => (gantt.zoom+1)), :update => 'content'},
{:href => url_for(gantt.params.merge(:zoom => (gantt.zoom+1)))}) {:href => url_for(gantt.params.merge(:zoom => (gantt.zoom+1)))})
else else
l(:text_zoom_in) + l(:text_zoom_in) +
@@ -264,7 +262,7 @@ module IssuesHelper
when :out when :out
if gantt.zoom > 1 if gantt.zoom > 1
link_to_remote(l(:text_zoom_out) + image_tag('zoom_out.png', img_attributes.merge(:alt => l(:text_zoom_out))), link_to_remote(l(:text_zoom_out) + image_tag('zoom_out.png', img_attributes.merge(:alt => l(:text_zoom_out))),
{:url => gantt.params.merge(:zoom => (gantt.zoom-1)), :method => :get, :update => 'content'}, {:url => gantt.params.merge(:zoom => (gantt.zoom-1)), :update => 'content'},
{:href => url_for(gantt.params.merge(:zoom => (gantt.zoom-1)))}) {:href => url_for(gantt.params.merge(:zoom => (gantt.zoom-1)))})
else else
l(:text_zoom_out) + l(:text_zoom_out) +
-10
View File
@@ -71,14 +71,4 @@ module SettingsHelper
label = options.delete(:label) label = options.delete(:label)
label != false ? content_tag("label", l(label || "setting_#{setting}")) : '' label != false ? content_tag("label", l(label || "setting_#{setting}")) : ''
end end
# Renders a notification field for a Redmine::Notifiable option
def notification_field(notifiable)
return content_tag(:label,
check_box_tag('settings[notified_events][]',
notifiable.name,
Setting.notified_events.include?(notifiable.name)) +
l_or_humanize(notifiable.name, :prefix => 'label_'),
:class => notifiable.parent.present? ? "parent" : '')
end
end end
+4 -4
View File
@@ -34,14 +34,14 @@ module UsersHelper
end end
def change_status_link(user) def change_status_link(user)
url = {:controller => 'users', :action => 'update', :id => user, :page => params[:page], :status => params[:status], :tab => nil} url = {:controller => 'users', :action => 'edit', :id => user, :page => params[:page], :status => params[:status], :tab => nil}
if user.locked? if user.locked?
link_to l(:button_unlock), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock' link_to l(:button_unlock), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :post, :class => 'icon icon-unlock'
elsif user.registered? elsif user.registered?
link_to l(:button_activate), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock' link_to l(:button_activate), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :post, :class => 'icon icon-unlock'
elsif user != User.current elsif user != User.current
link_to l(:button_lock), url.merge(:user => {:status => User::STATUS_LOCKED}), :method => :put, :class => 'icon icon-lock' link_to l(:button_lock), url.merge(:user => {:status => User::STATUS_LOCKED}), :method => :post, :class => 'icon icon-lock'
end end
end end
+1 -1
View File
@@ -18,7 +18,7 @@
class Board < ActiveRecord::Base class Board < ActiveRecord::Base
belongs_to :project belongs_to :project
has_many :topics, :class_name => 'Message', :conditions => "#{Message.table_name}.parent_id IS NULL", :order => "#{Message.table_name}.created_on DESC" has_many :topics, :class_name => 'Message', :conditions => "#{Message.table_name}.parent_id IS NULL", :order => "#{Message.table_name}.created_on DESC"
has_many :messages, :dependent => :delete_all, :order => "#{Message.table_name}.created_on DESC" has_many :messages, :dependent => :destroy, :order => "#{Message.table_name}.created_on DESC"
belongs_to :last_message, :class_name => 'Message', :foreign_key => :last_message_id belongs_to :last_message, :class_name => 'Message', :foreign_key => :last_message_id
acts_as_list :scope => :project_id acts_as_list :scope => :project_id
acts_as_watchable acts_as_watchable
+1
View File
@@ -31,6 +31,7 @@ class Group < Principal
def user_added(user) def user_added(user)
members.each do |member| members.each do |member|
next if member.project.nil?
user_member = Member.find_by_project_id_and_user_id(member.project_id, user.id) || Member.new(:project_id => member.project_id, :user_id => user.id) user_member = Member.find_by_project_id_and_user_id(member.project_id, user.id) || Member.new(:project_id => member.project_id, :user_id => user.id)
member.member_roles.each do |member_role| member.member_roles.each do |member_role|
user_member.member_roles << MemberRole.new(:role => member_role.role, :inherited_from => member_role.id) user_member.member_roles << MemberRole.new(:role => member_role.role, :inherited_from => member_role.id)
+5 -31
View File
@@ -62,28 +62,10 @@ class Issue < ActiveRecord::Base
named_scope :open, :conditions => ["#{IssueStatus.table_name}.is_closed = ?", false], :include => :status named_scope :open, :conditions => ["#{IssueStatus.table_name}.is_closed = ?", false], :include => :status
named_scope :recently_updated, :order => "#{Issue.table_name}.updated_on DESC" named_scope :recently_updated, :order => "#{self.table_name}.updated_on DESC"
named_scope :with_limit, lambda { |limit| { :limit => limit} } named_scope :with_limit, lambda { |limit| { :limit => limit} }
named_scope :on_active_project, :include => [:status, :project, :tracker], named_scope :on_active_project, :include => [:status, :project, :tracker],
:conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"] :conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"]
named_scope :for_gantt, lambda {
{
:include => [:tracker, :status, :assigned_to, :priority, :project, :fixed_version],
:order => "#{Issue.table_name}.due_date ASC, #{Issue.table_name}.start_date ASC, #{Issue.table_name}.id ASC"
}
}
named_scope :without_version, lambda {
{
:conditions => { :fixed_version_id => nil}
}
}
named_scope :with_query, lambda {|query|
{
:conditions => Query.merge_conditions(query.statement)
}
}
before_create :default_assign before_create :default_assign
before_save :close_duplicates, :update_done_ratio_from_issue_status before_save :close_duplicates, :update_done_ratio_from_issue_status
@@ -255,7 +237,7 @@ class Issue < ActiveRecord::Base
if !user.allowed_to?(:manage_subtasks, project) if !user.allowed_to?(:manage_subtasks, project)
attrs.delete('parent_issue_id') attrs.delete('parent_issue_id')
elsif !attrs['parent_issue_id'].blank? elsif !attrs['parent_issue_id'].blank?
attrs.delete('parent_issue_id') unless Issue.visible(user).exists?(attrs['parent_issue_id']) attrs.delete('parent_issue_id') unless Issue.visible(user).exists?(attrs['parent_issue_id'].to_i)
end end
end end
@@ -376,13 +358,6 @@ class Issue < ActiveRecord::Base
!due_date.nil? && (due_date < Date.today) && !status.is_closed? !due_date.nil? && (due_date < Date.today) && !status.is_closed?
end end
# Is the amount of work done less than it should for the due date
def behind_schedule?
return false if start_date.nil? || due_date.nil?
done_date = start_date + ((due_date - start_date+1)* done_ratio/100).floor
return done_date <= Date.today
end
# Does this issue have children? # Does this issue have children?
def children? def children?
!leaf? !leaf?
@@ -417,10 +392,9 @@ class Issue < ActiveRecord::Base
# Returns the mail adresses of users that should be notified # Returns the mail adresses of users that should be notified
def recipients def recipients
notified = project.notified_users notified = project.notified_users
# Author and assignee are always notified unless they have been # Author and assignee are always notified unless they have been locked
# locked or don't want to be notified notified << author if author && author.active?
notified << author if author && author.active? && author.notify_about?(self) notified << assigned_to if assigned_to && assigned_to.active?
notified << assigned_to if assigned_to && assigned_to.active? && assigned_to.notify_about?(self)
notified.uniq! notified.uniq!
# Remove users that can not view the issue # Remove users that can not view the issue
notified.reject! {|user| !visible?(user)} notified.reject! {|user| !visible?(user)}
+1 -6
View File
@@ -17,11 +17,6 @@
class JournalObserver < ActiveRecord::Observer class JournalObserver < ActiveRecord::Observer
def after_create(journal) def after_create(journal)
if Setting.notified_events.include?('issue_updated') || Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated')
(Setting.notified_events.include?('issue_note_added') && journal.notes.present?) ||
(Setting.notified_events.include?('issue_status_updated') && journal.new_status.present?) ||
(Setting.notified_events.include?('issue_priority_updated') && journal.new_value_for('priority_id').present?)
Mailer.deliver_issue_edit(journal)
end
end end
end end
+2 -47
View File
@@ -382,13 +382,12 @@ class Project < ActiveRecord::Base
# Returns the mail adresses of users that should be always notified on project events # Returns the mail adresses of users that should be always notified on project events
def recipients def recipients
notified_users.collect {|user| user.mail} members.select {|m| m.mail_notification? || m.user.mail_notification?}.collect {|m| m.user.mail}
end end
# Returns the users that should be notified on project events # Returns the users that should be notified on project events
def notified_users def notified_users
# TODO: User part should be extracted to User#notify_about? members.select {|m| m.mail_notification? || m.user.mail_notification?}.collect {|m| m.user}
members.select {|m| m.mail_notification? || m.user.mail_notification == 'all'}.collect {|m| m.user}
end end
# Returns an array of all custom fields enabled for project issues # Returns an array of all custom fields enabled for project issues
@@ -422,50 +421,6 @@ class Project < ActiveRecord::Base
s s
end end
# The earliest start date of a project, based on it's issues and versions
def start_date
if module_enabled?(:issue_tracking)
[
issues.minimum('start_date'),
shared_versions.collect(&:effective_date),
shared_versions.collect {|v| v.fixed_issues.minimum('start_date')}
].flatten.compact.min
end
end
# The latest due date of an issue or version
def due_date
if module_enabled?(:issue_tracking)
[
issues.maximum('due_date'),
shared_versions.collect(&:effective_date),
shared_versions.collect {|v| v.fixed_issues.maximum('due_date')}
].flatten.compact.max
end
end
def overdue?
active? && !due_date.nil? && (due_date < Date.today)
end
# Returns the percent completed for this project, based on the
# progress on it's versions.
def completed_percent(options={:include_subprojects => false})
if options.delete(:include_subprojects)
total = self_and_descendants.collect(&:completed_percent).sum
total / self_and_descendants.count
else
if versions.count > 0
total = versions.collect(&:completed_pourcent).sum
total / versions.count
else
100
end
end
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')
-47
View File
@@ -195,12 +195,6 @@ class Query < ActiveRecord::Base
end end
@available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty? @available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty?
@available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values } unless user_values.empty? @available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values } unless user_values.empty?
group_values = Group.all.collect {|g| [g.name, g.id.to_s] }
@available_filters["member_of_group"] = { :type => :list_optional, :order => 6, :values => group_values } unless group_values.empty?
role_values = Role.givable.collect {|r| [r.name, r.id.to_s] }
@available_filters["assigned_to_role"] = { :type => :list_optional, :order => 7, :values => role_values } unless role_values.empty?
if User.current.logged? if User.current.logged?
@available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] } @available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] }
@@ -438,47 +432,6 @@ class Query < ActiveRecord::Base
db_field = 'user_id' db_field = 'user_id'
sql << "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND " sql << "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND "
sql << sql_for_field(field, '=', v, db_table, db_field) + ')' sql << sql_for_field(field, '=', v, db_table, db_field) + ')'
elsif field == "member_of_group" # named field
if operator == '*' # Any group
groups = Group.all
operator = '=' # Override the operator since we want to find by assigned_to
elsif operator == "!*"
groups = Group.all
operator = '!' # Override the operator since we want to find by assigned_to
else
groups = Group.find_all_by_id(v)
end
groups ||= []
members_of_groups = groups.inject([]) {|user_ids, group|
if group && group.user_ids.present?
user_ids << group.user_ids
end
user_ids.flatten.uniq.compact
}.sort.collect(&:to_s)
sql << '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')'
elsif field == "assigned_to_role" # named field
if operator == "*" # Any Role
roles = Role.givable
operator = '=' # Override the operator since we want to find by assigned_to
elsif operator == "!*" # No role
roles = Role.givable
operator = '!' # Override the operator since we want to find by assigned_to
else
roles = Role.givable.find_all_by_id(v)
end
roles ||= []
members_of_roles = roles.inject([]) {|user_ids, role|
if role && role.members
user_ids << role.members.collect(&:user_id)
end
user_ids.flatten.uniq.compact
}.sort.collect(&:to_s)
sql << '(' + sql_for_field("assigned_to_id", operator, members_of_roles, Issue.table_name, "assigned_to_id", false) + ')'
else else
# regular field # regular field
db_table = Issue.table_name db_table = Issue.table_name
+9 -76
View File
@@ -33,15 +33,6 @@ class User < Principal
:username => '#{login}' :username => '#{login}'
} }
MAIL_NOTIFICATION_OPTIONS = [
[:all, :label_user_mail_option_all],
[:selected, :label_user_mail_option_selected],
[:none, :label_user_mail_option_none],
[:only_my_events, :label_user_mail_option_only_my_events],
[:only_assigned, :label_user_mail_option_only_assigned],
[:only_owner, :label_user_mail_option_only_owner]
]
has_and_belongs_to_many :groups, :after_add => Proc.new {|user, group| group.user_added(user)}, has_and_belongs_to_many :groups, :after_add => Proc.new {|user, group| group.user_added(user)},
:after_remove => Proc.new {|user, group| group.user_removed(user)} :after_remove => Proc.new {|user, group| group.user_removed(user)}
has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify
@@ -74,7 +65,7 @@ class User < Principal
validates_confirmation_of :password, :allow_nil => true validates_confirmation_of :password, :allow_nil => true
def before_create def before_create
self.mail_notification = Setting.default_notification_option if self.mail_notification.blank? self.mail_notification = false
true true
end end
@@ -259,17 +250,6 @@ class User < Principal
notified_projects_ids notified_projects_ids
end end
# Only users that belong to more than 1 project can select projects for which they are notified
def valid_notification_options
# Note that @user.membership.size would fail since AR ignores
# :include association option when doing a count
if memberships.length < 1
MAIL_NOTIFICATION_OPTIONS.delete_if {|option| option.first == :selected}
else
MAIL_NOTIFICATION_OPTIONS
end
end
# Find a user account by matching the exact login and then a case-insensitive # Find a user account by matching the exact login and then a case-insensitive
# version. Exact matches will be given priority. # version. Exact matches will be given priority.
def self.find_by_login(login) def self.find_by_login(login)
@@ -344,35 +324,23 @@ class User < Principal
!roles_for_project(project).detect {|role| role.member?}.nil? !roles_for_project(project).detect {|role| role.member?}.nil?
end end
# Return true if the user is allowed to do the specified action on a specific context # Return true if the user is allowed to do the specified action on project
# Action can be: # action can be:
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
# * a permission Symbol (eg. :edit_project) # * a permission Symbol (eg. :edit_project)
# Context can be: def allowed_to?(action, project, options={})
# * a project : returns true if user is allowed to do the specified action on this project if project
# * a group of projects : returns true if user is allowed on every project
# * nil with options[:global] set : check if user has at least one role allowed for this action,
# or falls back to Non Member / Anonymous permissions depending if the user is logged
def allowed_to?(action, context, options={})
if context && context.is_a?(Project)
# No action allowed on archived projects # No action allowed on archived projects
return false unless context.active? return false unless project.active?
# No action allowed on disabled modules # No action allowed on disabled modules
return false unless context.allows_to?(action) return false unless project.allows_to?(action)
# Admin users are authorized for anything else # Admin users are authorized for anything else
return true if admin? return true if admin?
roles = roles_for_project(context) roles = roles_for_project(project)
return false unless roles return false unless roles
roles.detect {|role| (context.is_public? || role.member?) && role.allowed_to?(action)} roles.detect {|role| (project.is_public? || role.member?) && role.allowed_to?(action)}
elsif context && context.is_a?(Array)
# Authorize if user is authorized on every element of the array
context.map do |project|
allowed_to?(action,project,options)
end.inject do |memo,allowed|
memo && allowed
end
elsif options[:global] elsif options[:global]
# Admin users are always authorized # Admin users are always authorized
return true if admin? return true if admin?
@@ -391,41 +359,6 @@ class User < Principal
allowed_to?(action, nil, options.reverse_merge(:global => true)) allowed_to?(action, nil, options.reverse_merge(:global => true))
end end
# Utility method to help check if a user should be notified about an
# event.
#
# TODO: only supports Issue events currently
def notify_about?(object)
case mail_notification.to_sym
when :all
true
when :selected
# Handled by the Project
when :none
false
when :only_my_events
if object.is_a?(Issue) && (object.author == self || object.assigned_to == self)
true
else
false
end
when :only_assigned
if object.is_a?(Issue) && object.assigned_to == self
true
else
false
end
when :only_owner
if object.is_a?(Issue) && object.author == self
true
else
false
end
else
false
end
end
def self.current=(user) def self.current=(user)
@current_user = user @current_user = user
end end
-16
View File
@@ -73,18 +73,6 @@ class Version < ActiveRecord::Base
def completed? def completed?
effective_date && (effective_date <= Date.today) && (open_issues_count == 0) effective_date && (effective_date <= Date.today) && (open_issues_count == 0)
end end
def behind_schedule?
if completed_pourcent == 100
return false
elsif due_date && fixed_issues.present? && fixed_issues.minimum('start_date') # TODO: should use #start_date but that method is wrong...
start_date = fixed_issues.minimum('start_date')
done_date = start_date + ((due_date - start_date+1)* completed_pourcent/100).floor
return done_date <= Date.today
else
false # No issues so it's not late
end
end
# Returns the completion percentage of this version based on the amount of open/closed issues # Returns the completion percentage of this version based on the amount of open/closed issues
# and the time spent on the open issues. # and the time spent on the open issues.
@@ -135,10 +123,6 @@ class Version < ActiveRecord::Base
end end
def to_s; name end def to_s; name end
def to_s_with_project
"#{project} - #{name}"
end
# Versions are sorted by effective_date and "Project Name - Version name" # Versions are sorted by effective_date and "Project Name - Version name"
# Those with no effective_date are at the end, sorted by "Project Name - Version name" # Those with no effective_date are at the end, sorted by "Project Name - Version name"
+4 -2
View File
@@ -19,6 +19,7 @@
<table class="list"> <table class="list">
<thead><tr> <thead><tr>
<th><%=l(:label_project)%></th> <th><%=l(:label_project)%></th>
<th><%=l(:field_description)%></th>
<th><%=l(:field_is_public)%></th> <th><%=l(:field_is_public)%></th>
<th><%=l(:field_created_on)%></th> <th><%=l(:field_created_on)%></th>
<th></th> <th></th>
@@ -26,14 +27,15 @@
<tbody> <tbody>
<% project_tree(@projects) do |project, level| %> <% project_tree(@projects) do |project, level| %>
<tr class="<%= cycle("odd", "even") %> <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> <tr class="<%= cycle("odd", "even") %> <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="name"><span><%= link_to_project(project, {:action => 'settings'}, :title => project.short_description) %></span></td> <td class="name"><%= link_to_project(project, :action => 'settings') %></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>
<td class="buttons"> <td class="buttons">
<%= link_to(l(:button_archive), { :controller => 'projects', :action => 'archive', :id => project, :status => params[:status] }, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-lock') if project.active? %> <%= link_to(l(:button_archive), { :controller => 'projects', :action => 'archive', :id => project, :status => params[:status] }, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-lock') if project.active? %>
<%= link_to(l(:button_unarchive), { :controller => 'projects', :action => 'unarchive', :id => project, :status => params[:status] }, :method => :post, :class => 'icon icon-unlock') if !project.active? && (project.parent.nil? || project.parent.active?) %> <%= link_to(l(:button_unarchive), { :controller => 'projects', :action => 'unarchive', :id => project, :status => params[:status] }, :method => :post, :class => 'icon icon-unlock') if !project.active? && (project.parent.nil? || project.parent.active?) %>
<%= link_to(l(:button_copy), { :controller => 'projects', :action => 'copy', :id => project }, :class => 'icon icon-copy') %> <%= link_to(l(:button_copy), { :controller => 'projects', :action => 'copy', :id => project }, :class => 'icon icon-copy') %>
<%= link_to(l(:button_delete), project_destroy_confirm_path(project), :class => 'icon icon-del') %> <%= link_to(l(:button_delete), { :controller => 'projects', :action => 'destroy', :id => project }, :class => 'icon icon-del') %>
</td> </td>
</tr> </tr>
<% end %> <% end %>
+3 -5
View File
@@ -1,7 +1,6 @@
<h2><%= l(:label_calendar) %></h2> <h2><%= l(:label_calendar) %></h2>
<% form_tag(calendar_path, :method => :put, :id => 'query_form') do %> <% form_tag({}, :id => 'query_form') do %>
<%= hidden_field_tag('project_id', @project.to_param) if @project%>
<fieldset id="filters" class="collapsible"> <fieldset id="filters" class="collapsible">
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend> <legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div> <div>
@@ -10,7 +9,7 @@
</fieldset> </fieldset>
<p style="float:right;"> <p style="float:right;">
<%= link_to_previous_month(@year, @month, :project => @project) %> | <%= link_to_next_month(@year, @month, :project => @project) %> <%= link_to_previous_month(@year, @month) %> | <%= link_to_next_month(@year, @month) %>
</p> </p>
<p class="buttons"> <p class="buttons">
@@ -26,8 +25,7 @@
}, :class => 'icon icon-checked' %> }, :class => 'icon icon-checked' %>
<%= link_to_remote l(:button_clear), <%= link_to_remote l(:button_clear),
{ :url => { :project_id => @project, :set_filter => (@query.new_record? ? 1 : nil) }, { :url => { :set_filter => (@query.new_record? ? 1 : nil) },
:method => :put,
:update => "content", :update => "content",
}, :class => 'icon icon-reload' if @query.new_record? %> }, :class => 'icon icon-reload' if @query.new_record? %>
</p> </p>
+6 -5
View File
@@ -9,7 +9,7 @@
:class => 'icon-edit', :disabled => !@can[:edit] %></li> :class => 'icon-edit', :disabled => !@can[:edit] %></li>
<% end %> <% end %>
<% unless @allowed_statuses.empty? %> <% if @allowed_statuses.present? %>
<li class="folder"> <li class="folder">
<a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a> <a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
<ul> <ul>
@@ -33,6 +33,7 @@
</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>
@@ -42,8 +43,8 @@
<% end -%> <% end -%>
</ul> </ul>
</li> </li>
<% end %>
<% #TODO: allow editing versions when multiple projects %>
<% 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>
@@ -57,7 +58,7 @@
</ul> </ul>
</li> </li>
<% end %> <% end %>
<% unless @assignables.nil? || @assignables.empty? -%> <% if @assignables.present? -%>
<li class="folder"> <li class="folder">
<a href="#" class="submenu"><%= l(:field_assigned_to) %></a> <a href="#" class="submenu"><%= l(:field_assigned_to) %></a>
<ul> <ul>
@@ -84,7 +85,7 @@
</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>
@@ -114,7 +115,7 @@
:class => 'icon-copy', :disabled => !@can[:move] %></li> :class => 'icon-copy', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_move), new_issue_move_path(: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), :back_url => @back}, <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>
<%= call_hook(:view_issues_context_menu_end, {:issues => @issues, :can => @can, :back => @back }) %> <%= call_hook(:view_issues_context_menu_end, {:issues => @issues, :can => @can, :back => @back }) %>
+1 -1
View File
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to(l(:label_attachment_new), new_project_file_path(@project), :class => 'icon icon-add') if User.current.allowed_to?(:manage_files, @project) %> <%= 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>
+1 -1
View File
@@ -2,7 +2,7 @@
<%= error_messages_for 'attachment' %> <%= error_messages_for 'attachment' %>
<div class="box"> <div class="box">
<% form_tag(project_files_path(@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>
+73 -17
View File
@@ -1,8 +1,6 @@
<% @gantt.view = self %>
<h2><%= l(:label_gantt) %></h2> <h2><%= l(:label_gantt) %></h2>
<% form_tag(gantt_path(:month => params[:month], :year => params[:year], :months => params[:months]), :method => :put, :id => 'query_form') do %> <% form_tag(params.merge(:month => nil, :year => nil, :months => nil), :id => 'query_form') do %>
<%= hidden_field_tag('project_id', @project.to_param) if @project%>
<fieldset id="filters" class="collapsible"> <fieldset id="filters" class="collapsible">
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend> <legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div> <div>
@@ -29,8 +27,7 @@
}, :class => 'icon icon-checked' %> }, :class => 'icon icon-checked' %>
<%= link_to_remote l(:button_clear), <%= link_to_remote l(:button_clear),
{ :url => { :project_id => @project, :set_filter => (@query.new_record? ? 1 : nil) }, { :url => { :set_filter => (@query.new_record? ? 1 : nil) },
:method => :put,
:update => "content", :update => "content",
}, :class => 'icon icon-reload' if @query.new_record? %> }, :class => 'icon icon-reload' if @query.new_record? %>
</p> </p>
@@ -57,12 +54,11 @@ if @gantt.zoom >1
end end
end end
# Width of the entire chart
g_width = (@gantt.date_to - @gantt.date_from + 1)*zoom g_width = (@gantt.date_to - @gantt.date_from + 1)*zoom
# Collect the number of issues on Versions g_height = [(20 * @gantt.events.length + 6)+150, 206].max
g_height = [(20 * (@gantt.number_of_rows + 6))+150, 206].max
t_height = g_height + headers_height t_height = g_height + headers_height
%> %>
<table width="100%" style="border:0; border-collapse: collapse;"> <table width="100%" style="border:0; border-collapse: collapse;">
<tr> <tr>
<td style="width:<%= subject_width %>px; padding:0px;"> <td style="width:<%= subject_width %>px; padding:0px;">
@@ -70,10 +66,26 @@ t_height = g_height + headers_height
<div style="position:relative;height:<%= t_height + 24 %>px;width:<%= subject_width + 1 %>px;"> <div style="position:relative;height:<%= t_height + 24 %>px;width:<%= subject_width + 1 %>px;">
<div style="right:-2px;width:<%= subject_width %>px;height:<%= headers_height %>px;background: #eee;" class="gantt_hdr"></div> <div style="right:-2px;width:<%= subject_width %>px;height:<%= headers_height %>px;background: #eee;" class="gantt_hdr"></div>
<div style="right:-2px;width:<%= subject_width %>px;height:<%= t_height %>px;border-left: 1px solid #c0c0c0;overflow:hidden;" class="gantt_hdr"></div> <div style="right:-2px;width:<%= subject_width %>px;height:<%= t_height %>px;border-left: 1px solid #c0c0c0;overflow:hidden;" class="gantt_hdr"></div>
<% top = headers_height + 8 %> <%
#
<%= @gantt.subjects(:headers_height => headers_height, :top => top, :g_width => g_width) %> # Tasks subjects
#
top = headers_height + 8
@gantt.events.each do |i|
left = 4 + (i.is_a?(Issue) ? i.level * 16 : 0)
%>
<div style="position: absolute;line-height:1.2em;height:16px;top:<%= top %>px;left:<%= left %>px;overflow:hidden;"><small>
<% if i.is_a? Issue %>
<%= h("#{i.project} -") unless @project && @project == i.project %>
<%= link_to_issue i %>
<% else %>
<span class="icon icon-package">
<%= link_to_version i %>
</span>
<% end %>
</small></div>
<% top = top + 20
end %>
</div> </div>
</td> </td>
<td> <td>
@@ -151,9 +163,53 @@ if show_days
end end
end %> end %>
<% top = headers_height + 10 %> <%
#
<%= @gantt.lines(:top => top, :zoom => zoom, :g_width => g_width ) %> # Tasks
#
top = headers_height + 10
@gantt.events.each do |i|
if i.is_a? Issue
i_start_date = (i.start_date >= @gantt.date_from ? i.start_date : @gantt.date_from )
i_end_date = (i.due_before <= @gantt.date_to ? i.due_before : @gantt.date_to )
i_done_date = i.start_date + ((i.due_before - i.start_date+1)*i.done_ratio/100).floor
i_done_date = (i_done_date <= @gantt.date_from ? @gantt.date_from : i_done_date )
i_done_date = (i_done_date >= @gantt.date_to ? @gantt.date_to : i_done_date )
i_late_date = [i_end_date, Date.today].min if i_start_date < Date.today
i_left = ((i_start_date - @gantt.date_from)*zoom).floor
i_width = ((i_end_date - i_start_date + 1)*zoom).floor - 2 # total width of the issue (- 2 for left and right borders)
d_width = ((i_done_date - i_start_date)*zoom).floor - 2 # done width
l_width = i_late_date ? ((i_late_date - i_start_date+1)*zoom).floor - 2 : 0 # delay width
css = "task " + (i.leaf? ? 'leaf' : 'parent')
%>
<div style="top:<%= top %>px;left:<%= i_left %>px;width:<%= i_width %>px;" class="<%= css %> task_todo"><div class="left"></div>&nbsp;<div class="right"></div></div>
<% if l_width > 0 %>
<div style="top:<%= top %>px;left:<%= i_left %>px;width:<%= l_width %>px;" class="<%= css %> task_late">&nbsp;</div>
<% end %>
<% if d_width > 0 %>
<div style="top:<%= top %>px;left:<%= i_left %>px;width:<%= d_width %>px;" class="<%= css %> task_done">&nbsp;</div>
<% end %>
<div style="top:<%= top %>px;left:<%= i_left + i_width + 8 %>px;background:#fff;" class="<%= css %>">
<%= i.status.name %>
<%= (i.done_ratio).to_i %>%
</div>
<div class="tooltip" style="position: absolute;top:<%= top %>px;left:<%= i_left %>px;width:<%= i_width %>px;height:12px;">
<span class="tip">
<%= render_issue_tooltip i %>
</span></div>
<% else
i_left = ((i.start_date - @gantt.date_from)*zoom).floor
%>
<div style="top:<%= top %>px;left:<%= i_left %>px;width:15px;" class="task milestone">&nbsp;</div>
<div style="top:<%= top %>px;left:<%= i_left + 12 %>px;background:#fff;" class="task">
<strong><%= format_version_name i %></strong>
</div>
<% end %>
<% top = top + 20
end %>
<% <%
# #
@@ -170,8 +226,8 @@ if Date.today >= @gantt.date_from and Date.today <= @gantt.date_to %>
<table width="100%"> <table width="100%">
<tr> <tr>
<td align="left"><%= link_to_remote ('&#171; ' + l(:label_previous)), {:url => @gantt.params_previous, :method => :get, :update => 'content', :complete => 'window.scrollTo(0,0)'}, {:href => url_for(@gantt.params_previous)} %></td> <td align="left"><%= link_to_remote ('&#171; ' + l(:label_previous)), {:url => @gantt.params_previous, :update => 'content', :complete => 'window.scrollTo(0,0)'}, {:href => url_for(@gantt.params_previous)} %></td>
<td align="right"><%= link_to_remote (l(:label_next) + ' &#187;'), {:url => @gantt.params_next, :method => :get, :update => 'content', :complete => 'window.scrollTo(0,0)'}, {:href => url_for(@gantt.params_next)} %></td> <td align="right"><%= link_to_remote (l(:label_next) + ' &#187;'), {:url => @gantt.params_next, :update => 'content', :complete => 'window.scrollTo(0,0)'}, {:href => url_for(@gantt.params_next)} %></td>
</tr> </tr>
</table> </table>
+1 -1
View File
@@ -29,7 +29,7 @@
<% remote_form_for(:group, @group, :url => {:controller => 'groups', :action => 'add_users', :id => @group}, :method => :post) do |f| %> <% remote_form_for(:group, @group, :url => {:controller => 'groups', :action => 'add_users', :id => @group}, :method => :post) do |f| %>
<fieldset><legend><%=l(:label_user_new)%></legend> <fieldset><legend><%=l(:label_user_new)%></legend>
<p><%= text_field_tag 'user_search', nil %></p> <p><%= label_tag "user_search", l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p>
<%= observe_field(:user_search, <%= observe_field(:user_search,
:frequency => 0.5, :frequency => 0.5,
:update => :users, :update => :users,
+1 -1
View File
@@ -2,5 +2,5 @@
<div class="box"> <div class="box">
<p><%= f.text_field :name, :size => 30, :required => true %></p> <p><%= f.text_field :name, :size => 30, :required => true %></p>
<p><%= f.select :assigned_to_id, @project.users.collect{|u| [u.name, u.id]}, :include_blank => true %></p> <p><%= f.select :assigned_to_id, @project.users.sort.collect{|u| [u.name, u.id]}, :include_blank => true %></p>
</div> </div>
+10
View File
@@ -33,6 +33,11 @@
<%= select_tag('status_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@available_statuses, :id, :name)) %> <%= select_tag('status_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@available_statuses, :id, :name)) %>
</p> </p>
<p>
<label><%= l(:field_priority) %></label>
<%= select_tag('priority_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(IssuePriority.all, :id, :name)) %>
</p>
<p> <p>
<label><%= l(:field_start_date) %></label> <label><%= l(:field_start_date) %></label>
<%= text_field_tag 'start_date', '', :size => 10 %><%= calendar_for('start_date') %> <%= text_field_tag 'start_date', '', :size => 10 %><%= calendar_for('start_date') %>
@@ -43,6 +48,11 @@
<%= text_field_tag 'due_date', '', :size => 10 %><%= calendar_for('due_date') %> <%= text_field_tag 'due_date', '', :size => 10 %><%= calendar_for('due_date') %>
</p> </p>
<fieldset><legend><%= l(:field_notes) %></legend>
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
<%= wikitoolbar_for 'notes' %>
</fieldset>
<%= call_hook(:view_issues_move_bottom, :issues => @issues, :target_project => @target_project, :copy => !!@copy) %> <%= call_hook(:view_issues_move_bottom, :issues => @issues, :target_project => @target_project, :copy => !!@copy) %>
</div> </div>
+1 -1
View File
@@ -1,6 +1,6 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %> <%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'new', :issue_id => @issue}, :class => 'icon icon-time-add' %> <%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, :class => 'icon icon-time-add' %>
<% 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' %>
+4 -4
View File
@@ -8,8 +8,8 @@
<p><%= f.text_field :subject, :size => 80, :required => true %></p> <p><%= f.text_field :subject, :size => 80, :required => true %></p>
<% unless (@issue.new_record? && @issue.parent_issue_id.nil?) || !User.current.allowed_to?(:manage_subtasks, @project) %> <% if User.current.allowed_to?(:manage_subtasks, @project) %>
<p><%= f.text_field :parent_issue_id, :size => 10 %></p> <p id="parent_issue"><%= 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('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %> <%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %>
<% end %> <% end %>
@@ -26,11 +26,11 @@
</div> </div>
<% if @issue.new_record? %> <% if @issue.new_record? %>
<p><%= label_tag('attachments[1][file]', l(:label_attachment_plural))%><%= render :partial => 'attachments/form' %></p> <p id="attachments_form"><%= label_tag('attachments[1][file]', l(:label_attachment_plural))%><%= render :partial => 'attachments/form' %></p>
<% end %> <% end %>
<% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%> <% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%>
<p><label><%= l(:label_issue_watchers) %></label> <p id="watchers_form"><label><%= l(:label_issue_watchers) %></label>
<% @issue.project.users.sort.each do |user| -%> <% @issue.project.users.sort.each do |user| -%>
<label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, @issue.watched_by?(user) %> <%=h user %></label> <label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, @issue.watched_by?(user) %> <%=h user %></label>
<% end -%> <% end -%>
+2 -7
View File
@@ -11,7 +11,7 @@
<div class="splitcontentleft"> <div class="splitcontentleft">
<p> <p>
<label><%= l(:field_tracker) %></label> <label><%= l(:field_tracker) %></label>
<%= select_tag('issue[tracker_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@trackers, :id, :name)) %> <%= select_tag('issue[tracker_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@project.trackers, :id, :name)) %>
</p> </p>
<% if @available_statuses.any? %> <% if @available_statuses.any? %>
<p> <p>
@@ -27,25 +27,20 @@
<label><%= l(:field_assigned_to) %></label> <label><%= l(:field_assigned_to) %></label>
<%= select_tag('issue[assigned_to_id]', content_tag('option', l(:label_no_change_option), :value => '') + <%= select_tag('issue[assigned_to_id]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_nobody), :value => 'none') + content_tag('option', l(:label_nobody), :value => 'none') +
options_from_collection_for_select(@assignables, :id, :name)) %> options_from_collection_for_select(@project.assignable_users, :id, :name)) %>
</p> </p>
<% if @project %>
<p> <p>
<label><%= l(:field_category) %></label> <label><%= l(:field_category) %></label>
<%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') + <%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_none), :value => 'none') + content_tag('option', l(:label_none), :value => 'none') +
options_from_collection_for_select(@project.issue_categories, :id, :name)) %> options_from_collection_for_select(@project.issue_categories, :id, :name)) %>
</p> </p>
<% end %>
<% #TODO: allow editing versions when multiple projects %>
<% if @project %>
<p> <p>
<label><%= l(:field_fixed_version) %></label> <label><%= l(:field_fixed_version) %></label>
<%= select_tag('issue[fixed_version_id]', content_tag('option', l(:label_no_change_option), :value => '') + <%= select_tag('issue[fixed_version_id]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_none), :value => 'none') + content_tag('option', l(:label_none), :value => 'none') +
version_options_for_select(@project.shared_versions.open)) %> version_options_for_select(@project.shared_versions.open)) %>
</p> </p>
<% end %>
<% @custom_fields.each do |custom_field| %> <% @custom_fields.each do |custom_field| %>
<p><label><%= h(custom_field.name) %></label> <%= custom_field_tag_for_bulk_edit('issue', custom_field) %></p> <p><label><%= h(custom_field.name) %></label> <%= custom_field_tag_for_bulk_edit('issue', custom_field) %></p>
+1 -1
View File
@@ -1,7 +1,7 @@
<h2><%=l(:label_issue_new)%></h2> <h2><%=l(:label_issue_new)%></h2>
<% labelled_tabular_form_for :issue, @issue, :url => {:controller => 'issues', :action => 'create', :project_id => @project}, <% labelled_tabular_form_for :issue, @issue, :url => {:controller => 'issues', :action => 'create', :project_id => @project},
:html => {:multipart => true, :id => 'issue-form'} do |f| %> :html => {:multipart => true, :id => 'issue-form', :class => 'tabular new-issue-form'} do |f| %>
<%= error_messages_for 'issue' %> <%= error_messages_for 'issue' %>
<div class="box"> <div class="box">
<%= render :partial => 'issues/form', :locals => {:f => f} %> <%= render :partial => 'issues/form', :locals => {:f => f} %>
+4 -5
View File
@@ -32,7 +32,7 @@
<th class="category"><%=l(:field_category)%>:</th><td class="category"><%=h @issue.category ? @issue.category.name : "-" %></td> <th class="category"><%=l(:field_category)%>:</th><td class="category"><%=h @issue.category ? @issue.category.name : "-" %></td>
<% if User.current.allowed_to?(:view_time_entries, @project) %> <% if User.current.allowed_to?(:view_time_entries, @project) %>
<th class="spent-time"><%=l(:label_spent_time)%>:</th> <th class="spent-time"><%=l(:label_spent_time)%>:</th>
<td class="spent-time"><%= @issue.spent_hours > 0 ? (link_to l_hours(@issue.spent_hours), {:controller => 'timelog', :action => 'index', :project_id => @project, :issue_id => @issue}) : "-" %></td> <td class="spent-time"><%= @issue.spent_hours > 0 ? (link_to l_hours(@issue.spent_hours), {:controller => 'timelog', :action => 'details', :project_id => @project, :issue_id => @issue}) : "-" %></td>
<% end %> <% end %>
</tr> </tr>
<tr> <tr>
@@ -44,19 +44,18 @@
<%= render_custom_fields_rows(@issue) %> <%= render_custom_fields_rows(@issue) %>
<%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %> <%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
</table> </table>
<% if @issue.description? || @issue.attachments.any? -%>
<hr /> <hr />
<div class="contextual"> <div class="contextual">
<%= link_to_remote_if_authorized(l(:button_quote), { :url => {:action => 'reply', :id => @issue} }, :class => 'icon icon-comment') if @issue.description? %> <%= link_to_remote_if_authorized(l(:button_quote), { :url => {:action => 'reply', :id => @issue} }, :class => 'icon icon-comment') unless @issue.description.blank? %>
</div> </div>
<p><strong><%=l(:field_description)%></strong></p>
<div class="wiki"> <div class="wiki">
<%= textilizable @issue, :description, :attachments => @issue.attachments %> <%= textilizable @issue, :description, :attachments => @issue.attachments %>
</div> </div>
<%= link_to_attachments @issue %> <%= link_to_attachments @issue %>
<% end -%>
<%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %> <%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %>
+14 -2
View File
@@ -32,12 +32,24 @@
<div class="splitcontentright"> <div class="splitcontentright">
<h3><%=l(:field_mail_notification)%></h3> <h3><%=l(:field_mail_notification)%></h3>
<div class="box"> <div class="box">
<%= render :partial => 'users/mail_notifications' %> <%= select_tag 'notification_option', options_for_select(@notification_options, @notification_option),
:onchange => 'if ($("notification_option").value == "selected") {Element.show("notified-projects")} else {Element.hide("notified-projects")}' %>
<% content_tag 'div', :id => 'notified-projects', :style => (@notification_option == 'selected' ? '' : 'display:none;') do %>
<p><% User.current.projects.each do |project| %>
<label><%= check_box_tag 'notified_project_ids[]', project.id, @user.notified_projects_ids.include?(project.id) %> <%=h project.name %></label><br />
<% end %></p>
<p><em><%= l(:text_user_mail_option) %></em></p>
<% end %>
<p><label><%= check_box_tag 'no_self_notified', 1, @user.pref[:no_self_notified] %> <%= l(:label_user_mail_no_self_notified) %></label></p>
</div> </div>
<h3><%=l(:label_preferences)%></h3> <h3><%=l(:label_preferences)%></h3>
<div class="box tabular"> <div class="box tabular">
<%= render :partial => 'users/preferences' %> <% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
<p><%= pref_fields.check_box :hide_mail %></p>
<p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
<p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
<% end %>
</div> </div>
</div> </div>
+1 -1
View File
@@ -40,7 +40,7 @@ entries_by_day = entries.group_by(&:spent_on)
:title => l(:button_edit) %> :title => l(:button_edit) %>
<%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry}, <%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry},
:confirm => l(:text_are_you_sure), :confirm => l(:text_are_you_sure),
:method => :delete, :method => :post,
:title => l(:button_delete) %> :title => l(:button_delete) %>
<% end -%> <% end -%>
</td> </td>
+3 -3
View File
@@ -5,9 +5,9 @@ function recreateSortables() {
Sortable.destroy('list-left'); Sortable.destroy('list-left');
Sortable.destroy('list-right'); Sortable.destroy('list-right');
Sortable.create("list-top", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=top', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("list-top")})}, only:'mypage-box', tag:'div'}) Sortable.create("list-top", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('<%= url_for(:controller => 'my', :action => 'order_blocks', :group => 'top') %>', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("list-top")})}, only:'mypage-box', tag:'div'})
Sortable.create("list-left", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=left', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("list-left")})}, only:'mypage-box', tag:'div'}) Sortable.create("list-left", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('<%= url_for(:controller => 'my', :action => 'order_blocks', :group => 'left') %>', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("list-left")})}, only:'mypage-box', tag:'div'})
Sortable.create("list-right", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=right', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("list-right")})}, only:'mypage-box', tag:'div'}) Sortable.create("list-right", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('<%= url_for(:controller => 'my', :action => 'order_blocks', :group => 'right') %>', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("list-right")})}, only:'mypage-box', tag:'div'})
} }
function updateSelect() { function updateSelect() {
+1 -1
View File
@@ -1,5 +1,5 @@
<p><%= link_to_project(news.project) + ': ' unless @project %> <p><%= link_to_project(news.project) + ': ' unless @project %>
<%= link_to h(news.title), news_path(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 />
<% unless news.summary.blank? %><span class="summary"><%=h news.summary %></span><br /><% end %> <% unless news.summary.blank? %><span class="summary"><%=h news.summary %></span><br /><% end %>
+4 -4
View File
@@ -1,12 +1,12 @@
<h2><%=l(:label_news)%></h2> <h2><%=l(:label_news)%></h2>
<% labelled_tabular_form_for :news, @news, :url => news_path(@news), <% labelled_tabular_form_for :news, @news, :url => { :action => "edit" },
:html => { :id => 'news-form', :method => :put } do |f| %> :html => { :id => 'news-form' } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => preview_news_path(:project_id => @project), { :url => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'get', :method => 'post',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('news-form')" :with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %> }, :accesskey => accesskey(:preview) %>
+8 -8
View File
@@ -1,19 +1,19 @@
<div class="contextual"> <div class="contextual">
<%= link_to(l(:label_news_new), <%= link_to_if_authorized(l(:label_news_new),
new_project_news_path(@project), {:controller => 'news', :action => 'new', :project_id => @project},
:class => 'icon icon-add', :class => 'icon icon-add',
:onclick => 'Element.show("add-news"); Form.Element.focus("news_title"); return false;') if @project && User.current.allowed_to?(:manage_news, @project) %> :onclick => 'Element.show("add-news"); Form.Element.focus("news_title"); return false;') if @project %>
</div> </div>
<div id="add-news" style="display:none;"> <div id="add-news" style="display:none;">
<h2><%=l(:label_news_new)%></h2> <h2><%=l(:label_news_new)%></h2>
<% labelled_tabular_form_for :news, @news, :url => project_news_index_path(@project), <% labelled_tabular_form_for :news, @news, :url => { :controller => 'news', :action => 'new', :project_id => @project },
:html => { :id => 'news-form' } do |f| %> :html => { :id => 'news-form' } do |f| %>
<%= render :partial => 'news/form', :locals => { :f => f } %> <%= render :partial => 'news/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %> <%= submit_tag l(:button_create) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => preview_news_path(:project_id => @project), { :url => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'get', :method => 'post',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('news-form')" :with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %> | }, :accesskey => accesskey(:preview) %> |
@@ -29,7 +29,7 @@
<% else %> <% else %>
<% @newss.each do |news| %> <% @newss.each do |news| %>
<h3><%= link_to_project(news.project) + ': ' unless news.project == @project %> <h3><%= link_to_project(news.project) + ': ' unless news.project == @project %>
<%= link_to h(news.title), news_path(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>
<div class="wiki"> <div class="wiki">
+3 -3
View File
@@ -1,12 +1,12 @@
<h2><%=l(:label_news_new)%></h2> <h2><%=l(:label_news_new)%></h2>
<% labelled_tabular_form_for :news, @news, :url => project_news_index_path(@project), <% labelled_tabular_form_for :news, @news, :url => { :controller => 'news', :action => 'new', :project_id => @project },
:html => { :id => 'news-form' } do |f| %> :html => { :id => 'news-form' } do |f| %>
<%= render :partial => 'news/form', :locals => { :f => f } %> <%= render :partial => 'news/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %> <%= submit_tag l(:button_create) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => preview_news_path(:project_id => @project), { :url => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'get', :method => 'post',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('news-form')" :with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %> }, :accesskey => accesskey(:preview) %>
+10 -10
View File
@@ -1,23 +1,23 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:button_edit), <%= link_to_if_authorized l(:button_edit),
edit_news_path(@news), {:controller => 'news', :action => 'edit', :id => @news},
:class => 'icon icon-edit', :class => 'icon icon-edit',
:accesskey => accesskey(:edit), :accesskey => accesskey(:edit),
:onclick => 'Element.show("edit-news"); return false;' %> :onclick => 'Element.show("edit-news"); return false;' %>
<%= link_to_if_authorized l(:button_delete), news_path(@news), :confirm => l(:text_are_you_sure), :method => :delete, :class => 'icon icon-del' %> <%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy', :id => @news}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
</div> </div>
<h2><%= avatar(@news.author, :size => "24") %><%=h @news.title %></h2> <h2><%= avatar(@news.author, :size => "24") %><%=h @news.title %></h2>
<% if authorize_for('news', 'edit') %> <% if authorize_for('news', 'edit') %>
<div id="edit-news" style="display:none;"> <div id="edit-news" style="display:none;">
<% labelled_tabular_form_for :news, @news, :url => news_path(@news), <% labelled_tabular_form_for :news, @news, :url => { :action => "edit", :id => @news },
:html => { :id => 'news-form', :method => :put } do |f| %> :html => { :id => 'news-form' } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => preview_news_path(:project_id => @project), { :url => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'get', :method => 'post',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('news-form')" :with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %> | }, :accesskey => accesskey(:preview) %> |
@@ -39,17 +39,17 @@
<% @comments.each do |comment| %> <% @comments.each do |comment| %>
<% next if comment.new_record? %> <% next if comment.new_record? %>
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized image_tag('delete.png'), {:controller => 'comments', :action => 'destroy', :id => @news, :comment_id => comment}, <%= link_to_if_authorized image_tag('delete.png'), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment},
:confirm => l(:text_are_you_sure), :method => :delete, :title => l(:button_delete) %> :confirm => l(:text_are_you_sure), :method => :post, :title => l(:button_delete) %>
</div> </div>
<h4><%= avatar(comment.author, :size => "24") %><%= authoring comment.created_on, comment.author %></h4> <h4><%= avatar(comment.author, :size => "24") %><%= authoring comment.created_on, comment.author %></h4>
<%= textilizable(comment.comments) %> <%= textilizable(comment.comments) %>
<% end if @comments.any? %> <% end if @comments.any? %>
</div> </div>
<% if authorize_for 'comments', 'create' %> <% if authorize_for 'news', 'add_comment' %>
<p><%= toggle_link l(:label_comment_add), "add_comment_form", :focus => "comment_comments" %></p> <p><%= toggle_link l(:label_comment_add), "add_comment_form", :focus => "comment_comments" %></p>
<% form_tag({:controller => 'comments', :action => 'create', :id => @news}, :id => "add_comment_form", :style => "display:none;") do %> <% form_tag({:action => 'add_comment', :id => @news}, :id => "add_comment_form", :style => "display:none;") do %>
<div class="box"> <div class="box">
<%= text_area 'comment', 'comments', :cols => 80, :rows => 15, :class => 'wiki-edit' %> <%= text_area 'comment', 'comments', :cols => 80, :rows => 15, :class => 'wiki-edit' %>
<%= wikitoolbar_for 'comment_comments' %> <%= wikitoolbar_for 'comment_comments' %>
+1 -1
View File
@@ -1,4 +1,4 @@
<% labelled_tabular_form_for :project, @project, :url => project_path(@project), :html => {:method => (@project.new_record? ? :post : :put) } 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 %>
+1 -1
View File
@@ -8,7 +8,7 @@
<% end %> <% end %>
</p> </p>
<p> <p>
<% form_tag(project_path(@project_to_destroy), :method => :delete) do %> <% form_tag({:controller => 'projects', :action => 'destroy', :id => @project_to_destroy}) do %>
<label><%= check_box_tag 'confirm', 1 %> <%= l(:general_text_Yes) %></label> <label><%= check_box_tag 'confirm', 1 %> <%= l(:general_text_Yes) %></label>
<%= submit_tag l(:button_delete) %> <%= submit_tag l(:button_delete) %>
<% end %> <% end %>
@@ -1,4 +1,4 @@
<% form_tag(project_project_enumerations_path(@project), :method => :put, :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), project_project_enumerations_path(@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') %>
+1 -1
View File
@@ -58,7 +58,7 @@
<% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post) do |f| %> <% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post) do |f| %>
<fieldset><legend><%=l(:label_member_new)%></legend> <fieldset><legend><%=l(:label_member_new)%></legend>
<p><%= text_field_tag 'principal_search', nil %></p> <p><%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %></p>
<%= observe_field(:principal_search, <%= observe_field(:principal_search,
:frequency => 0.5, :frequency => 0.5,
:update => :principals, :update => :principals,
+4 -4
View File
@@ -6,7 +6,7 @@
<th><%= l(:field_description) %></th> <th><%= l(:field_description) %></th>
<th><%= l(:field_status) %></th> <th><%= l(:field_status) %></th>
<th><%= l(:field_sharing) %></th> <th><%= l(:field_sharing) %></th>
<th><%= l(:label_wiki_page) unless @project.wiki.nil? %></th> <th><%= l(:label_wiki_page) %></th>
<th style="width:15%"></th> <th style="width:15%"></th>
</tr></thead> </tr></thead>
<tbody> <tbody>
@@ -17,11 +17,11 @@
<td class="description"><%=h version.description %></td> <td class="description"><%=h version.description %></td>
<td class="status"><%= l("version_status_#{version.status}") %></td> <td class="status"><%= l("version_status_#{version.status}") %></td>
<td class="sharing"><%=h format_version_sharing(version.sharing) %></td> <td class="sharing"><%=h format_version_sharing(version.sharing) %></td>
<td><%= link_to(h(version.wiki_page_title), :controller => 'wiki', :page => Wiki.titleize(version.wiki_page_title)) unless version.wiki_page_title.blank? || @project.wiki.nil? %></td> <td><%= link_to_if_authorized(h(version.wiki_page_title), {:controller => 'wiki', :action => 'index', :id => version.project, :page => Wiki.titleize(version.wiki_page_title)}) || h(version.wiki_page_title) unless version.wiki_page_title.blank? || version.project.wiki.nil? %></td>
<td class="buttons"> <td class="buttons">
<% if version.project == @project %> <% if version.project == @project %>
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %> <%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %>
<%= link_to_if_authorized l(:button_delete), {:controller => 'versions', :action => 'destroy', :id => version}, :confirm => l(:text_are_you_sure), :method => :delete, :class => 'icon icon-del' %> <%= link_to_if_authorized l(:button_delete), {:controller => 'versions', :action => 'destroy', :id => version}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
<% end %> <% end %>
</td> </td>
</tr> </tr>
@@ -34,7 +34,7 @@
<div class="contextual"> <div class="contextual">
<% if @project.versions.any? %> <% if @project.versions.any? %>
<%= link_to l(:label_close_versions), close_completed_project_versions_path(@project), :method => :put %> <%= link_to l(:label_close_versions), {:controller => 'versions', :action => 'close_completed', :project_id => @project}, :method => :post %>
<% end %> <% end %>
</div> </div>
+2 -2
View File
@@ -67,8 +67,8 @@
<% if @total_hours && User.current.allowed_to?(:view_time_entries, @project) %> <% if @total_hours && User.current.allowed_to?(:view_time_entries, @project) %>
<h3><%= l(:label_spent_time) %></h3> <h3><%= l(:label_spent_time) %></h3>
<p><span class="icon icon-time"><%= l_hours(@total_hours) %></span></p> <p><span class="icon icon-time"><%= l_hours(@total_hours) %></span></p>
<p><%= link_to(l(:label_details), {:controller => 'timelog', :action => 'index', :project_id => @project}) %> | <p><%= link_to(l(:label_details), {:controller => 'timelog', :action => 'details', :project_id => @project}) %> |
<%= link_to(l(:label_report), {:controller => 'time_entry_reports', :action => 'report', :project_id => @project}) %></p> <%= link_to(l(:label_report), {:controller => 'timelog', :action => 'report', :project_id => @project}) %></p>
<% end %> <% end %>
<%= call_hook(:view_projects_show_sidebar_bottom, :project => @project) %> <%= call_hook(:view_projects_show_sidebar_bottom, :project => @project) %>
<% end %> <% end %>
+1 -1
View File
@@ -3,7 +3,7 @@
<div class="box tabular settings"> <div class="box tabular settings">
<p><%= setting_check_box :login_required %></p> <p><%= setting_check_box :login_required %></p>
<p><%= setting_select :autologin, [1, 7, 30, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), days.to_s]}, :blank => :label_disabled %></p> <p><%= setting_select :autologin, [[l(:label_disabled), 0]] + [1, 7, 30, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), days.to_s]} %></p>
<p><%= setting_select :self_registration, [[l(:label_disabled), "0"], <p><%= setting_select :self_registration, [[l(:label_disabled), "0"],
[l(:label_registration_activation_by_email), "1"], [l(:label_registration_activation_by_email), "1"],
+2 -2
View File
@@ -6,7 +6,7 @@
<p><%= setting_text_area :welcome_text, :cols => 60, :rows => 5, :class => 'wiki-edit' %></p> <p><%= setting_text_area :welcome_text, :cols => 60, :rows => 5, :class => 'wiki-edit' %></p>
<%= wikitoolbar_for 'settings_welcome_text' %> <%= wikitoolbar_for 'settings_welcome_text' %>
<p><%= setting_text_field :attachment_max_size, :size => 6 %> KB</p> <p><%= setting_text_field :attachment_max_size, :size => 6 %> <%= l(:"number.human.storage_units.units.kb") %></p>
<p><%= setting_text_field :per_page_options, :size => 20 %><br /> <p><%= setting_text_field :per_page_options, :size => 20 %><br />
<em><%= l(:text_comma_separated) %></em></p> <em><%= l(:text_comma_separated) %></em></p>
@@ -26,7 +26,7 @@
<p><%= setting_text_field :feeds_limit, :size => 6 %></p> <p><%= setting_text_field :feeds_limit, :size => 6 %></p>
<p><%= setting_text_field :file_max_size_displayed, :size => 6 %> KB</p> <p><%= setting_text_field :file_max_size_displayed, :size => 6 %> <%= l(:"number.human.storage_units.units.kb") %></p>
<p><%= setting_text_field :diff_max_lines_displayed, :size => 6 %></p> <p><%= setting_text_field :diff_max_lines_displayed, :size => 6 %></p>
+5 -10
View File
@@ -7,18 +7,13 @@
<p><%= setting_check_box :bcc_recipients %></p> <p><%= setting_check_box :bcc_recipients %></p>
<p><%= setting_check_box :plain_text_mail %></p> <p><%= setting_check_box :plain_text_mail %></p>
<p><%= setting_select(:default_notification_option, User::MAIL_NOTIFICATION_OPTIONS.collect {|o| [l(o.last), o.first.to_s]}) %></p>
</div> </div>
<fieldset class="box" id="notified_events"><legend><%=l(:text_select_mail_notifications)%></legend> <fieldset class="box settings" id="notified_events"><legend><%=l(:text_select_mail_notifications)%></legend>
<%= hidden_field_tag 'settings[notified_events][]', '' %> <%= setting_multiselect(:notified_events,
<% @notifiables.each do |notifiable| %> @notifiables.collect {|notifiable| [l_or_humanize(notifiable, :prefix => 'label_'), notifiable]}, :label => false) %>
<%= notification_field notifiable %>
<br /> <p><%= check_all_links('notified_events') %></p>
<% end %>
<p><%= check_all_links('notified_events') %></p>
</fieldset> </fieldset>
<fieldset class="box"><legend><%= l(:setting_emails_footer) %></legend> <fieldset class="box"><legend><%= l(:setting_emails_footer) %></legend>
+3 -3
View File
@@ -28,9 +28,9 @@
<div class="tabs"> <div class="tabs">
<% url_params = @free_period ? { :from => @from, :to => @to } : { :period => params[:period] } %> <% url_params = @free_period ? { :from => @from, :to => @to } : { :period => params[:period] } %>
<ul> <ul>
<li><%= link_to(l(:label_details), url_params.merge({:controller => 'timelog', :action => 'index', :project_id => @project, :issue_id => @issue }), <li><%= link_to(l(:label_details), url_params.merge({:controller => 'timelog', :action => 'details', :project_id => @project, :issue_id => @issue }),
:class => (@controller.action_name == 'index' ? 'selected' : nil)) %></li> :class => (@controller.action_name == 'details' ? 'selected' : nil)) %></li>
<li><%= link_to(l(:label_report), url_params.merge({:controller => 'time_entry_reports', :action => 'report', :project_id => @project, :issue_id => @issue}), <li><%= link_to(l(:label_report), url_params.merge({:controller => 'timelog', :action => 'report', :project_id => @project, :issue_id => @issue}),
:class => (@controller.action_name == 'report' ? 'selected' : nil)) %></li> :class => (@controller.action_name == 'report' ? 'selected' : nil)) %></li>
</ul> </ul>
</div> </div>
+1 -1
View File
@@ -31,7 +31,7 @@
:title => l(:button_edit) %> :title => l(:button_edit) %>
<%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry, :project_id => nil}, <%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry, :project_id => nil},
:confirm => l(:text_are_you_sure), :confirm => l(:text_are_you_sure),
:method => :delete, :method => :post,
:title => l(:button_delete) %> :title => l(:button_delete) %>
<% end -%> <% end -%>
</td> </td>
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'new', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time-add' %> <%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time-add' %>
</div> </div>
<%= render_timelog_breadcrumb %> <%= render_timelog_breadcrumb %>
+1 -6
View File
@@ -1,11 +1,6 @@
<h2><%= l(:label_spent_time) %></h2> <h2><%= l(:label_spent_time) %></h2>
<% labelled_tabular_form_for(:time_entry, @time_entry, :url => { <% labelled_tabular_form_for :time_entry, @time_entry, :url => {:action => 'edit', :id => @time_entry, :project_id => @time_entry.project} do |f| %>
:action => (@time_entry.new_record? ? 'create' : 'update'),
:id => @time_entry,
:project_id => @time_entry.project
},
:html => {:method => @time_entry.new_record? ? :post : :put}) do |f| %>
<%= error_messages_for 'time_entry' %> <%= error_messages_for 'time_entry' %>
<%= back_url_hidden_field_tag %> <%= back_url_hidden_field_tag %>
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'new', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time-add' %> <%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time-add' %>
</div> </div>
<%= render_timelog_breadcrumb %> <%= render_timelog_breadcrumb %>
@@ -13,7 +13,7 @@
<%# TODO: get rid of the project_id field, that should already be in the URL %> <%# TODO: get rid of the project_id field, that should already be in the URL %>
<%= hidden_field_tag('project_id', params[:project_id]) if @project %> <%= hidden_field_tag('project_id', params[:project_id]) if @project %>
<%= hidden_field_tag('issue_id', params[:issue_id]) if @issue %> <%= hidden_field_tag('issue_id', params[:issue_id]) if @issue %>
<%= render :partial => 'timelog/date_range' %> <%= render :partial => 'date_range' %>
<p><%= l(:label_details) %>: <%= select_tag 'columns', options_for_select([[l(:label_year), 'year'], <p><%= l(:label_details) %>: <%= select_tag 'columns', options_for_select([[l(:label_year), 'year'],
[l(:label_month), 'month'], [l(:label_month), 'month'],
-10
View File
@@ -32,14 +32,4 @@
<%= password_field_tag 'password_confirmation', nil, :size => 25 %></p> <%= password_field_tag 'password_confirmation', nil, :size => 25 %></p>
</div> </div>
</div> </div>
<div class="box">
<h3><%=l(:field_mail_notification)%></h3>
<%= render :partial => 'users/mail_notifications' %>
</div>
<div class="box tabular">
<h3><%=l(:label_preferences)%></h3>
<%= render :partial => 'users/preferences' %>
</div>
<!--[eoform:user]--> <!--[eoform:user]-->
+1 -1
View File
@@ -1,4 +1,4 @@
<% labelled_tabular_form_for :user, @user, :url => { :controller => 'users', :action => "update", :tab => nil }, :html => { :method => :put, :class => nil } do |f| %> <% labelled_tabular_form_for :user, @user, :url => { :controller => 'users', :action => "edit", :tab => nil }, :html => { :class => nil } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<% if @user.active? -%> <% if @user.active? -%>
<p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p> <p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p>
+1 -1
View File
@@ -1,4 +1,4 @@
<% form_for(:user, :url => { :action => 'update' }, :html => {:method => :put}) do %> <% form_for(:user, :url => { :action => 'edit' }) do %>
<div class="box"> <div class="box">
<% Group.all.sort.each do |group| %> <% Group.all.sort.each do |group| %>
<label><%= check_box_tag 'user[group_ids][]', group.id, @user.groups.include?(group) %> <%=h group %></label><br /> <label><%= check_box_tag 'user[group_ids][]', group.id, @user.groups.include?(group) %> <%=h group %></label><br />
@@ -1,12 +0,0 @@
<p>
<%= select_tag 'notification_option', options_for_select(@notification_options.collect {|o| [l(o.last), o.first]}, @notification_option.to_sym),
:onchange => 'if ($("notification_option").value == "selected") {Element.show("notified-projects")} else {Element.hide("notified-projects")}' %>
</p>
<% content_tag 'div', :id => 'notified-projects', :style => (@notification_option == 'selected' ? '' : 'display:none;') do %>
<p><% @user.projects.each do |project| %>
<label><%= check_box_tag 'notified_project_ids[]', project.id, @user.notified_projects_ids.include?(project.id) %> <%=h project.name %></label><br />
<% end %></p>
<p><em><%= l(:text_user_mail_option) %></em></p>
<% end %>
<p><label><%= l(:label_user_mail_no_self_notified) %></label><%= check_box_tag 'no_self_notified', 1, @user.pref[:no_self_notified] %></p>
-6
View File
@@ -1,6 +0,0 @@
<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
<p><%= pref_fields.check_box :hide_mail %></p>
<p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
<p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
<% end %>
@@ -1,6 +1,6 @@
<h2><%= link_to l(:label_user_plural), :controller => 'users', :action => 'index' %> &#187; <%=l(:label_user_new)%></h2> <h2><%= link_to l(:label_user_plural), :controller => 'users', :action => 'index' %> &#187; <%=l(:label_user_new)%></h2>
<% labelled_tabular_form_for :user, @user, :url => { :action => "create" }, :html => { :class => nil } do |f| %> <% labelled_tabular_form_for :user, @user, :url => { :action => "add" }, :html => { :class => nil } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p> <p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p>
<p> <p>
+1 -1
View File
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to l(:label_profile), user_path(@user), :class => 'icon icon-user' %> <%= link_to l(:label_profile), {:controller => 'users', :action => 'show', :id => @user}, :class => 'icon icon-user' %>
<%= change_status_link(@user) %> <%= change_status_link(@user) %>
</div> </div>
+2 -2
View File
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to l(:label_user_new), {:action => 'new'}, :class => 'icon icon-add' %> <%= link_to l(:label_user_new), {:action => 'add'}, :class => 'icon icon-add' %>
</div> </div>
<h2><%=l(:label_user_plural)%></h2> <h2><%=l(:label_user_plural)%></h2>
@@ -30,7 +30,7 @@
<tbody> <tbody>
<% for user in @users -%> <% for user in @users -%>
<tr class="user <%= cycle("odd", "even") %> <%= %w(anon active registered locked)[user.status] %>"> <tr class="user <%= cycle("odd", "even") %> <%= %w(anon active registered locked)[user.status] %>">
<td class="username"><%= avatar(user, :size => "14") %><%= link_to h(user.login), edit_user_path(user) %></td> <td class="username"><%= avatar(user, :size => "14") %><%= link_to h(user.login), :action => 'edit', :id => user %></td>
<td class="firstname"><%= h(user.firstname) %></td> <td class="firstname"><%= h(user.firstname) %></td>
<td class="lastname"><%= h(user.lastname) %></td> <td class="lastname"><%= h(user.lastname) %></td>
<td class="email"><%= mail_to(h(user.mail)) %></td> <td class="email"><%= mail_to(h(user.mail)) %></td>
+1 -1
View File
@@ -1,5 +1,5 @@
<div class="contextual"> <div class="contextual">
<%= link_to(l(:button_edit), edit_user_path(@user), :class => 'icon icon-edit') if User.current.admin? %> <%= link_to(l(:button_edit), {:controller => 'users', :action => 'edit', :id => @user}, :class => 'icon icon-edit') if User.current.admin? %>
</div> </div>
<h2><%= avatar @user, :size => "50" %> <%=h @user.name %></h2> <h2><%= avatar @user, :size => "50" %> <%=h @user.name %></h2>
+1 -1
View File
@@ -5,7 +5,7 @@
select_tag('status_by', select_tag('status_by',
status_by_options_for_select(criteria), status_by_options_for_select(criteria),
:id => 'status_by_select', :id => 'status_by_select',
:onchange => remote_function(:url => status_by_project_version_path(version.project, version), :onchange => remote_function(:url => { :action => :status_by, :id => version },
:with => "Form.serialize('status_by_form')"))) %> :with => "Form.serialize('status_by_form')"))) %>
</legend> </legend>
<% if counts.empty? %> <% if counts.empty? %>
+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 => project_version_path(@project, @version), :html => {:method => :put} 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 %>
+1 -1
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 => project_versions_path(@project) 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 %>
+1 -1
View File
@@ -1,6 +1,6 @@
<div class="contextual"> <div class="contextual">
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %> <%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %>
<%= link_to_if_authorized(l(:button_edit_associated_wikipage, :page_title => @version.wiki_page_title), {:controller => 'wiki', :action => 'edit', :page => Wiki.titleize(@version.wiki_page_title)}, :class => 'icon icon-edit') unless @version.wiki_page_title.blank? || @project.wiki.nil? %> <%= link_to_if_authorized(l(:button_edit_associated_wikipage, :page_title => @version.wiki_page_title), {:controller => 'wiki', :action => 'edit', :id => @version.project, :page => Wiki.titleize(@version.wiki_page_title)}, :class => 'icon icon-edit') unless @version.wiki_page_title.blank? || @version.project.wiki.nil? %>
<%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %> <%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %>
</div> </div>
+3 -3
View File
@@ -4,6 +4,6 @@
<h3><%= l(:label_wiki) %></h3> <h3><%= l(:label_wiki) %></h3>
<%= link_to l(:field_start_page), {:action => 'show', :page => nil} %><br /> <%= link_to l(:field_start_page), {:action => 'index', :page => nil} %><br />
<%= link_to l(:label_index_by_title), {:action => 'page_index'} %><br /> <%= link_to l(:label_index_by_title), {:action => 'special', :page => 'Page_index'} %><br />
<%= link_to l(:label_index_by_date), {:action => 'date_index'} %><br /> <%= link_to l(:label_index_by_date), {:action => 'special', :page => 'Date_index'} %><br />
+2 -2
View File
@@ -6,7 +6,7 @@
<h2><%= @page.pretty_title %></h2> <h2><%= @page.pretty_title %></h2>
<p> <p>
<%= l(:label_version) %> <%= link_to @annotate.content.version, :action => 'show', :page => @page.title, :version => @annotate.content.version %> <%= l(:label_version) %> <%= link_to @annotate.content.version, :action => 'index', :page => @page.title, :version => @annotate.content.version %>
<em>(<%= @annotate.content.author ? @annotate.content.author.name : "anonyme" %>, <%= format_time(@annotate.content.updated_on) %>)</em> <em>(<%= @annotate.content.author ? @annotate.content.author.name : "anonyme" %>, <%= format_time(@annotate.content.updated_on) %>)</em>
</p> </p>
@@ -18,7 +18,7 @@
<% @annotate.lines.each do |line| -%> <% @annotate.lines.each do |line| -%>
<tr class="bloc-<%= colors[line[0]] %>"> <tr class="bloc-<%= colors[line[0]] %>">
<th class="line-num"><%= line_num %></th> <th class="line-num"><%= line_num %></th>
<td class="revision"><%= link_to line[0], :controller => 'wiki', :action => 'show', :project_id => @project, :page => @page.title, :version => line[0] %></td> <td class="revision"><%= link_to line[0], :controller => 'wiki', :action => 'index', :id => @project, :page => @page.title, :version => line[0] %></td>
<td class="author"><%= h(line[1]) %></td> <td class="author"><%= h(line[1]) %></td>
<td class="line-code"><pre><%=h line[2] %></pre></td> <td class="line-code"><pre><%=h line[2] %></pre></td>
</tr> </tr>
+1 -1
View File
@@ -15,5 +15,5 @@
</div> </div>
<%= submit_tag l(:button_apply) %> <%= submit_tag l(:button_apply) %>
<%= link_to l(:button_cancel), :controller => 'wiki', :action => 'show', :project_id => @project, :page => @page.title %> <%= link_to l(:button_cancel), :controller => 'wiki', :action => 'index', :id => @project, :page => @page.title %>
<% end %> <% end %>
+2 -2
View File
@@ -5,10 +5,10 @@
<h2><%= @page.pretty_title %></h2> <h2><%= @page.pretty_title %></h2>
<p> <p>
<%= l(:label_version) %> <%= link_to @diff.content_from.version, :action => 'show', :page => @page.title, :version => @diff.content_from.version %> <%= l(:label_version) %> <%= link_to @diff.content_from.version, :action => 'index', :page => @page.title, :version => @diff.content_from.version %>
<em>(<%= @diff.content_from.author ? @diff.content_from.author.name : "anonyme" %>, <%= format_time(@diff.content_from.updated_on) %>)</em> <em>(<%= @diff.content_from.author ? @diff.content_from.author.name : "anonyme" %>, <%= format_time(@diff.content_from.updated_on) %>)</em>
&#8594; &#8594;
<%= l(:label_version) %> <%= link_to @diff.content_to.version, :action => 'show', :page => @page.title, :version => @diff.content_to.version %>/<%= @page.content.version %> <%= l(:label_version) %> <%= link_to @diff.content_to.version, :action => 'index', :page => @page.title, :version => @diff.content_to.version %>/<%= @page.content.version %>
<em>(<%= @diff.content_to.author ? @diff.content_to.author.name : "anonyme" %>, <%= format_time(@diff.content_to.updated_on) %>)</em> <em>(<%= @diff.content_to.author ? @diff.content_to.author.name : "anonyme" %>, <%= format_time(@diff.content_to.updated_on) %>)</em>
</p> </p>
+2 -2
View File
@@ -1,6 +1,6 @@
<h2><%=h @page.pretty_title %></h2> <h2><%=h @page.pretty_title %></h2>
<% form_for :content, @content, :url => {:action => 'update', :page => @page.title}, :html => {:multipart => true, :id => 'wiki_form'} do |f| %> <% form_for :content, @content, :url => {:action => 'edit', :page => @page.title}, :html => {:multipart => true, :id => 'wiki_form'} do |f| %>
<%= f.hidden_field :version %> <%= f.hidden_field :version %>
<%= error_messages_for 'content' %> <%= error_messages_for 'content' %>
@@ -10,7 +10,7 @@
<p><%= submit_tag l(:button_save) %> <p><%= submit_tag l(:button_save) %>
<%= link_to_remote l(:label_preview), <%= link_to_remote l(:label_preview),
{ :url => { :controller => 'wiki', :action => 'preview', :project_id => @project, :page => @page.title }, { :url => { :controller => 'wiki', :action => 'preview', :id => @project, :page => @page.title },
:method => 'post', :method => 'post',
:update => 'preview', :update => 'preview',
:with => "Form.serialize('wiki_form')", :with => "Form.serialize('wiki_form')",
+1 -2
View File
@@ -3,7 +3,6 @@
<h3><%= l(:label_history) %></h3> <h3><%= l(:label_history) %></h3>
<% form_tag({:action => "diff"}, :method => :get) do %> <% form_tag({:action => "diff"}, :method => :get) do %>
<%= hidden_field_tag('project_id', h(@project.to_param)) %>
<table class="list"> <table class="list">
<thead><tr> <thead><tr>
<th>#</th> <th>#</th>
@@ -19,7 +18,7 @@
<% line_num = 1 %> <% line_num = 1 %>
<% @versions.each do |ver| %> <% @versions.each do |ver| %>
<tr class="<%= cycle("odd", "even") %>"> <tr class="<%= cycle("odd", "even") %>">
<td class="id"><%= link_to ver.version, :action => 'show', :page => @page.title, :version => ver.version %></td> <td class="id"><%= link_to ver.version, :action => 'index', :page => @page.title, :version => ver.version %></td>
<td class="checkbox"><%= radio_button_tag('version', ver.version, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < @versions.size) %></td> <td class="checkbox"><%= radio_button_tag('version', ver.version, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < @versions.size) %></td>
<td class="checkbox"><%= radio_button_tag('version_from', ver.version, (line_num==2), :id => "cbto-#{line_num}") if show_diff && (line_num > 1) %></td> <td class="checkbox"><%= radio_button_tag('version_from', ver.version, (line_num==2), :id => "cbto-#{line_num}") if show_diff && (line_num > 1) %></td>
<td align="center"><%= format_time(ver.updated_on) %></td> <td align="center"><%= format_time(ver.updated_on) %></td>
+3 -3
View File
@@ -15,11 +15,11 @@
<% if @content.version != @page.content.version %> <% if @content.version != @page.content.version %>
<p> <p>
<%= link_to(('&#171; ' + l(:label_previous)), :action => 'show', :page => @page.title, :version => (@content.version - 1)) + " - " if @content.version > 1 %> <%= link_to(('&#171; ' + l(:label_previous)), :action => 'index', :page => @page.title, :version => (@content.version - 1)) + " - " if @content.version > 1 %>
<%= "#{l(:label_version)} #{@content.version}/#{@page.content.version}" %> <%= "#{l(:label_version)} #{@content.version}/#{@page.content.version}" %>
<%= '(' + link_to('diff', :controller => 'wiki', :action => 'diff', :page => @page.title, :version => @content.version) + ')' if @content.version > 1 %> - <%= '(' + link_to('diff', :controller => 'wiki', :action => 'diff', :page => @page.title, :version => @content.version) + ')' if @content.version > 1 %> -
<%= link_to((l(:label_next) + ' &#187;'), :action => 'show', :page => @page.title, :version => (@content.version + 1)) + " - " if @content.version < @page.content.version %> <%= link_to((l(:label_next) + ' &#187;'), :action => 'index', :page => @page.title, :version => (@content.version + 1)) + " - " if @content.version < @page.content.version %>
<%= link_to(l(:label_current_version), :action => 'show', :page => @page.title) %> <%= link_to(l(:label_current_version), :action => 'index', :page => @page.title) %>
<br /> <br />
<em><%= @content.author ? @content.author.name : "anonyme" %>, <%= format_time(@content.updated_on) %> </em><br /> <em><%= @content.author ? @content.author.name : "anonyme" %>, <%= format_time(@content.updated_on) %> </em><br />
<%=h @content.comments %> <%=h @content.comments %>
@@ -12,7 +12,7 @@
<h3><%= format_date(date) %></h3> <h3><%= format_date(date) %></h3>
<ul> <ul>
<% @pages_by_date[date].each do |page| %> <% @pages_by_date[date].each do |page| %>
<li><%= link_to page.pretty_title, :action => 'show', :page => page.title %></li> <li><%= link_to page.pretty_title, :action => 'index', :page => page.title %></li>
<% end %> <% end %>
</ul> </ul>
<% end %> <% end %>
@@ -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 => 'activities', :action => 'show', :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 => '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 => 'activities', :action => 'show', :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 %>
@@ -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 => 'activities', :action => 'show', :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 => '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 => 'activities', :action => 'show', :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
View File
@@ -5,6 +5,7 @@
<% if @workflow_counts.empty? %> <% if @workflow_counts.empty? %>
<p class="nodata"><%= l(:label_no_data) %></p> <p class="nodata"><%= l(:label_no_data) %></p>
<% else %> <% else %>
<div class="autoscroll">
<table class="list"> <table class="list">
<thead> <thead>
<tr> <tr>
@@ -30,4 +31,5 @@
<% end -%> <% end -%>
</tbody> </tbody>
</table> </table>
</div>
<% end %> <% end %>
+1 -1
View File
@@ -84,7 +84,7 @@ ActionMailer::Base.send :include, AsynchronousMailer
module I18n module I18n
module Backend module Backend
module Base module Base
def warn_syntax_deprecation! def warn_syntax_deprecation!(*args)
return if @skip_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." 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 @skip_syntax_deprecation = true
+292 -284
View File
@@ -9,12 +9,12 @@ bg:
short: "%b %d" short: "%b %d"
long: "%B %d, %Y" long: "%B %d, %Y"
day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] day_names: [Неделя, Понеделник, Вторник, Сряда, Четвъртък, Петък, Събота]
abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] abbr_day_names: [Нед, Пон, Вто, Сря, Чет, Пет, Съб]
# Don't forget the nil at the beginning; there's no such thing as a 0th month # Don't forget the nil at the beginning; there's no such thing as a 0th month
month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] month_names: [~, Януари, Февруари, Март, Април, Май, Юни, Юли, Август, Септември, Октомври, Ноември, Декември]
abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] abbr_month_names: [~, Яну, Фев, Мар, Апр, Май, Юни, Юли, Авг, Сеп, Окт, Ное, Дек]
# Used in date_select and datime_select. # Used in date_select and datime_select.
order: [ :year, :month, :day ] order: [ :year, :month, :day ]
@@ -31,38 +31,38 @@ bg:
distance_in_words: distance_in_words:
half_a_minute: "half a minute" half_a_minute: "half a minute"
less_than_x_seconds: less_than_x_seconds:
one: "less than 1 second" one: "по-малко от 1 секунда"
other: "less than {{count}} seconds" other: "по-малко от {{count}} секунди"
x_seconds: x_seconds:
one: "1 second" one: "1 секунда"
other: "{{count}} seconds" other: "{{count}} секунди"
less_than_x_minutes: less_than_x_minutes:
one: "less than a minute" one: "по-малко от 1 минута"
other: "less than {{count}} minutes" other: "по-малко от {{count}} минути"
x_minutes: x_minutes:
one: "1 minute" one: "1 минута"
other: "{{count}} minutes" other: "{{count}} минути"
about_x_hours: about_x_hours:
one: "about 1 hour" one: "около 1 час"
other: "about {{count}} hours" other: "около {{count}} часа"
x_days: x_days:
one: "1 day" one: "1 ден"
other: "{{count}} days" other: "{{count}} дена"
about_x_months: about_x_months:
one: "about 1 month" one: "около 1 месец"
other: "about {{count}} months" other: "около {{count}} месеца"
x_months: x_months:
one: "1 month" one: "1 месец"
other: "{{count}} months" other: "{{count}} месеца"
about_x_years: about_x_years:
one: "about 1 year" one: "около 1 година"
other: "about {{count}} years" other: "около {{count}} години"
over_x_years: over_x_years:
one: "over 1 year" one: "над 1 година"
other: "over {{count}} years" other: "над {{count}} години"
almost_x_years: almost_x_years:
one: "almost 1 year" one: "почти 1 година"
other: "almost {{count}} years" other: "почти {{count}} години"
number: number:
format: format:
@@ -87,7 +87,7 @@ bg:
# Used in array.to_sentence. # Used in array.to_sentence.
support: support:
array: array:
sentence_connector: "and" sentence_connector: "и"
skip_last_comma: false skip_last_comma: false
activerecord: activerecord:
@@ -106,17 +106,16 @@ bg:
taken: "вече съществува" taken: "вече съществува"
not_a_number: "не е число" not_a_number: "не е число"
not_a_date: "е невалидна дата" not_a_date: "е невалидна дата"
greater_than: "must be greater than {{count}}" greater_than: "трябва да бъде по-голям[a/о] от {{count}}"
greater_than_or_equal_to: "must be greater than or equal to {{count}}" greater_than_or_equal_to: "трябва да бъде по-голям[a/о] от или равен[a/o] на {{count}}"
equal_to: "must be equal to {{count}}" equal_to: "трябва да бъде равен[a/o] на {{count}}"
less_than: "must be less than {{count}}" less_than: "трябва да бъде по-малък[a/o] от {{count}}"
less_than_or_equal_to: "must be less than or equal to {{count}}" less_than_or_equal_to: "трябва да бъде по-малък[a/o] от или равен[a/o] на {{count}}"
odd: "must be odd" odd: "трябва да бъде нечетен[a/o]"
even: "must be even" even: "трябва да бъде четен[a/o]"
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 +170,7 @@ bg:
field_mail: Email field_mail: Email
field_filename: Файл field_filename: Файл
field_filesize: Големина field_filesize: Големина
field_downloads: Downloads field_downloads: Изтеглени файлове
field_author: Автор field_author: Автор
field_created_on: От дата field_created_on: От дата
field_updated_on: Обновена field_updated_on: Обновена
@@ -186,10 +185,10 @@ bg:
field_title: Заглавие field_title: Заглавие
field_project: Проект field_project: Проект
field_issue: Задача field_issue: Задача
field_status: Статус field_status: Състояние
field_notes: Бележка field_notes: Бележка
field_is_closed: Затворена задача field_is_closed: Затворена задача
field_is_default: Статус по подразбиране field_is_default: Състояние по подразбиране
field_tracker: Тракер field_tracker: Тракер
field_subject: Относно field_subject: Относно
field_due_date: Крайна дата field_due_date: Крайна дата
@@ -217,12 +216,11 @@ bg:
field_port: Порт field_port: Порт
field_account: Профил field_account: Профил
field_base_dn: Base DN field_base_dn: Base DN
field_attr_login: Login attribute field_attr_login: Атрибут Login
field_attr_firstname: Firstname attribute field_attr_firstname: Атрибут Първо име (Firstname)
field_attr_lastname: Lastname attribute field_attr_lastname: Атрибут Фамилия (Lastname)
field_attr_mail: Email attribute field_attr_mail: Атрибут Email
field_onthefly: Динамично създаване на потребител field_onthefly: Динамично създаване на потребител
field_start_date: Начална дата
field_done_ratio: % Прогрес field_done_ratio: % Прогрес
field_auth_source: Начин на оторизация field_auth_source: Начин на оторизация
field_hide_mail: Скрий e-mail адреса ми field_hide_mail: Скрий e-mail адреса ми
@@ -249,12 +247,12 @@ bg:
setting_login_required: Изискване за вход в системата setting_login_required: Изискване за вход в системата
setting_self_registration: Регистрация от потребители setting_self_registration: Регистрация от потребители
setting_attachment_max_size: Максимална големина на прикачен файл setting_attachment_max_size: Максимална големина на прикачен файл
setting_issues_export_limit: Лимит за експорт на задачи setting_issues_export_limit: Максимален брой задачи за експорт
setting_mail_from: E-mail адрес за емисии setting_mail_from: E-mail адрес за емисии
setting_host_name: Хост setting_host_name: Хост
setting_text_formatting: Форматиране на текста setting_text_formatting: Форматиране на текста
setting_wiki_compression: Wiki компресиране на историята setting_wiki_compression: Wiki компресиране на историята
setting_feeds_limit: Лимит на Feeds setting_feeds_limit: Максимален брой за емисии
setting_autofetch_changesets: Автоматично обработване на ревизиите setting_autofetch_changesets: Автоматично обработване на ревизиите
setting_sys_api_enabled: Разрешаване на WS за управление setting_sys_api_enabled: Разрешаване на WS за управление
setting_commit_ref_keywords: Отбелязващи ключови думи setting_commit_ref_keywords: Отбелязващи ключови думи
@@ -270,9 +268,9 @@ bg:
label_project_new: Нов проект label_project_new: Нов проект
label_project_plural: Проекти label_project_plural: Проекти
label_x_projects: label_x_projects:
zero: no projects zero: 0 проекти
one: 1 project one: 1 проект
other: "{{count}} projects" other: "{{count}} проекта"
label_project_all: Всички проекти label_project_all: Всички проекти
label_project_latest: Последни проекти label_project_latest: Последни проекти
label_issue: Задача label_issue: Задача
@@ -293,9 +291,9 @@ bg:
label_tracker_plural: Тракери label_tracker_plural: Тракери
label_tracker_new: Нов тракер label_tracker_new: Нов тракер
label_workflow: Работен процес label_workflow: Работен процес
label_issue_status: Статус на задача label_issue_status: Състояние на задача
label_issue_status_plural: Статуси на задачи label_issue_status_plural: Състояния на задачи
label_issue_status_new: Нов статус label_issue_status_new: Ново състояние
label_issue_category: Категория задача label_issue_category: Категория задача
label_issue_category_plural: Категории задачи label_issue_category_plural: Категории задачи
label_issue_category_new: Нова категория label_issue_category_new: Нова категория
@@ -323,14 +321,14 @@ bg:
label_registered_on: Регистрация label_registered_on: Регистрация
label_activity: Дейност label_activity: Дейност
label_new: Нов label_new: Нов
label_logged_as: Логнат като label_logged_as: Здравейте,
label_environment: Среда label_environment: Среда
label_authentication: Оторизация label_authentication: Оторизация
label_auth_source: Начин на оторозация label_auth_source: Начин на оторозация
label_auth_source_new: Нов начин на оторизация label_auth_source_new: Нов начин на оторизация
label_auth_source_plural: Начини на оторизация label_auth_source_plural: Начини на оторизация
label_subproject_plural: Подпроекти label_subproject_plural: Подпроекти
label_min_max_length: Мин. - Макс. дължина label_min_max_length: Минимална - максимална дължина
label_list: Списък label_list: Списък
label_date: Дата label_date: Дата
label_integer: Целочислен label_integer: Целочислен
@@ -339,10 +337,10 @@ bg:
label_text: Дълъг текст label_text: Дълъг текст
label_attribute: Атрибут label_attribute: Атрибут
label_attribute_plural: Атрибути label_attribute_plural: Атрибути
label_download: "{{count}} Download" label_download: "{{count}} изтегляне"
label_download_plural: "{{count}} Downloads" label_download_plural: "{{count}} изтегляния"
label_no_data: Няма изходни данни label_no_data: Няма изходни данни
label_change_status: Промяна на статуса label_change_status: Промяна на състоянието
label_history: История label_history: История
label_attachment: Файл label_attachment: Файл
label_attachment_new: Нов файл label_attachment_new: Нов файл
@@ -369,21 +367,21 @@ bg:
label_closed_issues: затворена label_closed_issues: затворена
label_closed_issues_plural: затворени label_closed_issues_plural: затворени
label_x_open_issues_abbr_on_total: label_x_open_issues_abbr_on_total:
zero: 0 open / {{total}} zero: 0 отворени / {{total}}
one: 1 open / {{total}} one: 1 отворена / {{total}}
other: "{{count}} open / {{total}}" other: "{{count}} отворени / {{total}}"
label_x_open_issues_abbr: label_x_open_issues_abbr:
zero: 0 open zero: 0 отворени
one: 1 open one: 1 отворена
other: "{{count}} open" other: "{{count}} отворени"
label_x_closed_issues_abbr: label_x_closed_issues_abbr:
zero: 0 closed zero: 0 затворени
one: 1 closed one: 1 затворена
other: "{{count}} closed" other: "{{count}} затворени"
label_total: Общо label_total: Общо
label_permissions: Права label_permissions: Права
label_current_status: Текущ статус label_current_status: Текущо състояние
label_new_statuses_allowed: Позволени статуси label_new_statuses_allowed: Позволени състояния
label_all: всички label_all: всички
label_none: никакви label_none: никакви
label_next: Следващ label_next: Следващ
@@ -394,7 +392,7 @@ bg:
label_per_page: На страница label_per_page: На страница
label_calendar: Календар label_calendar: Календар
label_months_from: месеца от label_months_from: месеца от
label_gantt: Gantt label_gantt: Мрежов график
label_internal: Вътрешен label_internal: Вътрешен
label_last_changes: "последни {{count}} промени" label_last_changes: "последни {{count}} промени"
label_change_view_all: Виж всички промени label_change_view_all: Виж всички промени
@@ -402,9 +400,9 @@ bg:
label_comment: Коментар label_comment: Коментар
label_comment_plural: Коментари label_comment_plural: Коментари
label_x_comments: label_x_comments:
zero: no comments zero: 0 коментари
one: 1 comment one: 1 коментар
other: "{{count}} comments" other: "{{count}} коментари"
label_comment_add: Добавяне на коментар label_comment_add: Добавяне на коментар
label_comment_added: Добавен коментар label_comment_added: Добавен коментар
label_comment_delete: Изтриване на коментари label_comment_delete: Изтриване на коментари
@@ -453,13 +451,13 @@ bg:
label_wiki: Wiki label_wiki: Wiki
label_wiki_edit: Wiki редакция label_wiki_edit: Wiki редакция
label_wiki_edit_plural: Wiki редакции label_wiki_edit_plural: Wiki редакции
label_wiki_page: Wiki page label_wiki_page: Wiki страница
label_wiki_page_plural: Wiki pages label_wiki_page_plural: Wiki страници
label_index_by_title: Индекс label_index_by_title: Индекс
label_index_by_date: Индекс по дата label_index_by_date: Индекс по дата
label_current_version: Текуща версия label_current_version: Текуща версия
label_preview: Преглед label_preview: Преглед
label_feed_plural: Feeds label_feed_plural: Емисии
label_changes_details: Подробни промени label_changes_details: Подробни промени
label_issue_tracking: Тракинг label_issue_tracking: Тракинг
label_spent_time: Отделено време label_spent_time: Отделено време
@@ -478,7 +476,7 @@ bg:
label_permissions_report: Справка за права label_permissions_report: Справка за права
label_watched_issues: Наблюдавани задачи label_watched_issues: Наблюдавани задачи
label_related_issues: Свързани задачи label_related_issues: Свързани задачи
label_applied_status: Промени статуса на label_applied_status: Установено състояние
label_loading: Зареждане... label_loading: Зареждане...
label_relation_new: Нова релация label_relation_new: Нова релация
label_relation_delete: Изтриване на релация label_relation_delete: Изтриване на релация
@@ -488,10 +486,10 @@ bg:
label_blocked_by: блокирана от label_blocked_by: блокирана от
label_precedes: предшества label_precedes: предшества
label_follows: изпълнява се след label_follows: изпълнява се след
label_end_to_start: end to start label_end_to_start: край към начало
label_end_to_end: end to end label_end_to_end: край към край
label_start_to_start: start to start label_start_to_start: начало към начало
label_start_to_end: start to end label_start_to_end: начало към край
label_stay_logged_in: Запомни ме label_stay_logged_in: Запомни ме
label_disabled: забранено label_disabled: забранено
label_show_completed_versions: Показване на реализирани версии label_show_completed_versions: Показване на реализирани версии
@@ -534,7 +532,7 @@ bg:
button_clear: Изчисти button_clear: Изчисти
button_lock: Заключване button_lock: Заключване
button_unlock: Отключване button_unlock: Отключване
button_download: Download button_download: Изтегляне
button_list: Списък button_list: Списък
button_view: Преглед button_view: Преглед
button_move: Преместване button_move: Преместване
@@ -544,8 +542,8 @@ bg:
button_sort: Сортиране button_sort: Сортиране
button_log_time: Отделяне на време button_log_time: Отделяне на време
button_rollback: Върни се към тази ревизия button_rollback: Върни се към тази ревизия
button_watch: Наблюдавай button_watch: Наблюдаване
button_unwatch: Спри наблюдението button_unwatch: Край на наблюдението
button_reply: Отговор button_reply: Отговор
button_archive: Архивиране button_archive: Архивиране
button_unarchive: Разархивиране button_unarchive: Разархивиране
@@ -562,9 +560,9 @@ bg:
text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него? text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него?
text_workflow_edit: Изберете роля и тракер за да редактирате работния процес text_workflow_edit: Изберете роля и тракер за да редактирате работния процес
text_are_you_sure: Сигурни ли сте? text_are_you_sure: Сигурни ли сте?
text_tip_issue_begin_day: задача започваща този ден text_tip_task_begin_day: задача започваща този ден
text_tip_issue_end_day: задача завършваща този ден text_tip_task_end_day: задача завършваща този ден
text_tip_issue_begin_end_day: задача започваща и завършваща този ден text_tip_task_begin_end_day: задача започваща и завършваща този ден
text_project_identifier_info: 'Позволени са малки букви (a-z), цифри и тирета.<br />Невъзможна промяна след запис.' text_project_identifier_info: 'Позволени са малки букви (a-z), цифри и тирета.<br />Невъзможна промяна след запис.'
text_caracters_maximum: "До {{count}} символа." text_caracters_maximum: "До {{count}} символа."
text_length_between: "От {{min}} до {{max}} символа." text_length_between: "От {{min}} до {{max}} символа."
@@ -582,11 +580,11 @@ bg:
default_role_manager: Мениджър default_role_manager: Мениджър
default_role_developer: Разработчик default_role_developer: Разработчик
default_role_reporter: Публикуващ default_role_reporter: Публикуващ
default_tracker_bug: Бъг default_tracker_bug: Грешка
default_tracker_feature: Функционалност default_tracker_feature: Функционалност
default_tracker_support: Поддръжка default_tracker_support: Поддръжка
default_issue_status_new: Нова default_issue_status_new: Нова
default_issue_status_in_progress: In Progress default_issue_status_in_progress: Изпълнение
default_issue_status_resolved: Приключена default_issue_status_resolved: Приключена
default_issue_status_feedback: Обратна връзка default_issue_status_feedback: Обратна връзка
default_issue_status_closed: Затворена default_issue_status_closed: Затворена
@@ -622,6 +620,7 @@ bg:
text_user_mail_option: "За неизбраните проекти, ще получавате известия само за наблюдавани дейности или в които участвате (т.е. автор или назначени на мен)." text_user_mail_option: "За неизбраните проекти, ще получавате известия само за наблюдавани дейности или в които участвате (т.е. автор или назначени на мен)."
label_user_mail_option_selected: "За всички събития само в избраните проекти..." label_user_mail_option_selected: "За всички събития само в избраните проекти..."
label_user_mail_option_all: "За всяко събитие в проектите, в които участвам" label_user_mail_option_all: "За всяко събитие в проектите, в които участвам"
label_user_mail_option_none: "Само за наблюдавани или в които участвам (автор или назначени на мен)"
setting_emails_footer: Подтекст за e-mail setting_emails_footer: Подтекст за e-mail
label_float: Дробно label_float: Дробно
button_copy: Копиране button_copy: Копиране
@@ -647,7 +646,7 @@ bg:
label_age: Възраст label_age: Възраст
notice_default_data_loaded: Примерната информацията е успешно заредена. notice_default_data_loaded: Примерната информацията е успешно заредена.
text_load_default_configuration: Зареждане на примерна информация text_load_default_configuration: Зареждане на примерна информация
text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, статуси на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате." text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, състояния на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате."
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: {{value}}" error_can_t_load_default_data: "Грешка при зареждане на примерната информация: {{value}}"
button_update: Обновяване button_update: Обновяване
label_change_properties: Промяна на настройки label_change_properties: Промяна на настройки
@@ -706,212 +705,221 @@ bg:
setting_default_projects_public: Новите проекти са публични по подразбиране setting_default_projects_public: Новите проекти са публични по подразбиране
error_scm_annotate: "Обектът не съществува или не може да бъде анотиран." error_scm_annotate: "Обектът не съществува или не може да бъде анотиран."
label_planning: Планиране label_planning: Планиране
text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted." text_subprojects_destroy_warning: "Неговите подпроекти: {{value}} също ще бъдат изтрити."
label_and_its_subprojects: "{{value}} and its subprojects" label_and_its_subprojects: "{{value}} и неговите подпроекти"
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:" mail_body_reminder: "{{count}} задачи, назначени на вас са с краен срок в следващите {{days}} дни:"
mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days" mail_subject_reminder: "{{count}} задачи с краен срок с следващите {{days}} дни"
text_user_wrote: "{{value}} wrote:" text_user_wrote: "{{value}} написа:"
label_duplicated_by: duplicated by label_duplicated_by: дублирана от
setting_enabled_scm: Enabled SCM setting_enabled_scm: Разрешена SCM
text_enumeration_category_reassign_to: 'Reassign them to this value:' text_enumeration_category_reassign_to: 'Пресвържете ги към тази стойност:'
text_enumeration_destroy_question: "{{count}} objects are assigned to this value." text_enumeration_destroy_question: "{{count}} обекта са свързани с тази стойност."
label_incoming_emails: Incoming emails label_incoming_emails: Входящи e-mail-и
label_generate_key: Generate a key label_generate_key: Генериране на ключ
setting_mail_handler_api_enabled: Enable WS for incoming emails setting_mail_handler_api_enabled: Разрешаване на WS за входящи e-mail-и
setting_mail_handler_api_key: API key setting_mail_handler_api_key: API ключ
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them." text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/email.yml и рестартирайте Redmine, за да ги разрешите."
field_parent_title: Parent page field_parent_title: Родителска страница
label_issue_watchers: Watchers label_issue_watchers: Наблюдатели
setting_commit_logs_encoding: Commit messages encoding setting_commit_logs_encoding: Кодова таблица на съобщенията при поверяване
button_quote: Quote button_quote: Цитат
setting_sequential_project_identifiers: Generate sequential project identifiers setting_sequential_project_identifiers: Генериране на последователни проектни идентификатори
notice_unable_delete_version: Unable to delete version notice_unable_delete_version: Невъзможност за изтриване на версия
label_renamed: renamed label_renamed: преименуван
label_copied: copied label_copied: копиран
setting_plain_text_mail: plain text only (no HTML) setting_plain_text_mail: само чист текст (без HTML)
permission_view_files: View files permission_view_files: Разглеждане на файлове
permission_edit_issues: Edit issues permission_edit_issues: Редактиране на задачи
permission_edit_own_time_entries: Edit own time logs permission_edit_own_time_entries: Редактиране на собствените time logs
permission_manage_public_queries: Manage public queries permission_manage_public_queries: Управление на публичните заявки
permission_add_issues: Add issues permission_add_issues: Добавяне на задачи
permission_log_time: Log spent time permission_log_time: Log spent time
permission_view_changesets: View changesets permission_view_changesets: Разглеждане на changesets
permission_view_time_entries: View spent time permission_view_time_entries: Разглеждане на изразходваното време
permission_manage_versions: Manage versions permission_manage_versions: Управление на версиите
permission_manage_wiki: Manage wiki permission_manage_wiki: Управление на wiki
permission_manage_categories: Manage issue categories permission_manage_categories: Управление на категориите задачи
permission_protect_wiki_pages: Protect wiki pages permission_protect_wiki_pages: Заключване на wiki страници
permission_comment_news: Comment news permission_comment_news: Коментиране на новини
permission_delete_messages: Delete messages permission_delete_messages: Изтриване на съобщения
permission_select_project_modules: Select project modules permission_select_project_modules: Избор на проектни модули
permission_manage_documents: Manage documents permission_manage_documents: Управление на документи
permission_edit_wiki_pages: Edit wiki pages permission_edit_wiki_pages: Редактиране на wiki страници
permission_add_issue_watchers: Add watchers permission_add_issue_watchers: Добавяне на наблюдатели
permission_view_gantt: View gantt chart permission_view_gantt: Разглеждане на мрежов график
permission_move_issues: Move issues permission_move_issues: Преместване на задачи
permission_manage_issue_relations: Manage issue relations permission_manage_issue_relations: Управление на връзките между задачите
permission_delete_wiki_pages: Delete wiki pages permission_delete_wiki_pages: Изтриване на wiki страници
permission_manage_boards: Manage boards permission_manage_boards: Управление на boards
permission_delete_wiki_pages_attachments: Delete attachments permission_delete_wiki_pages_attachments: Изтриване на прикачени файлове
permission_view_wiki_edits: View wiki history permission_view_wiki_edits: Разглеждане на wiki история
permission_add_messages: Post messages permission_add_messages: Публикуване на съобщения
permission_view_messages: View messages permission_view_messages: Разглеждане на съобщения
permission_manage_files: Manage files permission_manage_files: Управление на файлове
permission_edit_issue_notes: Edit notes permission_edit_issue_notes: Редактиране на бележки
permission_manage_news: Manage news permission_manage_news: Управление на новини
permission_view_calendar: View calendrier permission_view_calendar: Разглеждане на календари
permission_manage_members: Manage members permission_manage_members: Управление на членовете (на екип)
permission_edit_messages: Edit messages permission_edit_messages: Редактиране на съобщения
permission_delete_issues: Delete issues permission_delete_issues: Изтриване на задачи
permission_view_issue_watchers: View watchers list permission_view_issue_watchers: Разглеждане на списък с наблюдатели
permission_manage_repository: Manage repository permission_manage_repository: Управление на хранилища
permission_commit_access: Commit access permission_commit_access: Поверяване
permission_browse_repository: Browse repository permission_browse_repository: Разглеждане на хранилища
permission_view_documents: View documents permission_view_documents: Разглеждане на документи
permission_edit_project: Edit project permission_edit_project: Редактиране на проект
permission_add_issue_notes: Add notes permission_add_issue_notes: Добаване на бележки
permission_save_queries: Save queries permission_save_queries: Запис на запитвания (queries)
permission_view_wiki_pages: View wiki permission_view_wiki_pages: Разглеждане на wiki
permission_rename_wiki_pages: Rename wiki pages permission_rename_wiki_pages: Преименуване на wiki страници
permission_edit_time_entries: Edit time logs permission_edit_time_entries: Редактиране на time logs
permission_edit_own_issue_notes: Edit own notes permission_edit_own_issue_notes: Редактиране на собствени бележки
setting_gravatar_enabled: Use Gravatar user icons setting_gravatar_enabled: Използване на портребителски икони от Gravatar
label_example: Example label_example: Пример
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
permission_edit_own_messages: Edit own messages permission_edit_own_messages: Редактиране на собствени съобщения
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Изтриване на собствени съобщения
label_user_activity: "{{value}}'s activity" label_user_activity: "Активност на {{value}}"
label_updated_time_by: "Updated by {{author}} {{age}} ago" label_updated_time_by: "Обновена от {{author}} преди {{age}}"
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' text_diff_truncated: '... Този diff не е пълен, понеже е надхвърля максималния размер, който може да бъде показан.'
setting_diff_max_lines_displayed: Max number of diff lines displayed setting_diff_max_lines_displayed: Максимален брой показани diff редове
text_plugin_assets_writable: Plugin assets directory writable text_plugin_assets_writable: Папката на приставките е разрешена за запис
warning_attachments_not_saved: "{{count}} file(s) could not be saved." warning_attachments_not_saved: "{{count}} файла не бяха записани."
button_create_and_continue: Create and continue button_create_and_continue: Създаване и продължаване
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'Една стойност на ред'
label_display: Display label_display: Display
field_editable: Editable field_editable: Editable
setting_repository_log_display_limit: Maximum number of revisions displayed on file log setting_repository_log_display_limit: Максимален брой на показванете ревизии в лог файла
setting_file_max_size_displayed: Max size of text files displayed inline setting_file_max_size_displayed: Максимален размер на текстовите файлове, показвани inline
field_watcher: Watcher field_watcher: Наблюдател
setting_openid: Allow OpenID login and registration setting_openid: Рарешаване на OpenID вход и регистрация
field_identity_url: OpenID URL field_identity_url: OpenID URL
label_login_with_open_id_option: or login with OpenID label_login_with_open_id_option: или вход чрез OpenID
field_content: Content field_content: Съдържание
label_descending: Descending label_descending: Намаляващ
label_sort: Sort label_sort: Сортиране
label_ascending: Ascending label_ascending: Нарастващ
label_date_from_to: From {{start}} to {{end}} label_date_from_to: От {{start}} до {{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: Тази страница има {{descendants}} страници деца и descendant(s). Какво желаете да правите?
text_wiki_page_reassign_children: Reassign child pages to this parent page text_wiki_page_reassign_children: Преназначаване на страниците деца на тази родителска страница
text_wiki_page_nullify_children: Keep child pages as root pages text_wiki_page_nullify_children: Запазване на тези страници като коренни страници
text_wiki_page_destroy_children: Delete child pages and all their descendants text_wiki_page_destroy_children: Изтриване на страниците деца и всички техни descendants
setting_password_min_length: Minimum password length setting_password_min_length: Минимална дължина на парола
field_group_by: Group results by field_group_by: Групиране на резултатите по
mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated" mail_subject_wiki_content_updated: "Wiki страницата '{{id}}' не беше обновена"
label_wiki_content_added: Wiki page added label_wiki_content_added: Wiki страница беше добавена
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added" mail_subject_wiki_content_added: "Wiki страницата '{{id}}' беше добавена"
mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}. mail_body_wiki_content_added: Wiki страницата '{{id}}' беше добавена от {{author}}.
label_wiki_content_updated: Wiki page updated label_wiki_content_updated: Wiki страница беше обновена
mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}. mail_body_wiki_content_updated: Wiki страницата '{{id}}' беше обновена от {{author}}.
permission_add_project: Create project permission_add_project: Създаване на проект
setting_new_project_user_role_id: Role given to a non-admin user who creates a project setting_new_project_user_role_id: Роля, давана на потребител, създаващ проекти, който не е администратор
label_view_all_revisions: View all revisions label_view_all_revisions: Разглеждане на всички ревизии
label_tag: Tag label_tag: Версия
label_branch: Branch label_branch: работен вариант
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings. error_no_tracker_in_project: Няма асоциирани тракери с този проект. Проверете настройките на проекта.
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: Няма установено подразбиращо се състояние за задачите. Моля проверете вашата конфигурация (Вижте "Администрация -> Състояния на задачи").
text_journal_changed: "{{label}} changed from {{old}} to {{new}}" text_journal_changed: "{{label}} променен от {{old}} на {{new}}"
text_journal_set_to: "{{label}} set to {{value}}" text_journal_set_to: "{{label}} установен на {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})" text_journal_deleted: "{{label}} изтрит ({{old}})"
label_group_plural: Groups label_group_plural: Групи
label_group: Group label_group: Група
label_group_new: New group label_group_new: Нова група
label_time_entry_plural: Spent time label_time_entry_plural: Използвано време
text_journal_added: "{{label}} {{value}} added" text_journal_added: "Добавено {{label}} {{value}}"
field_active: Active field_active: Активен
enumeration_system_activity: System Activity enumeration_system_activity: Системна активност
permission_delete_issue_watchers: Delete watchers permission_delete_issue_watchers: Изтриване на наблюдатели
version_status_closed: closed version_status_closed: затворена
version_status_locked: locked version_status_locked: заключена
version_status_open: open version_status_open: отворена
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: Задача, асоциирана със затворена версия не може да бъде отворена отново
label_user_anonymous: Anonymous label_user_anonymous: Анонимен
button_move_and_follow: Move and follow button_move_and_follow: Преместване и продължаване
setting_default_projects_modules: Default enabled modules for new projects setting_default_projects_modules: Активирани модули по подразбиране за нов проект
setting_gravatar_default: Default Gravatar image setting_gravatar_default: Подразбиращо се изображение от Gravatar
field_sharing: Sharing field_sharing: Sharing
label_version_sharing_hierarchy: With project hierarchy label_version_sharing_hierarchy: С проектна йерархия
label_version_sharing_system: With all projects label_version_sharing_system: С всички проекти
label_version_sharing_descendants: With subprojects label_version_sharing_descendants: С подпроекти
label_version_sharing_tree: With project tree label_version_sharing_tree: С дърво на проектите
label_version_sharing_none: Not shared label_version_sharing_none: Не споделен
error_can_not_archive_project: This project can not be archived error_can_not_archive_project: Този проект не може да бъде архивиран
button_duplicate: Duplicate button_duplicate: Дублиране
button_copy_and_follow: Copy and follow button_copy_and_follow: Копиране и продължаване
label_copy_source: Source label_copy_source: Източник
setting_issue_done_ratio: Calculate the issue done ratio with setting_issue_done_ratio: Изчисление на процента на готови задачи с
setting_issue_done_ratio_issue_status: Use the issue status setting_issue_done_ratio_issue_status: Използване на състоянието на задачите
error_issue_done_ratios_not_updated: Issue done ratios not updated. error_issue_done_ratios_not_updated: Процентът на завършените задачи не е обновен.
error_workflow_copy_target: Please select target tracker(s) and role(s) error_workflow_copy_target: Моля изберете тракер(и) и роля (роли).
setting_issue_done_ratio_issue_field: Use the issue field setting_issue_done_ratio_issue_field: Използване на поле 'задача'
label_copy_same_as_target: Same as target label_copy_same_as_target: Също като целта
label_copy_target: Target label_copy_target: Цел
notice_issue_done_ratios_updated: Issue done ratios updated. notice_issue_done_ratios_updated: Обновен процент на завършените задачи.
error_workflow_copy_source: Please select a source tracker or role error_workflow_copy_source: Моля изберете source тракер или роля
label_update_issue_done_ratios: Update issue done ratios label_update_issue_done_ratios: Обновяване на процента на завършените задачи
setting_start_of_week: Start calendars on setting_start_of_week: Първи ден на седмицата
permission_view_issues: View Issues permission_view_issues: Разглеждане на задачите
label_display_used_statuses_only: Only display statuses that are used by this tracker label_display_used_statuses_only: Показване само на състоянията, използвани от този тракер
label_revision_id: Revision {{value}} label_revision_id: Ревизия {{value}}
label_api_access_key: API access key label_api_access_key: API ключ за достъп
label_api_access_key_created_on: API access key created {{value}} ago label_api_access_key_created_on: API ключ за достъп е създаден преди {{value}}
label_feeds_access_key: RSS access key label_feeds_access_key: RSS access ключ
notice_api_access_key_reseted: Your API access key was reset. notice_api_access_key_reseted: Вашият API ключ за достъп беше изчистен.
setting_rest_api_enabled: Enable REST web service setting_rest_api_enabled: Разрешаване на REST web сървис
label_missing_api_access_key: Missing an API access key label_missing_api_access_key: Липсващ API ключ
label_missing_feeds_access_key: Missing a RSS access key label_missing_feeds_access_key: Липсващ RSS ключ за достъп
button_show: Show button_show: Показване
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Позволени са много стойности (по едно на ред).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Отрязване на e-mail-ите след един от тези редове
permission_add_subprojects: Create subprojects permission_add_subprojects: Създаване на подпроекти
label_subproject_new: New subproject label_subproject_new: Нов подпроект
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. Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това на да не можете да редатирате този проект.
Are you sure you want to continue? Сигурен ли сте, че искате да продължите?
label_close_versions: Close completed versions label_close_versions: Затваряне на завършените версии
label_board_sticky: Sticky label_board_sticky: Sticky
label_board_locked: Locked label_board_locked: Заключена
permission_export_wiki_pages: Export wiki pages permission_export_wiki_pages: Експорт на wiki страници
setting_cache_formatted_text: Cache formatted text setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities permission_manage_project_activities: Управление на дейностите на проекта
error_unable_delete_issue_status: Unable to delete issue status error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача
label_profile: Profile label_profile: Профил
permission_manage_subtasks: Manage subtasks permission_manage_subtasks: Управление на подзадачите
field_parent_issue: Parent task field_parent_issue: Родителска задача
label_subtask_plural: Subtasks label_subtask_plural: Подзадачи
label_project_copy_notifications: Send email notifications during the project copy label_project_copy_notifications: Изпращане на Send e-mail известия по време на копирането на проекта
error_can_not_delete_custom_field: Unable to delete custom field error_can_not_delete_custom_field: Невъзможност за изтриване на потребителско поле
error_unable_to_connect: Unable to connect ({{value}}) error_unable_to_connect: Невъзможност за свързване с ({{value}})
error_can_not_remove_role: This role is in use and can not be deleted. error_can_not_remove_role: Тази роля се използва и не може да бъде изтрита.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted. error_can_not_delete_tracker: Този тракер съдържа задачи и не може да бъде изтрит.
field_principal: Principal field_principal: Principal
label_my_page_block: My page block label_my_page_block: Блокове в личната страница
notice_failed_to_save_members: "Failed to save member(s): {{errors}}." notice_failed_to_save_members: "Невъзможност за запис на член(ове): {{errors}}."
text_zoom_out: Zoom out text_zoom_out: Намаляване
text_zoom_in: Zoom in text_zoom_in: Увеличаване
notice_unable_delete_time_entry: Unable to delete time log entry. notice_unable_delete_time_entry: Невъзможност за изтриване на запис на time log.
label_overall_spent_time: Overall spent time label_overall_spent_time: Общо употребено време
field_time_entries: Log time field_time_entries: Log time
project_module_gantt: Gantt notice_not_authorized_archived_project: Проектът, който се опитвате да видите е архивиран.
project_module_calendar: Calendar text_tip_issue_end_day: задача, завършваща този ден
field_member_of_group: Member of Group field_text: Текстово поле
field_assigned_to_role: Member of Role label_user_mail_option_only_owner: Само за неща, на които аз съм собственик
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}" field_member_of_group: Член на група
text_are_you_sure_with_children: Delete issue and all child issues? project_module_gantt: Мрежов график
field_text: Text field text_are_you_sure_with_children: Изтриване на задачата и нейните подзадачи?
label_user_mail_option_only_owner: Only for things I am the owner of text_tip_issue_begin_end_day: задача, започваща и завършваща този ден
setting_default_notification_option: Default notification option setting_default_notification_option: Подразбиращ се начин за известяване
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in project_module_calendar: Календар
label_user_mail_option_only_assigned: Only for things I am assigned to label_user_mail_option_only_my_events: Само за неща, в които съм включен/а
text_tip_issue_begin_day: задача, започваща този ден
label_user_mail_option_only_assigned: Само за неща, назначени на мен
button_edit_associated_wikipage: "Редактиране на асоциираната Wiki страница: {{page_title}}"
field_assigned_to_role: Assignee's role
field_start_date: Начална дата
label_principal_search: "Търсене на потребител или група:"
label_user_search: "Търсене на потребител:"
field_visible: Видим
setting_emails_header: Emails header
+5 -5
View File
@@ -252,7 +252,6 @@ bs:
field_attr_lastname: Atribut za prezime field_attr_lastname: Atribut za prezime
field_attr_mail: Atribut za email field_attr_mail: Atribut za email
field_onthefly: 'Kreiranje korisnika "On-the-fly"' field_onthefly: 'Kreiranje korisnika "On-the-fly"'
field_start_date: Početak
field_done_ratio: % Realizovano field_done_ratio: % Realizovano
field_auth_source: Mod za authentifikaciju field_auth_source: Mod za authentifikaciju
field_hide_mail: Sakrij moju email adresu field_hide_mail: Sakrij moju email adresu
@@ -676,6 +675,7 @@ bs:
label_search_titles_only: Pretraži samo naslove label_search_titles_only: Pretraži samo naslove
label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima" label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima"
label_user_mail_option_selected: "Za bilo koji događaj na odabranim projektima..." label_user_mail_option_selected: "Za bilo koji događaj na odabranim projektima..."
label_user_mail_option_none: "Samo za stvari koje ja gledam ili sam u njih uključen"
label_user_mail_no_self_notified: "Ne želim notifikaciju za promjene koje sam ja napravio" label_user_mail_no_self_notified: "Ne želim notifikaciju za promjene koje sam ja napravio"
label_registration_activation_by_email: aktivacija korisničkog računa email-om label_registration_activation_by_email: aktivacija korisničkog računa email-om
label_registration_manual_activation: ručna aktivacija korisničkog računa label_registration_manual_activation: ručna aktivacija korisničkog računa
@@ -931,7 +931,7 @@ bs:
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option field_start_date: Start date
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in label_principal_search: "Search for user or group:"
label_user_mail_option_only_assigned: Only for things I am assigned to label_user_search: "Search for user:"
+5 -6
View File
@@ -264,7 +264,6 @@ ca:
field_attr_lastname: Atribut del cognom field_attr_lastname: Atribut del cognom
field_attr_mail: Atribut del correu electrònic field_attr_mail: Atribut del correu electrònic
field_onthefly: "Creació de l'usuari «al vol»" field_onthefly: "Creació de l'usuari «al vol»"
field_start_date: Inici
field_done_ratio: % realitzat field_done_ratio: % realitzat
field_auth_source: "Mode d'autenticació" field_auth_source: "Mode d'autenticació"
field_hide_mail: "Oculta l'adreça de correu electrònic" field_hide_mail: "Oculta l'adreça de correu electrònic"
@@ -725,6 +724,7 @@ ca:
label_search_titles_only: Cerca només en els títols label_search_titles_only: Cerca només en els títols
label_user_mail_option_all: "Per qualsevol esdeveniment en tots els meus projectes" label_user_mail_option_all: "Per qualsevol esdeveniment en tots els meus projectes"
label_user_mail_option_selected: "Per qualsevol esdeveniment en els projectes seleccionats..." label_user_mail_option_selected: "Per qualsevol esdeveniment en els projectes seleccionats..."
label_user_mail_option_none: "Només per les coses que vigilo o hi estic implicat"
label_user_mail_no_self_notified: "No vull ser notificat pels canvis que faig jo mateix" label_user_mail_no_self_notified: "No vull ser notificat pels canvis que faig jo mateix"
label_registration_activation_by_email: activació del compte per correu electrònic label_registration_activation_by_email: activació del compte per correu electrònic
label_registration_manual_activation: activació del compte manual label_registration_manual_activation: activació del compte manual
@@ -914,13 +914,12 @@ ca:
enumeration_doc_categories: Categories del document enumeration_doc_categories: Categories del document
enumeration_activities: Activitats (seguidor de temps) enumeration_activities: Activitats (seguidor de temps)
enumeration_system_activity: Activitat del sistema enumeration_system_activity: Activitat del sistema
field_member_of_group: Member of Group field_member_of_group: Member of Group
field_assigned_to_role: Member of Role field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}" button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option field_start_date: Start date
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in label_principal_search: "Search for user or group:"
label_user_mail_option_only_assigned: Only for things I am assigned to label_user_search: "Search for user:"
+4 -5
View File
@@ -237,7 +237,6 @@ cs:
field_attr_lastname: Příjemní (atribut) field_attr_lastname: Příjemní (atribut)
field_attr_mail: Email (atribut) field_attr_mail: Email (atribut)
field_onthefly: Automatické vytváření uživatelů field_onthefly: Automatické vytváření uživatelů
field_start_date: Začátek
field_done_ratio: % Hotovo field_done_ratio: % Hotovo
field_auth_source: Autentifikační mód field_auth_source: Autentifikační mód
field_hide_mail: Nezobrazovat můj email field_hide_mail: Nezobrazovat můj email
@@ -587,6 +586,7 @@ cs:
label_search_titles_only: Vyhledávat pouze v názvech label_search_titles_only: Vyhledávat pouze v názvech
label_user_mail_option_all: "Pro všechny události všech mých projektů" label_user_mail_option_all: "Pro všechny události všech mých projektů"
label_user_mail_option_selected: "Pro všechny události vybraných projektů..." label_user_mail_option_selected: "Pro všechny události vybraných projektů..."
label_user_mail_option_none: "Pouze pro události které sleduji nebo které se mne týkají"
label_user_mail_no_self_notified: "Nezasílat informace o mnou vytvořených změnách" label_user_mail_no_self_notified: "Nezasílat informace o mnou vytvořených změnách"
label_registration_activation_by_email: aktivace účtu emailem label_registration_activation_by_email: aktivace účtu emailem
label_registration_manual_activation: manuální aktivace účtu label_registration_manual_activation: manuální aktivace účtu
@@ -917,7 +917,6 @@ cs:
button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: {{page_title}}" 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ů? text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
field_text: Textové pole field_text: Textové pole
label_user_mail_option_only_owner: Only for things I am the owner of field_start_date: Start date
setting_default_notification_option: Default notification option label_principal_search: "Search for user or group:"
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in label_user_search: "Search for user:"
label_user_mail_option_only_assigned: Only for things I am assigned to
+29 -29
View File
@@ -250,7 +250,6 @@ da:
field_attr_lastname: Efternavn attribut field_attr_lastname: Efternavn attribut
field_attr_mail: Email attribut field_attr_mail: Email attribut
field_onthefly: løbende brugeroprettelse field_onthefly: løbende brugeroprettelse
field_start_date: Start
field_done_ratio: % Færdig field_done_ratio: % Færdig
field_auth_source: Sikkerhedsmetode field_auth_source: Sikkerhedsmetode
field_hide_mail: Skjul min email field_hide_mail: Skjul min email
@@ -371,7 +370,7 @@ da:
label_reported_issues: Rapporterede sager label_reported_issues: Rapporterede sager
label_assigned_to_me_issues: Sager tildelt mig label_assigned_to_me_issues: Sager tildelt mig
label_last_login: Sidste login tidspunkt label_last_login: Sidste login tidspunkt
label_registered_on: Registeret den label_registered_on: Registreret den
label_activity: Aktivitet label_activity: Aktivitet
label_new: Ny label_new: Ny
label_logged_as: Registreret som label_logged_as: Registreret som
@@ -442,7 +441,7 @@ da:
label_none: intet label_none: intet
label_nobody: ingen label_nobody: ingen
label_next: Næste label_next: Næste
label_previous: Forrig label_previous: Forrige
label_used_by: Brugt af label_used_by: Brugt af
label_details: Detaljer label_details: Detaljer
label_add_note: Tilføj note label_add_note: Tilføj note
@@ -538,7 +537,7 @@ da:
label_view_diff: Vis forskelle label_view_diff: Vis forskelle
label_diff_inline: inline label_diff_inline: inline
label_diff_side_by_side: side om side label_diff_side_by_side: side om side
label_options: Optioner label_options: Formatering
label_copy_workflow_from: Kopier arbejdsgang fra label_copy_workflow_from: Kopier arbejdsgang fra
label_permissions_report: Godkendelsesrapport label_permissions_report: Godkendelsesrapport
label_watched_issues: Overvågede sager label_watched_issues: Overvågede sager
@@ -548,7 +547,7 @@ da:
label_relation_new: Ny relation label_relation_new: Ny relation
label_relation_delete: Slet relation label_relation_delete: Slet relation
label_relates_to: relaterer til label_relates_to: relaterer til
label_duplicates: kopierer label_duplicates: duplikater
label_blocks: blokerer label_blocks: blokerer
label_blocked_by: blokeret af label_blocked_by: blokeret af
label_precedes: kommer før label_precedes: kommer før
@@ -594,6 +593,7 @@ da:
label_search_titles_only: Søg kun i titler label_search_titles_only: Søg kun i titler
label_user_mail_option_all: "For alle hændelser på mine projekter" label_user_mail_option_all: "For alle hændelser på mine projekter"
label_user_mail_option_selected: "For alle hændelser på de valgte projekter..." label_user_mail_option_selected: "For alle hændelser på de valgte projekter..."
label_user_mail_option_none: "Kun for ting jeg overvåger eller jeg er involveret i"
label_user_mail_no_self_notified: "Jeg ønsker ikke besked om ændring foretaget af mig selv" label_user_mail_no_self_notified: "Jeg ønsker ikke besked om ændring foretaget af mig selv"
label_registration_activation_by_email: kontoaktivering på email label_registration_activation_by_email: kontoaktivering på email
label_registration_manual_activation: manuel kontoaktivering label_registration_manual_activation: manuel kontoaktivering
@@ -870,8 +870,8 @@ da:
label_version_sharing_tree: Med projekt træ label_version_sharing_tree: Med projekt træ
label_version_sharing_none: Ikke delt label_version_sharing_none: Ikke delt
error_can_not_archive_project: Dette projekt kan ikke arkiveres error_can_not_archive_project: Dette projekt kan ikke arkiveres
button_duplicate: Kopier button_duplicate: Duplikér
button_copy_and_follow: Kopier og overvåg button_copy_and_follow: Kopiér og overvåg
label_copy_source: Kilde label_copy_source: Kilde
setting_issue_done_ratio: Beregn sagsløsning ratio setting_issue_done_ratio: Beregn sagsløsning ratio
setting_issue_done_ratio_issue_status: Benyt sags status setting_issue_done_ratio_issue_status: Benyt sags status
@@ -896,14 +896,14 @@ da:
label_missing_feeds_access_key: Mangler en RSS nøgle label_missing_feeds_access_key: Mangler en RSS nøgle
button_show: Vis button_show: Vis
text_line_separated: Flere væredier tilladt (en linje for hver værdi). text_line_separated: Flere væredier tilladt (en linje for hver værdi).
setting_mail_handler_body_delimiters: Trunker emails efter en af disse linjer setting_mail_handler_body_delimiters: Trunkér emails efter en af disse linjer
permission_add_subprojects: Lav underprojekter permission_add_subprojects: Lav underprojekter
label_subproject_new: Nyt underprojekt label_subproject_new: Nyt underprojekt
text_own_membership_delete_confirmation: |- text_own_membership_delete_confirmation: |-
Du er ved at fjerne en eller flere af dine rettigheder, og kan muligvis ikke redigere projektet bagefter. Du er ved at fjerne en eller flere af dine rettigheder, og kan muligvis ikke redigere projektet bagefter.
Er du sikker på du ønsker at fortsætte? Er du sikker på du ønsker at fortsætte?
label_close_versions: Luk færdige versioner label_close_versions: Luk færdige versioner
label_board_sticky: Sticky label_board_sticky: Klistret
label_board_locked: Låst label_board_locked: Låst
permission_export_wiki_pages: Eksporter wiki sider permission_export_wiki_pages: Eksporter wiki sider
setting_cache_formatted_text: Cache formatteret tekst setting_cache_formatted_text: Cache formatteret tekst
@@ -914,26 +914,26 @@ da:
field_parent_issue: Hoved opgave field_parent_issue: Hoved opgave
label_subtask_plural: Under opgaver label_subtask_plural: Under opgaver
label_project_copy_notifications: Send email notifikationer, mens projektet kopieres label_project_copy_notifications: Send email notifikationer, mens projektet kopieres
error_can_not_delete_custom_field: Unable to delete custom field error_can_not_delete_custom_field: Kan ikke slette brugerdefineret felt
error_unable_to_connect: Unable to connect ({{value}}) error_unable_to_connect: Kan ikke forbinde ({{value}})
error_can_not_remove_role: This role is in use and can not be deleted. error_can_not_remove_role: Denne rolle er i brug og kan ikke slettes.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted. error_can_not_delete_tracker: Denne type indeholder sager og kan ikke slettes.
field_principal: Principal field_principal: Principal
label_my_page_block: My page block label_my_page_block: blok
notice_failed_to_save_members: "Failed to save member(s): {{errors}}." notice_failed_to_save_members: "Fejl under lagring af medlem(mer): {{errors}}."
text_zoom_out: Zoom out text_zoom_out: Zoom ud
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: Kan ikke slette tidsregistrering.
label_overall_spent_time: Overall spent time label_overall_spent_time: Overordnet forbrug af tid
field_time_entries: Log time field_time_entries: Log tid
project_module_gantt: Gantt project_module_gantt: Gantt
project_module_calendar: Calendar project_module_calendar: Kalender
field_member_of_group: Member of Group field_member_of_group: Medlem af Gruppe
field_assigned_to_role: Member of Role field_assigned_to_role: Medlem af Rolle
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}" button_edit_associated_wikipage: "Redigér tilknyttet Wiki side: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Slet sag og alle undersager?
field_text: Text field field_text: Tekstfelt
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option field_start_date: Start date
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in label_principal_search: "Search for user or group:"
label_user_mail_option_only_assigned: Only for things I am assigned to label_user_search: "Search for user:"
+11 -6
View File
@@ -280,7 +280,6 @@ de:
field_attr_lastname: Name-Attribut field_attr_lastname: Name-Attribut
field_attr_mail: E-Mail-Attribut field_attr_mail: E-Mail-Attribut
field_onthefly: On-the-fly-Benutzererstellung field_onthefly: On-the-fly-Benutzererstellung
field_start_date: Beginn
field_done_ratio: % erledigt field_done_ratio: % erledigt
field_auth_source: Authentifizierungs-Modus field_auth_source: Authentifizierungs-Modus
field_hide_mail: E-Mail-Adresse nicht anzeigen field_hide_mail: E-Mail-Adresse nicht anzeigen
@@ -741,6 +740,7 @@ de:
label_search_titles_only: Nur Titel durchsuchen label_search_titles_only: Nur Titel durchsuchen
label_user_mail_option_all: "Für alle Ereignisse in all meinen Projekten" label_user_mail_option_all: "Für alle Ereignisse in all meinen Projekten"
label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten..." label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten..."
label_user_mail_option_none: "Nur für Dinge, die ich beobachte oder an denen ich beteiligt bin"
label_user_mail_no_self_notified: "Ich möchte nicht über Änderungen benachrichtigt werden, die ich selbst durchführe." label_user_mail_no_self_notified: "Ich möchte nicht über Änderungen benachrichtigt werden, die ich selbst durchführe."
label_registration_activation_by_email: Kontoaktivierung durch E-Mail label_registration_activation_by_email: Kontoaktivierung durch E-Mail
label_registration_manual_activation: Manuelle Kontoaktivierung label_registration_manual_activation: Manuelle Kontoaktivierung
@@ -791,6 +791,8 @@ de:
label_profile: Profil label_profile: Profil
label_subtask_plural: Unteraufgaben label_subtask_plural: Unteraufgaben
label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des Projekts. label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des Projekts.
label_principal_search: "Nach Benutzer oder Gruppe suchen:"
label_user_search: "Nach Benutzer suchen:"
button_login: Anmelden button_login: Anmelden
button_submit: OK button_submit: OK
@@ -802,7 +804,6 @@ de:
button_create_and_continue: Anlegen und weiter button_create_and_continue: Anlegen und weiter
button_test: Testen button_test: Testen
button_edit: Bearbeiten button_edit: Bearbeiten
button_edit_associated_wikipage: "Zugehörige Wikiseite bearbeiten: {{page_title}}"
button_add: Hinzufügen button_add: Hinzufügen
button_change: Wechseln button_change: Wechseln
button_apply: Anwenden button_apply: Anwenden
@@ -831,7 +832,7 @@ de:
button_copy: Kopieren button_copy: Kopieren
button_copy_and_follow: Kopieren und Ticket anzeigen button_copy_and_follow: Kopieren und Ticket anzeigen
button_annotate: Annotieren button_annotate: Annotieren
button_update: Aktualisieren button_update: Bearbeiten
button_configure: Konfigurieren button_configure: Konfigurieren
button_quote: Zitieren button_quote: Zitieren
button_duplicate: Duplizieren button_duplicate: Duplizieren
@@ -936,7 +937,11 @@ de:
field_assigned_to_role: Member of Role field_assigned_to_role: Member of Role
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option setting_default_notification_option: Default notification option
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in notice_not_authorized_archived_project: The project you're trying to access has been archived.
label_user_mail_option_only_assigned: Only for things I am assigned to label_user_mail_option_none: "Only for things I watch or I'm involved in"
field_member_of_group: Assignee's group
field_assigned_to_role: Assignee's role
field_start_date: Start date
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"

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