Compare commits

..

258 Commits

Author SHA1 Message Date
Eric Davis 432b00df40 Add documentation about contributing to Redmine with git
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4273 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 17:18:11 +00:00
Eric Davis cac3b1e538 Refactor: split WikiController#edit into #update
update will handle the saving and should be accessed via POST only.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4272 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 16:20:20 +00:00
Jean-Philippe Lang 2fbf7bbcf1 Fixes display of archived child projects on the admin project list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4271 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 15:11:04 +00:00
Jean-Philippe Lang 128c92779c Removes description column from the admin project list to get a better looking project tree.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4270 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 14:57:20 +00:00
Jean-Philippe Lang 2589bec48b Removes duplicate helper introduced in r4072.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4269 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 14:49:46 +00:00
Jean-Philippe Lang f17c990a77 Fixed: "Add file" link broken by recent refactoring (#6627).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4268 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 14:45:02 +00:00
Jean-Philippe Lang b26ba17184 Fixed: "Add news" link broken by recent refactoring (#6650).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4267 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 14:42:38 +00:00
Eric Davis c259ada6e1 Refactor: rename WikiController#index to #show, it's a single resource action
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4266 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-21 16:07:28 +00:00
Eric Davis d3381fb518 Refactor: change :id on WikiController to use :project_id
Using :id to track projects on non-project controllers is confusing and
makes routing with resources difficult.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4265 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-20 21:26:30 +00:00
Jean-Philippe Lang c058bc2245 Remove the Description label from the issue view and omit the block if empty (#6677).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4264 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-19 19:26:07 +00:00
Jean-Philippe Lang f3baa5bfee Fixed: precedes/follows relations no longer update start/due dates (#5803).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4263 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-19 19:16:50 +00:00
Eric Davis 297eb6f81b Refactor: remove WikiController#special
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4262 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-19 15:24:16 +00:00
Eric Davis c06c22cf2e Refactor: extract method from WikiController#special
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4261 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-18 15:27:49 +00:00
Eric Davis fef21d5aa2 Remember the selected "Member of Role" and "Member of Group" options. #6467
Contributed by Yuki Kita

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4260 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-16 00:00:23 +00:00
Eric Davis ce99f3247f Use HTTP DELETE when deleting a time entry. #6674
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4259 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 23:37:01 +00:00
Eric Davis c8177b99ed Revert part of r3936.
link_to_if_authorized no longer supports paths for the link options.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4258 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 23:11:05 +00:00
Eric Davis 5823a71c18 Revert part of r4064.
Having link_to_if_authorized support urls has too many edge cases and isn't
working with sub-uris.  #6195 #6513

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4257 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 23:11:00 +00:00
Eric Davis 06c0e5ad1c Add rake task to send test email. (#6511)
Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4256 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 22:50:33 +00:00
Eric Davis c20308c7ba Remove the translated string. It's definition changed in en
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4255 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 22:41:52 +00:00
Eric Davis 1bfbc012f5 Add rake tasks to add and remove keys in the locales. #6548
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4254 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 22:41:47 +00:00
Eric Davis 0271105794 Refactor: extract #page_index from WikiController#special
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4253 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 15:36:10 +00:00
Eric Davis bbbfd4ee4c Refactor: extract finder to a utility method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4252 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-14 18:01:46 +00:00
Eric Davis e8468b51cc Refactor: extract method in WikiController#special to create a new #export method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4251 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-13 17:13:50 +00:00
Eric Davis 718816c5d4 Refactor: convert timelogs to a REST resource (:time_entries)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4250 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-12 15:55:21 +00:00
Jean-Baptiste Barth 71dd4b8a7d Fixed bad markup in users/general partial
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4249 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-11 20:34:33 +00:00
Eric Davis 435c90eb47 Refactor: extract TimelogController#edit to #update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4248 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-11 15:31:42 +00:00
Eric Davis 700c302fca Change Project#notified_users to check for the 'all' notification option. #6541
The previous mail_notification? check would always pass since the
notifications where converted to strings and strings are always true.

Also changed Project#recipients to use #notified_users instead of duplicated
code.

Based on contribution by Felix Schäfer.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4247 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-10 21:42:24 +00:00
Eric Davis d2986eb98f Correctly update all mail_notification options. #6549
* Need to check for 't' values to support sqlite
* Need to check the membership count for the 'selected' option

Based on patch contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4246 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-10 21:17:15 +00:00
Eric Davis eabf1ff3e7 Add SortHelper so custom queries will run on the Calendar. #6612
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4245 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-10 21:17:10 +00:00
Eric Davis 4acd990ee2 Refactor: extract TimelogController#create from TimelogController#edit
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4244 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-08 15:39:39 +00:00
Eric Davis 84ebd786d6 Fix the Log Time link on an issue page
Contributed by Philippe Lafoucrière (gravis)

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4243 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-08 15:01:20 +00:00
Jean-Baptiste Barth 156eca4d22 Added ability to edit issues from different project through contextual menu (#5332)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4242 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-08 03:09:51 +00:00
Eric Davis 73f12765a9 Don't duplicate users in Issue#assignable_users. From r4240
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4241 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 17:46:37 +00:00
Eric Davis 7798e1b1f7 Allow assigning issues back to the author. #4199
This allows an issue to be reassigned to the author even if they are not
a project member.  Useful when passing back an issue to get more
information from the author.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4240 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 17:28:29 +00:00
Eric Davis 068771ea07 Refactor: extract TimelogController#new from #edit
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4239 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 15:51:09 +00:00
Azamat Hackimov e59156b446 Rename task to issue in calendar (#6563)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4238 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 15:26:53 +00:00
Azamat Hackimov 5592e77fc6 Translation updates
* de (#6598)
* ja (#6508, #6570)
* he (#6569)
* ru
* pt (#6509)
* pt-BR (#6494, #6596)
* sv (#6536)
* zh-TW (#6525)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4237 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 15:19:28 +00:00
Jean-Baptiste Barth b255b7760a Added ability to delete issues from different projects through contextual menu (#5332)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4236 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 05:11:28 +00:00
Eric Davis 2ecca7e4df Refactor: rename TimelogController#details to #index
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4235 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-06 18:23:45 +00:00
Jean-Baptiste Barth c43ef6e769 Code cleanup: renamed variables in User#allowed_to? with explicit names
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4234 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-06 05:08:38 +00:00
Jean-Baptiste Barth e59c927ee5 Fixed: User#allowed_to? returning true in any case if array of projects had only one item (#5332)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4233 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-06 05:08:31 +00:00
Eric Davis e13790c62c Refactor: extract TimelogController#report to a new controller class
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4232 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-05 16:07:17 +00:00
Eric Davis a034172b24 Refactor: convert UsersController to resource
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4231 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-04 15:36:16 +00:00
Eric Davis 86ba692bf5 Refactor: split UsersController#edit into #edit and #update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4230 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-30 18:22:46 +00:00
Eric Davis d06a1a7fa4 Refactor: rename UsersController#add to #new
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4229 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-29 16:00:45 +00:00
Jean-Baptiste Barth 4853dd97fd Splitted #find_issues filter in ApplicationController to #find_issues and #check_project_uniqueness (#5332)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4228 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-29 05:22:53 +00:00
Jean-Baptiste Barth e8f3dd07dd Added ability to specify multiple projects in User#allowed_to? (#5332)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4227 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-29 05:22:45 +00:00
Eric Davis fda1a0cb3b Fix test failure from Setting changes in other tests
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4226 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-29 03:02:23 +00:00
Eric Davis a04e1bd582 Locale update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4225 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 22:15:56 +00:00
Eric Davis 747b9ec568 Refactor: move method to model
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4224 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 22:13:11 +00:00
Eric Davis 437690119b Allow admins to edit user's email notifications and preferences. #3503
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4223 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 22:13:06 +00:00
Eric Davis 26ef9da02b Changed the notifications to use a hierarchy UI
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4222 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 21:09:06 +00:00
Eric Davis 4c9f261a24 Added three new notifiable events based on issue attributes
* issue_note_added
* issue_status_updated
* issue_priority_updated

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4221 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 20:20:00 +00:00
Eric Davis 244e94de80 Refactor the hardcoded event actions (notifiables) to use a class
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4220 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 20:19:55 +00:00
Eric Davis 582ed86d82 Add a default mail notification setting for new users
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4219 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 18:36:50 +00:00
Eric Davis c059300d99 Added User#notify_about? to check when a user should be notified about an event
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4218 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 18:22:10 +00:00
Eric Davis a61ee73e69 Added tests for Issue#recipients
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4217 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 18:22:05 +00:00
Eric Davis 0316af7f6b Converted User#mail_notification from a boolean to a string.
The string will now store which type of notification option to use.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4216 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 18:22:00 +00:00
Eric Davis 3a3263102a Refactor: split UsersController#add into #add and #create
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4215 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 15:28:50 +00:00
Eric Davis 79e30e7087 Refactor: convert News to a REST resource
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4214 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-27 16:51:12 +00:00
Eric Davis 0a224e8bb1 Bump version to 1.0.2
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4210 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:39:50 +00:00
Eric Davis d3517e87e5 Update changelog for the 1.0.2 release
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4209 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:39:44 +00:00
Eric Davis ffb3d9260a Support leading and trailing spaces in filenames or directories in the git adapter. #6499
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4189 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 21:54:52 +00:00
Eric Davis bd51119460 Support spaces in the files or directories in the git adapter. #6054
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4188 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 19:07:46 +00:00
Eric Davis 319849caf8 Parse the timezone in #last_rev for git to correct display the Age diplay. #6346
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4187 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 18:41:06 +00:00
Eric Davis 83e0be5d07 Fixes reverting an issue to a status with a done_ratio of 0%. #5170
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4186 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 18:13:31 +00:00
Eric Davis 76fcf136d0 Redirect to project settings after copying a project. #6443
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4185 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 18:04:54 +00:00
Eric Davis 83bfb8cd2b Revert "Fixed: gantt broken when no due date on project issues and versions."
It broke the tests for overdue projects and isn't a good way to fix #6350
because it makes an assumption that a project is due Today and will still
error if issue tracking is disabled.

This reverts commit a7fd592db4. (r4178)

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4184 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 17:35:18 +00:00
Eric Davis 768d67f27b Workaround for i18n 0.4.x with the old style syntax. #6428 #5608
This will also silance the whole trace with the deprecation warning.

Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4183 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 17:13:52 +00:00
Eric Davis 1781d87477 Add documentation about setting the log level. #6135
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4182 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 16:54:38 +00:00
Jean-Baptiste Barth 2f380a7985 Fixed: don't reset watchers when changing tracker. #6479
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4181 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 13:52:25 +00:00
Azamat Hackimov b3c5bf3f2e Translation updates
* pt-BR (#6490)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4180 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 13:47:56 +00:00
Jean-Philippe Lang 7a952136e0 Project tests updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4179 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 08:24:51 +00:00
Jean-Philippe Lang a7fd592db4 Fixed: gantt broken when no due date on project issues and versions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4178 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 08:16:05 +00:00
Jean-Philippe Lang e9686cbbe5 Fixed: error on mail notification when adding an invalid file (#6452).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4177 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 08:07:41 +00:00
Jean-Philippe Lang 53b131ba2a Fixes broken filter clearing links on gantt and calendar (#6473).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4176 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 07:51:10 +00:00
Azamat Hackimov 02b7423b73 Translation updates
* cs (#6471)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4175 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-24 18:04:32 +00:00
Eric Davis deed1b949d Refactor: move NewsController#preview to PreviewsController#news
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4174 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-24 16:26:46 +00:00
Azamat Hackimov 20305418f4 Translation updates
* cs (#6471)
* ja (#6465)
* zh-TW (#6466)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4173 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-23 16:23:39 +00:00
Eric Davis 401197a895 Refactor: move #destroy_comment method to CommentsController#destroy
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4172 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-23 15:20:19 +00:00
Azamat Hackimov 4948121af0 Translation update
* ru


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4171 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-22 19:45:30 +00:00
Eric Davis 1f2f953687 Refactor: move NewsController#add_comment to CommentsController#create
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4170 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-22 16:25:09 +00:00
Azamat Hackimov 3b20774c54 New string to translate - field_text. It appear when you trying save empty wiki-page. See #6448 for reference.
Translation updates
* ja (#6441)
* ru
* zh-TW (#6451)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4169 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-22 16:06:29 +00:00
Eric Davis 01d1a02df4 Refactor: split NewsController#edit into #edit and #update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4168 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-21 15:20:37 +00:00
Eric Davis 51359704a0 Added a users options to the reminders email
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4167 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 23:17:51 +00:00
Eric Davis 55fbf6836b Document render_issue_tooltip
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4166 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 18:50:14 +00:00
Eric Davis a09a39402e Add view_issues_form_details_top hook
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4165 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 18:50:09 +00:00
Eric Davis 6a76aef375 Add User#allowed_to_globally? which wraps User#allowed_to?
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4164 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 16:38:00 +00:00
Eric Davis 3bc29e29e0 Refactor: split NewsController#new into #new and #create methods.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4163 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 15:13:48 +00:00
Eric Davis 1a4f5e87f2 Add scm.css to news pages to allow proper syntax highlighting. #6270
Contributed by Holger Just.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4107 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 02:55:37 +00:00
Eric Davis e58513c976 Fix failing test.
See http://ci.finn.de/builds/1-8-7_redmine-trunk_postgres/4100

Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4106 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 02:55:32 +00:00
Eric Davis f62a1827f3 Updated issue delete confirmation when it has child issues. #6191
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4105 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 02:55:26 +00:00
Eric Davis 1809eefe4c Use the correct local variables in the PDF export. #6382
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4104 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 02:55:20 +00:00
Eric Davis 09331ec432 Turn on ssl Gravatars for all SSL requests. #5929
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4103 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 02:55:14 +00:00
Azamat Hackimov 944d1a68bd Translations update
* ru
* zh-TW (#6365)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4102 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-19 12:00:23 +00:00
Jean-Baptiste Barth 81a28e9ffa Adds a link to edit the associated wiki page on the version view. #4416
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4101 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-18 17:30:22 +00:00
Jean-Baptiste Barth 099761d8fb Fixes switching between inline and side-by-side in diff view with path. #6242
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4100 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-18 16:50:08 +00:00
Jean-Baptiste Barth ffdaead5b7 Removed file mistakenly added in r4092. #6392
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4099 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 23:13:26 +00:00
Eric Davis 5fdfe02b3a Refactor: add VersionsController#status_by to the resource.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4098 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 16:11:43 +00:00
Eric Davis bd193a026d Refactor: convert VersionsController to a REST resource.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4097 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 15:55:08 +00:00
Eric Davis eb1f58f962 Added some documentation about the Rails Logger. #6135
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4096 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 04:31:17 +00:00
Eric Davis b8ea556616 Fix the new subproject link on project overview. #6388
Contributed by Felix Schäfer.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4095 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 04:22:46 +00:00
Eric Davis ebb445c364 Use the relative_url_root when generating asset_paths. #3935
Contributed by Daniel S from Redmine.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4094 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 04:06:40 +00:00
Jean-Baptiste Barth 35dba0f412 Fixed: pressing enter in filters should result to an 'apply', not a 'save'. #2285
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4093 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-16 21:33:49 +00:00
Jean-Baptiste Barth 0d967c0572 Fix links to activity pages broken with r4047. #6392
Contributed by Felix Schafer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4092 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-16 21:26:30 +00:00
Jean-Baptiste Barth c4d44af54c Fixed non standard SQL syntax. #6413
Contributed by Juan G

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4091 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-16 19:28:04 +00:00
Eric Davis 969bf2107b Refactor: split VersionsController#new into #new and #create
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4090 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-16 18:27:33 +00:00
Eric Davis bde8ab84f2 Use the full path to the partials
When trying to use the issue form in a plugin, it would try to use the
relative path to the partials which were incorrect.

  Example: would render 'my_plugin_views/attributes'

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4089 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-15 22:43:30 +00:00
Eric Davis be6e0927f3 Refactor: Split VersionsController#edit into #edit and #update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4088 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-15 16:50:25 +00:00
Eric Davis cdfc57d544 Change the TimelogController's to/from dates based on the project time entries
Instead of looking for the earliest and latest time entry system wide for the
dates in the form, now TimelogController will only look at the time entries
for the current project (and parent/sub projects).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4087 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-14 19:02:25 +00:00
Eric Davis 8900797ada Refactor: move method to Model.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4086 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-14 19:02:20 +00:00
Eric Davis 1b90703157 Refactor: convert FilesController to a restful resource.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4085 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-14 16:24:07 +00:00
Eric Davis 41c055363e Refactor: split FilesController#new into #new and #create.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4084 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-13 20:35:03 +00:00
Jean-Baptiste Barth 12e10f6956 Fixed "Create and continue" redirection broken by recent changes. #6333
IssuesController#create is no more scoped under project, but
IssuesController#new is, so we need to precise project_id
when redirecting to "New issue" form.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4083 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-11 20:21:27 +00:00
Jean-Baptiste Barth 4b69a895df Fixed broken context_menu on roadmap. #6351
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4082 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-11 14:00:23 +00:00
Azamat Hackimov f2a8057d63 Translations update
* ja (#6363)
 * ko (#6307)
 * po (#6458)
 * pt-BR (#6316)
 * ru
 * sr and sr-YU (#6339)
 * zh-TW (#6306)
New strings to translate
 * field_member_of_group (r4077)
 * field_assigned_to_role (r4078)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4081 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-11 11:16:56 +00:00
Eric Davis 878bb55522 Refactor: move method to Project#css_classes
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4080 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 23:07:10 +00:00
Eric Davis d36700eeee Refactor: replace chained finders with an inject. Should handle edge cases better.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4079 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 19:53:57 +00:00
Eric Davis 41f8d043eb Added a "Member of Role" to the issues filters. #5869
This filter will check an issue's assigned to field for users who have
(or don't have) a specific Role(s).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4078 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 19:44:45 +00:00
Eric Davis 109b42f482 Added a "Member of Group" to the issues filter. #5869
This filter will check an issue's assigned to field for users in (or not in)
specific groups.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4077 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 18:46:29 +00:00
Eric Davis 4c656fcffc Define Principal#name so all subclasses will have some sort of name when printed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4076 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 18:46:23 +00:00
Eric Davis 3a2efb4757 Refactor: convert ProjectEnumerations to a resource on a project.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4075 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 16:00:49 +00:00
Eric Davis 5e1c295230 Fixed the zoom, previous, and next links on the Gantt chart.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4074 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 03:09:18 +00:00
Eric Davis abf3ee4999 Add project names to the Versions in the Gantt export. #5904
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4073 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 03:09:11 +00:00
Eric Davis bdb3937e0f Rewrite the Gantt chart. #6276
This version of the Gantt chart supports nested charts. So Projects,
Versions, and Issues will be nested underneath their parents correctly.

Additional features:

* Move all Gantt code to Redmine::Helpers::Gantt class instead of having it in
  the Gantt class, controller, and view
* Recursive and nest sub-projects
* Recursive and nest versions
* Recursive and nest issues
* Draw a line showing when a Project is active and it's progress
* Draw a line showing when a Version is active and it's progress
* Show a version's % complete
* Change the color of Projects, Versions, and Issues if they are late or
  behind schedule
* Added Project#start_date and #due_date
* Added Project#completed_percent
* Use a mini-gravatar on the Gantt chart
* Added tests for the Gantt rendering

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4072 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 03:09:02 +00:00
Eric Davis 8d52608dba Refactor: convert the Projects routes to resources.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4071 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-09 18:57:21 +00:00
Eric Davis bf7476af5b Refactor: split method ProjectsController#edit to ProjectsController#update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4070 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-08 16:01:51 +00:00
Eric Davis 2295b61cb6 Refactor: rename method ProjectsController#add to ProjectsController#new
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4069 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-07 15:00:27 +00:00
Eric Davis 06878e5004 Change project add form to use #create. (From r4067)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4068 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 15:09:52 +00:00
Eric Davis 763ab07942 Refactor: split ProjectsController#add into #add (GET) and #create (POST).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4067 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 14:53:08 +00:00
Eric Davis 9da4ee5fcc Allow user password changes when changing to Internal authentication. #6267
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4066 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 01:02:52 +00:00
Eric Davis 270b559d36 Refocus the related issue field after submitting an issue. #6275
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4065 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 00:48:44 +00:00
Eric Davis d771fa9289 Change link_to_if_authorized to allow url paths. (Fixes #6195)
Both url paths (/issues/1234) and params hashes (:controller => 'issues')
are now supported by link_to_if_authorized.  The authorize_for method
requires a controller/action pair so urls need to be parsed against the
routes to find their controller/action.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4064 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 00:26:08 +00:00
Eric Davis 563c879e44 Use the built in Rails ActionView::TestCase for testing helpers.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4063 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 00:26:02 +00:00
Eric Davis db11030410 Refactor: move method to model. (references r4057)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4062 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-05 22:57:20 +00:00
Azamat Hackimov cbe266079e Added string "cant_link_an_issue_with_a_descendant" to translations missed in #443
Solves #6278


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4061 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-05 13:01:38 +00:00
Azamat Hackimov c5071cd091 Translation updates:
* ca (#6263)
* nl (#6248)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4060 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-05 11:33:08 +00:00
Jean-Baptiste Barth a9f5a17c67 Do not display items without valid selection in context menu when on different projects. #4998
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4059 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 21:43:07 +00:00
Jean-Baptiste Barth c799d03ece Added missing tests for User#allowed_to? #6291
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4058 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 20:16:00 +00:00
Jean-Baptiste Barth b6d9f2bddf Add css classes to journals display to facilitate theming
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4057 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 20:05:51 +00:00
Jean-Baptiste Barth 4776a5a427 Hide checkboxes in issues list when printing
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4056 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 19:59:49 +00:00
Jean-Baptiste Barth a2ce6e236c Allow mass status update through context menu. #3411
NB: it cannot be done with issues from different projects, same as
other fields. This will be addressed separately, see #5332.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4055 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 19:54:24 +00:00
Eric Davis c1068bf0cd Refactor: move method, ProjectsController#reset_activities to ProjectEnumerationsController#destroy.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4054 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 15:04:03 +00:00
Eric Davis 83b4343d2d Refactor: move method, ProjectsController#save_activities to ProjectEnumerationsController#save
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4053 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-02 17:39:56 +00:00
Eric Davis b5e90972d8 Refactor: move method, ProjectsController#add_file to FilesController#new.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4052 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-01 15:17:45 +00:00
Eric Davis daa8eaa9ae Refactor: move method, ProjectsController#list_files to FilesController#index.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4051 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-31 15:12:58 +00:00
Eric Davis a188abbe28 Refactor: move method, ProjectsController#roadmap to VersionsController#index.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4050 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-30 15:30:28 +00:00
Azamat Hackimov 1ebb0d9cae Translation updates
* mk (#6208)
* sv (#6210)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4049 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-29 12:54:04 +00:00
Eric Davis f92dcdf50a Allow setting an issue's notes via params[:issue][:notes]. (XML API)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4048 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-27 20:08:59 +00:00
Eric Davis b925325ddb Refactor: extract ProjectsController#activity to a new Activities controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4047 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-27 14:05:54 +00:00
Eric Davis 5b08b2f33d Refactor: extract common code to link_to_month.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4046 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:37:26 +00:00
Eric Davis 30821586cb Add the project_id to the Calendar link to month.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4045 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:37:21 +00:00
Eric Davis ab1e74d16c Refactor: extract target link generation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4044 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:37:16 +00:00
Eric Davis 91380eeaab Refactor: extract ternary operators to temps.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4043 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:37:11 +00:00
Eric Davis 3eea03d70e Refactor: extract link to previous and next month into helpers.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4042 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:37:05 +00:00
Eric Davis 56e984b5e7 Refactor: convert many of the custom Issue routes to REST resources.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4041 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:36:59 +00:00
Eric Davis daa4272c0e Refactor: extract method in bulk_update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4040 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-25 14:59:16 +00:00
Azamat Hackimov bc951a9d4f remove BOM from zh-TW
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4039 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-24 16:15:14 +00:00
Azamat Hackimov 2e2241cf84 Translation updates
* de (#6198)
* ja (#6189)
* zh-TW (#6197)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4038 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-24 15:32:11 +00:00
Eric Davis 80256cf298 Refactor: extract #bulk_update method from IssuesController#bulk_edit.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4037 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-24 15:27:12 +00:00
Azamat Hackimov 95673a9ee4 Adding missed new strings for #6153:
*  project_module_gantt: Gantt
*  project_module_calendar: Calendar


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4036 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-23 19:39:35 +00:00
Eric Davis dfcb5a666f Updated permissions for r4034
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4035 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-23 15:32:57 +00:00
Eric Davis b67b3820a1 Refactor: move IssuesController#changes to JournalsController#index.
Since #changes is only an Atom feed of journals of a query, it makes
more sense to have it on the JournalsController resource.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4034 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-23 15:04:36 +00:00
Eric Davis 5b4bd8a59a Sure hope 1.0.1 wasn't released in 201,008 AD...
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4029 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:17:44 +00:00
Eric Davis 22fa8d9b31 Bump version to 1.0.1
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4028 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:15:38 +00:00
Eric Davis dcd2204786 Updated changelog for 1.0.1
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4027 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:15:33 +00:00
Eric Davis 05527be943 Add RTL support to the context menu. #6012
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4014 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:12:21 +00:00
Eric Davis fc9b984cc1 Treat Calendar and Gantt pages as separate modules. #6153
This will let the Issue Tracking, Gantt, and Calendar modules be enabled
or disabled as needed.  A database migration will enable the Gantt and
Calendar for all existing projects that have Issue Tracking enabled.

Contributed by Adam Soltys

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4013 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 18:42:00 +00:00
Eric Davis 7e565eed34 Fix the calendar link in the Issues sidebar. #5591
Contributed by Andrew Rudenko

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4012 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 18:30:26 +00:00
Eric Davis dfd1d0c7fe Refactor: merge IssuesController#update_form into IssuesController#new
The #update_form action was only refreshing the issue attributes form,
so it's just a specialized JavaScript version of #new.  This also removed
old code that was extracted in other places (@issue.new_statuses_allowed_to).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4011 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-20 15:22:19 +00:00
Eric Davis 9696557897 Fix the mock_file test helper.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4010 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 22:24:42 +00:00
Eric Davis e4c5a91d0e Refactor: extract Members Box to partial.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4009 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 22:24:37 +00:00
Azamat Hackimov 1c53668bc9 Remove dublicate string
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4008 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 19:47:55 +00:00
Azamat Hackimov af58531482 Localisation updates: New string to fix #5162
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4007 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 18:50:18 +00:00
Eric Davis 1fcc1bdc89 Refactor: move IssuesController#context_menu to a new controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4006 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 18:16:54 +00:00
Azamat Hackimov 57372d9d8e Real RTL-theme support in locales (#6012)
Now each locale-file have direction string (ltr - left-to-right - by default).


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4005 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 16:57:44 +00:00
Azamat Hackimov eefb36177d Fixing #6009
Added to all locales required strings.


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4004 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 16:35:51 +00:00
Azamat Hackimov 01788e83e7 Translation updates for upcoming release
* de (#6079)
* es (#6021)
* it (#6093)
* nl (#6025)
* ru
* sr and sr-YU (sr is now serbian cyrillic, #6078)
* sv (#6142)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4003 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 15:41:09 +00:00
Eric Davis 782a5f1218 Add Issue Status to the tooltip. #6169
Contributed by Nick Peelman

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3952 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 03:43:33 +00:00
Eric Davis fc6e7f12b7 Small test refactoring, extract method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3951 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 01:28:33 +00:00
Eric Davis a256e4b1dc Scope the calendar popup CSS so it doesn't conflict with the Calendar menu. #6163
Contributed by Adam Soltys

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3950 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 01:13:50 +00:00
Eric Davis 73ba49a715 Use the base layout for all 403, 404, and 500 pages. #6172
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3949 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 01:01:35 +00:00
Eric Davis c090d115e2 Added a rake task to display permissions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3948 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-18 17:23:23 +00:00
Eric Davis e6e21046c0 No more IssuesController#preview action.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3947 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-18 15:03:42 +00:00
Eric Davis 1f8d396e3f Refactor: move IssuesController#preview to a new controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3946 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-18 15:01:35 +00:00
Eric Davis 3eff27344b Refactor: move IssuesController#auto_complete to a new controller. #4382
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3945 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-17 15:03:58 +00:00
Eric Davis e63acb70ca Add the Calendar as a project menu item.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3944 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-16 23:56:42 +00:00
Eric Davis a24f448dc0 Add the Gantt chart as a project menu item
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3943 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-16 23:56:37 +00:00
Eric Davis d2b0a51848 Allow key authentication for Boards. #6132
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3942 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-16 23:39:27 +00:00
Eric Davis 22c978ad94 Refactor: move IssuesController#reply to JournalsController
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3941 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-16 16:25:04 +00:00
Eric Davis 13fe01a185 Refactor: pull up method to ApplicationController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3940 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-13 14:59:04 +00:00
Jean-Baptiste Barth 32f6fa5b00 Fixed: changing view style in repository/diff doesn't keep previously selected file. #6045
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3939 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-13 06:09:38 +00:00
Eric Davis f18b126fba Refactor: Pull up method to ApplicationController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3938 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-12 13:57:51 +00:00
Eric Davis a6112ef40d Fix path to test_helper
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3937 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-12 13:57:46 +00:00
Eric Davis ff43bb1a74 Refactor: Extract a new IssueMovesController from IssuesController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3936 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-11 14:42:10 +00:00
Jean-Baptiste Barth e43f9fc21e Show projects depending on their visibility in user's profile. #6100
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3935 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-10 23:07:44 +00:00
Jean-Baptiste Barth 0cfa757db0 Added a warning when a new user or group membership is invalid. #3834
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3934 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-10 22:37:00 +00:00
Jean-Baptiste Barth 83e4cf3dd4 Prevent 500 error on login when there's a typo in OpenID URI scheme, such as http;// or http.//
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3933 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-10 21:12:32 +00:00
Eric Davis 52c624aabd Refactor: extract method from #move and #perform_move.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3932 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-10 15:11:11 +00:00
Eric Davis 424b482579 Refactor TimelogController#report's joins and provide a hook to add more.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3931 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-09 23:15:32 +00:00
Eric Davis a1b89a53eb Refactor: extract POST version of IssuesController#move to #perform_move.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3930 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-09 14:53:23 +00:00
Jean-Baptiste Barth e00884bcca Removed hard-coded english error message on failed Member creation
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3929 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-09 05:10:00 +00:00
Jean-Baptiste Barth 56e3953a71 Removed useless debug code. #5978
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3928 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-08 20:26:33 +00:00
Jean-Baptiste Barth 56a6d86af5 Added project filter when viewing all issues. #5084
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3927 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-08 09:01:25 +00:00
Jean-Baptiste Barth bc5d32d6de Replace Test::Unit::TestCase with ActiveSupport::TestCase. #5477
Contributed by Alexey Palazhchenko

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3926 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-08 07:07:38 +00:00
Jean-Baptiste Barth 780bdccc42 Fixed wrong commit range in git log command. #5628
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3925 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-08 07:07:30 +00:00
Jean-Baptiste Barth a1b607480a Refactor: added link_to_project helper to handle links to projects
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3924 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-08 07:07:20 +00:00
Eric Davis 5b64f0ff96 Updated changelog format to use lists.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3923 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-07 15:11:31 +00:00
Eric Davis 2e14ba95a0 Add static docs to YARD.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3922 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-07 15:11:26 +00:00
Eric Davis 2c79572e4b Save yard doc to the doc/app directory.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3921 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-07 15:11:21 +00:00
Eric Davis 7a3dcdc67f Exclude test files from YARD.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3920 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-07 15:11:15 +00:00
Eric Davis ab546a14cb Add a rake task to run CI.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3919 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-06 20:46:44 +00:00
Eric Davis 041bca6ac9 Refactor: start to split IssuesController#move into two separate actions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3918 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-06 15:47:27 +00:00
Eric Davis e4af6e77a7 Refactor: extract method in IssuesController#move.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3917 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-05 17:43:07 +00:00
Jean-Baptiste Barth 0bcde4ab28 Fixed: assigned_to and author filters in cross project issues view should be based on user's project visibility. #5760
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3916 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 21:01:56 +00:00
Jean-Baptiste Barth 8a2bc5772e Focus on the input when adding a related issue on issues/show page. #4656
Contributed by Edouard Briere

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3915 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 20:52:31 +00:00
Jean-Baptiste Barth 491c9d2b55 Display projects as links in users/memberships partial. #5898
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3914 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 20:41:32 +00:00
Eric Davis 70973fda64 Fix a few requires for metric_fu's rcov.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3913 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 15:04:30 +00:00
Eric Davis 8c79385261 Refactor: extract back_url method to ApplicationController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3912 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 13:37:44 +00:00
Eric Davis a544a1e57c Added css classes to the HTML body based on the theme, controller, and action. #819
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3911 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 01:17:45 +00:00
Eric Davis 07cd12978e Add maxlength attributes to some Project fields. #4896
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3910 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 00:59:15 +00:00
Eric Davis 6f3ae29522 Use the MenuManager for the Administration menu. #6008
Contributed by Jean-Baptiste Barth.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3909 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 00:38:22 +00:00
Eric Davis 6e14b8a6af Remove extra css like the border on revision links in Associated Revisions. #5971
Contributed by Holger Just.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3908 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 00:27:41 +00:00
Eric Davis 16969fdbbb Show the number of days in the subject line of Reminder emails.
i18n check needed.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3907 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-03 16:01:53 +00:00
Eric Davis 13234f8552 Refactor: Add methods to User to edit the encapsulate the status field.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3906 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-03 15:26:50 +00:00
Eric Davis 25037b841b Refactor: extract method to shoulda macro.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3905 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-02 15:43:04 +00:00
Eric Davis d3158e37b9 Added tests for AccountController#register POST with automatic registration.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3904 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-02 15:42:59 +00:00
Eric Davis 5c525f0b41 Added tests for AccountController#register GET.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3903 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-02 15:42:54 +00:00
Eric Davis ca663fcd10 Use image_path for the favicon instead to pick up asset hosts. #3301
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3899 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-30 19:18:33 +00:00
Azamat Hackimov dbb8645353 RTL theme for reference (thanks to Orgad Shaneh, #5972)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3898 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-29 15:48:53 +00:00
Azamat Hackimov 702b7296a0 Translation updates
* de (#5982)
* zh (#5910) - revert last commit & new string


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3897 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-29 15:47:38 +00:00
Eric Davis 5f20bc240e Add a favicon link with support for suburi. #3301
Contributed by Yuki Kita and Christian Boenning

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3894 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-29 14:58:33 +00:00
Azamat Hackimov 2a85a1cebf Translation updates
* de (#5982)
* he (#5972)
* hu (#5962)
* zh (#5910)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3893 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-28 20:05:06 +00:00
Jean-Philippe Lang 4f2d1b7424 Fixed: Vertical scrollbar always visible in Wiki "code" blocks in Chrome (#5861).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3891 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 12:56:57 +00:00
Jean-Philippe Lang db55ea8cb3 Moves LDAP entry in admin menu.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3889 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 12:48:28 +00:00
Jean-Philippe Lang e1c3415795 Fixes context menu broken by r3869 (#5925).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3887 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:55:57 +00:00
Jean-Philippe Lang 701d2eaeac Display project names in cross-project gantt PNG (#5904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3885 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:43:19 +00:00
Jean-Philippe Lang bdad35a736 Display project names for versions too on PDF (#5904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3884 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:19:44 +00:00
Jean-Philippe Lang cb5e63d846 Display project names in cross-project gantt PDF (#5904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3883 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:10:08 +00:00
Jean-Philippe Lang c47d23a87b Fixed: Deleting statuses doesn't delete all workflow entries (#5811).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3881 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:48:27 +00:00
Jean-Philippe Lang 73d9368039 Fixed: Add Another file to ticket doesn't work in IE (broken by r3750).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3879 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:34:55 +00:00
Jean-Philippe Lang 91f7cbb79d Fixed: Forum message permalinks don't take pagination into account (#5945).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3877 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:02:12 +00:00
Jean-Philippe Lang 72ce4f3ab9 Harmonize french locale "zero" translation with other locales (#5937).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3875 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:54:59 +00:00
Jean-Philippe Lang 66820dbed3 Strips user email (#5834).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3873 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:50:41 +00:00
Jean-Philippe Lang fd0623bf69 Fixes broken status change in context menu (#5892).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3871 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:47:37 +00:00
Jean-Philippe Lang 379c0a1dd4 Disable priority (#5925) and progress in context menu for parent issues.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3869 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:38:54 +00:00
Jean-Philippe Lang fe63eefc1f Adds missing visibility scope.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3866 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:29:46 +00:00
Jean-Philippe Lang a9a4e0d6b8 Moves code to controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3865 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:29:17 +00:00
Azamat Hackimov 7f49f07e9a Try to resolve bug #3922
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3864 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-24 10:26:53 +00:00
Azamat Hackimov 90490c92a0 Translation updates
* fr (#5912)
* ru
* zh (#5910)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3863 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-24 09:47:31 +00:00
Eric Davis a628b0f186 Force-clear the default value for migration from :string to :text. #5846 #5771
This is a special case for MySQL in Win32.

Contributed by Holger Just.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3860 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-24 00:19:32 +00:00
Eric Davis 4fef8b601d Added icon for the LDAP authentication menu item. #5775
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3859 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-20 23:50:15 +00:00
Eric Davis fa8d0c5c6f Bump version to 1.0.0
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3854 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 16:35:43 +00:00
Eric Davis 854ba2a8d2 Adding 1.0.0's release date.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3853 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 16:35:37 +00:00
Eric Davis c087e6f895 Readme update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3849 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 15:49:24 +00:00
Eric Davis 6807d070da Updated the INSTALL and UPGRADING documents for the 1.0 release.
Contributed by Mischa The Evil

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3848 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 15:19:04 +00:00
Azamat Hackimov 09a681db8b Translation updates
* ru 
* sv (#5740)
* pt-BR (#5785)
* zh (#5158, #5883)
* zh-TW (#5735)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3847 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 16:47:00 +00:00
Eric Davis 9cfa15917d Added an official favicon.ico
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3845 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 03:45:50 +00:00
178 changed files with 4759 additions and 1885 deletions
+17 -7
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, :global => global)
allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project || @projects, :global => global)
allowed ? true : deny_access
end
@@ -169,6 +169,13 @@ 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
@@ -206,16 +213,19 @@ 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
if projects.size == 1
@project = projects.first
else
@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
# 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
+6 -1
View File
@@ -8,6 +8,8 @@ class CalendarsController < ApplicationController
helper :projects
helper :queries
include QueriesHelper
helper :sort
include SortHelper
def show
if params[:year] and params[:year].to_i > 1900
@@ -32,8 +34,11 @@ class CalendarsController < ApplicationController
@calendar.events = events
end
render :layout => false if request.xhr?
render :action => 'show', :layout => false if request.xhr?
end
def update
show
end
end
+36
View File
@@ -0,0 +1,36 @@
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
+7 -3
View File
@@ -16,17 +16,21 @@ class ContextMenusController < ApplicationController
@projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
@can = {:edit => User.current.allowed_to?(:edit_issues, @projects),
:log_time => (@project && User.current.allowed_to?(:log_time, @project)),
:update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
:update => (User.current.allowed_to?(:edit_issues, @projects) || (User.current.allowed_to?(:change_status, @projects) && !@allowed_statuses.blank?)),
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
:delete => User.current.allowed_to?(:delete_issues, @projects)
}
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
+12 -13
View File
@@ -1,7 +1,7 @@
class FilesController < ApplicationController
menu_item :files
before_filter :find_project
before_filter :find_project_by_project_id
before_filter :authorize
helper :sort
@@ -19,19 +19,18 @@ 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
+9 -19
View File
@@ -4,6 +4,7 @@ class GanttsController < ApplicationController
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
helper :gantt
helper :issues
helper :projects
helper :queries
@@ -14,33 +15,22 @@ class GanttsController < ApplicationController
def show
@gantt = Redmine::Helpers::Gantt.new(params)
@gantt.project = @project
retrieve_query
@query.group_by = nil
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
@gantt.query = @query if @query.valid?
basename = (@project ? "#{@project.identifier}-" : '') + 'gantt'
respond_to do |format|
format.html { render :action => "show", :layout => !request.xhr? }
format.png { send_data(@gantt.to_image(@project), :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") }
format.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") }
end
end
def update
show
end
end
+1 -1
View File
@@ -1,6 +1,6 @@
class IssueMovesController < ApplicationController
default_search_scope :issues
before_filter :find_issues
before_filter :find_issues, :check_project_uniqueness
before_filter :authorize
def new
+7 -3
View File
@@ -21,6 +21,7 @@ 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]
@@ -47,6 +48,7 @@ class IssuesController < ApplicationController
include SortHelper
include IssuesHelper
helper :timelog
helper :gantt
include Redmine::Export::PDF
verify :method => [:post, :delete],
@@ -192,8 +194,10 @@ class IssuesController < ApplicationController
# Bulk edit a set of issues
def bulk_edit
@issues.sort!
@available_statuses = Workflow.available_statuses(@project)
@custom_fields = @project.all_issue_custom_fields
@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}
end
def bulk_update
@@ -240,7 +244,7 @@ class IssuesController < ApplicationController
end
@issues.each(&:destroy)
respond_to do |format|
format.html { redirect_to :action => 'index', :project_id => @project }
format.html { redirect_back_or_default(:action => 'index', :project_id => @project) }
format.xml { head :ok }
format.json { head :ok }
end
+3 -7
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] == 'all')
@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
@@ -66,12 +66,8 @@ class MyController < ApplicationController
return
end
end
@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')
@notification_options = @user.valid_notification_options
@notification_option = @user.mail_notification #? ? 'all' : (@user.notified_projects_ids.empty? ? 'none' : 'selected')
end
# Manage user's password
+16 -27
View File
@@ -18,10 +18,10 @@
class NewsController < ApplicationController
default_search_scope :news
model_object News
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_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_optional_project, :only => :index
accept_key_auth :index
@@ -46,49 +46,38 @@ 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
if request.post? and @news.update_attributes(params[:news])
end
def update
if request.put? and @news.update_attributes(params[:news])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'show', :id => @news
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'
render :action => 'edit'
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,6 +16,11 @@ 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
before_filter :find_project_by_project_id
before_filter :authorize
def save
if request.post? && params[:enumerations]
def update
if request.put? && params[:enumerations]
Project.transaction do
params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity)
+1 -1
View File
@@ -26,7 +26,7 @@ class SettingsController < ApplicationController
end
def edit
@notifiables = %w(issue_added issue_updated news_added document_added file_added message_posted wiki_content_added wiki_content_updated)
@notifiables = Redmine::Notifiable.all
if request.post? && params[:settings] && params[:settings].is_a?(Hash)
settings = (params[:settings] || {}).dup.symbolize_keys
settings.each do |name, value|
@@ -0,0 +1,209 @@
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
+42 -146
View File
@@ -17,12 +17,9 @@
class TimelogController < ApplicationController
menu_item :issues
before_filter :find_project, :authorize, :only => [:edit, :destroy]
before_filter :find_optional_project, :only => [:report, :details]
before_filter :load_available_criterias, :only => [:report]
before_filter :find_project, :authorize, :only => [:new, :create, :edit, :update, :destroy]
before_filter :find_optional_project, :only => [:index]
verify :method => :post, :only => :destroy, :redirect_to => { :action => :details }
helper :sort
include SortHelper
helper :issues
@@ -30,83 +27,7 @@ class TimelogController < ApplicationController
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
def details
def index
sort_init 'spent_on', 'desc'
sort_update 'spent_on' => 'spent_on',
'user' => 'user_id',
@@ -162,21 +83,53 @@ class TimelogController < ApplicationController
end
end
end
def edit
(render_403; return) if @time_entry && !@time_entry.editable_by?(User.current)
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 request.post? and @time_entry.save
if @time_entry.save
flash[:notice] = l(:notice_successful_update)
redirect_back_or_default :action => 'details', :project_id => @time_entry.project
return
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.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
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)
@@ -187,7 +140,7 @@ class TimelogController < ApplicationController
end
redirect_to :back
rescue ::ActionController::RedirectBackError
redirect_to :action => 'details', :project_id => @time_entry.project
redirect_to :action => 'index', :project_id => @time_entry.project
end
private
@@ -264,61 +217,4 @@ 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
+80 -37
View File
@@ -71,53 +71,96 @@ class UsersController < ApplicationController
render_404
end
def add
if request.get?
@user = User.new(:language => Setting.default_language)
else
@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
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
else
@auth_sources = AuthSource.find(:all)
@notification_option = @user.mail_notification
render :action => 'new'
end
end
def edit
@user = User.find(params[:id])
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
@notification_options = @user.valid_notification_options
@notification_option = @user.mail_notification
@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)
+2 -2
View File
@@ -103,7 +103,7 @@ class VersionsController < ApplicationController
end
def update
if request.post? && params[:version]
if request.put? && params[:version]
attributes = params[:version].dup
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
if @version.update_attributes(attributes)
@@ -114,7 +114,7 @@ class VersionsController < ApplicationController
end
def close_completed
if request.post?
if request.put?
@project.close_completed_versions
end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
+71 -58
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 => :index }
verify :method => :post, :only => [:destroy, :protect], :redirect_to => { :action => :show }
helper :attachments
include AttachmentsHelper
helper :watchers
# display a page (in editing mode if it doesn't exist)
def index
def show
page_title = params[:page]
@page = @wiki.find_or_new_page(page_title)
if @page.new_record?
@@ -71,34 +71,48 @@ class WikiController < ApplicationController
@content.text = initial_page_content(@page) if @content.text.blank?
# don't keep previous comment
@content.comments = nil
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
# To prevent StaleObjectError exception when reverting to a previous version
@content.version = @page.content.version
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?
@@ -107,13 +121,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 => 'index', :id => @project, :page => @page.title
redirect_to :action => 'show', :project_id => @project, :page => @page.title
end
end
def protect
@page.update_attribute :protected, params[:protected]
redirect_to :action => 'index', :id => @project, :page => @page.title
redirect_to :action => 'show', :project_id => @project, :page => @page.title
end
# show page history
@@ -166,37 +180,26 @@ class WikiController < ApplicationController
end
end
@page.destroy
redirect_to :action => 'special', :id => @project, :page => 'Page_index'
redirect_to :action => 'page_index', :project_id => @project
end
# 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
# 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")
else
# requested special page doesn't exist, redirect to default page
redirect_to :action => 'index', :id => @project, :page => nil
return
redirect_to :action => 'show', :project_id => @project, :page => nil
end
render :action => "special_#{page_title}"
end
def page_index
load_pages_grouped_by_date_without_content
end
def date_index
load_pages_grouped_by_date_without_content
end
def preview
@@ -215,13 +218,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 => 'index', :page => @page.title
redirect_to :action => 'show', :page => @page.title
end
private
def find_wiki
@project = Project.find(params[:id])
@project = Project.find(params[:project_id])
@wiki = @project.wiki
render_404 unless @wiki
rescue ActiveRecord::RecordNotFound
@@ -245,4 +248,14 @@ 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
+6 -18
View File
@@ -34,25 +34,11 @@ module ApplicationHelper
# Display a link if user is authorized
#
# @param [String] name Anchor text (passed to link_to)
# @param [Hash, String] options Hash params or url for the link target (passed to link_to).
# This will checked by authorize_for to see if the user is authorized
# @param [Hash] options Hash params. This will checked by authorize_for to see if the user is authorized
# @param [optional, Hash] html_options Options passed to link_to
# @param [optional, Hash] parameters_for_method_reference Extra parameters for link_to
def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
if options.is_a?(String)
begin
route = ActionController::Routing::Routes.recognize_path(options.gsub(/\?.*/,''), :method => options[:method] || :get)
link_controller = route[:controller]
link_action = route[:action]
rescue ActionController::RoutingError # Parse failed, not a route
link_controller, link_action = nil, nil
end
else
link_controller = options[:controller] || params[:controller]
link_action = options[:action]
end
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(link_controller, link_action)
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
end
# Display a link to remote if user is authorized
@@ -191,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 => 'index', :id => page.project, :page => page.title},
content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => 'show', :project_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"
@@ -560,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 => 'index', :id => link_project, :page => Wiki.titleize(page), :anchor => anchor)
url_for(:only_path => only_path, :controller => 'wiki', :action => 'show', :project_id => link_project, :page => Wiki.titleize(page), :anchor => anchor)
end
link_to((title || page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new')))
else
@@ -832,6 +818,8 @@ module ApplicationHelper
email = $1
end
return gravatar(email.to_s.downcase, options) unless email.blank? rescue nil
else
''
end
end
+16 -9
View File
@@ -1,5 +1,5 @@
module CalendarsHelper
def link_to_previous_month(year, month)
def link_to_previous_month(year, month, options={})
target_year, target_month = if month == 1
[year - 1, 12]
else
@@ -11,13 +11,11 @@ module CalendarsHelper
else
"#{month_name(target_month)}"
end
link_to_remote ('&#171; ' + name),
{:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month => target_month)}
link_to_month(('&#171; ' + name), target_year, target_month, options)
end
def link_to_next_month(year, month)
def link_to_next_month(year, month, options={})
target_year, target_month = if month == 12
[year + 1, 1]
else
@@ -30,9 +28,18 @@ module CalendarsHelper
"#{month_name(target_month)}"
end
link_to_remote (name + ' &#187;'),
{:update => "content", :url => { :year => target_year, :month => target_month }},
{:href => url_for(:action => 'show', :year => target_year, :month =>target_month)}
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})
end
end
+24
View File
@@ -0,0 +1,24 @@
# 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
+5 -3
View File
@@ -44,8 +44,10 @@ 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 />" +
@@ -252,7 +254,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)), :update => 'content'},
{:url => gantt.params.merge(:zoom => (gantt.zoom+1)), :method => :get, :update => 'content'},
{:href => url_for(gantt.params.merge(:zoom => (gantt.zoom+1)))})
else
l(:text_zoom_in) +
@@ -262,7 +264,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)), :update => 'content'},
{:url => gantt.params.merge(:zoom => (gantt.zoom-1)), :method => :get, :update => 'content'},
{:href => url_for(gantt.params.merge(:zoom => (gantt.zoom-1)))})
else
l(:text_zoom_out) +
+10
View File
@@ -71,4 +71,14 @@ 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 => 'edit', :id => user, :page => params[:page], :status => params[:status], :tab => nil}
url = {:controller => 'users', :action => 'update', :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 => :post, :class => 'icon icon-unlock'
link_to l(:button_unlock), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock'
elsif user.registered?
link_to l(:button_activate), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :post, :class => 'icon icon-unlock'
link_to l(:button_activate), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock'
elsif user != User.current
link_to l(:button_lock), url.merge(:user => {:status => User::STATUS_LOCKED}), :method => :post, :class => 'icon icon-lock'
link_to l(:button_lock), url.merge(:user => {:status => User::STATUS_LOCKED}), :method => :put, :class => 'icon icon-lock'
end
end
+35 -7
View File
@@ -62,14 +62,32 @@ class Issue < ActiveRecord::Base
named_scope :open, :conditions => ["#{IssueStatus.table_name}.is_closed = ?", false], :include => :status
named_scope :recently_updated, :order => "#{self.table_name}.updated_on DESC"
named_scope :recently_updated, :order => "#{Issue.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 :reschedule_following_issues, :close_duplicates, :update_done_ratio_from_issue_status
after_save :update_nested_set_attributes, :update_parent_attributes, :create_journal
before_save :close_duplicates, :update_done_ratio_from_issue_status
after_save :reschedule_following_issues, :update_nested_set_attributes, :update_parent_attributes, :create_journal
after_destroy :destroy_children
after_destroy :update_parent_attributes
@@ -358,6 +376,13 @@ 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?
@@ -365,7 +390,9 @@ class Issue < ActiveRecord::Base
# Users the issue can be assigned to
def assignable_users
project.assignable_users
users = project.assignable_users
users << author if author
users.uniq.sort
end
# Versions that the issue can be assigned to
@@ -390,9 +417,10 @@ 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
notified << author if author && author.active?
notified << assigned_to if assigned_to && assigned_to.active?
# 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)
notified.uniq!
# Remove users that can not view the issue
notified.reject! {|user| !visible?(user)}
+6 -1
View File
@@ -17,6 +17,11 @@
class JournalObserver < ActiveRecord::Observer
def after_create(journal)
Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated')
if Setting.notified_events.include?('issue_updated') ||
(Setting.notified_events.include?('issue_note_added') && journal.notes.present?) ||
(Setting.notified_events.include?('issue_status_updated') && journal.new_status.present?) ||
(Setting.notified_events.include?('issue_priority_updated') && journal.new_value_for('priority_id').present?)
Mailer.deliver_issue_edit(journal)
end
end
end
+47 -2
View File
@@ -382,12 +382,13 @@ class Project < ActiveRecord::Base
# Returns the mail adresses of users that should be always notified on project events
def recipients
members.select {|m| m.mail_notification? || m.user.mail_notification?}.collect {|m| m.user.mail}
notified_users.collect {|user| user.mail}
end
# Returns the users that should be notified on project events
def notified_users
members.select {|m| m.mail_notification? || m.user.mail_notification?}.collect {|m| m.user}
# 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}
end
# Returns an array of all custom fields enabled for project issues
@@ -421,6 +422,50 @@ 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')
+47
View File
@@ -195,6 +195,12 @@ 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"]] }
@@ -432,6 +438,47 @@ 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
+76 -9
View File
@@ -33,6 +33,15 @@ 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
@@ -65,7 +74,7 @@ class User < Principal
validates_confirmation_of :password, :allow_nil => true
def before_create
self.mail_notification = false
self.mail_notification = Setting.default_notification_option if self.mail_notification.blank?
true
end
@@ -250,6 +259,17 @@ 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)
@@ -324,23 +344,35 @@ 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 project
# action can be:
# Return true if the user is allowed to do the specified action on a specific context
# Action can be:
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
# * a permission Symbol (eg. :edit_project)
def allowed_to?(action, project, options={})
if 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)
# No action allowed on archived projects
return false unless project.active?
return false unless context.active?
# No action allowed on disabled modules
return false unless project.allows_to?(action)
return false unless context.allows_to?(action)
# Admin users are authorized for anything else
return true if admin?
roles = roles_for_project(project)
roles = roles_for_project(context)
return false unless roles
roles.detect {|role| (project.is_public? || role.member?) && role.allowed_to?(action)}
roles.detect {|role| (context.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?
@@ -359,6 +391,41 @@ 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,6 +73,18 @@ 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.
@@ -123,6 +135,10 @@ 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"
+2 -4
View File
@@ -19,7 +19,6 @@
<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>
@@ -27,15 +26,14 @@
<tbody>
<% project_tree(@projects) do |project, level| %>
<tr class="<%= cycle("odd", "even") %> <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="name"><%= link_to_project(project, :action => 'settings') %></td>
<td><%= textilizable project.short_description, :project => project %></td>
<td class="name"><span><%= link_to_project(project, {:action => 'settings'}, :title => project.short_description) %></span></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), { :controller => 'projects', :action => 'destroy', :id => project }, :class => 'icon icon-del') %>
<%= link_to(l(:button_delete), project_destroy_confirm_path(project), :class => 'icon icon-del') %>
</td>
</tr>
<% end %>
+8 -6
View File
@@ -1,6 +1,7 @@
<h2><%= l(:label_calendar) %></h2>
<% form_tag({}, :id => 'query_form') do %>
<% form_tag(calendar_path, :method => :put, :id => 'query_form') do %>
<%= hidden_field_tag('project_id', @project.to_param) if @project%>
<fieldset id="filters" class="collapsible">
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div>
@@ -9,7 +10,7 @@
</fieldset>
<p style="float:right;">
<%= link_to_previous_month(@year, @month) %> | <%= link_to_next_month(@year, @month) %>
<%= link_to_previous_month(@year, @month, :project => @project) %> | <%= link_to_next_month(@year, @month, :project => @project) %>
</p>
<p class="buttons">
@@ -25,7 +26,8 @@
}, :class => 'icon icon-checked' %>
<%= link_to_remote l(:button_clear),
{ :url => { :set_filter => (@query.new_record? ? 1 : nil) },
{ :url => { :project_id => @project, :set_filter => (@query.new_record? ? 1 : nil) },
:method => :put,
:update => "content",
}, :class => 'icon icon-reload' if @query.new_record? %>
</p>
@@ -36,9 +38,9 @@
<%= render :partial => 'common/calendar', :locals => {:calendar => @calendar} %>
<p class="legend cal">
<span class="starting"><%= l(:text_tip_task_begin_day) %></span>
<span class="ending"><%= l(:text_tip_task_end_day) %></span>
<span class="starting ending"><%= l(:text_tip_task_begin_end_day) %></span>
<span class="starting"><%= l(:text_tip_issue_begin_day) %></span>
<span class="ending"><%= l(:text_tip_issue_end_day) %></span>
<span class="starting ending"><%= l(:text_tip_issue_begin_end_day) %></span>
</p>
<% end %>
+3 -4
View File
@@ -33,7 +33,6 @@
</li>
<% end %>
<% if @projects.size == 1 %>
<li class="folder">
<a href="#" class="submenu"><%= l(:field_priority) %></a>
<ul>
@@ -43,8 +42,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>
@@ -85,7 +84,7 @@
</li>
<% end -%>
<% if Issue.use_field_for_done_ratio? && @projects.size == 1 %>
<% if Issue.use_field_for_done_ratio? %>
<li class="folder">
<a href="#" class="submenu"><%= l(:field_done_ratio) %></a>
<ul>
@@ -115,7 +114,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)},
<li><%= context_menu_link l(:button_delete), {:controller => 'issues', :action => 'destroy', :ids => @issues.collect(&:id), :back_url => @back},
: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_if_authorized l(:label_attachment_new), {:controller => 'files', :action => 'new', :id => @project}, :class => 'icon icon-add' %>
<%= link_to(l(:label_attachment_new), new_project_file_path(@project), :class => 'icon icon-add') if User.current.allowed_to?(:manage_files, @project) %>
</div>
<h2><%=l(:label_attachment_plural)%></h2>
+1 -1
View File
@@ -2,7 +2,7 @@
<%= error_messages_for 'attachment' %>
<div class="box">
<% form_tag({ :action => 'new', :id => @project }, :multipart => true, :class => "tabular") do %>
<% form_tag(project_files_path(@project), :multipart => true, :class => "tabular") do %>
<% if @versions.any? %>
<p><label for="version_id"><%=l(:field_version)%></label>
+17 -73
View File
@@ -1,6 +1,8 @@
<% @gantt.view = self %>
<h2><%= l(:label_gantt) %></h2>
<% form_tag(params.merge(:month => nil, :year => nil, :months => nil), :id => 'query_form') do %>
<% 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%>
<fieldset id="filters" class="collapsible">
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div>
@@ -27,7 +29,8 @@
}, :class => 'icon icon-checked' %>
<%= link_to_remote l(:button_clear),
{ :url => { :set_filter => (@query.new_record? ? 1 : nil) },
{ :url => { :project_id => @project, :set_filter => (@query.new_record? ? 1 : nil) },
:method => :put,
:update => "content",
}, :class => 'icon icon-reload' if @query.new_record? %>
</p>
@@ -54,11 +57,12 @@ if @gantt.zoom >1
end
end
# Width of the entire chart
g_width = (@gantt.date_to - @gantt.date_from + 1)*zoom
g_height = [(20 * @gantt.events.length + 6)+150, 206].max
# Collect the number of issues on Versions
g_height = [(20 * (@gantt.number_of_rows + 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;">
@@ -66,26 +70,10 @@ 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>
<%
#
# 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 %>
<% top = headers_height + 8 %>
<%= @gantt.subjects(:headers_height => headers_height, :top => top, :g_width => g_width) %>
</div>
</td>
<td>
@@ -163,53 +151,9 @@ if show_days
end
end %>
<%
#
# 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 %>
<% top = headers_height + 10 %>
<%= @gantt.lines(:top => top, :zoom => zoom, :g_width => g_width ) %>
<%
#
@@ -226,8 +170,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, :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>
<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>
</tr>
</table>
+3 -3
View File
@@ -1,10 +1,10 @@
<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 => 'edit', :issue_id => @issue}, :class => 'icon icon-time-add' %>
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'new', :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' %>
<%= link_to_if_authorized l(:button_copy), new_issue_move_path(:id => @issue, :copy_options => {:copy => 't'}), :class => 'icon icon-copy' %>
<%= link_to_if_authorized l(:button_move), new_issue_move_path(:id => @issue), :class => 'icon icon-move' %>
<%= link_to_if_authorized l(:button_copy), {:controller => 'issue_moves', :action => 'new', :id => @issue, :copy_options => {:copy => 't'}}, :class => 'icon icon-copy' %>
<%= link_to_if_authorized l(:button_move), {:controller => 'issue_moves', :action => 'new', :id => @issue}, :class => 'icon icon-move' %>
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => (@issue.leaf? ? l(:text_are_you_sure) : l(:text_are_you_sure_with_children)), :method => :post, :class => 'icon icon-del' %>
</div>
+7 -2
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(@project.trackers, :id, :name)) %>
<%= select_tag('issue[tracker_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@trackers, :id, :name)) %>
</p>
<% if @available_statuses.any? %>
<p>
@@ -27,20 +27,25 @@
<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(@project.assignable_users, :id, :name)) %>
options_from_collection_for_select(@assignables, :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>
+5 -4
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 => 'details', :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 => 'index', :project_id => @project, :issue_id => @issue}) : "-" %></td>
<% end %>
</tr>
<tr>
@@ -44,18 +44,19 @@
<%= render_custom_fields_rows(@issue) %>
<%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
</table>
<hr />
<% 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') unless @issue.description.blank? %>
<%= link_to_remote_if_authorized(l(:button_quote), { :url => {:action => 'reply', :id => @issue} }, :class => 'icon icon-comment') if @issue.description? %>
</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) %>
+2 -14
View File
@@ -32,24 +32,12 @@
<div class="splitcontentright">
<h3><%=l(:field_mail_notification)%></h3>
<div class="box">
<%= 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>
<%= render :partial => 'users/mail_notifications' %>
</div>
<h3><%=l(:label_preferences)%></h3>
<div class="box tabular">
<% 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 %>
<%= render :partial => 'users/preferences' %>
</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 => :post,
:method => :delete,
:title => l(:button_delete) %>
<% end -%>
</td>
+1 -1
View File
@@ -1,5 +1,5 @@
<p><%= link_to_project(news.project) + ': ' unless @project %>
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
<%= link_to h(news.title), news_path(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 => { :action => "edit" },
:html => { :id => 'news-form' } do |f| %>
<% labelled_tabular_form_for :news, @news, :url => news_path(@news),
:html => { :id => 'news-form', :method => :put } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %>
<%= link_to_remote l(:label_preview),
{ :url => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'post',
{ :url => preview_news_path(:project_id => @project),
:method => 'get',
:update => 'preview',
:with => "Form.serialize('news-form')"
}, :accesskey => accesskey(:preview) %>
+8 -8
View File
@@ -1,19 +1,19 @@
<div class="contextual">
<%= 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 %>
<%= 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) %>
</div>
<div id="add-news" style="display:none;">
<h2><%=l(:label_news_new)%></h2>
<% labelled_tabular_form_for :news, @news, :url => { :controller => 'news', :action => 'new', :project_id => @project },
<% labelled_tabular_form_for :news, @news, :url => project_news_index_path(@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 => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'post',
{ :url => preview_news_path(:project_id => @project),
:method => 'get',
: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), :controller => 'news', :action => 'show', :id => news %>
<%= link_to h(news.title), news_path(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 => { :controller => 'news', :action => 'new', :project_id => @project },
<% labelled_tabular_form_for :news, @news, :url => project_news_index_path(@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 => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'post',
{ :url => preview_news_path(:project_id => @project),
:method => 'get',
: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),
{:controller => 'news', :action => 'edit', :id => @news},
edit_news_path(@news),
:class => 'icon icon-edit',
:accesskey => accesskey(:edit),
:onclick => 'Element.show("edit-news"); return false;' %>
<%= 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' %>
<%= link_to_if_authorized l(:button_delete), news_path(@news), :confirm => l(:text_are_you_sure), :method => :delete, :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 => { :action => "edit", :id => @news },
:html => { :id => 'news-form' } do |f| %>
<% labelled_tabular_form_for :news, @news, :url => news_path(@news),
:html => { :id => 'news-form', :method => :put } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %>
<%= link_to_remote l(:label_preview),
{ :url => { :controller => 'news', :action => 'preview', :project_id => @project },
:method => 'post',
{ :url => preview_news_path(:project_id => @project),
:method => 'get',
: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 => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment},
:confirm => l(:text_are_you_sure), :method => :post, :title => l(:button_delete) %>
<%= 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) %>
</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 'news', 'add_comment' %>
<% if authorize_for 'comments', 'create' %>
<p><%= toggle_link l(:label_comment_add), "add_comment_form", :focus => "comment_comments" %></p>
<% form_tag({:action => 'add_comment', :id => @news}, :id => "add_comment_form", :style => "display:none;") do %>
<% form_tag({:controller => 'comments', :action => 'create', :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 => { :action => "update", :id => @project } do |f| %>
<% labelled_tabular_form_for :project, @project, :url => project_path(@project), :html => {:method => (@project.new_record? ? :post : :put) } 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({:controller => 'projects', :action => 'destroy', :id => @project_to_destroy}) do %>
<% form_tag(project_path(@project_to_destroy), :method => :delete) do %>
<label><%= check_box_tag 'confirm', 1 %> <%= l(:general_text_Yes) %></label>
<%= submit_tag l(:button_delete) %>
<% end %>
@@ -1,4 +1,4 @@
<% form_tag({:controller => 'project_enumerations', :action => 'save', :id => @project}, :class => "tabular") do %>
<% form_tag(project_project_enumerations_path(@project), :method => :put, :class => "tabular") do %>
<table class="list">
<thead><tr>
@@ -32,7 +32,7 @@
</table>
<div class="contextual">
<%= link_to(l(:button_reset), {:controller => 'project_enumerations', :action => 'destroy', :id => @project},
<%= link_to(l(:button_reset), project_project_enumerations_path(@project),
:method => :delete,
:confirm => l(:text_are_you_sure),
:class => 'icon icon-del') %>
+2 -2
View File
@@ -21,7 +21,7 @@
<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 => :post, :class => 'icon icon-del' %>
<%= 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' %>
<% end %>
</td>
</tr>
@@ -34,7 +34,7 @@
<div class="contextual">
<% if @project.versions.any? %>
<%= link_to l(:label_close_versions), {:controller => 'versions', :action => 'close_completed', :project_id => @project}, :method => :post %>
<%= link_to l(:label_close_versions), close_completed_project_versions_path(@project), :method => :put %>
<% 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 => 'details', :project_id => @project}) %> |
<%= link_to(l(:label_report), {:controller => 'timelog', :action => 'report', :project_id => @project}) %></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>
<% end %>
<%= call_hook(:view_projects_show_sidebar_bottom, :project => @project) %>
<% end %>
+10 -5
View File
@@ -7,13 +7,18 @@
<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 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 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>
<fieldset class="box"><legend><%= l(:setting_emails_footer) %></legend>
@@ -1,5 +1,5 @@
<div class="contextual">
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time-add' %>
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'new', :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 => 'date_range' %>
<%= render :partial => 'timelog/date_range' %>
<p><%= l(:label_details) %>: <%= select_tag 'columns', options_for_select([[l(:label_year), 'year'],
[l(:label_month), 'month'],
+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 => '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}),
<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}),
: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 => :post,
:method => :delete,
:title => l(:button_delete) %>
<% end -%>
</td>
+6 -1
View File
@@ -1,6 +1,11 @@
<h2><%= l(:label_spent_time) %></h2>
<% labelled_tabular_form_for :time_entry, @time_entry, :url => {:action => 'edit', :id => @time_entry, :project_id => @time_entry.project} do |f| %>
<% 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| %>
<%= 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 => 'edit', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time-add' %>
<%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'new', :project_id => @project, :issue_id => @issue}, :class => 'icon icon-time-add' %>
</div>
<%= render_timelog_breadcrumb %>
+10
View File
@@ -32,4 +32,14 @@
<%= 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]-->
+2 -2
View File
@@ -1,7 +1,7 @@
<% labelled_tabular_form_for :user, @user, :url => { :controller => 'users', :action => "edit", :tab => nil }, :html => { :class => nil } do |f| %>
<% labelled_tabular_form_for :user, @user, :url => { :controller => 'users', :action => "update", :tab => nil }, :html => { :method => :put, :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><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p>
<% end -%>
<p><%= submit_tag l(:button_save) %></p>
<% end %>
+1 -1
View File
@@ -1,4 +1,4 @@
<% form_for(:user, :url => { :action => 'edit' }) do %>
<% form_for(:user, :url => { :action => 'update' }, :html => {:method => :put}) 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 />
@@ -0,0 +1,12 @@
<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
@@ -0,0 +1,6 @@
<% 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 -1
View File
@@ -1,5 +1,5 @@
<div class="contextual">
<%= link_to l(:label_profile), {:controller => 'users', :action => 'show', :id => @user}, :class => 'icon icon-user' %>
<%= link_to l(:label_profile), user_path(@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 => 'add'}, :class => 'icon icon-add' %>
<%= link_to l(:label_user_new), {:action => 'new'}, :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), :action => 'edit', :id => user %></td>
<td class="username"><%= avatar(user, :size => "14") %><%= link_to h(user.login), edit_user_path(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,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 => "add" }, :html => { :class => nil } do |f| %>
<% labelled_tabular_form_for :user, @user, :url => { :action => "create" }, :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(:button_edit), {:controller => 'users', :action => 'edit', :id => @user}, :class => 'icon icon-edit') if User.current.admin? %>
<%= link_to(l(:button_edit), edit_user_path(@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 => { :action => :status_by, :id => version },
:onchange => remote_function(:url => status_by_project_version_path(version.project, 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 => { :action => 'update', :id => @version } do |f| %>
<% labelled_tabular_form_for :version, @version, :url => project_version_path(@project, @version), :html => {:method => :put} 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 => { :action => 'create', :project_id => @project } do |f| %>
<% labelled_tabular_form_for :version, @version, :url => project_versions_path(@project) do |f| %>
<%= render :partial => 'versions/form', :locals => { :f => f } %>
<%= submit_tag l(:button_create) %>
<% end %>
+1
View File
@@ -1,5 +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? %>
<%= 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 => '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 />
<%= 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 />
+2 -2
View File
@@ -6,7 +6,7 @@
<h2><%= @page.pretty_title %></h2>
<p>
<%= l(:label_version) %> <%= link_to @annotate.content.version, :action => 'index', :page => @page.title, :version => @annotate.content.version %>
<%= l(:label_version) %> <%= link_to @annotate.content.version, :action => 'show', :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 => 'index', :id => @project, :page => @page.title, :version => line[0] %></td>
<td class="revision"><%= link_to line[0], :controller => 'wiki', :action => 'show', :project_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>
@@ -12,7 +12,7 @@
<h3><%= format_date(date) %></h3>
<ul>
<% @pages_by_date[date].each do |page| %>
<li><%= link_to page.pretty_title, :action => 'index', :page => page.title %></li>
<li><%= link_to page.pretty_title, :action => 'show', :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 => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<%= f.link_to '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) %>
<% end %>
<% end %>
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'show', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<% end %>
+1 -1
View File
@@ -15,5 +15,5 @@
</div>
<%= submit_tag l(:button_apply) %>
<%= link_to l(:button_cancel), :controller => 'wiki', :action => 'index', :id => @project, :page => @page.title %>
<%= link_to l(:button_cancel), :controller => 'wiki', :action => 'show', :project_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 => 'index', :page => @page.title, :version => @diff.content_from.version %>
<%= l(:label_version) %> <%= link_to @diff.content_from.version, :action => 'show', :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 => 'index', :page => @page.title, :version => @diff.content_to.version %>/<%= @page.content.version %>
<%= l(:label_version) %> <%= link_to @diff.content_to.version, :action => 'show', :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 => 'edit', :page => @page.title}, :html => {:multipart => true, :id => 'wiki_form'} do |f| %>
<% form_for :content, @content, :url => {:action => 'update', :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', :id => @project, :page => @page.title },
{ :url => { :controller => 'wiki', :action => 'preview', :project_id => @project, :page => @page.title },
:method => 'post',
:update => 'preview',
:with => "Form.serialize('wiki_form')",
+2 -1
View File
@@ -3,6 +3,7 @@
<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>
@@ -18,7 +19,7 @@
<% line_num = 1 %>
<% @versions.each do |ver| %>
<tr class="<%= cycle("odd", "even") %>">
<td class="id"><%= link_to ver.version, :action => 'index', :page => @page.title, :version => ver.version %></td>
<td class="id"><%= link_to ver.version, :action => 'show', :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>
@@ -16,11 +16,11 @@
<% unless @pages.empty? %>
<% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
<%= f.link_to '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) %>
<% end %>
<% end %>
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'show', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
<% end %>
+3 -3
View File
@@ -15,11 +15,11 @@
<% if @content.version != @page.content.version %>
<p>
<%= link_to(('&#171; ' + l(:label_previous)), :action => 'index', :page => @page.title, :version => (@content.version - 1)) + " - " if @content.version > 1 %>
<%= link_to(('&#171; ' + l(:label_previous)), :action => 'show', :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 => '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) %>
<%= 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) %>
<br />
<em><%= @content.author ? @content.author.name : "anonyme" %>, <%= format_time(@content.updated_on) %> </em><br />
<%=h @content.comments %>
+7 -5
View File
@@ -562,9 +562,9 @@ bg:
text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него?
text_workflow_edit: Изберете роля и тракер за да редактирате работния процес
text_are_you_sure: Сигурни ли сте?
text_tip_task_begin_day: задача започваща този ден
text_tip_task_end_day: задача завършваща този ден
text_tip_task_begin_end_day: задача започваща и завършваща този ден
text_tip_issue_begin_day: задача започваща този ден
text_tip_issue_end_day: задача завършваща този ден
text_tip_issue_begin_end_day: задача започваща и завършваща този ден
text_project_identifier_info: 'Позволени са малки букви (a-z), цифри и тирета.<br />Невъзможна промяна след запис.'
text_caracters_maximum: "До {{count}} символа."
text_length_between: "От {{min}} до {{max}} символа."
@@ -622,7 +622,6 @@ 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: Копиране
@@ -912,4 +911,7 @@ bg:
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
+7 -5
View File
@@ -676,7 +676,6 @@ 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
@@ -750,9 +749,9 @@ bs:
text_subprojects_destroy_warning: "Podprojekt(i): {{value}} će takođe biti izbrisani."
text_workflow_edit: Odaberite ulogu i područje aktivnosti za ispravku toka promjena na aktivnosti
text_are_you_sure: Da li ste sigurni ?
text_tip_task_begin_day: zadatak počinje danas
text_tip_task_end_day: zadatak završava danas
text_tip_task_begin_end_day: zadatak započinje i završava danas
text_tip_issue_begin_day: zadatak počinje danas
text_tip_issue_end_day: zadatak završava danas
text_tip_issue_begin_end_day: zadatak započinje i završava danas
text_project_identifier_info: 'Samo mala slova (a-z), brojevi i crtice su dozvoljeni.<br />Nakon snimanja, identifikator se ne može mijenjati.'
text_caracters_maximum: "maksimum {{count}} karaktera."
text_caracters_minimum: "Dužina mora biti najmanje {{count}} znakova."
@@ -932,4 +931,7 @@ 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
+8 -5
View File
@@ -725,7 +725,6 @@ ca:
label_search_titles_only: Cerca només en els títols
label_user_mail_option_all: "Per qualsevol esdeveniment en tots els meus projectes"
label_user_mail_option_selected: "Per qualsevol esdeveniment en els projectes seleccionats..."
label_user_mail_option_none: "Només per les coses que vigilo o hi estic implicat"
label_user_mail_no_self_notified: "No vull ser notificat pels canvis que faig jo mateix"
label_registration_activation_by_email: activació del compte per correu electrònic
label_registration_manual_activation: activació del compte manual
@@ -842,9 +841,9 @@ ca:
text_journal_set_to: "{{label}} s'ha establert a {{value}}"
text_journal_deleted: "{{label}} s'ha suprimit ({{old}})"
text_journal_added: "S'ha afegit {{label}} {{value}}"
text_tip_task_begin_day: "tasca que s'inicia aquest dia"
text_tip_task_end_day: tasca que finalitza aquest dia
text_tip_task_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
text_tip_issue_begin_day: "tasca que s'inicia aquest dia"
text_tip_issue_end_day: tasca que finalitza aquest dia
text_tip_issue_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
text_project_identifier_info: "Es permeten lletres en minúscules (a-z), números i guions.<br />Un cop desat, l'identificador no es pot modificar."
text_caracters_maximum: "{{count}} caràcters com a màxim."
text_caracters_minimum: "Com a mínim ha de tenir {{count}} caràcters."
@@ -915,9 +914,13 @@ ca:
enumeration_doc_categories: Categories del document
enumeration_activities: Activitats (seguidor de temps)
enumeration_system_activity: Activitat del sistema
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
+7 -4
View File
@@ -587,7 +587,6 @@ cs:
label_search_titles_only: Vyhledávat pouze v názvech
label_user_mail_option_all: "Pro všechny události všech mých projektů"
label_user_mail_option_selected: "Pro všechny události vybraných projektů..."
label_user_mail_option_none: "Pouze pro události které sleduji nebo které se mne týkají"
label_user_mail_no_self_notified: "Nezasílat informace o mnou vytvořených změnách"
label_registration_activation_by_email: aktivace účtu emailem
label_registration_manual_activation: manuální aktivace účtu
@@ -655,9 +654,9 @@ cs:
text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ?
text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce
text_are_you_sure: Jste si jisti?
text_tip_task_begin_day: úkol začíná v tento den
text_tip_task_end_day: úkol končí v tento den
text_tip_task_begin_end_day: úkol začíná a končí v tento den
text_tip_issue_begin_day: úkol začíná v tento den
text_tip_issue_end_day: úkol končí v tento den
text_tip_issue_begin_end_day: úkol začíná a končí v tento den
text_project_identifier_info: 'Jsou povolena malá písmena (a-z), čísla a pomlčky.<br />Po uložení již není možné identifikátor změnit.'
text_caracters_maximum: "{{count}} znaků maximálně."
text_caracters_minimum: "Musí být alespoň {{count}} znaků dlouhé."
@@ -918,3 +917,7 @@ cs:
button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: {{page_title}}"
text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
field_text: Textové pole
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
+7 -5
View File
@@ -594,7 +594,6 @@ da:
label_search_titles_only: Søg kun i titler
label_user_mail_option_all: "For alle hændelser på mine projekter"
label_user_mail_option_selected: "For alle hændelser på de valgte projekter..."
label_user_mail_option_none: "Kun for ting jeg overvåger eller jeg er involveret i"
label_user_mail_no_self_notified: "Jeg ønsker ikke besked om ændring foretaget af mig selv"
label_registration_activation_by_email: kontoaktivering på email
label_registration_manual_activation: manuel kontoaktivering
@@ -657,9 +656,9 @@ da:
text_project_destroy_confirmation: Er du sikker på at du vil slette dette projekt og alle relaterede data?
text_workflow_edit: Vælg en rolle samt en type, for at redigere arbejdsgangen
text_are_you_sure: Er du sikker?
text_tip_task_begin_day: opgaven begynder denne dag
text_tip_task_end_day: opaven slutter denne dag
text_tip_task_begin_end_day: opgaven begynder og slutter denne dag
text_tip_issue_begin_day: opgaven begynder denne dag
text_tip_issue_end_day: opaven slutter denne dag
text_tip_issue_begin_end_day: opgaven begynder og slutter denne dag
text_project_identifier_info: 'Små bogstaver (a-z), numre og bindestreg er tilladt.<br />Denne er en unik identifikation for projektet, og kan defor ikke rettes senere.'
text_caracters_maximum: "max {{count}} karakterer."
text_caracters_minimum: "Skal være mindst {{count}} karakterer lang."
@@ -934,4 +933,7 @@ da:
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
+9 -6
View File
@@ -741,7 +741,6 @@ de:
label_search_titles_only: Nur Titel durchsuchen
label_user_mail_option_all: "Für alle Ereignisse in all meinen Projekten"
label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten..."
label_user_mail_option_none: "Nur für Dinge, die ich beobachte oder an denen ich beteiligt bin"
label_user_mail_no_self_notified: "Ich möchte nicht über Änderungen benachrichtigt werden, die ich selbst durchführe."
label_registration_activation_by_email: Kontoaktivierung durch E-Mail
label_registration_manual_activation: Manuelle Kontoaktivierung
@@ -800,9 +799,10 @@ de:
button_uncheck_all: Alles abwählen
button_delete: Löschen
button_create: Anlegen
button_create_and_continue: Anlegen + nächstes Ticket
button_create_and_continue: Anlegen und weiter
button_test: Testen
button_edit: Bearbeiten
button_edit_associated_wikipage: "Zugehörige Wikiseite bearbeiten: {{page_title}}"
button_add: Hinzufügen
button_change: Wechseln
button_apply: Anwenden
@@ -858,9 +858,9 @@ de:
text_journal_set_to: "{{label}} wurde auf {{value}} gesetzt"
text_journal_deleted: "{{label}} {{old}} wurde gelöscht"
text_journal_added: "{{label}} {{value}} wurde hinzugefügt"
text_tip_task_begin_day: Aufgabe, die an diesem Tag beginnt
text_tip_task_end_day: Aufgabe, die an diesem Tag endet
text_tip_task_begin_end_day: Aufgabe, die an diesem Tag beginnt und endet
text_tip_issue_begin_day: Aufgabe, die an diesem Tag beginnt
text_tip_issue_end_day: Aufgabe, die an diesem Tag endet
text_tip_issue_begin_end_day: Aufgabe, die an diesem Tag beginnt und endet
text_project_identifier_info: 'Kleinbuchstaben (a-z), Ziffern und Bindestriche erlaubt.<br />Einmal gespeichert, kann die Kennung nicht mehr geändert werden.'
text_caracters_maximum: "Max. {{count}} Zeichen."
text_caracters_minimum: "Muss mindestens {{count}} Zeichen lang sein."
@@ -936,4 +936,7 @@ de:
field_assigned_to_role: Member of Role
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
+7 -5
View File
@@ -678,7 +678,6 @@ el:
label_search_titles_only: Αναζήτηση τίτλων μόνο
label_user_mail_option_all: "Για όλες τις εξελίξεις σε όλα τα έργα μου"
label_user_mail_option_selected: "Για όλες τις εξελίξεις μόνο στα επιλεγμένα έργα..."
label_user_mail_option_none: "Μόνο για πράγματα που παρακολουθώ ή συμμετέχω ενεργά"
label_user_mail_no_self_notified: "Δεν θέλω να ειδοποιούμαι για τις δικές μου αλλαγές"
label_registration_activation_by_email: ενεργοποίηση λογαριασμού με email
label_registration_manual_activation: χειροκίνητη ενεργοποίηση λογαριασμού
@@ -761,9 +760,9 @@ el:
text_subprojects_destroy_warning: "Επίσης το(α) επιμέρους έργο(α): {{value}} θα διαγραφούν."
text_workflow_edit: Επιλέξτε ένα ρόλο και έναν ανιχνευτή για να επεξεργαστείτε τη ροή εργασίας
text_are_you_sure: Είστε σίγουρος ;
text_tip_task_begin_day: καθήκοντα που ξεκινάνε σήμερα
text_tip_task_end_day: καθήκοντα που τελειώνουν σήμερα
text_tip_task_begin_end_day: καθήκοντα που ξεκινάνε και τελειώνουν σήμερα
text_tip_issue_begin_day: καθήκοντα που ξεκινάνε σήμερα
text_tip_issue_end_day: καθήκοντα που τελειώνουν σήμερα
text_tip_issue_begin_end_day: καθήκοντα που ξεκινάνε και τελειώνουν σήμερα
text_project_identifier_info: 'Επιτρέπονται μόνο μικρά πεζά γράμματα (a-z), αριθμοί και παύλες. <br /> Μετά την αποθήκευση, το αναγνωριστικό δεν μπορεί να αλλάξει.'
text_caracters_maximum: "μέγιστος αριθμός {{count}} χαρακτήρες."
text_caracters_minimum: "Πρέπει να περιέχει τουλάχιστον {{count}} χαρακτήρες."
@@ -918,4 +917,7 @@ el:
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
+9 -6
View File
@@ -228,7 +228,7 @@ en-GB:
field_tracker: Tracker
field_subject: Subject
field_due_date: Due date
field_assigned_to: Assigned to
field_assigned_to: Assignee
field_priority: Priority
field_fixed_version: Target version
field_user: User
@@ -711,7 +711,7 @@ en-GB:
label_search_titles_only: Search titles only
label_user_mail_option_all: "For any event on all my projects"
label_user_mail_option_selected: "For any event on the selected projects only..."
label_user_mail_option_none: "Only for things I watch or I'm involved in"
label_user_mail_option_none: "No events"
label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
label_registration_activation_by_email: account activation by email
label_registration_manual_activation: manual account activation
@@ -825,9 +825,9 @@ en-GB:
text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})"
text_journal_added: "{{label}} {{value}} added"
text_tip_task_begin_day: task beginning this day
text_tip_task_end_day: task ending this day
text_tip_task_begin_end_day: task beginning and ending this day
text_tip_issue_begin_day: task beginning this day
text_tip_issue_end_day: task ending this day
text_tip_issue_begin_end_day: task beginning and ending this day
text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed.<br />Once saved, the identifier can not be changed.'
text_caracters_maximum: "{{count}} characters maximum."
text_caracters_minimum: "Must be at least {{count}} characters long."
@@ -922,4 +922,7 @@ en-GB:
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
+10 -5
View File
@@ -231,7 +231,7 @@ en:
field_tracker: Tracker
field_subject: Subject
field_due_date: Due date
field_assigned_to: Assigned to
field_assigned_to: Assignee
field_priority: Priority
field_fixed_version: Target version
field_user: User
@@ -350,6 +350,7 @@ en:
setting_start_of_week: Start calendars on
setting_rest_api_enabled: Enable REST web service
setting_cache_formatted_text: Cache formatted text
setting_default_notification_option: Default notification option
permission_add_project: Create project
permission_add_subprojects: Create subprojects
@@ -725,7 +726,10 @@ en:
label_search_titles_only: Search titles only
label_user_mail_option_all: "For any event on all my projects"
label_user_mail_option_selected: "For any event on the selected projects only..."
label_user_mail_option_none: "Only for things I watch or I'm involved in"
label_user_mail_option_none: "No events"
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_user_mail_option_only_owner: "Only for things I am the owner of"
label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
label_registration_activation_by_email: account activation by email
label_registration_manual_activation: manual account activation
@@ -787,6 +791,7 @@ en:
button_create_and_continue: Create and continue
button_test: Test
button_edit: Edit
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
button_add: Add
button_change: Change
button_apply: Apply
@@ -843,9 +848,9 @@ en:
text_journal_set_to: "{{label}} set to {{value}}"
text_journal_deleted: "{{label}} deleted ({{old}})"
text_journal_added: "{{label}} {{value}} added"
text_tip_task_begin_day: task beginning this day
text_tip_task_end_day: task ending this day
text_tip_task_begin_end_day: task beginning and ending this day
text_tip_issue_begin_day: issue beginning this day
text_tip_issue_end_day: issue ending this day
text_tip_issue_begin_end_day: issue beginning and ending this day
text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed.<br />Once saved, the identifier can not be changed.'
text_caracters_maximum: "{{count}} characters maximum."
text_caracters_minimum: "Must be at least {{count}} characters long."
+7 -5
View File
@@ -636,7 +636,6 @@ es:
label_user_activity: "Actividad de {{value}}"
label_user_mail_no_self_notified: "No quiero ser avisado de cambios hechos por mí"
label_user_mail_option_all: "Para cualquier evento en todos mis proyectos"
label_user_mail_option_none: "Sólo para elementos monitorizados o relacionados conmigo"
label_user_mail_option_selected: "Para cualquier evento de los proyectos seleccionados..."
label_user_new: Nuevo usuario
label_user_plural: Usuarios
@@ -821,9 +820,9 @@ es:
text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:'
text_status_changed_by_changeset: "Aplicado en los cambios {{value}}"
text_subprojects_destroy_warning: "Los proyectos secundarios: {{value}} también se eliminarán"
text_tip_task_begin_day: tarea que comienza este día
text_tip_task_begin_end_day: tarea que comienza y termina este día
text_tip_task_end_day: tarea que termina este día
text_tip_issue_begin_day: tarea que comienza este día
text_tip_issue_begin_end_day: tarea que comienza y termina este día
text_tip_issue_end_day: tarea que termina este día
text_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tipo de petición
text_unallowed_characters: Caracteres no permitidos
text_user_mail_option: "De los proyectos no seleccionados, sólo recibirá notificaciones sobre elementos monitorizados o elementos en los que esté involucrado (por ejemplo, peticiones de las que usted sea autor o asignadas a usted)."
@@ -958,4 +957,7 @@ es:
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
+7 -4
View File
@@ -707,7 +707,6 @@ eu:
label_search_titles_only: Izenburuetan bakarrik bilatu
label_user_mail_option_all: "Nire proiektu guztietako gertakari guztientzat"
label_user_mail_option_selected: "Hautatutako proiektuetako edozein gertakarientzat..."
label_user_mail_option_none: "Nik behatu edo parte hartze dudan gauzetarako bakarrik"
label_user_mail_no_self_notified: "Ez dut nik egiten ditudan aldeketen jakinarazpenik jaso nahi"
label_registration_activation_by_email: kontuak epostaz gaitu
label_registration_manual_activation: kontuak eskuz gaitu
@@ -821,9 +820,9 @@ eu:
text_journal_set_to: "{{label}}-k {{value}} balioa hartu du"
text_journal_deleted: "{{label}} ezabatuta ({{old}})"
text_journal_added: "{{label}} {{value}} gehituta"
text_tip_task_begin_day: gaur hasten diren atazak
text_tip_task_end_day: gaur bukatzen diren atazak
text_tip_task_begin_end_day: gaur hasi eta bukatzen diren atazak
text_tip_issue_begin_day: gaur hasten diren atazak
text_tip_issue_end_day: gaur bukatzen diren atazak
text_tip_issue_begin_end_day: gaur hasi eta bukatzen diren atazak
text_project_identifier_info: 'Letra xeheak (a-z), zenbakiak eta marrak erabil daitezke bakarrik.<br />Gorde eta gero identifikadorea ezin da aldatu.'
text_caracters_maximum: "{{count}} karaktere gehienez."
text_caracters_minimum: "Gutxienez {{count}} karaktereetako luzerakoa izan behar du."
@@ -922,3 +921,7 @@ eu:
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
+7 -4
View File
@@ -579,7 +579,6 @@ fi:
label_search_titles_only: Hae vain otsikot
label_user_mail_option_all: "Kaikista tapahtumista kaikissa projekteistani"
label_user_mail_option_selected: "Kaikista tapahtumista vain valitsemistani projekteista..."
label_user_mail_option_none: "Vain tapahtumista joita valvon tai olen mukana"
label_user_mail_no_self_notified: "En halua muistutusta muutoksista joita itse teen"
label_registration_activation_by_email: tilin aktivointi sähköpostitse
label_registration_manual_activation: tilin aktivointi käsin
@@ -636,9 +635,9 @@ fi:
text_project_destroy_confirmation: Oletko varma että haluat poistaa tämän projektin ja kaikki siihen kuuluvat tiedot?
text_workflow_edit: Valitse rooli ja tapahtuma muokataksesi työnkulkua
text_are_you_sure: Oletko varma?
text_tip_task_begin_day: tehtävä joka alkaa tänä päivänä
text_tip_task_end_day: tehtävä joka loppuu tänä päivänä
text_tip_task_begin_end_day: tehtävä joka alkaa ja loppuu tänä päivänä
text_tip_issue_begin_day: tehtävä joka alkaa tänä päivänä
text_tip_issue_end_day: tehtävä joka loppuu tänä päivänä
text_tip_issue_begin_end_day: tehtävä joka alkaa ja loppuu tänä päivänä
text_project_identifier_info: 'Pienet kirjaimet (a-z), numerot ja viivat ovat sallittu.<br />Tallentamisen jälkeen tunnistetta ei voi muuttaa.'
text_caracters_maximum: "{{count}} merkkiä enintään."
text_caracters_minimum: "Täytyy olla vähintään {{count}} merkkiä pitkä."
@@ -943,3 +942,7 @@ fi:
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
+14 -12
View File
@@ -422,8 +422,6 @@ fr:
project_module_wiki: Wiki
project_module_repository: Dépôt de sources
project_module_boards: Forums de discussion
project_module_gantt: Gantt
project_module_calendar: Calendar
label_user: Utilisateur
label_user_plural: Utilisateurs
@@ -720,7 +718,6 @@ fr:
label_search_titles_only: Uniquement dans les titres
label_user_mail_option_all: "Pour tous les événements de tous mes projets"
label_user_mail_option_selected: "Pour tous les événements des projets sélectionnés..."
label_user_mail_option_none: "Seulement pour ce que je surveille ou à quoi je participe"
label_user_mail_no_self_notified: "Je ne veux pas être notifié des changements que j'effectue"
label_registration_activation_by_email: activation du compte par email
label_registration_manual_activation: activation manuelle du compte
@@ -835,9 +832,9 @@ fr:
text_subprojects_destroy_warning: "Ses sous-projets : {{value}} seront également supprimés."
text_workflow_edit: Sélectionner un tracker et un rôle pour éditer le workflow
text_are_you_sure: Êtes-vous sûr ?
text_tip_task_begin_day: tâche commençant ce jour
text_tip_task_end_day: tâche finissant ce jour
text_tip_task_begin_end_day: tâche commençant et finissant ce jour
text_tip_issue_begin_day: tâche commençant ce jour
text_tip_issue_end_day: tâche finissant ce jour
text_tip_issue_begin_end_day: tâche commençant et finissant ce jour
text_project_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres et tirets sont autorisés.<br />Un fois sauvegardé, l''identifiant ne pourra plus être modifié.'
text_caracters_maximum: "{{count}} caractères maximum."
text_caracters_minimum: "{{count}} caractères minimum."
@@ -919,11 +916,11 @@ fr:
enumeration_system_activity: Activité système
label_board_sticky: Sticky
label_board_locked: Verrouillé
error_unable_delete_issue_status: Unable to delete issue status
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.
error_unable_delete_issue_status: Impossible de supprimer le statut de demande
error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisé
error_unable_to_connect: Connexion impossible ({{value}})
error_can_not_remove_role: Ce rôle est utilisé et ne peut pas être supprimé.
error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas être supprimé.
field_principal: Principal
notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: {{errors}}."
text_zoom_out: Zoom arrière
@@ -931,9 +928,14 @@ fr:
notice_unable_delete_time_entry: Impossible de supprimer le temps passé.
label_overall_spent_time: Temps passé global
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: "Modifier la page de Wiki associée: {{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
+7 -5
View File
@@ -613,7 +613,6 @@ gl:
label_user_activity: "Actividade de {{value}}"
label_user_mail_no_self_notified: "Non quero ser avisado de cambios feitos por min"
label_user_mail_option_all: "Para calquera evento en tódolos proxectos"
label_user_mail_option_none: "Só para elementos monitorizados ou relacionados comigo"
label_user_mail_option_selected: "Para calquera evento dos proxectos seleccionados..."
label_user_new: Novo usuario
label_user_plural: Usuarios
@@ -798,9 +797,9 @@ gl:
text_select_project_modules: 'Seleccione os módulos a activar para este proxecto:'
text_status_changed_by_changeset: "Aplicado nos cambios {{value}}"
text_subprojects_destroy_warning: "Os proxectos secundarios: {{value}} tamén se eliminarán"
text_tip_task_begin_day: tarefa que comeza este día
text_tip_task_begin_end_day: tarefa que comeza e remata este día
text_tip_task_end_day: tarefa que remata este día
text_tip_issue_begin_day: tarefa que comeza este día
text_tip_issue_begin_end_day: tarefa que comeza e remata este día
text_tip_issue_end_day: tarefa que remata este día
text_tracker_no_workflow: Non hai ningún fluxo de traballo definido para este tipo de petición
text_unallowed_characters: Caracteres non permitidos
text_user_mail_option: "Dos proxectos non seleccionados, só recibirá notificacións sobre elementos monitorizados ou elementos nos que estea involucrado (por exemplo, peticións das que vostede sexa autor ou asignadas a vostede)."
@@ -934,4 +933,7 @@ gl:
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
+69 -66
View File
@@ -104,7 +104,7 @@ he:
inclusion: "לא נכלל ברשימה"
exclusion: "לא זמין"
invalid: "לא ולידי"
confirmation: "לא תואם לאישורו"
confirmation: "לא תואם לאישור"
accepted: "חייב באישור"
empty: "חייב להכלל"
blank: "חייב להכלל"
@@ -122,8 +122,8 @@ he:
even: "חייב להיות זוגי"
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"
circular_dependency: "קשר זה יצור תלות מעגלית"
cant_link_an_issue_with_a_descendant: "לא ניתן לקשר נושא לתת־משימה שלו"
actionview_instancetag_blank_option: בחר בבקשה
@@ -144,7 +144,7 @@ he:
notice_account_wrong_password: סיסמה שגויה
notice_account_register_done: החשבון נוצר בהצלחה. להפעלת החשבון לחץ על הקישור שנשלח לדוא"ל שלך.
notice_account_unknown_email: משתמש לא מוכר.
notice_can_t_change_password: החשבון הזה משתמש במקור אימות חיצוני. שינוי סיסמה הינו בילתי אפשר
notice_can_t_change_password: החשבון הזה משתמש במקור הזדהות חיצוני. שינוי סיסמה הינו בילתי אפשר
notice_account_lost_email_sent: דוא"ל עם הוראות לבחירת סיסמה חדשה נשלח אליך.
notice_account_activated: חשבונך הופעל. אתה יכול להתחבר כעת.
notice_successful_create: יצירה מוצלחת.
@@ -155,7 +155,7 @@ he:
notice_locking_conflict: המידע עודכן על ידי משתמש אחר.
notice_not_authorized: אינך מורשה לראות דף זה.
notice_email_sent: "דואל נשלח לכתובת {{value}}"
notice_email_error: "ארעה שגיאה בעט שליחת הדואל ({{value}})"
notice_email_error: "ארעה שגיאה בעת שליחת הדואל ({{value}})"
notice_feeds_access_key_reseted: מפתח ה־RSS שלך אופס.
notice_api_access_key_reseted: מפתח הגישה שלך ל־API אופס.
notice_failed_to_save_issues: "נכשרת בשמירת {{count}} נושא\ים ב {{total}} נבחרו: {{ids}}."
@@ -168,7 +168,7 @@ he:
notice_issue_done_ratios_updated: אחוזי התקדמות לנושא עודכנו.
error_can_t_load_default_data: "אפשרויות ברירת המחדל לא הצליחו להיטען: {{value}}"
error_scm_not_found: כניסה ו\או גירסה אינם קיימים במאגר.
error_scm_not_found: כניסה ו\או מהדורה אינם קיימים במאגר.
error_scm_command_failed: "ארעה שגיאה בעת ניסון גישה למאגר: {{value}}"
error_scm_annotate: "הכניסה לא קיימת או שלא ניתן לתאר אותה."
error_issue_not_found_in_project: 'הנושאים לא נמצאו או אינם שיכים לפרויקט'
@@ -194,7 +194,7 @@ he:
mail_body_account_information: פרטי החשבון שלך
mail_subject_account_activation_request: "בקשת הפעלה לחשבון {{value}}"
mail_body_account_activation_request: "משתמש חדש ({{value}}) נרשם. החשבון שלו מחכה לאישור שלך:"
mail_subject_reminder: "{{count}} נושאים מיעדים להגשה בימים הקרובים ({{days}})"
mail_subject_reminder: "{{count}} נושאים מיועדים להגשה בימים הקרובים ({{days}})"
mail_body_reminder: "{{count}} נושאים שמיועדים אליך מיועדים להגשה בתוך {{days}} ימים:"
mail_subject_wiki_content_added: "דף ה־wiki '{{page}}' נוסף"
mail_body_wiki_content_added: דף ה־wiki '{{page}}' נוסף ע"י {{author}}.
@@ -248,7 +248,7 @@ he:
field_login: שם משתמש
field_mail_notification: הודעות דוא"ל
field_admin: ניהול
field_last_login_on: חיבור אחרון
field_last_login_on: התחברות אחרונה
field_language: שפה
field_effective_date: תאריך
field_password: סיסמה
@@ -267,7 +267,7 @@ he:
field_onthefly: יצירת משתמשים זריזה
field_start_date: תאריך התחלה
field_done_ratio: % גמור
field_auth_source: מצב אימות
field_auth_source: מקור הזדהות
field_hide_mail: החבא את כתובת הדוא"ל שלי
field_comments: הערות
field_url: URL
@@ -284,6 +284,7 @@ he:
field_redirect_existing_links: העבר קישורים קיימים
field_estimated_hours: זמן משוער
field_column_names: עמודות
field_time_entries: רישום זמנים
field_time_zone: איזור זמן
field_searchable: ניתן לחיפוש
field_default_value: ערך ברירת מחדל
@@ -296,13 +297,16 @@ he:
field_group_by: קבץ את התוצאות לפי
field_sharing: שיתוף
field_parent_issue: משימת אב
field_member_of_group: חבר בקבוצה
field_assigned_to_role: בעל תפקיד
field_text: שדה טקסט
setting_app_title: כותרת ישום
setting_app_subtitle: תת־כותרת ישום
setting_welcome_text: טקסט "ברוך הבא"
setting_default_language: שפת ברירת מחדל
setting_login_required: דרוש אימות
setting_self_registration: אפשר הרשמות עצמית
setting_login_required: דרושה הזדהות
setting_self_registration: אפשר הרשמה עצמית
setting_attachment_max_size: גודל דבוקה מקסימאלי
setting_issues_export_limit: גבול יצוא נושאים
setting_mail_from: כתובת שליחת דוא"ל
@@ -310,14 +314,14 @@ he:
setting_plain_text_mail: טקסט פשוט בלבד (ללא HTML)
setting_host_name: שם שרת
setting_text_formatting: עיצוב טקסט
setting_wiki_compression: כיווץ היסטורית WIKI
setting_wiki_compression: כיווץ היסטורית wiki
setting_feeds_limit: גבול תוכן הזנות
setting_default_projects_public: פרויקטים חדשים הינם פומביים כברירת מחדל
setting_autofetch_changesets: משיכה אוטומטית של עידכונים
setting_autofetch_changesets: משיכה אוטומטית של שינויים
setting_sys_api_enabled: אפשר שירות רשת לניהול המאגר
setting_commit_ref_keywords: מילות מפתח מקשרות
setting_commit_fix_keywords: מילות מפתח מתקנות
setting_autologin: חיבור אוטומטי
setting_autologin: התחברות אוטומטית
setting_date_format: פורמט תאריך
setting_time_format: פורמט זמן
setting_cross_project_issue_relations: הרשה קישור נושאים בין פרויקטים
@@ -339,17 +343,18 @@ he:
setting_gravatar_default: תמונת Gravatar ברירת מחדל
setting_diff_max_lines_displayed: מספר מירבי של שורות בתצוגת שינויים
setting_file_max_size_displayed: גודל מירבי של מלל המוצג בתוך השורה
setting_repository_log_display_limit: מספר מירבי של גירסאות המוצגות ביומן קובץ
setting_repository_log_display_limit: מספר מירבי של מהדורות המוצגות ביומן קובץ
setting_openid: אפשר התחברות ורישום באמצעות OpenID
setting_password_min_length: אורך סיסמא מינימאלי
setting_password_min_length: אורך סיסמה מינימאלי
setting_new_project_user_role_id: התפקיד שמוגדר למשתמש פשוט אשר יוצר פרויקט
setting_default_projects_modules: מודולים מאופשרים בברירת מחדל עבור פרויקטים חדשים
setting_issue_done_ratio: חשב אחוז התקדמות בנושא עם
setting_issue_done_ratio_issue_field: השתמש בשדה הנושא
setting_issue_done_ratio_issue_status: השתמש במצב הנושא
setting_start_of_week: התחל יומנים לפי
setting_start_of_week: השבוע מתחיל ביום
setting_rest_api_enabled: אפשר שירות רשת REST
setting_cache_formatted_text: שמור טקסט מעוצב במטמון
setting_default_notification_option: אפשרות התראה ברירת־מחדל
permission_add_project: יצירת פרויקט
permission_add_subprojects: יצירת תתי־פרויקט
@@ -376,9 +381,9 @@ he:
permission_add_issue_watchers: הוספת צופים
permission_delete_issue_watchers: הסרת צופים
permission_log_time: תיעוד זמן שהושקע
permission_view_time_entries: צפיה בזמן שהושקע
permission_view_time_entries: צפיה ברישום זמנים
permission_edit_time_entries: עריכת רישום זמנים
permission_edit_own_time_entries: עריכת לוג הזמן של עצמו
permission_edit_own_time_entries: עריכת רישום הזמנים של עצמו
permission_manage_news: ניהול חדשות
permission_comment_news: תגובה לחדשות
permission_manage_documents: ניהול מסמכים
@@ -395,7 +400,7 @@ he:
permission_protect_wiki_pages: הגנה על כל דפי wiki
permission_manage_repository: ניהול מאגר
permission_browse_repository: סיור במאגר
permission_view_changesets: צפיה בקבוצות שינויים
permission_view_changesets: צפיה בסדרות שינויים
permission_commit_access: אישור הפקדות
permission_manage_boards: ניהול לוחות
permission_view_messages: צפיה בהודעות
@@ -415,6 +420,8 @@ he:
project_module_wiki: Wiki
project_module_repository: מאגר
project_module_boards: לוחות
project_module_calendar: לוח שנה
project_module_gantt: גאנט
label_user: משתמש
label_user_plural: משתמשים
@@ -439,7 +446,7 @@ he:
label_document: מסמך
label_document_new: מסמך חדש
label_document_plural: מסמכים
label_document_added: מוסמך נוסף
label_document_added: מסמך נוסף
label_role: תפקיד
label_role_plural: תפקידים
label_role_new: תפקיד חדש
@@ -464,7 +471,7 @@ he:
label_enumeration_new: ערך חדש
label_information: מידע
label_information_plural: מידע
label_please_login: התחבר בבקשה
label_please_login: נא התחבר
label_register: הרשמה
label_login_with_open_id_option: או התחבר באמצעות OpenID
label_password_lost: אבדה הסיסמה?
@@ -479,7 +486,7 @@ he:
label_help: עזרה
label_reported_issues: נושאים שדווחו
label_assigned_to_me_issues: נושאים שהוצבו לי
label_last_login: חיבור אחרון
label_last_login: התחברות אחרונה
label_registered_on: נרשם בתאריך
label_activity: פעילות
label_overall_activity: פעילות כוללת
@@ -487,10 +494,10 @@ he:
label_new: חדש
label_logged_as: מחובר כ
label_environment: סביבה
label_authentication: אישור
label_auth_source: מצב אישור
label_auth_source_new: מצב אישור חדש
label_auth_source_plural: מצבי אישור
label_authentication: הזדהות
label_auth_source: מקור הזדהות
label_auth_source_new: מקור הזדהות חדש
label_auth_source_plural: מקורות הזדהות
label_subproject_plural: תת־פרויקטים
label_subproject_new: תת־פרויקט חדש
label_and_its_subprojects: "{{value}} וכל תתי־הפרויקטים שלו"
@@ -521,7 +528,7 @@ he:
label_news_plural: חדשות
label_news_latest: חדשות אחרונות
label_news_view_all: צפה בכל החדשות
label_news_added: חדשות הוספו
label_news_added: חדשות נוספו
label_settings: הגדרות
label_overview: מבט רחב
label_version: גירסה
@@ -575,7 +582,7 @@ he:
one: הערה אחת
other: "{{count}} הערות"
label_comment_add: הוסף תגובה
label_comment_added: תגובה הוספה
label_comment_added: תגובה נוספה
label_comment_delete: מחק תגובות
label_query: שאילתה אישית
label_query_plural: שאילתות אישיות
@@ -593,7 +600,7 @@ he:
label_all_time: תמיד
label_yesterday: אתמול
label_this_week: השבוע
label_last_week: שבוע שעבר
label_last_week: השבוע שעבר
label_last_n_days: "ב־{{count}} ימים אחרונים"
label_this_month: החודש
label_last_month: חודש שעבר
@@ -612,19 +619,19 @@ he:
label_modification_plural: "{{count}} שינויים"
label_branch: ענף
label_tag: סימון
label_revision: גירסה
label_revision_plural: גירסאות
label_revision_id: גירסה {{value}}
label_associated_revisions: גירסאות קשורות
label_revision: מהדורה
label_revision_plural: מהדורות
label_revision_id: מהדורה {{value}}
label_associated_revisions: מהדורות קשורות
label_added: נוסף
label_modified: שונה
label_copied: הועתק
label_renamed: השם שונה
label_deleted: נמחק
label_latest_revision: גירסה אחרונה
label_latest_revision_plural: גירסאות אחרונות
label_view_revisions: צפה בגירסאות
label_view_all_revisions: צפה בכל הגירסאות
label_latest_revision: מהדורה אחרונה
label_latest_revision_plural: מהדורות אחרונות
label_view_revisions: צפה במהדורות
label_view_all_revisions: צפה בכל המהדורות
label_max_size: גודל מקסימאלי
label_sort_highest: הזז לראשית
label_sort_higher: הזז למעלה
@@ -638,10 +645,10 @@ he:
label_result_plural: תוצאות
label_all_words: כל המילים
label_wiki: Wiki
label_wiki_edit: ערוך Wiki
label_wiki_edit_plural: עריכות Wiki
label_wiki_edit: ערוך wiki
label_wiki_edit_plural: עריכות wiki
label_wiki_page: דף Wiki
label_wiki_page_plural: דפי Wiki
label_wiki_page_plural: דפי wiki
label_index_by_title: סדר על פי כותרת
label_index_by_date: סדר על פי תאריך
label_current_version: גירסה נוכחית
@@ -694,7 +701,7 @@ he:
label_message_plural: הודעות
label_message_last: הודעה אחרונה
label_message_new: הודעה חדשה
label_message_posted: הודעה הוספה
label_message_posted: הודעה נוספה
label_reply_plural: השבות
label_send_information: שלח מידע על חשבון למשתמש
label_year: שנה
@@ -703,18 +710,18 @@ he:
label_date_from: מתאריך
label_date_to: עד
label_language_based: מבוסס שפה
label_sort_by: "מין לפי {{value}}"
label_sort_by: "מיין לפי {{value}}"
label_send_test_email: שלח דוא"ל בדיקה
label_feeds_access_key: מפתח גישה ל־RSS
label_missing_feeds_access_key: חסר מפתח גישה ל־RSS
label_feeds_access_key_created_on: "מפתח הזנת RSS נוצר לפני{{value}}"
label_module_plural: מודולים
label_added_time_by: "נוסף על ידי {{author}} לפני {{age}} "
label_added_time_by: 'נוסף ע"י {{author}} לפני {{age}}'
label_updated_time_by: 'עודכן ע"י {{author}} לפני {{age}}'
label_updated_time: "עודכן לפני {{value}} "
label_jump_to_a_project: קפוץ לפרויקט...
label_file_plural: קבצים
label_changeset_plural: אוסף שינוים
label_changeset_plural: סדרות שינויים
label_default_columns: עמודת ברירת מחדל
label_no_change_option: (אין שינוים)
label_bulk_edit_selected_issues: ערוך את הנושאים המסומנים
@@ -723,7 +730,9 @@ he:
label_search_titles_only: חפש בכותרות בלבד
label_user_mail_option_all: "לכל אירוע בכל הפרויקטים שלי"
label_user_mail_option_selected: "לכל אירוע בפרויקטים שבחרתי בלבד..."
label_user_mail_option_none: "רק לנושאים שאני צופה או קשור אליהם"
label_user_mail_option_only_my_events: עבור דברים שאני צופה או מעורב בהם בלבד
label_user_mail_option_only_assigned: עבור דברים שאני אחראי עליהם בלבד
label_user_mail_option_only_owner: עבור דברים שאני הבעלים שלהם בלבד
label_user_mail_no_self_notified: "אני לא רוצה שיודיעו לי על שינויים שאני מבצע"
label_registration_activation_by_email: הפעל חשבון באמצעות דוא"ל
label_registration_manual_activation: הפעלת חשבון ידנית
@@ -735,7 +744,7 @@ he:
label_more: עוד
label_scm: מערכת ניהול תצורה
label_plugins: תוספים
label_ldap_authentication: אימות LDAP
label_ldap_authentication: הזדהות LDAP
label_downloads_abbr: D/L
label_optional_description: תיאור רשות
label_add_another_file: הוסף עוד קובץ
@@ -752,8 +761,8 @@ he:
label_ascending: בסדר עולה
label_descending: בסדר יורד
label_date_from_to: 'מתאריך {{start}} ועד תאריך {{end}}'
label_wiki_content_added: הדף נוסף ל־wiki
label_wiki_content_updated: דף ה־wiki עודכן
label_wiki_content_added: נוסף דף ל־wiki
label_wiki_content_updated: דף wiki עודכן
label_group: קבוצה
label_group_plural: קבוצות
label_group_new: קבוצה חדשה
@@ -785,6 +794,7 @@ he:
button_create_and_continue: צור ופתח חדש
button_test: בדוק
button_edit: ערוך
button_edit_associated_wikipage: "ערוך דף wiki מקושר: {{page_title}}"
button_add: הוסף
button_change: שנה
button_apply: החל
@@ -800,8 +810,8 @@ he:
button_cancel: בטל
button_activate: הפעל
button_sort: מיין
button_log_time: זמן לוג
button_rollback: חזור לגירסה זו
button_log_time: רישום זמנים
button_rollback: חזור למהדורה זו
button_watch: צפה
button_unwatch: בטל צפיה
button_reply: השב
@@ -809,7 +819,7 @@ he:
button_unarchive: הוצא מהארכיון
button_reset: אפס
button_rename: שנה שם
button_change_password: שנה סיסמא
button_change_password: שנה סיסמה
button_copy: העתק
button_copy_and_follow: העתק ועקוב
button_annotate: הוסף תיאור מסגרת
@@ -836,13 +846,14 @@ he:
text_subprojects_destroy_warning: "תת־הפרויקט\ים: {{value}} ימחקו גם כן."
text_workflow_edit: בחר תפקיד וסיווג כדי לערוך את זרימת העבודה
text_are_you_sure: האם אתה בטוח?
text_are_you_sure_with_children: האם למחוק את הנושא ואת כל בניו?
text_journal_changed: "{{label}} השתנה מ{{old}} ל{{new}}"
text_journal_set_to: "{{label}} נקבע ל{{value}}"
text_journal_deleted: "{{label}} נמחק ({{old}})"
text_journal_added: "{{label}} {{value}} נוסף"
text_tip_task_begin_day: מטלה המתחילה היום
text_tip_task_end_day: מטלה המסתיימת היום
text_tip_task_begin_end_day: מטלה המתחילה ומסתיימת היום
text_tip_issue_begin_day: מטלה המתחילה היום
text_tip_issue_end_day: מטלה המסתיימת היום
text_tip_issue_begin_end_day: מטלה המתחילה ומסתיימת היום
text_project_identifier_info: 'אותיות לטיניות (a-z), מספרים ומקפים.<br />ברגע שנשמר, לא ניתן לשנות את המזהה.'
text_caracters_maximum: "מקסימום {{count}} תווים."
text_caracters_minimum: "חייב להיות לפחות באורך של {{count}} תווים."
@@ -852,8 +863,8 @@ he:
text_comma_separated: הכנסת ערכים מרובים מותרת (מופרדים בפסיקים).
text_line_separated: ניתן להזין מספר ערכים (שורה אחת לכל ערך).
text_issues_ref_in_commit_messages: קישור ותיקום נושאים בהודעות הפקדה
text_issue_added: "הנושא {{id}} דווח (by {{author}})."
text_issue_updated: "הנושא {{id}} עודכן (by {{author}})."
text_issue_added: "הנושא {{id}} דווח (בידי {{author}})."
text_issue_updated: "הנושא {{id}} עודכן (בידי {{author}})."
text_wiki_destroy_confirmation: האם אתה בטוח שברצונך למחוק את הWIKI הזה ואת כל תוכנו?
text_issue_category_destroy_question: "כמה נושאים ({{count}}) מוצבים לקטגוריה הזו. מה ברצונך לעשות?"
text_issue_category_destroy_assignments: הסר הצבת קטגוריה
@@ -875,7 +886,7 @@ he:
text_user_wrote: "{{value}} כתב:"
text_enumeration_destroy_question: "{{count}} אוביקטים מוצבים לערך זה."
text_enumeration_category_reassign_to: 'הצב מחדש לערך הזה:'
text_email_delivery_not_configured: 'לא נקבעה תצורה לשליחת דואר, וההתראות כבויות.\nקבע את תצורת שרת ה־SMTP בקובץ config/email.yml והתחל את האפליקציה מחדש ע"מ לאפשר אותם.'
text_email_delivery_not_configured: 'לא נקבעה תצורה לשליחת דואר, וההתראות כבויות.\nקבע את תצורת שרת ה־SMTP בקובץ /etc/redmine/&lt;instance&gt;/email.yml והתחל את האפליקציה מחדש ע"מ לאפשר אותם.'
text_repository_usernames_mapping: "בחר או עדכן את משתמש Redmine הממופה לכל שם משתמש ביומן המאגר.\nמשתמשים בעלי שם או כתובת דואר זהה ב־Redmine ובמאגר ממופים באופן אוטומטי."
text_diff_truncated: '... השינויים עוברים את מספר השורות המירבי לתצוגה, ולכן הם קוצצו.'
text_custom_field_possible_values_info: שורה אחת לכל ערך
@@ -915,11 +926,3 @@ he:
enumeration_doc_categories: קטגוריות מסמכים
enumeration_activities: פעילויות (מעקב אחר זמנים)
enumeration_system_activity: פעילות מערכת
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
+7 -4
View File
@@ -701,7 +701,6 @@ hr:
label_search_titles_only: Pretraživanje samo naslova
label_user_mail_option_all: "Za bilo koji događaj na svim mojim projektima"
label_user_mail_option_selected: "Za bilo koji događaj samo za izabrane projekte..."
label_user_mail_option_none: "Samo za stvari koje pratim ili u kojima sudjelujem"
label_user_mail_no_self_notified: "Ne želim primati obavijesti o promjenama koje sam napravim"
label_registration_activation_by_email: aktivacija putem e-pošte
label_registration_manual_activation: ručna aktivacija
@@ -815,9 +814,9 @@ hr:
text_journal_set_to: "{{label}} postavi na {{value}}"
text_journal_deleted: "{{label}} izbrisano ({{old}})"
text_journal_added: "{{label}} {{value}} added"
text_tip_task_begin_day: Zadaci koji počinju ovog dana
text_tip_task_end_day: zadaci koji se završavaju ovog dana
text_tip_task_begin_end_day: Zadaci koji počinju i završavaju se ovog dana
text_tip_issue_begin_day: Zadaci koji počinju ovog dana
text_tip_issue_end_day: zadaci koji se završavaju ovog dana
text_tip_issue_begin_end_day: Zadaci koji počinju i završavaju se ovog dana
text_project_identifier_info: 'mala slova (a-z), brojevi i crtice su dozvoljeni.<br />Jednom snimljen identifikator se ne može mijenjati!'
text_caracters_maximum: "Najviše {{count}} znakova."
text_caracters_minimum: "Mora biti dugačko najmanje {{count}} znakova."
@@ -925,3 +924,7 @@ hr:
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
+7 -4
View File
@@ -612,7 +612,6 @@
label_search_titles_only: Keresés csak a címekben
label_user_mail_option_all: "Minden eseményről minden saját projektemben"
label_user_mail_option_selected: "Minden eseményről a kiválasztott projektekben..."
label_user_mail_option_none: "Csak a megfigyelt dolgokról, vagy, amiben részt veszek"
label_user_mail_no_self_notified: "Nem kérek értesítést az általam végzett módosításokról"
label_registration_activation_by_email: Fiók aktiválása e-mailben
label_registration_manual_activation: Manuális fiók aktiválás
@@ -682,9 +681,9 @@
text_subprojects_destroy_warning: "Az alprojekt(ek): {{value}} szintén törlésre kerülnek."
text_workflow_edit: Válasszon egy szerepkört, és egy feladat típust a workflow szerkesztéséhez
text_are_you_sure: Biztos benne ?
text_tip_task_begin_day: a feladat ezen a napon kezdődik
text_tip_task_end_day: a feladat ezen a napon ér véget
text_tip_task_begin_end_day: a feladat ezen a napon kezdődik és ér véget
text_tip_issue_begin_day: a feladat ezen a napon kezdődik
text_tip_issue_end_day: a feladat ezen a napon ér véget
text_tip_issue_begin_end_day: a feladat ezen a napon kezdődik és ér véget
text_project_identifier_info: 'Kis betűk (a-z), számok és kötőjel megengedett.<br />Mentés után az azonosítót megváltoztatni nem lehet.'
text_caracters_maximum: "maximum {{count}} karakter."
text_caracters_minimum: "Legkevesebb {{count}} karakter hosszúnek kell lennie."
@@ -941,3 +940,7 @@
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
+7 -4
View File
@@ -688,7 +688,6 @@ id:
label_search_titles_only: Cari judul saja
label_user_mail_option_all: "Untuk semua kejadian pada semua proyek saya"
label_user_mail_option_selected: "Hanya untuk semua kejadian pada proyek yang saya pilih ..."
label_user_mail_option_none: "Hanya pada hal-hal yang saya pantau atau saya terlibat di dalamnya"
label_user_mail_no_self_notified: "Saya tak ingin diberitahu untuk perubahan yang saya buat sendiri"
label_user_mail_assigned_only_mail_notification: "Kirim email hanya bila saya ditugaskan untuk masalah terkait"
label_user_mail_block_mail_notification: "Saya tidak ingin menerima email. Terima kasih."
@@ -796,9 +795,9 @@ id:
text_journal_set_to: "{{label}} di set ke {{value}}"
text_journal_deleted: "{{label}} dihapus ({{old}})"
text_journal_added: "{{label}} {{value}} ditambahkan"
text_tip_task_begin_day: tugas dimulai hari itu
text_tip_task_end_day: tugas berakhir hari itu
text_tip_task_begin_end_day: tugas dimulai dan berakhir hari itu
text_tip_issue_begin_day: tugas dimulai hari itu
text_tip_issue_end_day: tugas berakhir hari itu
text_tip_issue_begin_end_day: tugas dimulai dan berakhir hari itu
text_project_identifier_info: 'Yang diijinkan hanya huruf kecil (a-z), angka dan tanda minus.<br />Sekali disimpan, pengenal tidak bisa diubah.'
text_caracters_maximum: "maximum {{count}} karakter."
text_caracters_minimum: "Setidaknya harus sepanjang {{count}} karakter."
@@ -926,3 +925,7 @@ id:
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
+7 -4
View File
@@ -572,9 +572,9 @@ it:
text_project_destroy_confirmation: Sei sicuro di voler eliminare il progetto e tutti i dati ad esso collegati?
text_workflow_edit: Seleziona un ruolo ed un tracker per modificare il workflow
text_are_you_sure: Sei sicuro ?
text_tip_task_begin_day: attività che iniziano in questa giornata
text_tip_task_end_day: attività che terminano in questa giornata
text_tip_task_begin_end_day: attività che iniziano e terminano in questa giornata
text_tip_issue_begin_day: attività che iniziano in questa giornata
text_tip_issue_end_day: attività che terminano in questa giornata
text_tip_issue_begin_end_day: attività che iniziano e terminano in questa giornata
text_project_identifier_info: "Lettere minuscole (a-z), numeri e trattini permessi.<br />Una volta salvato, l'identificativo non può essere modificato."
text_caracters_maximum: "massimo {{count}} caratteri."
text_length_between: "Lunghezza compresa tra {{min}} e {{max}} caratteri."
@@ -632,7 +632,6 @@ it:
text_user_mail_option: "Per i progetti non selezionati, riceverai solo le notifiche riguardanti le cose che osservi o nelle quali sei coinvolto (per esempio segnalazioni che hai creato o che ti sono state assegnate)."
label_user_mail_option_selected: "Solo per gli eventi relativi ai progetti selezionati..."
label_user_mail_option_all: "Per ogni evento relativo ad uno dei miei progetti"
label_user_mail_option_none: "Solo per argomenti che osservo o che mi riguardano"
setting_emails_footer: Piè di pagina email
label_float: Decimale
button_copy: Copia
@@ -922,3 +921,7 @@ it:
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
+9 -6
View File
@@ -144,7 +144,7 @@ ja:
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"
cant_link_an_issue_with_a_descendant: "指定したチケットとは親子関係になっているため関連づけられません"
actionview_instancetag_blank_option: 選んでください
@@ -376,6 +376,7 @@ ja:
setting_issue_done_ratio_issue_status: チケットのステータスを使用する
setting_start_of_week: 週の開始曜日
setting_rest_api_enabled: RESTによるWebサービスを有効にする
setting_default_notification_option: デフォルトのメール通知オプション
permission_add_project: プロジェクトの追加
permission_add_subprojects: サブプロジェクトの追加
@@ -701,7 +702,7 @@ ja:
label_relation_delete: 関連の削除
label_relates_to: 関係している
label_duplicates: 重複している
label_duplicated_by: 重複ている
label_duplicated_by: 重複されている
label_blocks: ブロックしている
label_blocked_by: ブロックされている
label_precedes: 先行する
@@ -752,7 +753,9 @@ ja:
label_search_titles_only: タイトルのみ
label_user_mail_option_all: "参加しているプロジェクトの全ての通知"
label_user_mail_option_selected: "選択したプロジェクトの全ての通知..."
label_user_mail_option_none: "ウォッチまたは関係している事柄のみ"
label_user_mail_option_only_my_events: "ウォッチまたは関係している事柄のみ"
label_user_mail_option_only_assigned: "自分が担当している事柄のみ"
label_user_mail_option_only_owner: "自分が作成した事柄のみ"
label_user_mail_no_self_notified: 自分自身による変更の通知は不要
label_registration_activation_by_email: メールでアカウントを有効化
label_registration_manual_activation: 手動でアカウントを有効化
@@ -870,9 +873,9 @@ ja:
text_journal_set_to: "{{label}} を {{value}} にセット"
text_journal_deleted: "{{label}} を削除 ({{old}})"
text_journal_added: "{{label}} {{value}} を追加"
text_tip_task_begin_day: この日に開始するタスク
text_tip_task_end_day: この日に終了するタスク
text_tip_task_begin_end_day: この日のうちに開始して終了するタスク
text_tip_issue_begin_day: この日に開始するタスク
text_tip_issue_end_day: この日に終了するタスク
text_tip_issue_begin_end_day: この日のうちに開始して終了するタスク
text_project_identifier_info: '英小文字(a-z)と数字とダッシュ(-)が使えます。<br />一度保存すると、識別子は変更できません。'
text_caracters_maximum: "最大{{count}}文字です。"
text_caracters_minimum: "最低{{count}}文字の長さが必要です"

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