Compare commits

..

242 Commits

Author SHA1 Message Date
Jean-Philippe Lang 264274212c Merged r4965 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4967 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:14:54 +00:00
Jean-Philippe Lang 0949faa787 Merged r4577 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4905 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-21 11:13:37 +00:00
Jean-Philippe Lang aba0dc0371 Updates for 1.0.5 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4569 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 10:04:53 +00:00
Jean-Philippe Lang 902d765ab7 Merged r4553 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4565 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 10:00:35 +00:00
Jean-Philippe Lang c6852b7af2 Merged r4469 from trunk
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4564 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 09:59:36 +00:00
Jean-Philippe Lang 0bff40c1e1 Merged r4467 from trunk
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4563 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 09:58:18 +00:00
Jean-Philippe Lang 40ca445071 Merged r4561 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4562 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 09:57:02 +00:00
Jean-Philippe Lang f9bd713e3e Removed 1.1 specific translations that were unsafely merged in 1.0 (#7162).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4557 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-22 21:05:13 +00:00
Jean-Philippe Lang ba99936295 Restores non english field_start_date translations (#6629, #7016).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4555 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-22 20:48:23 +00:00
Jean-Philippe Lang 63c4fb5b97 Merged r4541 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4543 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 18:42:00 +00:00
Jean-Philippe Lang c02ecdd096 Merged r4539 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4540 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 18:14:30 +00:00
Jean-Philippe Lang cb30fa49fc Merged r4468 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4538 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 17:22:43 +00:00
Jean-Philippe Lang f4ada319d1 Merged r4535 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4536 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 17:13:13 +00:00
Jean-Philippe Lang fdaf587652 Merged r4516 from trunk (i18n 0.4.2 gem is now required: 'gem install -v=0.4.2 i18n', see #7013).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4532 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 13:53:34 +00:00
Jean-Philippe Lang 142b837271 Backported r4530 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4531 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 13:42:50 +00:00
Jean-Philippe Lang bd8e8bc71b Fixed: error when sending notification on wiki edit for bg, es, zh-TW locales (#7024).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4478 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-07 22:05:20 +00:00
Jean-Philippe Lang a67f06910b Merged r4449 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.0-stable@4450 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-29 19:34:56 +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
231 changed files with 6762 additions and 9008 deletions
+7 -17
View File
@@ -153,7 +153,7 @@ class ApplicationController < ActionController::Base
# Authorize the user for the requested action
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
end
@@ -169,13 +169,6 @@ class ApplicationController < ActionController::Base
render_404
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]
# TODO: some subclasses override this, see about merging their logic
def find_optional_project
@@ -213,19 +206,16 @@ class ApplicationController < ActionController::Base
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
@projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1
rescue ActiveRecord::RecordNotFound
render_404
end
# Check if project is unique before bulk operations
def check_project_uniqueness
unless @project
projects = @issues.collect(&:project).compact.uniq
if projects.size == 1
@project = projects.first
else
# TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects'
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
# make sure that the user is a member of the project (or admin) if project is private
+1 -4
View File
@@ -34,11 +34,8 @@ class CalendarsController < ApplicationController
@calendar.events = events
end
render :action => 'show', :layout => false if request.xhr?
render :layout => false if request.xhr?
end
def update
show
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
@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)),
: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)),
: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
@assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@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
@priorities = IssuePriority.all.reverse
+13 -12
View File
@@ -1,7 +1,7 @@
class FilesController < ApplicationController
menu_item :files
before_filter :find_project_by_project_id
before_filter :find_project
before_filter :authorize
helper :sort
@@ -19,18 +19,19 @@ class FilesController < ApplicationController
render :layout => !request.xhr?
end
# TODO: split method into new (GET) and create (POST)
def new
if request.post?
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = Attachment.attach_files(container, params[:attachments])
render_attachment_warning_if_needed(container)
if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments[:files])
end
redirect_to :controller => 'files', :action => 'index', :id => @project
return
end
@versions = @project.versions.sort
end
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
+19 -9
View File
@@ -4,7 +4,6 @@ class GanttsController < ApplicationController
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
helper :gantt
helper :issues
helper :projects
helper :queries
@@ -15,22 +14,33 @@ class GanttsController < ApplicationController
def show
@gantt = Redmine::Helpers::Gantt.new(params)
@gantt.project = @project
retrieve_query
@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'
respond_to do |format|
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.pdf { send_data(@gantt.to_pdf, :type => 'application/pdf', :filename => "#{basename}.pdf") }
format.png { send_data(@gantt.to_image(@project), :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") }
end
end
def update
show
end
end
+5 -2
View File
@@ -1,6 +1,6 @@
class IssueMovesController < ApplicationController
default_search_scope :issues
before_filter :find_issues, :check_project_uniqueness
before_filter :find_issues
before_filter :authorize
def new
@@ -18,6 +18,7 @@ class IssueMovesController < ApplicationController
@issues.each do |issue|
issue.reload
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 })
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)})
moved_issues << r
@@ -50,11 +51,13 @@ class IssueMovesController < ApplicationController
@target_project ||= @project
@trackers = @target_project.trackers
@available_statuses = Workflow.available_statuses(@project)
@notes = params[:notes]
@notes ||= ''
end
def extract_changed_attributes_for_move(params)
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?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
+5 -9
View File
@@ -21,13 +21,12 @@ class IssuesController < ApplicationController
before_filter :find_issue, :only => [:show, :edit, :update]
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 :authorize, :except => [:index]
before_filter :find_optional_project, :only => [:index]
before_filter :check_for_default_issue_status, :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
@@ -48,7 +47,6 @@ class IssuesController < ApplicationController
include SortHelper
include IssuesHelper
helper :timelog
helper :gantt
include Redmine::Export::PDF
verify :method => [:post, :delete],
@@ -194,10 +192,8 @@ class IssuesController < ApplicationController
# Bulk edit a set of issues
def bulk_edit
@issues.sort!
@available_statuses = @projects.map{|p|Workflow.available_statuses(p)}.inject{|memo,w|memo & w}
@custom_fields = @projects.map{|p|p.all_issue_custom_fields}.inject{|memo,c|memo & c}
@assignables = @projects.map(&:assignable_users).inject{|memo,a| memo & a}
@trackers = @projects.map(&:trackers).inject{|memo,t| memo & t}
@available_statuses = Workflow.available_statuses(@project)
@custom_fields = @project.all_issue_custom_fields
end
def bulk_update
@@ -244,7 +240,7 @@ class IssuesController < ApplicationController
end
@issues.each(&:destroy)
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.json { head :ok }
end
@@ -304,6 +300,7 @@ private
render_error l(:error_no_tracker_in_project)
return false
end
@issue.start_date ||= Date.today
if params[:issue].is_a?(Hash)
@issue.safe_attributes = params[:issue]
if User.current.allowed_to?(:add_issue_watchers, @project) && @issue.new_record?
@@ -311,7 +308,6 @@ private
end
end
@issue.author = User.current
@issue.start_date ||= Date.today
@priorities = IssuePriority.all
@allowed_statuses = @issue.new_statuses_allowed_to(User.current, true)
end
+1
View File
@@ -19,6 +19,7 @@ class JournalsController < ApplicationController
before_filter :find_journal, :only => [:edit]
before_filter :find_issue, :only => [:new]
before_filter :find_optional_project, :only => [:index]
before_filter :authorize, :only => [:new, :edit]
accept_key_auth :index
helper :issues
+7 -3
View File
@@ -54,7 +54,7 @@ class MyController < ApplicationController
@pref = @user.pref
if request.post?
@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[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save
@@ -66,8 +66,12 @@ class MyController < ApplicationController
return
end
end
@notification_options = @user.valid_notification_options
@notification_option = @user.mail_notification #? ? 'all' : (@user.notified_projects_ids.empty? ? 'none' : 'selected')
@notification_options = [[l(:label_user_mail_option_all), 'all'],
[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
# Manage user's password
+28 -17
View File
@@ -18,10 +18,10 @@
class NewsController < ApplicationController
default_search_scope :news
model_object News
before_filter :find_model_object, :except => [:new, :create, :index]
before_filter :find_project_from_association, :except => [:new, :create, :index]
before_filter :find_project, :only => [:new, :create]
before_filter :authorize, :except => [:index]
before_filter :find_model_object, :except => [:new, :index, :preview]
before_filter :find_project_from_association, :except => [:new, :index, :preview]
before_filter :find_project, :only => [:new, :preview]
before_filter :authorize, :except => [:index, :preview]
before_filter :find_optional_project, :only => :index
accept_key_auth :index
@@ -46,38 +46,49 @@ class NewsController < ApplicationController
def new
@news = News.new(:project => @project, :author => User.current)
end
def create
@news = News.new(:project => @project, :author => User.current)
if request.post?
@news.attributes = params[:news]
if @news.save
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'news', :action => 'index', :project_id => @project
else
render :action => 'new'
end
end
end
def edit
end
def update
if request.put? and @news.update_attributes(params[:news])
def edit
if request.post? and @news.update_attributes(params[:news])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'show', :id => @news
else
render :action => 'edit'
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
@news.destroy
redirect_to :action => 'index', :project_id => @project
end
def preview
@text = (params[:news] ? params[:news][:description] : nil)
render :partial => 'common/preview'
end
private
def find_project
@project = Project.find(params[:project_id])
-5
View File
@@ -16,11 +16,6 @@ class PreviewsController < ApplicationController
render :layout => false
end
def news
@text = (params[:news] ? params[:news][:description] : nil)
render :partial => 'common/preview'
end
private
def find_project
@@ -1,9 +1,9 @@
class ProjectEnumerationsController < ApplicationController
before_filter :find_project_by_project_id
before_filter :find_project
before_filter :authorize
def update
if request.put? && params[:enumerations]
def save
if request.post? && params[:enumerations]
Project.transaction do
params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity)
+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_global, :only => [:new, :create]
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|
if controller.request.post?
@@ -93,7 +93,7 @@ class ProjectsController < ApplicationController
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project
}
format.xml { head :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
end
else
respond_to do |format|
+1 -1
View File
@@ -26,7 +26,7 @@ class SettingsController < ApplicationController
end
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)
settings = (params[:settings] || {}).dup.symbolize_keys
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
menu_item :issues
before_filter :find_project, :authorize, :only => [:new, :create, :edit, :update, :destroy]
before_filter :find_optional_project, :only => [:index]
before_filter :find_project, :authorize, :only => [:edit, :destroy]
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
include SortHelper
helper :issues
@@ -27,7 +30,83 @@ class TimelogController < ApplicationController
helper :custom_fields
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_update 'spent_on' => 'spent_on',
'user' => 'user_id',
@@ -83,53 +162,21 @@ class TimelogController < ApplicationController
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
(render_403; return) if @time_entry && !@time_entry.editable_by?(User.current)
@time_entry.attributes = params[:time_entry]
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 ||= 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
if request.post? and @time_entry.save
flash[:notice] = l(:notice_successful_update)
redirect_back_or_default :action => 'index', :project_id => @time_entry.project
else
render :action => 'edit'
redirect_back_or_default :action => 'details', :project_id => @time_entry.project
return
end
end
verify :method => :delete, :only => :destroy, :render => {:nothing => true, :status => :method_not_allowed }
def destroy
(render_404; return) unless @time_entry
(render_403; return) unless @time_entry.editable_by?(User.current)
@@ -140,7 +187,7 @@ class TimelogController < ApplicationController
end
redirect_to :back
rescue ::ActionController::RedirectBackError
redirect_to :action => 'index', :project_id => @time_entry.project
redirect_to :action => 'details', :project_id => @time_entry.project
end
private
@@ -217,4 +264,61 @@ private
@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"
call_hook(:controller_timelog_time_report_joins, {:sql => sql} )
sql
end
end
+36 -79
View File
@@ -71,96 +71,53 @@ class UsersController < ApplicationController
render_404
end
def new
@notification_options = User::MAIL_NOTIFICATION_OPTIONS
@notification_option = Setting.default_notification_option
@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
def add
if request.get?
@user = User.new(:language => Setting.default_language)
else
@auth_sources = AuthSource.find(:all)
@notification_option = @user.mail_notification
render :action => 'new'
@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
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
@auth_sources = AuthSource.find(:all)
end
def edit
@user = User.find(params[:id])
@notification_options = @user.valid_notification_options
@notification_option = @user.mail_notification
if request.post?
@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)
@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
redirect_to :controller => 'users', :action => 'edit', :id => @user
end
def edit_membership
@user = User.find(params[:id])
@membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
+6 -2
View File
@@ -103,18 +103,22 @@ class VersionsController < ApplicationController
end
def update
if request.put? && params[:version]
if request.post? && params[:version]
attributes = params[:version].dup
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
if @version.update_attributes(attributes)
flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
else
respond_to do |format|
format.html { render :action => 'edit' }
end
end
end
end
def close_completed
if request.put?
if request.post?
@project.close_completed_versions
end
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_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
include AttachmentsHelper
helper :watchers
# display a page (in editing mode if it doesn't exist)
def show
def index
page_title = params[:page]
@page = @wiki.find_or_new_page(page_title)
if @page.new_record?
@@ -71,48 +71,34 @@ class WikiController < ApplicationController
@content.text = initial_page_content(@page) if @content.text.blank?
# don't keep previous comment
@content.comments = nil
# To prevent StaleObjectError exception when reverting to a previous version
@content.version = @page.content.version
if request.get?
# To prevent StaleObjectError exception when reverting to a previous 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
# Optimistic locking exception
flash[:error] = l(:notice_locking_conflict)
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
def rename
return render_403 unless editable?
@@ -121,13 +107,13 @@ class WikiController < ApplicationController
@original_title = @page.pretty_title
if request.post? && @page.update_attributes(params[:wiki_page])
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
def protect
@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
# show page history
@@ -180,26 +166,37 @@ class WikiController < ApplicationController
end
end
@page.destroy
redirect_to :action => 'page_index', :project_id => @project
redirect_to :action => 'special', :id => @project, :page => 'Page_index'
end
# Export wiki to a single html file
def 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")
# display special pages
def special
page_title = params[:page].downcase
case page_title
# show pages index, sorted by title
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
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
def page_index
load_pages_grouped_by_date_without_content
end
def date_index
load_pages_grouped_by_date_without_content
render :action => "special_#{page_title}"
end
def preview
@@ -218,13 +215,13 @@ class WikiController < ApplicationController
return render_403 unless editable?
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
redirect_to :action => 'show', :page => @page.title
redirect_to :action => 'index', :page => @page.title
end
private
def find_wiki
@project = Project.find(params[:project_id])
@project = Project.find(params[:id])
@wiki = @project.wiki
render_404 unless @wiki
rescue ActiveRecord::RecordNotFound
@@ -248,14 +245,4 @@ private
extend helper unless self.instance_of?(helper)
helper.instance_method(:initial_page_content).bind(self).call(page)
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
+2 -4
View File
@@ -177,7 +177,7 @@ module ApplicationHelper
content << "<ul class=\"pages-hierarchy\">\n"
pages[node].each do |page|
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))
content << "\n" + render_page_hierarchy(pages, page.id) if pages[page.id]
content << "</li>\n"
@@ -546,7 +546,7 @@ module ApplicationHelper
when :local; "#{title}.html"
when :anchor; "##{title}" # used for single-file wiki export
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
link_to((title || page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new')))
else
@@ -818,8 +818,6 @@ module ApplicationHelper
email = $1
end
return gravatar(email.to_s.downcase, options) unless email.blank? rescue nil
else
''
end
end
+9 -16
View File
@@ -1,5 +1,5 @@
module CalendarsHelper
def link_to_previous_month(year, month, options={})
def link_to_previous_month(year, month)
target_year, target_month = if month == 1
[year - 1, 12]
else
@@ -11,11 +11,13 @@ module CalendarsHelper
else
"#{month_name(target_month)}"
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
def link_to_next_month(year, month, options={})
def link_to_next_month(year, month)
target_year, target_month = if month == 12
[year + 1, 1]
else
@@ -28,18 +30,9 @@ module CalendarsHelper
"#{month_name(target_month)}"
end
link_to_month((name + ' &#187;'), target_year, target_month, options)
end
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})
link_to_remote (name + ' &#187;'),
{:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month =>target_month)}
end
end
-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_assigned_to ||= l(:field_assigned_to)
@cached_label_priority ||= l(:field_priority)
@cached_label_project ||= l(:field_project)
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_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
"<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
@@ -254,7 +252,7 @@ module IssuesHelper
when :in
if gantt.zoom < 4
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)))})
else
l(:text_zoom_in) +
@@ -264,7 +262,7 @@ module IssuesHelper
when :out
if gantt.zoom > 1
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)))})
else
l(:text_zoom_out) +
-10
View File
@@ -71,14 +71,4 @@ module SettingsHelper
label = options.delete(:label)
label != false ? content_tag("label", l(label || "setting_#{setting}")) : ''
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
+4 -4
View File
@@ -34,14 +34,14 @@ module UsersHelper
end
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?
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?
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
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
+1 -1
View File
@@ -18,7 +18,7 @@
class Board < ActiveRecord::Base
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 :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
acts_as_list :scope => :project_id
acts_as_watchable
+1
View File
@@ -31,6 +31,7 @@ class Group < Principal
def user_added(user)
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)
member.member_roles.each do |member_role|
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 :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 :on_active_project, :include => [:status, :project, :tracker],
: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_save :close_duplicates, :update_done_ratio_from_issue_status
@@ -255,7 +237,7 @@ class Issue < ActiveRecord::Base
if !user.allowed_to?(:manage_subtasks, project)
attrs.delete('parent_issue_id')
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
@@ -376,13 +358,6 @@ class Issue < ActiveRecord::Base
!due_date.nil? && (due_date < Date.today) && !status.is_closed?
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?
def children?
!leaf?
@@ -417,10 +392,9 @@ class Issue < ActiveRecord::Base
# Returns the mail adresses of users that should be notified
def recipients
notified = project.notified_users
# Author and assignee are always notified unless they have been
# locked or don't want to be notified
notified << author if author && author.active? && author.notify_about?(self)
notified << assigned_to if assigned_to && assigned_to.active? && assigned_to.notify_about?(self)
# Author and assignee are always notified unless they have been locked
notified << author if author && author.active?
notified << assigned_to if assigned_to && assigned_to.active?
notified.uniq!
# Remove users that can not view the issue
notified.reject! {|user| !visible?(user)}
+4 -3
View File
@@ -84,14 +84,15 @@ class IssueRelation < ActiveRecord::Base
def set_issue_to_dates
soonest_start = self.successor_soonest_start
if soonest_start
if soonest_start && issue_to
issue_to.reschedule_after(soonest_start)
end
end
def successor_soonest_start
return nil unless (TYPE_PRECEDES == self.relation_type) && (issue_from.start_date || issue_from.due_date)
(issue_from.due_date || issue_from.start_date) + 1 + delay
if (TYPE_PRECEDES == self.relation_type) && delay && issue_from && (issue_from.start_date || issue_from.due_date)
(issue_from.due_date || issue_from.start_date) + 1 + delay
end
end
def <=>(relation)
+1 -6
View File
@@ -17,11 +17,6 @@
class JournalObserver < ActiveRecord::Observer
def after_create(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
Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated')
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
def recipients
notified_users.collect {|user| user.mail}
members.select {|m| m.mail_notification? || m.user.mail_notification?}.collect {|m| m.user.mail}
end
# Returns the users that should be notified on project events
def notified_users
# TODO: User part should be extracted to User#notify_about?
members.select {|m| m.mail_notification? || m.user.mail_notification == 'all'}.collect {|m| m.user}
members.select {|m| m.mail_notification? || m.user.mail_notification?}.collect {|m| m.user}
end
# Returns an array of all custom fields enabled for project issues
@@ -422,50 +421,6 @@ class Project < ActiveRecord::Base
s
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.
# action can be:
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
+3 -50
View File
@@ -195,12 +195,6 @@ class Query < ActiveRecord::Base
end
@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?
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?
@available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] }
@@ -374,15 +368,15 @@ class Query < ActiveRecord::Base
# Returns true if the query is a grouped query
def grouped?
!group_by.blank?
!group_by_column.nil?
end
def group_by_column
groupable_columns.detect {|c| c.name.to_s == group_by}
groupable_columns.detect {|c| c.groupable && c.name.to_s == group_by}
end
def group_by_statement
group_by_column.groupable
group_by_column.try(:groupable)
end
def project_statement
@@ -438,47 +432,6 @@ class Query < ActiveRecord::Base
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 << 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
# regular field
db_table = Issue.table_name
+9 -76
View File
@@ -33,15 +33,6 @@ class User < Principal
: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)},
:after_remove => Proc.new {|user, group| group.user_removed(user)}
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
def before_create
self.mail_notification = Setting.default_notification_option if self.mail_notification.blank?
self.mail_notification = false
true
end
@@ -259,17 +250,6 @@ class User < Principal
notified_projects_ids
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
# version. Exact matches will be given priority.
def self.find_by_login(login)
@@ -344,35 +324,23 @@ class User < Principal
!roles_for_project(project).detect {|role| role.member?}.nil?
end
# Return true if the user is allowed to do the specified action on a specific context
# Action can be:
# Return true if the user is allowed to do the specified action on project
# action can be:
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
# * a permission Symbol (eg. :edit_project)
# Context can be:
# * a project : returns true if user is allowed to do the specified action on this 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)
def allowed_to?(action, project, options={})
if project
# No action allowed on archived projects
return false unless context.active?
return false unless project.active?
# 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
return true if admin?
roles = roles_for_project(context)
roles = roles_for_project(project)
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]
# Admin users are always authorized
return true if admin?
@@ -391,41 +359,6 @@ class User < Principal
allowed_to?(action, nil, options.reverse_merge(:global => true))
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)
@current_user = user
end
-16
View File
@@ -73,18 +73,6 @@ class Version < ActiveRecord::Base
def completed?
effective_date && (effective_date <= Date.today) && (open_issues_count == 0)
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
# and the time spent on the open issues.
@@ -135,10 +123,6 @@ class Version < ActiveRecord::Base
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"
# 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">
<thead><tr>
<th><%=l(:label_project)%></th>
<th><%=l(:field_description)%></th>
<th><%=l(:field_is_public)%></th>
<th><%=l(:field_created_on)%></th>
<th></th>
@@ -26,14 +27,15 @@
<tbody>
<% project_tree(@projects) do |project, level| %>
<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"><%= format_date(project.created_on) %></td>
<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_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_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>
</tr>
<% end %>
+3 -5
View File
@@ -1,7 +1,6 @@
<h2><%= l(:label_calendar) %></h2>
<% form_tag(calendar_path, :method => :put, :id => 'query_form') do %>
<%= hidden_field_tag('project_id', @project.to_param) if @project%>
<% form_tag({}, :id => 'query_form') do %>
<fieldset id="filters" class="collapsible">
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div>
@@ -10,7 +9,7 @@
</fieldset>
<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 class="buttons">
@@ -26,8 +25,7 @@
}, :class => 'icon icon-checked' %>
<%= link_to_remote l(:button_clear),
{ :url => { :project_id => @project, :set_filter => (@query.new_record? ? 1 : nil) },
:method => :put,
{ :url => { :set_filter => (@query.new_record? ? 1 : nil) },
:update => "content",
}, :class => 'icon icon-reload' if @query.new_record? %>
</p>
+6 -5
View File
@@ -9,7 +9,7 @@
:class => 'icon-edit', :disabled => !@can[:edit] %></li>
<% end %>
<% unless @allowed_statuses.empty? %>
<% if @allowed_statuses.present? %>
<li class="folder">
<a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
<ul>
@@ -33,6 +33,7 @@
</li>
<% end %>
<% if @projects.size == 1 %>
<li class="folder">
<a href="#" class="submenu"><%= l(:field_priority) %></a>
<ul>
@@ -42,8 +43,8 @@
<% end -%>
</ul>
</li>
<% end %>
<% #TODO: allow editing versions when multiple projects %>
<% unless @project.nil? || @project.shared_versions.open.empty? -%>
<li class="folder">
<a href="#" class="submenu"><%= l(:field_fixed_version) %></a>
@@ -57,7 +58,7 @@
</ul>
</li>
<% end %>
<% unless @assignables.nil? || @assignables.empty? -%>
<% if @assignables.present? -%>
<li class="folder">
<a href="#" class="submenu"><%= l(:field_assigned_to) %></a>
<ul>
@@ -84,7 +85,7 @@
</li>
<% end -%>
<% if Issue.use_field_for_done_ratio? %>
<% if Issue.use_field_for_done_ratio? && @projects.size == 1 %>
<li class="folder">
<a href="#" class="submenu"><%= l(:field_done_ratio) %></a>
<ul>
@@ -114,7 +115,7 @@
:class => 'icon-copy', :disabled => !@can[:move] %></li>
<li><%= context_menu_link l(:button_move), new_issue_move_path(:ids => @issues.collect(&:id)),
: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>
<%= call_hook(:view_issues_context_menu_end, {:issues => @issues, :can => @can, :back => @back }) %>
+1 -1
View File
@@ -1,5 +1,5 @@
<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>
<h2><%=l(:label_attachment_plural)%></h2>
+1 -1
View File
@@ -2,7 +2,7 @@
<%= error_messages_for 'attachment' %>
<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? %>
<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>
<% form_tag(gantt_path(:month => params[:month], :year => params[:year], :months => params[:months]), :method => :put, :id => 'query_form') do %>
<%= hidden_field_tag('project_id', @project.to_param) if @project%>
<% form_tag(params.merge(:month => nil, :year => nil, :months => nil), :id => 'query_form') do %>
<fieldset id="filters" class="collapsible">
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div>
@@ -29,8 +27,7 @@
}, :class => 'icon icon-checked' %>
<%= link_to_remote l(:button_clear),
{ :url => { :project_id => @project, :set_filter => (@query.new_record? ? 1 : nil) },
:method => :put,
{ :url => { :set_filter => (@query.new_record? ? 1 : nil) },
:update => "content",
}, :class => 'icon icon-reload' if @query.new_record? %>
</p>
@@ -57,12 +54,11 @@ if @gantt.zoom >1
end
end
# Width of the entire chart
g_width = (@gantt.date_to - @gantt.date_from + 1)*zoom
# Collect the number of issues on Versions
g_height = [(20 * (@gantt.number_of_rows + 6))+150, 206].max
g_height = [(20 * @gantt.events.length + 6)+150, 206].max
t_height = g_height + headers_height
%>
<table width="100%" style="border:0; border-collapse: collapse;">
<tr>
<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="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>
<% 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>
</td>
<td>
@@ -151,9 +163,53 @@ if show_days
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%">
<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="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="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, :update => 'content', :complete => 'window.scrollTo(0,0)'}, {:href => url_for(@gantt.params_next)} %></td>
</tr>
</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| %>
<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,
:frequency => 0.5,
:update => :users,
+1 -1
View File
@@ -2,5 +2,5 @@
<div class="box">
<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>
+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)) %>
</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>
<label><%= l(:field_start_date) %></label>
<%= 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') %>
</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) %>
</div>
+1 -1
View File
@@ -1,6 +1,6 @@
<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_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' %>
<%= 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' %>
+4 -4
View File
@@ -8,8 +8,8 @@
<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) %>
<p><%= f.text_field :parent_issue_id, :size => 10 %></p>
<% if User.current.allowed_to?(:manage_subtasks, @project) %>
<p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10 %></p>
<div id="parent_issue_candidates" class="autocomplete"></div>
<%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %>
<% end %>
@@ -26,11 +26,11 @@
</div>
<% 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 %>
<% 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| -%>
<label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, @issue.watched_by?(user) %> <%=h user %></label>
<% end -%>
+2 -7
View File
@@ -11,7 +11,7 @@
<div class="splitcontentleft">
<p>
<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>
<% if @available_statuses.any? %>
<p>
@@ -27,25 +27,20 @@
<label><%= l(:field_assigned_to) %></label>
<%= select_tag('issue[assigned_to_id]', content_tag('option', l(:label_no_change_option), :value => '') +
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>
<% if @project %>
<p>
<label><%= l(:field_category) %></label>
<%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_none), :value => 'none') +
options_from_collection_for_select(@project.issue_categories, :id, :name)) %>
</p>
<% end %>
<% #TODO: allow editing versions when multiple projects %>
<% if @project %>
<p>
<label><%= l(:field_fixed_version) %></label>
<%= select_tag('issue[fixed_version_id]', content_tag('option', l(:label_no_change_option), :value => '') +
content_tag('option', l(:label_none), :value => 'none') +
version_options_for_select(@project.shared_versions.open)) %>
</p>
<% end %>
<% @custom_fields.each do |custom_field| %>
<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>
<% 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' %>
<div class="box">
<%= 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>
<% if User.current.allowed_to?(:view_time_entries, @project) %>
<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 %>
</tr>
<tr>
@@ -44,19 +44,18 @@
<%= render_custom_fields_rows(@issue) %>
<%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
</table>
<% if @issue.description? || @issue.attachments.any? -%>
<hr />
<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 => {:controller => 'journals', :action => 'new', :id => @issue} }, :class => 'icon icon-comment') unless @issue.description.blank? %>
</div>
<p><strong><%=l(:field_description)%></strong></p>
<div class="wiki">
<%= textilizable @issue, :description, :attachments => @issue.attachments %>
</div>
<%= link_to_attachments @issue %>
<% end -%>
<%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %>
+1 -1
View File
@@ -20,7 +20,7 @@
<!-- page specific tags -->
<%= yield :header_tags -%>
</head>
<body class="<%= body_css_classes %>">
<body class="<%=h body_css_classes %>">
<div id="wrapper">
<div id="wrapper2">
<div id="top-menu">
+14 -2
View File
@@ -32,12 +32,24 @@
<div class="splitcontentright">
<h3><%=l(:field_mail_notification)%></h3>
<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>
<h3><%=l(:label_preferences)%></h3>
<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>
+1 -1
View File
@@ -40,7 +40,7 @@ entries_by_day = entries.group_by(&:spent_on)
:title => l(:button_edit) %>
<%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry},
:confirm => l(:text_are_you_sure),
:method => :delete,
:method => :post,
:title => l(:button_delete) %>
<% end -%>
</td>
+3 -3
View File
@@ -5,9 +5,9 @@ function recreateSortables() {
Sortable.destroy('list-left');
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-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-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-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('<%= 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('<%= 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() {
+1 -1
View File
@@ -1,5 +1,5 @@
<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 %>
<br />
<% 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>
<% labelled_tabular_form_for :news, @news, :url => news_path(@news),
:html => { :id => 'news-form', :method => :put } do |f| %>
<% labelled_tabular_form_for :news, @news, :url => { :action => "edit" },
:html => { :id => 'news-form' } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %>
<%= link_to_remote l(:label_preview),
{ :url => preview_news_path(:project_id => @project),
:method => 'get',
{ :url => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'post',
:update => 'preview',
:with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %>
+8 -8
View File
@@ -1,19 +1,19 @@
<div class="contextual">
<%= link_to(l(:label_news_new),
new_project_news_path(@project),
: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) %>
<%= link_to_if_authorized(l(:label_news_new),
{:controller => 'news', :action => 'new', :project_id => @project},
:class => 'icon icon-add',
:onclick => 'Element.show("add-news"); Form.Element.focus("news_title"); return false;') if @project %>
</div>
<div id="add-news" style="display:none;">
<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| %>
<%= render :partial => 'news/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %>
<%= link_to_remote l(:label_preview),
{ :url => preview_news_path(:project_id => @project),
:method => 'get',
{ :url => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'post',
:update => 'preview',
:with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %> |
@@ -29,7 +29,7 @@
<% else %>
<% @newss.each do |news| %>
<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>
<p class="author"><%= authoring news.created_on, news.author %></p>
<div class="wiki">
+3 -3
View File
@@ -1,12 +1,12 @@
<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| %>
<%= render :partial => 'news/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %>
<%= link_to_remote l(:label_preview),
{ :url => preview_news_path(:project_id => @project),
:method => 'get',
{ :url => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'post',
:update => 'preview',
:with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %>
+10 -10
View File
@@ -1,23 +1,23 @@
<div class="contextual">
<%= link_to_if_authorized l(:button_edit),
edit_news_path(@news),
{:controller => 'news', :action => 'edit', :id => @news},
:class => 'icon icon-edit',
:accesskey => accesskey(:edit),
: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>
<h2><%= avatar(@news.author, :size => "24") %><%=h @news.title %></h2>
<% if authorize_for('news', 'edit') %>
<div id="edit-news" style="display:none;">
<% labelled_tabular_form_for :news, @news, :url => news_path(@news),
:html => { :id => 'news-form', :method => :put } do |f| %>
<% labelled_tabular_form_for :news, @news, :url => { :action => "edit", :id => @news },
:html => { :id => 'news-form' } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %>
<%= link_to_remote l(:label_preview),
{ :url => preview_news_path(:project_id => @project),
:method => 'get',
{ :url => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'post',
:update => 'preview',
:with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %> |
@@ -39,17 +39,17 @@
<% @comments.each do |comment| %>
<% next if comment.new_record? %>
<div class="contextual">
<%= link_to_if_authorized image_tag('delete.png'), {:controller => 'comments', :action => 'destroy', :id => @news, :comment_id => comment},
:confirm => l(:text_are_you_sure), :method => :delete, :title => l(:button_delete) %>
<%= 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 => :post, :title => l(:button_delete) %>
</div>
<h4><%= avatar(comment.author, :size => "24") %><%= authoring comment.created_on, comment.author %></h4>
<%= textilizable(comment.comments) %>
<% end if @comments.any? %>
</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>
<% 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">
<%= text_area 'comment', 'comments', :cols => 80, :rows => 15, :class => 'wiki-edit' %>
<%= 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 } %>
<%= submit_tag l(:button_save) %>
<% end %>
+1 -1
View File
@@ -8,7 +8,7 @@
<% end %>
</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>
<%= submit_tag l(:button_delete) %>
<% 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">
<thead><tr>
@@ -32,7 +32,7 @@
</table>
<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,
:confirm => l(:text_are_you_sure),
: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| %>
<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,
:frequency => 0.5,
:update => :principals,
+4 -4
View File
@@ -6,7 +6,7 @@
<th><%= l(:field_description) %></th>
<th><%= l(:field_status) %></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>
</tr></thead>
<tbody>
@@ -17,11 +17,11 @@
<td class="description"><%=h version.description %></td>
<td class="status"><%= l("version_status_#{version.status}") %></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">
<% 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_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 %>
</td>
</tr>
@@ -34,7 +34,7 @@
<div class="contextual">
<% 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 %>
</div>
+2 -2
View File
@@ -67,8 +67,8 @@
<% if @total_hours && User.current.allowed_to?(:view_time_entries, @project) %>
<h3><%= l(:label_spent_time) %></h3>
<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}) %> |
<%= link_to(l(:label_report), {:controller => 'time_entry_reports', :action => 'report', :project_id => @project}) %></p>
<p><%= link_to(l(:label_details), {:controller => 'timelog', :action => 'details', :project_id => @project}) %> |
<%= link_to(l(:label_report), {:controller => 'timelog', :action => 'report', :project_id => @project}) %></p>
<% end %>
<%= call_hook(:view_projects_show_sidebar_bottom, :project => @project) %>
<% end %>
+1 -1
View File
@@ -3,7 +3,7 @@
<div class="box tabular settings">
<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"],
[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>
<%= 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 />
<em><%= l(:text_comma_separated) %></em></p>
@@ -26,7 +26,7 @@
<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>
+5 -10
View File
@@ -7,18 +7,13 @@
<p><%= setting_check_box :bcc_recipients %></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>
<fieldset class="box" id="notified_events"><legend><%=l(:text_select_mail_notifications)%></legend>
<%= hidden_field_tag 'settings[notified_events][]', '' %>
<% @notifiables.each do |notifiable| %>
<%= notification_field notifiable %>
<br />
<% end %>
<p><%= check_all_links('notified_events') %></p>
<fieldset class="box settings" id="notified_events"><legend><%=l(:text_select_mail_notifications)%></legend>
<%= setting_multiselect(:notified_events,
@notifiables.collect {|notifiable| [l_or_humanize(notifiable, :prefix => 'label_'), notifiable]}, :label => false) %>
<p><%= check_all_links('notified_events') %></p>
</fieldset>
<fieldset class="box"><legend><%= l(:setting_emails_footer) %></legend>
+3 -3
View File
@@ -28,9 +28,9 @@
<div class="tabs">
<% url_params = @free_period ? { :from => @from, :to => @to } : { :period => params[:period] } %>
<ul>
<li><%= link_to(l(:label_details), url_params.merge({:controller => 'timelog', :action => 'index', :project_id => @project, :issue_id => @issue }),
:class => (@controller.action_name == 'index' ? '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_details), url_params.merge({:controller => 'timelog', :action => 'details', :project_id => @project, :issue_id => @issue }),
:class => (@controller.action_name == 'details' ? 'selected' : nil)) %></li>
<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>
</ul>
</div>
+1 -1
View File
@@ -31,7 +31,7 @@
:title => l(:button_edit) %>
<%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry, :project_id => nil},
:confirm => l(:text_are_you_sure),
:method => :delete,
:method => :post,
:title => l(:button_delete) %>
<% end -%>
</td>
@@ -1,5 +1,5 @@
<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>
<%= render_timelog_breadcrumb %>
+1 -6
View File
@@ -1,11 +1,6 @@
<h2><%= l(:label_spent_time) %></h2>
<% labelled_tabular_form_for(:time_entry, @time_entry, :url => {
: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| %>
<% labelled_tabular_form_for :time_entry, @time_entry, :url => {:action => 'edit', :id => @time_entry, :project_id => @time_entry.project} do |f| %>
<%= error_messages_for 'time_entry' %>
<%= back_url_hidden_field_tag %>
@@ -1,5 +1,5 @@
<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>
<%= render_timelog_breadcrumb %>
@@ -13,7 +13,7 @@
<%# 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('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'],
[l(:label_month), 'month'],
-10
View File
@@ -32,14 +32,4 @@
<%= password_field_tag 'password_confirmation', nil, :size => 25 %></p>
</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]-->
+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 } %>
<% if @user.active? -%>
<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">
<% Group.all.sort.each do |group| %>
<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>
<% 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 } %>
<p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p>
<p>
+1 -1
View File
@@ -1,5 +1,5 @@
<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) %>
</div>
+2 -2
View File
@@ -1,5 +1,5 @@
<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>
<h2><%=l(:label_user_plural)%></h2>
@@ -30,7 +30,7 @@
<tbody>
<% for user in @users -%>
<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="lastname"><%= h(user.lastname) %></td>
<td class="email"><%= mail_to(h(user.mail)) %></td>
+1 -1
View File
@@ -1,5 +1,5 @@
<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>
<h2><%= avatar @user, :size => "50" %> <%=h @user.name %></h2>
+1 -1
View File
@@ -5,7 +5,7 @@
select_tag('status_by',
status_by_options_for_select(criteria),
: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')"))) %>
</legend>
<% if counts.empty? %>
+1 -1
View File
@@ -1,6 +1,6 @@
<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 } %>
<%= submit_tag l(:button_save) %>
<% end %>
+1 -1
View File
@@ -1,6 +1,6 @@
<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 } %>
<%= submit_tag l(:button_create) %>
<% end %>
+1 -1
View File
@@ -1,6 +1,6 @@
<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_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 }) %>
</div>
+3 -3
View File
@@ -4,6 +4,6 @@
<h3><%= l(:label_wiki) %></h3>
<%= link_to l(:field_start_page), {:action => 'show', :page => nil} %><br />
<%= link_to l(:label_index_by_title), {:action => 'page_index'} %><br />
<%= link_to l(:label_index_by_date), {:action => 'date_index'} %><br />
<%= link_to l(:field_start_page), {:action => 'index', :page => nil} %><br />
<%= link_to l(:label_index_by_title), {:action => 'special', :page => 'Page_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>
<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>
</p>
@@ -18,7 +18,7 @@
<% @annotate.lines.each do |line| -%>
<tr class="bloc-<%= colors[line[0]] %>">
<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="line-code"><pre><%=h line[2] %></pre></td>
</tr>
+1 -1
View File
@@ -15,5 +15,5 @@
</div>
<%= 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 %>
+2 -2
View File
@@ -5,10 +5,10 @@
<h2><%= @page.pretty_title %></h2>
<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>
&#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>
</p>
+2 -2
View File
@@ -1,6 +1,6 @@
<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 %>
<%= error_messages_for 'content' %>
@@ -10,7 +10,7 @@
<p><%= submit_tag l(:button_save) %>
<%= 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',
:update => 'preview',
:with => "Form.serialize('wiki_form')",
+1 -2
View File
@@ -3,7 +3,6 @@
<h3><%= l(:label_history) %></h3>
<% form_tag({:action => "diff"}, :method => :get) do %>
<%= hidden_field_tag('project_id', h(@project.to_param)) %>
<table class="list">
<thead><tr>
<th>#</th>
@@ -19,7 +18,7 @@
<% line_num = 1 %>
<% @versions.each do |ver| %>
<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_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>
+3 -3
View File
@@ -15,11 +15,11 @@
<% if @content.version != @page.content.version %>
<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}" %>
<%= '(' + 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_current_version), :action => 'show', :page => @page.title) %>
<%= 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 => 'index', :page => @page.title) %>
<br />
<em><%= @content.author ? @content.author.name : "anonyme" %>, <%= format_time(@content.updated_on) %> </em><br />
<%=h @content.comments %>
@@ -12,7 +12,7 @@
<h3><%= format_date(date) %></h3>
<ul>
<% @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 %>
</ul>
<% end %>
@@ -23,11 +23,11 @@
<% unless @pages.empty? %>
<% 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('HTML', :url => {:action => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% end %>
<% end %>
<% 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 %>
@@ -16,11 +16,11 @@
<% unless @pages.empty? %>
<% 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('HTML', :url => {:action => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% end %>
<% end %>
<% 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 %>
+2
View File
@@ -5,6 +5,7 @@
<% if @workflow_counts.empty? %>
<p class="nodata"><%= l(:label_no_data) %></p>
<% else %>
<div class="autoscroll">
<table class="list">
<thead>
<tr>
@@ -30,4 +31,5 @@
<% end -%>
</tbody>
</table>
</div>
<% end %>
+12
View File
@@ -106,5 +106,17 @@ module Rails
end
end
# TODO: Workaround for #7013 to be removed for 1.2.0
# Loads i18n 0.4.2 before Rails loads any more recent gem
# 0.5.0 is not compatible with the old interpolation syntax
# Plugins will have to migrate to the new syntax for 1.2.0
require 'rubygems'
begin
gem 'i18n', '0.4.2'
rescue Gem::LoadError => load_error
$stderr.puts %(Missing the i18n 0.4.2 gem. Please `gem install -v=0.4.2 i18n`)
exit 1
end
# All that for this:
Rails.boot!
+2 -2
View File
@@ -84,9 +84,9 @@ ActionMailer::Base.send :include, AsynchronousMailer
module I18n
module Backend
module Base
def warn_syntax_deprecation!
def warn_syntax_deprecation!(*args)
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 and will be removed in Redmine 1.2. Please use %{key} instead, see http://www.redmine.org/issues/7013 for more information."
@skip_syntax_deprecation = true
end
end
+288 -283
View File
@@ -9,12 +9,12 @@ bg:
short: "%b %d"
long: "%B %d, %Y"
day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
day_names: [Неделя, Понеделник, Вторник, Сряда, Четвъртък, Петък, Събота]
abbr_day_names: [Нед, Пон, Вто, Сря, Чет, Пет, Съб]
# 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]
abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
month_names: [~, Януари, Февруари, Март, Април, Май, Юни, Юли, Август, Септември, Октомври, Ноември, Декември]
abbr_month_names: [~, Яну, Фев, Мар, Апр, Май, Юни, Юли, Авг, Сеп, Окт, Ное, Дек]
# Used in date_select and datime_select.
order: [ :year, :month, :day ]
@@ -31,38 +31,38 @@ bg:
distance_in_words:
half_a_minute: "half a minute"
less_than_x_seconds:
one: "less than 1 second"
other: "less than {{count}} seconds"
one: "по-малко от 1 секунда"
other: "по-малко от {{count}} секунди"
x_seconds:
one: "1 second"
other: "{{count}} seconds"
one: "1 секунда"
other: "{{count}} секунди"
less_than_x_minutes:
one: "less than a minute"
other: "less than {{count}} minutes"
one: "по-малко от 1 минута"
other: "по-малко от {{count}} минути"
x_minutes:
one: "1 minute"
other: "{{count}} minutes"
one: "1 минута"
other: "{{count}} минути"
about_x_hours:
one: "about 1 hour"
other: "about {{count}} hours"
one: "около 1 час"
other: "около {{count}} часа"
x_days:
one: "1 day"
other: "{{count}} days"
one: "1 ден"
other: "{{count}} дена"
about_x_months:
one: "about 1 month"
other: "about {{count}} months"
one: "около 1 месец"
other: "около {{count}} месеца"
x_months:
one: "1 month"
other: "{{count}} months"
one: "1 месец"
other: "{{count}} месеца"
about_x_years:
one: "about 1 year"
other: "about {{count}} years"
one: "около 1 година"
other: "около {{count}} години"
over_x_years:
one: "over 1 year"
other: "over {{count}} years"
one: "над 1 година"
other: "над {{count}} години"
almost_x_years:
one: "almost 1 year"
other: "almost {{count}} years"
one: "почти 1 година"
other: "почти {{count}} години"
number:
format:
@@ -87,7 +87,7 @@ bg:
# Used in array.to_sentence.
support:
array:
sentence_connector: "and"
sentence_connector: "и"
skip_last_comma: false
activerecord:
@@ -106,17 +106,16 @@ bg:
taken: "вече съществува"
not_a_number: "не е число"
not_a_date: "е невалидна дата"
greater_than: "must be greater than {{count}}"
greater_than_or_equal_to: "must be greater than or equal to {{count}}"
equal_to: "must be equal to {{count}}"
less_than: "must be less than {{count}}"
less_than_or_equal_to: "must be less than or equal to {{count}}"
odd: "must be odd"
even: "must be even"
greater_than: "трябва да бъде по-голям[a/о] от {{count}}"
greater_than_or_equal_to: "трябва да бъде по-голям[a/о] от или равен[a/o] на {{count}}"
equal_to: "трябва да бъде равен[a/o] на {{count}}"
less_than: "трябва да бъде по-малък[a/o] от {{count}}"
less_than_or_equal_to: "трябва да бъде по-малък[a/o] от или равен[a/o] на {{count}}"
odd: "трябва да бъде нечетен[a/o]"
even: "трябва да бъде четен[a/o]"
greater_than_start_date: "трябва да е след началната дата"
not_same_project: "не е от същия проект"
circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
actionview_instancetag_blank_option: Изберете
@@ -171,7 +170,7 @@ bg:
field_mail: Email
field_filename: Файл
field_filesize: Големина
field_downloads: Downloads
field_downloads: Изтеглени файлове
field_author: Автор
field_created_on: От дата
field_updated_on: Обновена
@@ -186,10 +185,10 @@ bg:
field_title: Заглавие
field_project: Проект
field_issue: Задача
field_status: Статус
field_status: Състояние
field_notes: Бележка
field_is_closed: Затворена задача
field_is_default: Статус по подразбиране
field_is_default: Състояние по подразбиране
field_tracker: Тракер
field_subject: Относно
field_due_date: Крайна дата
@@ -217,10 +216,10 @@ bg:
field_port: Порт
field_account: Профил
field_base_dn: Base DN
field_attr_login: Login attribute
field_attr_firstname: Firstname attribute
field_attr_lastname: Lastname attribute
field_attr_mail: Email attribute
field_attr_login: Атрибут Login
field_attr_firstname: Атрибут Първо име (Firstname)
field_attr_lastname: Атрибут Фамилия (Lastname)
field_attr_mail: Атрибут Email
field_onthefly: Динамично създаване на потребител
field_start_date: Начална дата
field_done_ratio: % Прогрес
@@ -249,12 +248,12 @@ bg:
setting_login_required: Изискване за вход в системата
setting_self_registration: Регистрация от потребители
setting_attachment_max_size: Максимална големина на прикачен файл
setting_issues_export_limit: Лимит за експорт на задачи
setting_issues_export_limit: Максимален брой задачи за експорт
setting_mail_from: E-mail адрес за емисии
setting_host_name: Хост
setting_text_formatting: Форматиране на текста
setting_wiki_compression: Wiki компресиране на историята
setting_feeds_limit: Лимит на Feeds
setting_feeds_limit: Максимален брой за емисии
setting_autofetch_changesets: Автоматично обработване на ревизиите
setting_sys_api_enabled: Разрешаване на WS за управление
setting_commit_ref_keywords: Отбелязващи ключови думи
@@ -270,9 +269,9 @@ bg:
label_project_new: Нов проект
label_project_plural: Проекти
label_x_projects:
zero: no projects
one: 1 project
other: "{{count}} projects"
zero: 0 проекти
one: 1 проект
other: "{{count}} проекта"
label_project_all: Всички проекти
label_project_latest: Последни проекти
label_issue: Задача
@@ -293,9 +292,9 @@ bg:
label_tracker_plural: Тракери
label_tracker_new: Нов тракер
label_workflow: Работен процес
label_issue_status: Статус на задача
label_issue_status_plural: Статуси на задачи
label_issue_status_new: Нов статус
label_issue_status: Състояние на задача
label_issue_status_plural: Състояния на задачи
label_issue_status_new: Ново състояние
label_issue_category: Категория задача
label_issue_category_plural: Категории задачи
label_issue_category_new: Нова категория
@@ -323,14 +322,14 @@ bg:
label_registered_on: Регистрация
label_activity: Дейност
label_new: Нов
label_logged_as: Логнат като
label_logged_as: Здравейте,
label_environment: Среда
label_authentication: Оторизация
label_auth_source: Начин на оторозация
label_auth_source_new: Нов начин на оторизация
label_auth_source_plural: Начини на оторизация
label_subproject_plural: Подпроекти
label_min_max_length: Мин. - Макс. дължина
label_min_max_length: Минимална - максимална дължина
label_list: Списък
label_date: Дата
label_integer: Целочислен
@@ -339,10 +338,10 @@ bg:
label_text: Дълъг текст
label_attribute: Атрибут
label_attribute_plural: Атрибути
label_download: "{{count}} Download"
label_download_plural: "{{count}} Downloads"
label_download: "{{count}} изтегляне"
label_download_plural: "{{count}} изтегляния"
label_no_data: Няма изходни данни
label_change_status: Промяна на статуса
label_change_status: Промяна на състоянието
label_history: История
label_attachment: Файл
label_attachment_new: Нов файл
@@ -369,21 +368,21 @@ bg:
label_closed_issues: затворена
label_closed_issues_plural: затворени
label_x_open_issues_abbr_on_total:
zero: 0 open / {{total}}
one: 1 open / {{total}}
other: "{{count}} open / {{total}}"
zero: 0 отворени / {{total}}
one: 1 отворена / {{total}}
other: "{{count}} отворени / {{total}}"
label_x_open_issues_abbr:
zero: 0 open
one: 1 open
other: "{{count}} open"
zero: 0 отворени
one: 1 отворена
other: "{{count}} отворени"
label_x_closed_issues_abbr:
zero: 0 closed
one: 1 closed
other: "{{count}} closed"
zero: 0 затворени
one: 1 затворена
other: "{{count}} затворени"
label_total: Общо
label_permissions: Права
label_current_status: Текущ статус
label_new_statuses_allowed: Позволени статуси
label_current_status: Текущо състояние
label_new_statuses_allowed: Позволени състояния
label_all: всички
label_none: никакви
label_next: Следващ
@@ -394,7 +393,7 @@ bg:
label_per_page: На страница
label_calendar: Календар
label_months_from: месеца от
label_gantt: Gantt
label_gantt: Мрежов график
label_internal: Вътрешен
label_last_changes: "последни {{count}} промени"
label_change_view_all: Виж всички промени
@@ -402,9 +401,9 @@ bg:
label_comment: Коментар
label_comment_plural: Коментари
label_x_comments:
zero: no comments
one: 1 comment
other: "{{count}} comments"
zero: 0 коментари
one: 1 коментар
other: "{{count}} коментари"
label_comment_add: Добавяне на коментар
label_comment_added: Добавен коментар
label_comment_delete: Изтриване на коментари
@@ -453,13 +452,13 @@ bg:
label_wiki: Wiki
label_wiki_edit: Wiki редакция
label_wiki_edit_plural: Wiki редакции
label_wiki_page: Wiki page
label_wiki_page_plural: Wiki pages
label_wiki_page: Wiki страница
label_wiki_page_plural: Wiki страници
label_index_by_title: Индекс
label_index_by_date: Индекс по дата
label_current_version: Текуща версия
label_preview: Преглед
label_feed_plural: Feeds
label_feed_plural: Емисии
label_changes_details: Подробни промени
label_issue_tracking: Тракинг
label_spent_time: Отделено време
@@ -478,7 +477,7 @@ bg:
label_permissions_report: Справка за права
label_watched_issues: Наблюдавани задачи
label_related_issues: Свързани задачи
label_applied_status: Промени статуса на
label_applied_status: Установено състояние
label_loading: Зареждане...
label_relation_new: Нова релация
label_relation_delete: Изтриване на релация
@@ -488,10 +487,10 @@ bg:
label_blocked_by: блокирана от
label_precedes: предшества
label_follows: изпълнява се след
label_end_to_start: end to start
label_end_to_end: end to end
label_start_to_start: start to start
label_start_to_end: start to end
label_end_to_start: край към начало
label_end_to_end: край към край
label_start_to_start: начало към начало
label_start_to_end: начало към край
label_stay_logged_in: Запомни ме
label_disabled: забранено
label_show_completed_versions: Показване на реализирани версии
@@ -534,7 +533,7 @@ bg:
button_clear: Изчисти
button_lock: Заключване
button_unlock: Отключване
button_download: Download
button_download: Изтегляне
button_list: Списък
button_view: Преглед
button_move: Преместване
@@ -544,8 +543,8 @@ bg:
button_sort: Сортиране
button_log_time: Отделяне на време
button_rollback: Върни се към тази ревизия
button_watch: Наблюдавай
button_unwatch: Спри наблюдението
button_watch: Наблюдаване
button_unwatch: Край на наблюдението
button_reply: Отговор
button_archive: Архивиране
button_unarchive: Разархивиране
@@ -562,9 +561,9 @@ bg:
text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него?
text_workflow_edit: Изберете роля и тракер за да редактирате работния процес
text_are_you_sure: Сигурни ли сте?
text_tip_issue_begin_day: задача започваща този ден
text_tip_issue_end_day: задача завършваща този ден
text_tip_issue_begin_end_day: задача започваща и завършваща този ден
text_tip_task_begin_day: задача започваща този ден
text_tip_task_end_day: задача завършваща този ден
text_tip_task_begin_end_day: задача започваща и завършваща този ден
text_project_identifier_info: 'Позволени са малки букви (a-z), цифри и тирета.<br />Невъзможна промяна след запис.'
text_caracters_maximum: "До {{count}} символа."
text_length_between: "От {{min}} до {{max}} символа."
@@ -582,11 +581,11 @@ bg:
default_role_manager: Мениджър
default_role_developer: Разработчик
default_role_reporter: Публикуващ
default_tracker_bug: Бъг
default_tracker_bug: Грешка
default_tracker_feature: Функционалност
default_tracker_support: Поддръжка
default_issue_status_new: Нова
default_issue_status_in_progress: In Progress
default_issue_status_in_progress: Изпълнение
default_issue_status_resolved: Приключена
default_issue_status_feedback: Обратна връзка
default_issue_status_closed: Затворена
@@ -622,6 +621,7 @@ bg:
text_user_mail_option: "За неизбраните проекти, ще получавате известия само за наблюдавани дейности или в които участвате (т.е. автор или назначени на мен)."
label_user_mail_option_selected: "За всички събития само в избраните проекти..."
label_user_mail_option_all: "За всяко събитие в проектите, в които участвам"
label_user_mail_option_none: "Само за наблюдавани или в които участвам (автор или назначени на мен)"
setting_emails_footer: Подтекст за e-mail
label_float: Дробно
button_copy: Копиране
@@ -647,7 +647,7 @@ bg:
label_age: Възраст
notice_default_data_loaded: Примерната информацията е успешно заредена.
text_load_default_configuration: Зареждане на примерна информация
text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, статуси на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате."
text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, състояния на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате."
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: {{value}}"
button_update: Обновяване
label_change_properties: Промяна на настройки
@@ -706,212 +706,217 @@ bg:
setting_default_projects_public: Новите проекти са публични по подразбиране
error_scm_annotate: "Обектът не съществува или не може да бъде анотиран."
label_planning: Планиране
text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted."
label_and_its_subprojects: "{{value}} and its subprojects"
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days"
text_user_wrote: "{{value}} wrote:"
label_duplicated_by: duplicated by
setting_enabled_scm: Enabled SCM
text_enumeration_category_reassign_to: 'Reassign them to this value:'
text_enumeration_destroy_question: "{{count}} objects are assigned to this value."
label_incoming_emails: Incoming emails
label_generate_key: Generate a key
setting_mail_handler_api_enabled: Enable WS for incoming emails
setting_mail_handler_api_key: API key
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."
field_parent_title: Parent page
label_issue_watchers: Watchers
setting_commit_logs_encoding: Commit messages encoding
button_quote: Quote
setting_sequential_project_identifiers: Generate sequential project identifiers
notice_unable_delete_version: Unable to delete version
label_renamed: renamed
label_copied: copied
setting_plain_text_mail: plain text only (no HTML)
permission_view_files: View files
permission_edit_issues: Edit issues
permission_edit_own_time_entries: Edit own time logs
permission_manage_public_queries: Manage public queries
permission_add_issues: Add issues
text_subprojects_destroy_warning: "Неговите подпроекти: {{value}} също ще бъдат изтрити."
label_and_its_subprojects: "{{value}} и неговите подпроекти"
mail_body_reminder: "{{count}} задачи, назначени на вас са с краен срок в следващите {{days}} дни:"
mail_subject_reminder: "{{count}} задачи с краен срок с следващите {{days}} дни"
text_user_wrote: "{{value}} написа:"
label_duplicated_by: дублирана от
setting_enabled_scm: Разрешена SCM
text_enumeration_category_reassign_to: 'Пресвържете ги към тази стойност:'
text_enumeration_destroy_question: "{{count}} обекта са свързани с тази стойност."
label_incoming_emails: Входящи e-mail
label_generate_key: Генериране на ключ
setting_mail_handler_api_enabled: Разрешаване на WS за входящи e-mail
setting_mail_handler_api_key: API ключ
text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/email.yml и рестартирайте Redmine, за да ги разрешите."
field_parent_title: Родителска страница
label_issue_watchers: Наблюдатели
setting_commit_logs_encoding: Кодова таблица на съобщенията при поверяване
button_quote: Цитат
setting_sequential_project_identifiers: Генериране на последователни проектни идентификатори
notice_unable_delete_version: Невъзможност за изтриване на версия
label_renamed: преименуван
label_copied: копиран
setting_plain_text_mail: само чист текст (без HTML)
permission_view_files: Разглеждане на файлове
permission_edit_issues: Редактиране на задачи
permission_edit_own_time_entries: Редактиране на собствените time logs
permission_manage_public_queries: Управление на публичните заявки
permission_add_issues: Добавяне на задачи
permission_log_time: Log spent time
permission_view_changesets: View changesets
permission_view_time_entries: View spent time
permission_manage_versions: Manage versions
permission_manage_wiki: Manage wiki
permission_manage_categories: Manage issue categories
permission_protect_wiki_pages: Protect wiki pages
permission_comment_news: Comment news
permission_delete_messages: Delete messages
permission_select_project_modules: Select project modules
permission_manage_documents: Manage documents
permission_edit_wiki_pages: Edit wiki pages
permission_add_issue_watchers: Add watchers
permission_view_gantt: View gantt chart
permission_move_issues: Move issues
permission_manage_issue_relations: Manage issue relations
permission_delete_wiki_pages: Delete wiki pages
permission_manage_boards: Manage boards
permission_delete_wiki_pages_attachments: Delete attachments
permission_view_wiki_edits: View wiki history
permission_add_messages: Post messages
permission_view_messages: View messages
permission_manage_files: Manage files
permission_edit_issue_notes: Edit notes
permission_manage_news: Manage news
permission_view_calendar: View calendrier
permission_manage_members: Manage members
permission_edit_messages: Edit messages
permission_delete_issues: Delete issues
permission_view_issue_watchers: View watchers list
permission_manage_repository: Manage repository
permission_commit_access: Commit access
permission_browse_repository: Browse repository
permission_view_documents: View documents
permission_edit_project: Edit project
permission_add_issue_notes: Add notes
permission_save_queries: Save queries
permission_view_wiki_pages: View wiki
permission_rename_wiki_pages: Rename wiki pages
permission_edit_time_entries: Edit time logs
permission_edit_own_issue_notes: Edit own notes
setting_gravatar_enabled: Use Gravatar user icons
label_example: Example
permission_view_changesets: Разглеждане на changesets
permission_view_time_entries: Разглеждане на изразходваното време
permission_manage_versions: Управление на версиите
permission_manage_wiki: Управление на wiki
permission_manage_categories: Управление на категориите задачи
permission_protect_wiki_pages: Заключване на wiki страници
permission_comment_news: Коментиране на новини
permission_delete_messages: Изтриване на съобщения
permission_select_project_modules: Избор на проектни модули
permission_manage_documents: Управление на документи
permission_edit_wiki_pages: Редактиране на wiki страници
permission_add_issue_watchers: Добавяне на наблюдатели
permission_view_gantt: Разглеждане на мрежов график
permission_move_issues: Преместване на задачи
permission_manage_issue_relations: Управление на връзките между задачите
permission_delete_wiki_pages: Изтриване на wiki страници
permission_manage_boards: Управление на boards
permission_delete_wiki_pages_attachments: Изтриване на прикачени файлове
permission_view_wiki_edits: Разглеждане на wiki история
permission_add_messages: Публикуване на съобщения
permission_view_messages: Разглеждане на съобщения
permission_manage_files: Управление на файлове
permission_edit_issue_notes: Редактиране на бележки
permission_manage_news: Управление на новини
permission_view_calendar: Разглеждане на календари
permission_manage_members: Управление на членовете (на екип)
permission_edit_messages: Редактиране на съобщения
permission_delete_issues: Изтриване на задачи
permission_view_issue_watchers: Разглеждане на списък с наблюдатели
permission_manage_repository: Управление на хранилища
permission_commit_access: Поверяване
permission_browse_repository: Разглеждане на хранилища
permission_view_documents: Разглеждане на документи
permission_edit_project: Редактиране на проект
permission_add_issue_notes: Добаване на бележки
permission_save_queries: Запис на запитвания (queries)
permission_view_wiki_pages: Разглеждане на wiki
permission_rename_wiki_pages: Преименуване на wiki страници
permission_edit_time_entries: Редактиране на time logs
permission_edit_own_issue_notes: Редактиране на собствени бележки
setting_gravatar_enabled: Използване на портребителски икони от Gravatar
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."
permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "{{value}}'s activity"
label_updated_time_by: "Updated by {{author}} {{age}} ago"
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
text_plugin_assets_writable: Plugin assets directory writable
warning_attachments_not_saved: "{{count}} file(s) could not be saved."
button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value'
permission_edit_own_messages: Редактиране на собствени съобщения
permission_delete_own_messages: Изтриване на собствени съобщения
label_user_activity: "Активност на {{value}}"
label_updated_time_by: "Обновена от {{author}} преди {{age}}"
text_diff_truncated: '... Този diff не е пълен, понеже е надхвърля максималния размер, който може да бъде показан.'
setting_diff_max_lines_displayed: Максимален брой показани diff редове
text_plugin_assets_writable: Папката на приставките е разрешена за запис
warning_attachments_not_saved: "{{count}} файла не бяха записани."
button_create_and_continue: Създаване и продължаване
text_custom_field_possible_values_info: 'Една стойност на ред'
label_display: Display
field_editable: Editable
setting_repository_log_display_limit: Maximum number of revisions displayed on file log
setting_file_max_size_displayed: Max size of text files displayed inline
field_watcher: Watcher
setting_openid: Allow OpenID login and registration
setting_repository_log_display_limit: Максимален брой на показванете ревизии в лог файла
setting_file_max_size_displayed: Максимален размер на текстовите файлове, показвани inline
field_watcher: Наблюдател
setting_openid: Рарешаване на OpenID вход и регистрация
field_identity_url: OpenID URL
label_login_with_open_id_option: or login with OpenID
field_content: Content
label_descending: Descending
label_sort: Sort
label_ascending: Ascending
label_date_from_to: From {{start}} to {{end}}
label_login_with_open_id_option: или вход чрез OpenID
field_content: Съдържание
label_descending: Намаляващ
label_sort: Сортиране
label_ascending: Нарастващ
label_date_from_to: От {{start}} до {{end}}
label_greater_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_reassign_children: Reassign child pages to this parent page
text_wiki_page_nullify_children: Keep child pages as root pages
text_wiki_page_destroy_children: Delete child pages and all their descendants
setting_password_min_length: Minimum password length
field_group_by: Group results by
mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
label_wiki_content_added: Wiki page added
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}.
label_wiki_content_updated: Wiki page updated
mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}.
permission_add_project: Create project
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
label_view_all_revisions: View all revisions
label_tag: Tag
label_branch: Branch
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})"
label_group_plural: Groups
label_group: Group
label_group_new: New group
label_time_entry_plural: Spent time
text_journal_added: "{{label}} {{value}} added"
field_active: Active
enumeration_system_activity: System Activity
permission_delete_issue_watchers: Delete watchers
version_status_closed: closed
version_status_locked: locked
version_status_open: open
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
label_user_anonymous: Anonymous
button_move_and_follow: Move and follow
setting_default_projects_modules: Default enabled modules for new projects
setting_gravatar_default: Default Gravatar image
text_wiki_page_destroy_question: Тази страница има {{descendants}} страници деца и descendant(s). Какво желаете да правите?
text_wiki_page_reassign_children: Преназначаване на страниците деца на тази родителска страница
text_wiki_page_nullify_children: Запазване на тези страници като коренни страници
text_wiki_page_destroy_children: Изтриване на страниците деца и всички техни descendants
setting_password_min_length: Минимална дължина на парола
field_group_by: Групиране на резултатите по
mail_subject_wiki_content_updated: "Wiki страницата '{{page}}' не беше обновена"
label_wiki_content_added: Wiki страница беше добавена
mail_subject_wiki_content_added: "Wiki страницата '{{page}}' беше добавена"
mail_body_wiki_content_added: Wiki страницата '{{page}}' беше добавена от {{author}}.
label_wiki_content_updated: Wiki страница беше обновена
mail_body_wiki_content_updated: Wiki страницата '{{page}}' беше обновена от {{author}}.
permission_add_project: Създаване на проект
setting_new_project_user_role_id: Роля, давана на потребител, създаващ проекти, който не е администратор
label_view_all_revisions: Разглеждане на всички ревизии
label_tag: Версия
label_branch: работен вариант
error_no_tracker_in_project: Няма асоциирани тракери с този проект. Проверете настройките на проекта.
error_no_default_issue_status: Няма установено подразбиращо се състояние за задачите. Моля проверете вашата конфигурация (Вижте "Администрация -> Състояния на задачи").
text_journal_changed: "{{label}} променен от {{old}} на {{new}}"
text_journal_set_to: "{{label}} установен на {{value}}"
text_journal_deleted: "{{label}} изтрит ({{old}})"
label_group_plural: Групи
label_group: Група
label_group_new: Нова група
label_time_entry_plural: Използвано време
text_journal_added: "Добавено {{label}} {{value}}"
field_active: Активен
enumeration_system_activity: Системна активност
permission_delete_issue_watchers: Изтриване на наблюдатели
version_status_closed: затворена
version_status_locked: заключена
version_status_open: отворена
error_can_not_reopen_issue_on_closed_version: Задача, асоциирана със затворена версия не може да бъде отворена отново
label_user_anonymous: Анонимен
button_move_and_follow: Преместване и продължаване
setting_default_projects_modules: Активирани модули по подразбиране за нов проект
setting_gravatar_default: Подразбиращо се изображение от Gravatar
field_sharing: Sharing
label_version_sharing_hierarchy: With project hierarchy
label_version_sharing_system: With all projects
label_version_sharing_descendants: With subprojects
label_version_sharing_tree: With project tree
label_version_sharing_none: Not shared
error_can_not_archive_project: This project can not be archived
button_duplicate: Duplicate
button_copy_and_follow: Copy and follow
label_copy_source: Source
setting_issue_done_ratio: Calculate the issue done ratio with
setting_issue_done_ratio_issue_status: Use the issue status
error_issue_done_ratios_not_updated: Issue done ratios not updated.
error_workflow_copy_target: Please select target tracker(s) and role(s)
setting_issue_done_ratio_issue_field: Use the issue field
label_copy_same_as_target: Same as target
label_copy_target: Target
notice_issue_done_ratios_updated: Issue done ratios updated.
error_workflow_copy_source: Please select a source tracker or role
label_update_issue_done_ratios: Update issue done ratios
setting_start_of_week: Start calendars on
permission_view_issues: View Issues
label_display_used_statuses_only: Only display statuses that are used by this tracker
label_revision_id: Revision {{value}}
label_api_access_key: API access key
label_api_access_key_created_on: API access key created {{value}} ago
label_feeds_access_key: RSS access key
notice_api_access_key_reseted: Your API access key was reset.
setting_rest_api_enabled: Enable REST web service
label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key
button_show: Show
text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject
label_version_sharing_hierarchy: С проектна йерархия
label_version_sharing_system: С всички проекти
label_version_sharing_descendants: С подпроекти
label_version_sharing_tree: С дърво на проектите
label_version_sharing_none: Не споделен
error_can_not_archive_project: Този проект не може да бъде архивиран
button_duplicate: Дублиране
button_copy_and_follow: Копиране и продължаване
label_copy_source: Източник
setting_issue_done_ratio: Изчисление на процента на готови задачи с
setting_issue_done_ratio_issue_status: Използване на състоянието на задачите
error_issue_done_ratios_not_updated: Процентът на завършените задачи не е обновен.
error_workflow_copy_target: Моля изберете тракер(и) и роля (роли).
setting_issue_done_ratio_issue_field: Използване на поле 'задача'
label_copy_same_as_target: Също като целта
label_copy_target: Цел
notice_issue_done_ratios_updated: Обновен процент на завършените задачи.
error_workflow_copy_source: Моля изберете source тракер или роля
label_update_issue_done_ratios: Обновяване на процента на завършените задачи
setting_start_of_week: Първи ден на седмицата
permission_view_issues: Разглеждане на задачите
label_display_used_statuses_only: Показване само на състоянията, използвани от този тракер
label_revision_id: Ревизия {{value}}
label_api_access_key: API ключ за достъп
label_api_access_key_created_on: API ключ за достъп е създаден преди {{value}}
label_feeds_access_key: RSS access ключ
notice_api_access_key_reseted: Вашият API ключ за достъп беше изчистен.
setting_rest_api_enabled: Разрешаване на REST web сървис
label_missing_api_access_key: Липсващ API ключ
label_missing_feeds_access_key: Липсващ RSS ключ за достъп
button_show: Показване
text_line_separated: Позволени са много стойности (по едно на ред).
setting_mail_handler_body_delimiters: Отрязване на e-mail-ите след един от тези редове
permission_add_subprojects: Създаване на подпроекти
label_subproject_new: Нов подпроект
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_locked: Locked
permission_export_wiki_pages: Export wiki pages
label_board_locked: Заключена
permission_export_wiki_pages: Експорт на wiki страници
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
error_unable_delete_issue_status: Unable to delete issue status
label_profile: Profile
permission_manage_subtasks: Manage subtasks
field_parent_issue: Parent task
label_subtask_plural: Subtasks
label_project_copy_notifications: Send email notifications during the project copy
error_can_not_delete_custom_field: Unable to delete custom field
error_unable_to_connect: Unable to connect ({{value}})
error_can_not_remove_role: This role is in use and can not be deleted.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
permission_manage_project_activities: Управление на дейностите на проекта
error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача
label_profile: Профил
permission_manage_subtasks: Управление на подзадачите
field_parent_issue: Родителска задача
label_subtask_plural: Подзадачи
label_project_copy_notifications: Изпращане на Send e-mail известия по време на копирането на проекта
error_can_not_delete_custom_field: Невъзможност за изтриване на потребителско поле
error_unable_to_connect: Невъзможност за свързване с ({{value}})
error_can_not_remove_role: Тази роля се използва и не може да бъде изтрита.
error_can_not_delete_tracker: Този тракер съдържа задачи и не може да бъде изтрит.
field_principal: Principal
label_my_page_block: My page block
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
text_zoom_out: Zoom out
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
label_my_page_block: Блокове в личната страница
notice_failed_to_save_members: "Невъзможност за запис на член(ове): {{errors}}."
text_zoom_out: Намаляване
text_zoom_in: Увеличаване
notice_unable_delete_time_entry: Невъзможност за изтриване на запис на time log.
label_overall_spent_time: Общо употребено време
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
field_member_of_group: Member of Group
field_assigned_to_role: Member of Role
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
label_user_mail_option_only_assigned: Only for things I am assigned to
notice_not_authorized_archived_project: Проектът, който се опитвате да видите е архивиран.
text_tip_issue_end_day: задача, завършваща този ден
field_text: Текстово поле
field_member_of_group: Член на група
project_module_gantt: Мрежов график
text_are_you_sure_with_children: Изтриване на задачата и нейните подзадачи?
text_tip_issue_begin_end_day: задача, започваща и завършваща този ден
setting_default_notification_option: Подразбиращ се начин за известяване
project_module_calendar: Календар
text_tip_issue_begin_day: задача, започваща този ден
button_edit_associated_wikipage: "Редактиране на асоциираната Wiki страница: {{page_title}}"
field_assigned_to_role: Assignee's role
label_principal_search: "Търсене на потребител или група:"
label_user_search: "Търсене на потребител:"
field_visible: Видим
setting_emails_header: Emails header
+3 -4
View File
@@ -676,6 +676,7 @@ bs:
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_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_registration_activation_by_email: aktivacija korisničkog računa email-om
label_registration_manual_activation: ručna aktivacija korisničkog računa
@@ -931,7 +932,5 @@ bs:
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
label_user_mail_option_only_assigned: Only for things I am assigned to
label_principal_search: "Search for user or group:"
label_user_search: "Search for user:"

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